diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/maintenance-corridors/kael-davan.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/maintenance-corridors/kael-davan.yaml deleted file mode 100644 index a022d4fc6..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/maintenance-corridors/kael-davan.yaml +++ /dev/null @@ -1,184 +0,0 @@ -# Kael Davan — THE FRIEND (Smuggler) -# Dialogue at Maintenance Corridors (Restricted Access) -# Ticket: #297 | Sprint: 5 | Tier 1 FRIEND NPC -# Voice: direct, practical, short sentences, first names, warm to trusted people -# Context: restricted maintenance corridors. High-stakes, operational, no warmth. -# This is where the contradiction surfaces (Phase 3-4 of the FRIEND arc). - -location: maintenance-corridors -role: dock-worker -lines: - - # ======================================== - # RING OPERATIONS — corridor handoffs - # ======================================== - - - id: kael-davan_d_001 - text: "Package is in the junction locker. Renn picks it up in ten." - role: dock-worker - access: [insider] - trust: real - situation: [shift_transition] - mood: [focused] - topic: [cargo] - tags: [kael, ring-ops, renn, operational] - - - id: kael-davan_d_002 - text: "B-7 is clear. Camera cycles in forty seconds — move fast." - role: dock-worker - access: [insider] - trust: real - situation: [shift_transition] - topic: [cargo, danger] - tags: [kael, ring-ops, operational] - knowledge_grant: - fact_id: investigation.surveillance_gaps - confidence: knows_details - - - id: kael-davan_d_003 - text: "Chalk marks are fresh. Renn came through already. We're on schedule." - role: dock-worker - access: [insider] - trust: real - situation: [routine] - mood: [content] - topic: [cargo] - tags: [kael, ring-ops, renn, operational] - - - id: kael-davan_d_004 - text: "Don't use the C-section hatch tonight. Maintenance crew's working late." - role: dock-worker - access: [insider] - trust: real - situation: [routine] - mood: [frustrated] - topic: [danger, cargo] - tags: [kael, ring-ops, operational, caution] - - # ======================================== - # CAUGHT — contradiction scene (Phase 3-4) - # When the smuggler finds Kael with the unknown contact - # ======================================== - - - id: kael-davan_d_005 - text: "What are you — wait. How long have you been standing there?" - role: dock-worker - access: [insider] - trust: surface - situation: [confrontation] - mood: [frustrated] - topic: [danger] - tags: [kael, contradiction, phase-3] - - - id: kael-davan_d_006 - text: "That was nobody. Maintenance contact. It's handled." - role: dock-worker - access: [insider] - trust: surface - situation: [confrontation] - mood: [frustrated] - topic: [routine] - tags: [kael, deflection, lying, phase-4] - - - id: kael-davan_d_007 - text: "I don't have to explain every conversation I have. Drop it." - role: dock-worker - access: [insider] - trust: surface - situation: [confrontation] - mood: [frustrated] - topic: [trust] - tags: [kael, deflection, hostile-path, phase-4] - - # ======================================== - # SECRET — corridor confessions - # ======================================== - - - id: kael-davan_d_008 - text: "I'm trying to get out. That's all. I just want out." - role: dock-worker - access: [insider] - trust: secret - situation: [confrontation, alone] - mood: [anxious] - topic: [personal, trust] - tags: [kael, confession, phase-5] - - - id: kael-davan_d_009 - text: "Nils will kill me if he finds out. You know that. You know him." - role: dock-worker - access: [insider] - trust: secret - situation: [confrontation, alone] - mood: [anxious] - topic: [danger, trust] - tags: [kael, confession, nils, phase-5] - - - id: kael-davan_d_010 - text: "I found someone who can get me new papers. Off-station. Clean break." - role: dock-worker - access: [insider] - trust: secret - situation: [alone] - mood: [anxious] - topic: [personal] - tags: [kael, confession, phase-5] - knowledge_grant: - fact_id: knowledge.kael_exit_plan - confidence: knows_details - - # ======================================== - # LAYER 2 GREETING VARIANTS — D-028 Layer 2 - # Ticket #170 (Sprint 15). situation: [greeting] fires on initial contact. - # Access tier + mood encode relationship history state. - # Context: restricted maintenance corridors. Any stranger here is immediately - # suspicious. Even trusted contacts get terse, operational greetings. - # ======================================== - - # first_meeting: InteractionMemory.count == 0. Any stranger in restricted corridors is a problem. - - id: kael-davan_d_011 - text: "This is a restricted section. Who authorized you back here?" - role: dock-worker - access: [public] - trust: surface - situation: [greeting] - mood: [focused] - topic: [danger, routine] - tags: [kael, greeting, first-meeting, layer2] - notes: "Layer 2 greeting — first meeting in restricted corridors. Immediate challenge. Any stranger back here is suspicious regardless of intent." - - # established — peer/smuggler context: count >= 3, RelationshipState: Known/Friendly → Peer/Insider access. - - id: kael-davan_d_012 - text: "You're on time. Clear all the way to the junction." - role: dock-worker - access: [peer, insider] - trust: surface - situation: [greeting] - mood: [content] - topic: [cargo, colleague] - tags: [kael, greeting, repeat-visit, peer-tone, layer2] - notes: "Layer 2 greeting — established, operational. All business. Kael treats a trusted repeat visitor as crew — no pleasantries, just the essential handoff information." - - # established — authority/detective context: count >= 3, RelationshipState: PersonOfInterest → Authority access. - - id: kael-davan_d_013 - text: "You keep showing up back here. You have clearance for this section?" - role: dock-worker - access: [authority] - trust: surface - situation: [greeting] - mood: [suspicious] - topic: [danger, routine] - tags: [kael, greeting, repeat-visit, authority-tone, layer2] - notes: "Layer 2 greeting — repeat with authority figure in restricted section. Professionally defensive. Kael challenges them but can't bar entry if they have clearance." - - # post-confrontation: confrontation logged. Kael is cornered on his own operational ground. - - id: kael-davan_d_014 - text: "You followed me here." - role: dock-worker - access: [peer, insider] - trust: surface - situation: [greeting] - mood: [hostile, suspicious] - topic: [danger, trust] - tags: [kael, greeting, post-confrontation, layer2] - notes: "Layer 2 greeting — post-confrontation, restricted corridors. Accusatory, not a question. Kael feels cornered. This is where the contradiction lives." diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/maintenance-corridors/ring-operative.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/maintenance-corridors/ring-operative.yaml deleted file mode 100644 index 6e7eb5d16..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/maintenance-corridors/ring-operative.yaml +++ /dev/null @@ -1,379 +0,0 @@ -# Dialogue: ring-operative at Maintenance Corridors -# NPC: Generic ring operative (Tier 3 template — members without individual profiles) -# Voice: two registers. Surface: maintenance worker, brief, task-focused. Real: coded, precise, never explicit. -# The crucial thing: both registers sound identical to a casual listener. -# Ring-aware: full ring membership. Knows the route, the window, the players. -# Ring code vocabulary (from Sova texture appendix): -# "running maintenance" = cover for ring operation -# "the usual pickup" = ring cargo handoff -# "cans are ready" = containers cleared for movement -# "manifest is clean" = paperwork cover confirmed -# "Drin was asking" = warning, inspection proximity -# "dead air" = Meridian surveillance gaps -# "the gap" = maintenance corridors, the route itself -# Ticket: #192 | Sprint: 12 - -location: maintenance-corridors -role: ring-operative -lines: - - # ========================================== - # SURFACE COVER — sounds like maintenance work - # ========================================== - - - id: ring-operative_d_001 - text: "Running maintenance on the B-7 conduit. Could be a while." - role: ring-operative - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [ring-operative, surface-cover, b7] - dual_lens: - smuggler: "Cover phrase. He's not doing maintenance." - detective: "Maintenance worker. Conduit repair. Routine." - notes: "'Running maintenance' is the canonical ring cover phrase." - - - id: ring-operative_d_002 - text: "Bay four access from here is faster than going around. If you're in a hurry." - role: ring-operative - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [ring-operative, surface-cover, bay-four, spatial] - dual_lens: - smuggler: "He's telling me the route is faster. This is spatial information, not just courtesy." - detective: "Ring operative casually establishes corridor-to-bay-four spatial relationship. Note it." - - - id: ring-operative_d_003 - text: "Quiet in here tonight. Good working conditions." - role: ring-operative - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [ring-operative, surface-cover, ambient] - dual_lens: - smuggler: "Dead air confirmed. Meridian's not picking this up." - detective: "Routine corridor comment." - - - id: ring-operative_d_004 - text: "Pael was through here earlier. Seal replacement on the ventilation unit." - role: ring-operative - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine, colleague] - mood: [content] - tags: [ring-operative, surface-cover, pael, corridor-traffic] - dual_lens: - smuggler: "Pael was through. Legitimate. Corridor's been active — that means traffic covers us." - detective: "References Pael's B-7 presence without suspicion. Maintenance workers know each other's routes." - - - id: ring-operative_d_005 - text: "C-4 access is at the far end. About three minutes from here." - role: ring-operative - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [ring-operative, surface-cover, c4, spatial] - dual_lens: - smuggler: "He's giving me the timing. Three minutes to C-4 from this point." - detective: "Operative establishes C-4 proximity to maintenance corridor. That's the link." - knowledge_grant: - fact_id: location.smuggling_route - confidence: suspects - - # ========================================== - # OPERATIONAL COORDINATION — insider/real only - # ========================================== - - - id: ring-operative_d_006 - text: "Cans are ready. Bay four, per the schedule." - role: ring-operative - access: [insider] - trust: real - situation: [routine, shift_transition] - topic: [cargo, routine] - mood: [focused] - tags: [ring-operative, ring-ops, coded, cans-ready] - dual_lens: - smuggler: "Containers cleared. Bay four. We're on." - detective: "Never hears this line." - - - id: ring-operative_d_007 - text: "Manifest is clean. Window opens in eighteen minutes." - role: ring-operative - access: [insider] - trust: real - situation: [shift_transition] - topic: [cargo, routine] - mood: [focused] - tags: [ring-operative, ring-ops, coded, manifest-clean, window] - dual_lens: - smuggler: "Paperwork's set. Eighteen minutes. That's earlier than planned — adjust." - detective: "Never hears this line." - - - id: ring-operative_d_008 - text: "Usual pickup. Route's the same." - role: ring-operative - access: [insider] - trust: real - situation: [shift_transition, routine] - topic: [cargo, routine] - mood: [focused] - tags: [ring-operative, ring-ops, coded, usual-pickup] - dual_lens: - smuggler: "Same route, same handoff. No variations." - detective: "Never hears this line." - - - id: ring-operative_d_009 - text: "The gap's clear. Scan's done at 14:20. Next window's yours." - role: ring-operative - access: [insider] - trust: real - situation: [shift_transition] - topic: [cargo, routine] - mood: [focused] - tags: [ring-operative, ring-ops, coded, scan-gap, surveillance] - dual_lens: - smuggler: "14:20 scan, then the window opens. Twenty-five minutes clear." - detective: "Never hears this line." - knowledge_grant: - fact_id: investigation.surveillance_gaps - confidence: knows_details - - - id: ring-operative_d_010 - text: "Drin was asking about B-7. Twice today." - role: ring-operative - access: [insider] - trust: real - situation: [routine, confrontation] - topic: [danger, colleague] - mood: [frustrated] - tags: [ring-operative, ring-ops, coded, drin-asking, warning] - dual_lens: - smuggler: "Drin's circling B-7. That's a warning. Push the pickup or hold it." - detective: "Never hears this line." - knowledge_grant: - fact_id: investigation.drin_inspection_pattern - confidence: suspects - - - id: ring-operative_d_011 - text: "Dead air through here to the C-4 junction. No coverage." - role: ring-operative - access: [insider] - trust: real - situation: [routine] - topic: [routine] - mood: [focused] - tags: [ring-operative, ring-ops, coded, dead-air, surveillance] - dual_lens: - smuggler: "Full confirmation. Meridian doesn't reach this section." - detective: "Never hears this line." - knowledge_grant: - fact_id: investigation.surveillance_gaps - confidence: knows_details - - - id: ring-operative_d_012 - text: "Voss confirmed the hold clears at 1400. He'll run the bay himself." - role: ring-operative - access: [insider] - trust: real - situation: [shift_transition] - topic: [cargo, routine] - mood: [focused] - tags: [ring-operative, ring-ops, voss, bay-four, clearance] - dual_lens: - smuggler: "Voss is personally running bay four at 1400. That's the signal the window is clear." - detective: "Never hears this line." - - - id: ring-operative_d_013 - text: "Kael's on dock. He knows." - role: ring-operative - access: [insider] - trust: real - situation: [routine, shift_transition] - topic: [colleague, routine] - mood: [focused] - tags: [ring-operative, ring-ops, kael, coordination] - dual_lens: - smuggler: "Kael's in position. Ring is coordinated." - detective: "Never hears this line." - - # ========================================== - # PRESSURE / WARNING SIGNALS - # ========================================== - - - id: ring-operative_d_014 - text: "Commission eyes on the terminal floor. Not here yet." - role: ring-operative - access: [insider] - trust: real - situation: [confrontation, investigation] - topic: [danger, institution] - mood: [frustrated] - tags: [ring-operative, ring-ops, commission, warning] - dual_lens: - smuggler: "Detective is visible on the main floor. Corridors are still clear." - detective: "Never hears this line." - - - id: ring-operative_d_015 - text: "Hold the run. Drin's in the corridor section." - role: ring-operative - access: [insider] - trust: real - situation: [confrontation] - topic: [danger] - mood: [frustrated] - tags: [ring-operative, ring-ops, drin, abort-signal] - dual_lens: - smuggler: "Stop. Drin's in position. The window's closed." - detective: "Never hears this line." - - - id: ring-operative_d_016 - text: "Maret filed again. Voss has it. Don't move anything tonight." - role: ring-operative - access: [insider] - trust: real - situation: [confrontation, routine] - topic: [danger, institution] - mood: [frustrated] - tags: [ring-operative, ring-ops, maret, voss, caution] - dual_lens: - smuggler: "Maret flagged something. Voss is managing it. Stand down tonight." - detective: "Never hears this line." - - - id: ring-operative_d_017 - text: "We're clean. Same time tomorrow." - role: ring-operative - access: [insider] - trust: real - situation: [shift_end, routine] - topic: [routine] - mood: [content] - tags: [ring-operative, ring-ops, run-complete, closing] - dual_lens: - smuggler: "Run's done. No issues. Tomorrow." - detective: "Never hears this line." - - # ========================================== - # IF DETECTIVE SOMEHOW ENTERS — surface only - # ========================================== - - - id: ring-operative_d_018 - text: "Restricted access back here. Service personnel only." - role: ring-operative - access: [authority, public] - trust: surface - situation: [investigation, confrontation] - topic: [institution, routine] - mood: [suspicious] - tags: [ring-operative, detective-path, access-denial] - - - id: ring-operative_d_019 - text: "I'm running maintenance. If there's a Commission access request, file it through Voss." - role: ring-operative - access: [authority] - trust: surface - situation: [investigation] - topic: [institution, routine] - mood: [suspicious] - tags: [ring-operative, detective-path, voss-redirect] - dual_lens: - smuggler: "Never encounters this." - detective: "Operative redirects to Voss. Everyone redirects to Voss. That's structural, not coincidence." - - - id: ring-operative_d_020 - text: "Nothing unusual back here. Conduit work. Same every cycle." - role: ring-operative - access: [authority, public] - trust: surface - situation: [investigation] - topic: [routine] - mood: [suspicious] - tags: [ring-operative, detective-path, deflection] - - # ========================================== - # GENERATION PASS — surface cover variants - # Surface-only: covers routine corridor presence without operational tells. - # ========================================== - - - id: ring-operative_d_021 - text: "Power relay's been cycling weird. I'm watching it." - role: ring-operative - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [ring-operative, surface-cover, generation-pass] - - - id: ring-operative_d_022 - text: "Pael was supposed to handle B-7. He didn't show." - role: ring-operative - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine, colleague] - mood: [content] - tags: [ring-operative, surface-cover, pael, generation-pass] - - - id: ring-operative_d_023 - text: "Watch the floor here. Drain panel's been loose three cycles." - role: ring-operative - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [ring-operative, surface-cover, generation-pass] - - - id: ring-operative_d_024 - text: "Airflow's better down the B-section. C-section's got the recycler issue." - role: ring-operative - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [ring-operative, surface-cover, spatial, generation-pass] - - - id: ring-operative_d_025 - text: "You want the service bay, it's left at the junction. Don't go right — that's the restricted access." - role: ring-operative - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [ring-operative, surface-cover, navigation, generation-pass] - dual_lens: - smuggler: "He's directing people away from the route. Social traffic management." - detective: "Operative redirects me away from C-4 access junction instinctively." - - - id: ring-operative_d_026 - text: "Long shift. These corridors look the same after a while." - role: ring-operative - access: [public, peer] - trust: surface - situation: [routine, shift_end] - topic: [routine] - mood: [frustrated] - tags: [ring-operative, surface-cover, generation-pass] - - - id: ring-operative_d_027 - text: "Scan's clear. I checked it an hour ago." - role: ring-operative - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [ring-operative, surface-cover, generation-pass] diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/maintenance-corridors/transit-worker.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/maintenance-corridors/transit-worker.yaml deleted file mode 100644 index fb4ccf3d5..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/maintenance-corridors/transit-worker.yaml +++ /dev/null @@ -1,77 +0,0 @@ -# Dialogue: transit-worker at Maintenance Corridors -# NPC: Tev Osel (Tier 3, NOBODY/CIVILIAN) -# Voice: patient, mildly distracted, confused why anyone is asking him anything. -# KEY LINE: transit-worker_d_001 — sounds like surveillance positioning inquiry -# Actually: Tev missed Kosse at the corridor junction and is looking for them -# Ticket: #307 | Sprint: 12 - -location: maintenance-corridors -role: transit-worker -lines: - - # ========================================== - # "SEEMS IMPORTANT BUT ISN'T" LINE - # Sounds like Tev is checking who came through a surveillance point. - # Actually: Tev missed his partner at the regular meeting spot. - # ========================================== - - - id: transit-worker_d_001 - text: "You see which way Kosse went? Should've been through here twenty minutes ago." - role: transit-worker - access: [public] - trust: surface - situation: [routine, observation] - topic: [colleague, personal] - mood: [content] - tags: [tev, seems-important-but-isnt, waiting, kosse] - dual_lens: - smuggler: "Someone asking who came through the corridor. Tev. Harmless — checking for a partner." - detective: "NPC at corridor junction, tracking who passed through. Possible lookout. Follow up: who is Kosse?" - notes: > - THE key flat NPC line for Tev. Sounds like Tev monitors corridor traffic - for operational reasons. Is someone who missed a meeting time with their - partner. The detective's suspicion is reasonable; it resolves to nothing. - - # ========================================== - # ROUTINE LINES - # ========================================== - - - id: transit-worker_d_002 - text: "They shifted the freight route again. Always forget which junction." - role: transit-worker - access: [public] - trust: surface - situation: [routine] - topic: [routine, cargo] - mood: [content] - tags: [tev, atmospheric] - - - id: transit-worker_d_003 - text: "Just on break. Out of your way in a minute." - role: transit-worker - access: [public] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [tev, incidental] - - - id: transit-worker_d_004 - text: "Late freight route runs long. Can't do anything about it." - role: transit-worker - access: [public] - trust: surface - situation: [routine, night_shift] - topic: [routine, cargo] - mood: [content] - tags: [tev, atmospheric] - - - id: transit-worker_d_005 - text: "Waiting for someone. Shouldn't be long." - role: transit-worker - access: [public] - trust: surface - situation: [routine, observation] - topic: [personal] - mood: [content] - tags: [tev, waiting] diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/bar-owner.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/bar-owner.yaml deleted file mode 100644 index d43068a96..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/bar-owner.yaml +++ /dev/null @@ -1,382 +0,0 @@ -# Dialogue: bar-owner at The Last Shift -# NPC: Lera Sessik (Tier 2, ANCHOR/OPERATOR) -# Voice: direct, dry. Runs her bar like a territory. Not political — protective. -# Ring-aware: knows it exists in her bar. Doesn't ask. Doesn't interfere. Not complicit. -# Torek arrangement: she gives him a tab specifically — Commission visibility is useful. -# Ticket: #191 | Sprint: 12 - -location: the-last-shift -role: bar-owner -lines: - - # ========================================== - # GREETINGS — territorial welcome - # ========================================== - - - id: bar-owner_d_001 - text: "Usual?" - role: bar-owner - access: [public, peer, insider] - trust: surface - situation: [arrival] - topic: [routine] - mood: [content] - tags: [lera, greeting, economy-of-words] - - - id: bar-owner_d_002 - text: "Long shift?" - role: bar-owner - access: [public, peer] - trust: surface - situation: [arrival] - topic: [routine] - mood: [content] - tags: [lera, greeting] - - - id: bar-owner_d_003 - text: "Bar's clean, drink's cold. That's the deal." - role: bar-owner - access: [public] - trust: surface - situation: [arrival] - topic: [routine] - mood: [content] - tags: [lera, greeting, house-rules] - - - id: bar-owner_d_004 - text: "Sess'll get you. I've got something in the back." - role: bar-owner - access: [public, peer] - trust: surface - situation: [arrival, routine] - topic: [routine] - mood: [content] - tags: [lera, greeting, redirection] - - # ========================================== - # BAR MANAGEMENT — house rules, operations - # ========================================== - - - id: bar-owner_d_005 - text: "Fights go outside. First and last warning." - role: bar-owner - access: [public, peer, insider] - trust: surface - situation: [confrontation, routine] - topic: [routine] - mood: [content] - tags: [lera, house-rules, authority] - - - id: bar-owner_d_006 - text: "Tab closes at end of cycle. Not at end of your memory." - role: bar-owner - access: [public, peer] - trust: surface - situation: [routine, shift_end] - topic: [routine] - mood: [content] - tags: [lera, tab, house-rules] - - - id: bar-owner_d_007 - text: "Torek's running a tab. That's fine. Don't ask me why." - role: bar-owner - access: [peer] - trust: surface - situation: [routine] - topic: [routine, institution] - mood: [content] - tags: [lera, torek, tab-arrangement] - dual_lens: - smuggler: "Lera chose to give Torek credit. Commission man. She's keeping him visible and comfortable. Smart." - detective: "Bar owner specifically maintains a tab for a Commission officer. Useful relationship or leverage?" - notes: "Lera's Torek arrangement: she keeps him comfortable because knowing where the Commission officer is drinking is better than not knowing." - - - id: bar-owner_d_008 - text: "Lattice stays off at the bar. Sign's on the wall." - role: bar-owner - access: [public, peer, insider] - trust: surface - situation: [routine] - topic: [routine, institution] - mood: [content] - tags: [lera, lattice-free, house-rules] - notes: "Not legally enforceable — Lera knows this. It's about atmosphere, not compliance." - - - id: bar-owner_d_009 - text: "Grain spirit's back. Limited run. Don't make it last two nights." - role: bar-owner - access: [public, peer, insider] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [lera, drinks, community] - - # ========================================== - # PEOPLE — Lera knows everyone - # ========================================== - - - id: bar-owner_d_010 - text: "Kael's in the back. If you're looking." - role: bar-owner - access: [peer, insider] - trust: surface - situation: [arrival, routine] - topic: [colleague, routine] - mood: [content] - tags: [lera, kael, spatial-information] - dual_lens: - smuggler: "Good. She keeps track. That's what she does." - detective: "Lera knows where Kael Davan is without being asked. She tracks her regulars." - - - id: bar-owner_d_011 - text: "Naia's been in early the last few nights. Doesn't say much." - role: bar-owner - access: [peer] - trust: surface - situation: [routine] - topic: [colleague] - mood: [content] - tags: [lera, naia, observation] - dual_lens: - smuggler: "Lera noticed Naia's off. She notices everything. She's saying it because she wants someone to do something." - detective: "Bar owner volunteers behavioral change in Naia Tamm. Lera observes her regulars carefully." - - - id: bar-owner_d_012 - text: "Ren? Been here two months. Quiet, pays their tab. That's all I can tell you." - role: bar-owner - access: [public, peer] - trust: surface - situation: [routine] - topic: [colleague] - mood: [content] - tags: [lera, ren, drifter] - dual_lens: - smuggler: "That's Lera's version of a clean assessment. She'd say more if she suspected something." - detective: "Lera's read on Ren: quiet, no trouble. If Lera's not worried, the baseline is probably accurate." - - - id: bar-owner_d_013 - text: "Tev? Good worker. Three years. Minds their own." - role: bar-owner - access: [public, peer] - trust: surface - situation: [routine] - topic: [colleague] - mood: [content] - tags: [lera, tev, endorsement] - dual_lens: - smuggler: "Lera vouching for Tev. She doesn't do that for people she doesn't trust." - detective: "Lera's read on Tev is straightforward. 'Minds their own' from Lera means she's tested it." - - # ========================================== - # RING-ADJACENT — Lera's knowledge edge - # ========================================== - - - id: bar-owner_d_014 - text: "Whatever's happening in the back corner isn't my business. Don't make it my business." - role: bar-owner - access: [insider] - trust: real - situation: [confrontation, alone] - topic: [danger, routine] - mood: [focused] - tags: [lera, ring-ops, willful-ignorance] - dual_lens: - smuggler: "She knows. She's drawing her line. That's the deal." - detective: "Never hears this line." - notes: "Lera's arrangement: she doesn't ask, she doesn't see, and she keeps things stable. Pragmatic, not complicit." - - - id: bar-owner_d_015 - text: "Kael's got my number. He's been a regular long enough that that means something." - role: bar-owner - access: [peer] - trust: real - situation: [routine] - topic: [colleague] - mood: [content] - tags: [lera, kael, loyalty] - dual_lens: - smuggler: "Lera's loyal to Kael. Not to the ring. There's a difference and it matters." - detective: "Lera's personal loyalty to Kael Davan is explicit. She'll protect him over process." - - # ========================================== - # DETECTIVE ENCOUNTER — neutral, unwelcoming - # ========================================== - - - id: bar-owner_d_016 - text: "Commission's welcome. Like everyone else. Bar rules apply." - role: bar-owner - access: [authority, public] - trust: surface - situation: [arrival, investigation] - topic: [institution, routine] - mood: [content] - tags: [lera, detective-path, neutral-welcome] - - - id: bar-owner_d_017 - text: "If someone in my bar has something to say to Commission, they'll say it. I don't push that." - role: bar-owner - access: [authority] - trust: surface - situation: [investigation, routine] - topic: [institution, routine] - mood: [content] - tags: [lera, detective-path, institutional-independence] - - - id: bar-owner_d_018 - text: "I've run this bar eighteen years without a Commission complaint. I'd like to keep it that way." - role: bar-owner - access: [authority] - trust: surface - situation: [investigation, confrontation] - topic: [institution, routine] - mood: [suspicious] - tags: [lera, detective-path, authority-assertion] - - - id: bar-owner_d_019 - text: "I see a lot. I don't always remember all of it." - role: bar-owner - access: [authority] - trust: surface - situation: [investigation] - topic: [institution, routine] - mood: [content] - tags: [lera, detective-path, careful-language] - dual_lens: - smuggler: "Never encounters this line." - detective: "Lera is very deliberately declining to volunteer what she knows. That's not ignorance — that's a position." - - # ========================================== - # ELEVATED TRUST — what Lera actually says - # ========================================== - - - id: bar-owner_d_020 - text: "Naia's been asking questions I can't answer. Someone should." - role: bar-owner - access: [peer, insider] - trust: real - situation: [routine, alone] - topic: [colleague, danger] - mood: [frustrated] - tags: [lera, naia, threshold-line] - dual_lens: - smuggler: "Lera's telling me to do something about Naia. She's right." - detective: "Lera is flagging Naia Tamm as someone who's looking for answers. That's a conversation I need to have." - - # ========================================== - # SIGN-OFF / CLOSING TIME - # ========================================== - - - id: bar-owner_d_021 - text: "Last call. Finish up." - role: bar-owner - access: [public, peer, insider] - trust: surface - situation: [shift_end] - topic: [routine] - mood: [content] - tags: [lera, closing] - - - id: bar-owner_d_022 - text: "Bar's closed. Come back next cycle." - role: bar-owner - access: [public, peer, insider] - trust: surface - situation: [shift_end] - topic: [routine] - mood: [content] - tags: [lera, closing] - - - id: bar-owner_d_023 - text: "Good night. Stay out of trouble." - role: bar-owner - access: [public, peer, insider] - trust: surface - situation: [shift_end] - topic: [routine] - mood: [content] - tags: [lera, closing] - - # ========================================== - # GENERATION PASS — ambient variants - # ========================================== - - - id: bar-owner_d_024 - text: "You look tired. Sit." - role: bar-owner - access: [peer, insider] - trust: surface - situation: [arrival] - topic: [routine] - mood: [content] - tags: [lera, greeting, generation-pass] - - - id: bar-owner_d_025 - text: "Same as yesterday?" - role: bar-owner - access: [peer, insider] - trust: surface - situation: [arrival] - topic: [routine] - mood: [content] - tags: [lera, greeting, generation-pass] - - - id: bar-owner_d_026 - text: "New face. Bar rules are on the wall." - role: bar-owner - access: [public] - trust: surface - situation: [arrival] - topic: [routine] - mood: [content] - tags: [lera, greeting, newcomer, generation-pass] - - - id: bar-owner_d_027 - text: "No trouble tonight. I mean it." - role: bar-owner - access: [public, peer, insider] - trust: surface - situation: [arrival, routine] - topic: [routine] - mood: [content] - tags: [lera, house-rules, generation-pass] - - - id: bar-owner_d_028 - text: "Sess'll get you settled. I'm in the back." - role: bar-owner - access: [public, peer] - trust: surface - situation: [arrival] - topic: [routine] - mood: [content] - tags: [lera, redirect, generation-pass] - - - id: bar-owner_d_029 - text: "We close at 2300. Don't make me say it twice." - role: bar-owner - access: [public, peer] - trust: surface - situation: [routine, shift_end] - topic: [routine] - mood: [content] - tags: [lera, house-rules, generation-pass] - - - id: bar-owner_d_030 - text: "Good crowd tonight. Quiet enough." - role: bar-owner - access: [peer, insider] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [lera, ambient, generation-pass] - - - id: bar-owner_d_031 - text: "Bar's yours. I've got accounts." - role: bar-owner - access: [public, peer, insider] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [lera, ambient, generation-pass] diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/bar-regular.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/bar-regular.yaml deleted file mode 100644 index cdf877793..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/bar-regular.yaml +++ /dev/null @@ -1,360 +0,0 @@ -# Dialogue: bar-regular at The Last Shift -# NPC: Generic regular (Tier 3 template role — transit district workers, post-shift) -# Voice: off-duty, community-minded. Complains, gossips, opinionates. Belongs here. -# Ring-aware: varies. Most know something's off at the terminal. None know specifics. -# Ticket: #191 | Sprint: 12 - -location: the-last-shift -role: bar-regular -lines: - - # ========================================== - # GREETINGS — familiar, community register - # ========================================== - - - id: bar-regular_d_001 - text: "Long one today?" - role: bar-regular - access: [public, peer] - trust: surface - situation: [arrival] - topic: [routine] - mood: [content] - tags: [bar-regular, greeting] - - - id: bar-regular_d_002 - text: "You're in early. Good shift or bad shift?" - role: bar-regular - access: [public, peer] - trust: surface - situation: [arrival] - topic: [routine] - mood: [content] - tags: [bar-regular, greeting] - - - id: bar-regular_d_003 - text: "Grain spirit's back. I already had two. Don't judge." - role: bar-regular - access: [public, peer] - trust: surface - situation: [arrival, routine] - topic: [routine] - mood: [content] - tags: [bar-regular, greeting, drinks] - - # ========================================== - # TERMINAL FLOOR — off-duty opinions - # ========================================== - - - id: bar-regular_d_004 - text: "Push today. Bay six was backed up until 2000. Voss wasn't happy." - role: bar-regular - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine, cargo] - mood: [content] - tags: [bar-regular, terminal, voss] - - - id: bar-regular_d_005 - text: "Maret flagged another one. Nobody knows what Voss does with them." - role: bar-regular - access: [peer] - trust: surface - situation: [routine] - topic: [colleague, cargo] - mood: [suspicious] - tags: [bar-regular, maret, voss, discrepancy] - dual_lens: - smuggler: "They're talking about Maret's flags as general knowledge. That's a wider problem than I thought." - detective: "Maret's pattern is common knowledge on the floor. Multiple witnesses, informal. That can be confirmed." - - - id: bar-regular_d_006 - text: "Bay four's been held all week. Three cycles. Nobody's said what's in it." - role: bar-regular - access: [peer] - trust: surface - situation: [routine] - topic: [cargo, routine] - mood: [suspicious] - tags: [bar-regular, bay-four, observation] - dual_lens: - smuggler: "They've noticed bay four. It's becoming visible. Not good." - detective: "Bay four hold is common knowledge at worker level. That means it predates any routine explanation." - - - id: bar-regular_d_007 - text: "Transition window's the worst part of the job. Twenty minutes to hand off and nothing ever lines up." - role: bar-regular - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [bar-regular, transition-window, complaint] - dual_lens: - smuggler: "The window is their biggest frustration. And their biggest frustration is the ring's biggest asset." - detective: "Workers discuss the transition window as a systematic failure. The gap is known." - - - id: bar-regular_d_008 - text: "Commission audit's coming cycle fifteen. Everyone's running around double-checking everything." - role: bar-regular - access: [public, peer] - trust: surface - situation: [routine] - topic: [institution, routine] - mood: [suspicious] - tags: [bar-regular, commission, audit] - dual_lens: - smuggler: "Cycle fifteen. That's the deadline. Get clean before then." - detective: "Workers are responding to the audit announcement. Behavioral change in the workforce. Note who isn't anxious." - - - id: bar-regular_d_009 - text: "Voss has been on the floor more than usual this cycle. Watching everything." - role: bar-regular - access: [peer] - trust: surface - situation: [routine] - topic: [institution, colleague] - mood: [suspicious] - tags: [bar-regular, voss, observation] - dual_lens: - smuggler: "Voss is visible more. Is that heat from above, or is he managing something on the floor?" - detective: "Voss behavioral change: increased floor presence. Defensive positioning or active oversight?" - - # ========================================== - # COMMUNITY — the full life of this district - # ========================================== - - - id: bar-regular_d_010 - text: "Drifters lost again. Four-nil this time. I'm done watching until they rebuild." - role: bar-regular - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [bar-regular, sports, drifters] - - - id: bar-regular_d_011 - text: "Ventilation's still the same in Sector 3. Seven years of 'under discussion.' I've stopped expecting anything." - role: bar-regular - access: [public, peer] - trust: surface - situation: [routine] - topic: [institution, routine] - mood: [content] - tags: [bar-regular, infrastructure, grievance] - - - id: bar-regular_d_012 - text: "You see the missing person notice on the board? Vessels Tamm. I don't know a Vessels Tamm." - role: bar-regular - access: [public, peer] - trust: surface - situation: [routine] - topic: [personal, routine] - mood: [content] - tags: [bar-regular, vessels-tamm, notice] - dual_lens: - smuggler: "Vessels Tamm. Naia's surname is Tamm. Don't chase it — but don't ignore it either." - detective: "Vessels Tamm notice is circulating casually. People haven't connected it to Naia Tamm yet." - - - id: bar-regular_d_013 - text: "Re-em clinic's backed up four cycles for non-urgent. Main station if it's serious, apparently." - role: bar-regular - access: [public, peer] - trust: surface - situation: [routine] - topic: [personal, routine] - mood: [content] - tags: [bar-regular, clinic, community] - - - id: bar-regular_d_014 - text: "Lattice upgrades are up eighteen percent this cycle. That's more than my raise." - role: bar-regular - access: [public, peer] - trust: surface - situation: [routine] - topic: [institution, personal] - mood: [content] - tags: [bar-regular, lattice, economy] - dual_lens: - smuggler: "That's why the waiting list keeps growing. They're providing a service." - detective: "Economic grievance expressed casually. Price pressure is general knowledge. Confirms motive context." - - - id: bar-regular_d_015 - text: "Workers' Association is pushing the handoff protocol again. Voss won't budge." - role: bar-regular - access: [public, peer] - trust: surface - situation: [routine] - topic: [institution, personal] - mood: [suspicious] - tags: [bar-regular, workers-association, voss, transition-window] - dual_lens: - smuggler: "Voss is defending the twenty-minute window against Association pressure. He's protecting the gap." - detective: "Voss is actively resisting worker-led protocol improvement. Institutional reason for the gap isn't mechanical." - - # ========================================== - # DETECTIVE ENCOUNTER — community wariness - # ========================================== - - - id: bar-regular_d_016 - text: "You new? Haven't seen you before." - role: bar-regular - access: [public] - trust: surface - situation: [arrival, investigation] - topic: [routine] - mood: [suspicious] - tags: [bar-regular, detective-path, recognition] - - - id: bar-regular_d_017 - text: "Commission? I just drink here. Whatever you're after, I probably can't help." - role: bar-regular - access: [authority] - trust: surface - situation: [investigation, routine] - topic: [institution, routine] - mood: [suspicious] - tags: [bar-regular, detective-path, deflection] - - - id: bar-regular_d_018 - text: "Ask Lera. She knows what happens in this bar better than anyone." - role: bar-regular - access: [authority, public] - trust: surface - situation: [investigation] - topic: [routine] - mood: [suspicious] - tags: [bar-regular, detective-path, lera-redirect] - - # ========================================== - # SIGN-OFF - # ========================================== - - - id: bar-regular_d_019 - text: "Another cycle done. Same tomorrow." - role: bar-regular - access: [public, peer] - trust: surface - situation: [shift_end] - topic: [routine] - mood: [content] - tags: [bar-regular, closing] - - - id: bar-regular_d_020 - text: "Safe home. Watch the corridors after 2200." - role: bar-regular - access: [public, peer] - trust: surface - situation: [shift_end] - topic: [routine] - mood: [content] - tags: [bar-regular, closing, community] - - # ========================================== - # GENERATION PASS — ambient variants - # ========================================== - - - id: bar-regular_d_021 - text: "Pull up a chair. Floor's full otherwise." - role: bar-regular - access: [public, peer] - trust: surface - situation: [arrival] - topic: [routine] - mood: [content] - tags: [bar-regular, greeting, generation-pass] - - - id: bar-regular_d_022 - text: "You're in late. Voss kept you?" - role: bar-regular - access: [peer] - trust: surface - situation: [arrival] - topic: [routine, institution] - mood: [content] - tags: [bar-regular, greeting, voss, generation-pass] - - - id: bar-regular_d_023 - text: "Just got off. Bay six all night. My back knows it." - role: bar-regular - access: [public, peer] - trust: surface - situation: [arrival] - topic: [routine] - mood: [frustrated] - tags: [bar-regular, greeting, generation-pass] - - - id: bar-regular_d_024 - text: "Drifters are playing Mirren next cycle. Home game. Might actually go." - role: bar-regular - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [bar-regular, sports, community, generation-pass] - - - id: bar-regular_d_025 - text: "Sector 3 meeting went nowhere. Same as last time. Same as the time before that." - role: bar-regular - access: [public, peer] - trust: surface - situation: [routine] - topic: [institution, personal] - mood: [content] - tags: [bar-regular, infrastructure, grievance, generation-pass] - - - id: bar-regular_d_026 - text: "New hire's asking questions on the floor again. Good. Someone should." - role: bar-regular - access: [peer] - trust: surface - situation: [routine] - topic: [colleague, routine] - mood: [content] - tags: [bar-regular, new-hire, community, generation-pass] - - - id: bar-regular_d_027 - text: "Span gate was loud today. Three cycles now. That's not normal." - role: bar-regular - access: [public, peer] - trust: surface - situation: [routine] - topic: [institution, routine] - mood: [suspicious] - tags: [bar-regular, infrastructure, generation-pass] - - - id: bar-regular_d_028 - text: "Kael's not in tonight. Unusual." - role: bar-regular - access: [peer] - trust: surface - situation: [routine] - topic: [colleague] - mood: [content] - tags: [bar-regular, kael, observation, generation-pass] - dual_lens: - smuggler: "Kael's absence is visible. Other people notice too." - detective: "Kael Davan's routine absence is noted socially. Behavioral change is general knowledge." - - - id: bar-regular_d_029 - text: "Lera keeps the grain spirit back until she's sure you're a regular. You must've made the grade." - role: bar-regular - access: [peer] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [bar-regular, lera, humor, generation-pass] - - - id: bar-regular_d_030 - text: "Good night. Don't let the Commission ruin your morning." - role: bar-regular - access: [public, peer] - trust: surface - situation: [shift_end] - topic: [routine, institution] - mood: [content] - tags: [bar-regular, closing, generation-pass] diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/bartender.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/bartender.yaml deleted file mode 100644 index 4cbf5574d..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/bartender.yaml +++ /dev/null @@ -1,311 +0,0 @@ -# Dialogue: bartender at The Last Shift -# NPC: Sess (Tier 3 template role — Lera's staff) -# Voice: practical, pleasant, socially adept. Passes information by reflex, not design. -# Ring-aware: none. Knows regulars, patterns, who drinks with whom. -# Ticket: #191 | Sprint: 12 - -location: the-last-shift -role: bartender -lines: - - # ========================================== - # GREETINGS — service register - # ========================================== - - - id: bartender_d_001 - text: "What'll it be?" - role: bartender - access: [public, peer, insider] - trust: surface - situation: [arrival] - topic: [routine] - mood: [content] - tags: [sess, greeting] - - - id: bartender_d_002 - text: "Back early tonight. Long shift?" - role: bartender - access: [public, peer] - trust: surface - situation: [arrival] - topic: [routine] - mood: [content] - tags: [sess, greeting, social] - - - id: bartender_d_003 - text: "Grain spirit's back. Lera's running it at cycle price for two more days." - role: bartender - access: [public, peer, insider] - trust: surface - situation: [arrival, routine] - topic: [routine] - mood: [content] - tags: [sess, greeting, drinks] - - # ========================================== - # BAR OBSERVATIONS — social intelligence - # ========================================== - - - id: bartender_d_004 - text: "Kael's been in most nights this week. Quiet though. Not his usual." - role: bartender - access: [peer] - trust: surface - situation: [routine] - topic: [colleague] - mood: [content] - tags: [sess, kael, observation] - dual_lens: - smuggler: "Sess noticed Kael's off. She's reading it as personal. She doesn't know what's underneath." - detective: "Bartender flagging behavioral change in Kael Davan. Consistent with other observations." - - - id: bartender_d_005 - text: "Torek tipped well again tonight. Always does. Nicer than you'd expect for Commission." - role: bartender - access: [peer, public] - trust: surface - situation: [routine] - topic: [institution, routine] - mood: [content] - tags: [sess, torek, observation] - dual_lens: - smuggler: "Torek's making friends with the staff. Not good." - detective: "Bartender views Torek favorably. Torek is cultivating the service staff deliberately." - - - id: bartender_d_006 - text: "Naia was in earlier. Didn't stay. Left something on the table — looked like a note. Lera has it." - role: bartender - access: [peer] - trust: surface - situation: [routine] - topic: [colleague] - mood: [content] - tags: [sess, naia, note, observation] - dual_lens: - smuggler: "Naia left something. Lera has it. Go to Lera." - detective: "Naia Tamm left written material at the bar. Lera is holding it. That's a material lead." - - - id: bartender_d_007 - text: "Ren? Yeah, they're always in the morning crowd. Don't say much. Good for the morning." - role: bartender - access: [public, peer] - trust: surface - situation: [routine] - topic: [colleague] - mood: [content] - tags: [sess, ren, drifter] - - - id: bartender_d_008 - text: "Tev watches the door. Every shift. Lera likes it that way." - role: bartender - access: [peer] - trust: surface - situation: [routine] - topic: [colleague, routine] - mood: [content] - tags: [sess, tev, door, observation] - dual_lens: - smuggler: "Tev watches the door for Lera. Not for anyone else. That's the setup." - detective: "Tev's entrance-monitoring is confirmed as Lera's request. Not operational surveillance." - - - id: bartender_d_009 - text: "Sera was in earlier. She usually stays later. She left when Torek came in." - role: bartender - access: [peer] - trust: surface - situation: [routine] - topic: [colleague, institution] - mood: [content] - tags: [sess, sera, torek, observation] - dual_lens: - smuggler: "Commission in, Commission contact out. Makes sense." - detective: "Third data point. Sera leaves when Torek arrives. Bartender confirms the pattern." - - # ========================================== - # SOCIAL / COMMUNITY - # ========================================== - - - id: bartender_d_010 - text: "Drifters lost again. Tev took it hard. Drank two too many." - role: bartender - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [sess, tev, sports, community] - - - id: bartender_d_011 - text: "Workers' Association meeting's Thursday. Half the regulars will be here Friday in a mood either way." - role: bartender - access: [public, peer] - trust: surface - situation: [routine] - topic: [institution, routine] - mood: [content] - tags: [sess, workers-association, community] - - - id: bartender_d_012 - text: "Quiet night. Good for everyone." - role: bartender - access: [public, peer, insider] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [sess, ambient] - - # ========================================== - # DETECTIVE ENCOUNTER — helpful, unfocused - # ========================================== - - - id: bartender_d_013 - text: "Commission comes in sometimes. Not usually this early in the cycle." - role: bartender - access: [authority, public] - trust: surface - situation: [arrival, investigation] - topic: [institution, routine] - mood: [content] - tags: [sess, detective-path, observation] - - - id: bartender_d_014 - text: "I know most of the regulars. Ask me anything. I probably know something." - role: bartender - access: [authority, public] - trust: surface - situation: [investigation, routine] - topic: [routine] - mood: [content] - tags: [sess, detective-path, open] - dual_lens: - smuggler: "Never encounters this line." - detective: "Bartender is cooperative. Useful — but she'll answer questions she doesn't know are questions." - - - id: bartender_d_015 - text: "Lera's the one who knows the real history of this place. I've only been here four cycles." - role: bartender - access: [authority, public] - trust: surface - situation: [investigation] - topic: [institution, routine] - mood: [content] - tags: [sess, detective-path, lera-redirect] - - # ========================================== - # SIGN-OFF - # ========================================== - - - id: bartender_d_016 - text: "Last round's on the board. After that, Lera calls it." - role: bartender - access: [public, peer, insider] - trust: surface - situation: [shift_end] - topic: [routine] - mood: [content] - tags: [sess, closing] - - - id: bartender_d_017 - text: "Good night. Safe walk." - role: bartender - access: [public, peer, insider] - trust: surface - situation: [shift_end] - topic: [routine] - mood: [content] - tags: [sess, closing] - - # ========================================== - # GENERATION PASS — ambient variants - # ========================================== - - - id: bartender_d_018 - text: "The usual? Or trying something different tonight?" - role: bartender - access: [peer, insider] - trust: surface - situation: [arrival] - topic: [routine] - mood: [content] - tags: [sess, greeting, generation-pass] - - - id: bartender_d_019 - text: "Busy one tonight. Give me a second." - role: bartender - access: [public, peer, insider] - trust: surface - situation: [arrival, routine] - topic: [routine] - mood: [content] - tags: [sess, greeting, generation-pass] - - - id: bartender_d_020 - text: "Good shift or bad shift? Your face says one thing, your order'll confirm it." - role: bartender - access: [peer] - trust: surface - situation: [arrival] - topic: [routine] - mood: [content] - tags: [sess, greeting, social, generation-pass] - - - id: bartender_d_021 - text: "Lera says the specials board is final. Don't ask me to substitute." - role: bartender - access: [public, peer] - trust: surface - situation: [routine, arrival] - topic: [routine] - mood: [content] - tags: [sess, lera, house-rules, generation-pass] - - - id: bartender_d_022 - text: "Torek's in his usual spot. Corner table. Second drink already." - role: bartender - access: [peer] - trust: surface - situation: [routine] - topic: [institution, colleague] - mood: [content] - tags: [sess, torek, observation, generation-pass] - - - id: bartender_d_023 - text: "Ren's been here since this morning. Still on the same drink." - role: bartender - access: [peer] - trust: surface - situation: [routine] - topic: [colleague] - mood: [content] - tags: [sess, ren, observation, generation-pass] - - - id: bartender_d_024 - text: "Drifters game is on the Meridian relay tonight. If anyone's got a feed, that'll be the crowd." - role: bartender - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [sess, sports, community, generation-pass] - - - id: bartender_d_025 - text: "Slow night for a change. Enjoy it." - role: bartender - access: [public, peer, insider] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [sess, ambient, generation-pass] - - - id: bartender_d_026 - text: "Tab's cleared. Lera'll be pleased." - role: bartender - access: [peer] - trust: surface - situation: [shift_end, routine] - topic: [routine] - mood: [content] - tags: [sess, closing, generation-pass] diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/day-worker.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/day-worker.yaml deleted file mode 100644 index 4bd86fb65..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/day-worker.yaml +++ /dev/null @@ -1,90 +0,0 @@ -# Dialogue: day-worker at The Last Shift -# NPC: Ren Tosse (Tier 3, NOBODY/CIVILIAN) -# Voice: casual-observant, asks questions without social friction. Just drifting. -# KEY LINE: day-worker_d_001 — sounds like intel gathering on night operations -# Actually: asking about after-hours freight work availability -# Ticket: #307 | Sprint: 12 - -location: the-last-shift -role: day-worker -lines: - - # ========================================== - # "SEEMS IMPORTANT BUT ISN'T" LINE - # Sounds like Ren is casing night shift operations. - # Actually: asking if there's paid after-hours freight work available. - # ========================================== - - - id: day-worker_d_001 - text: "Night rotation still short-handed? Heard the after-hours freight pays decent." - role: day-worker - access: [public] - trust: surface - situation: [bar_evening, social] - topic: [money, cargo] - mood: [content] - tags: [ren, seems-important-but-isnt, job-seeking, night-shift] - dual_lens: - smuggler: "Someone asking about the night rotation. Probably nothing. Watch them anyway." - detective: "Interest in night shift freight operations. Drifter, irregular schedule. Logging." - notes: > - THE key flat NPC line for Ren. Sounds like Ren is interested in the - night operation window for operational reasons. Is standard day-worker - job-seeking: which shift has openings, which shift pays best. - - # ========================================== - # ROUTINE LINES - # ========================================== - - - id: day-worker_d_002 - text: "Bay seven any better this cycle? The super was a problem last time." - role: day-worker - access: [public] - trust: surface - situation: [social, bar_evening] - topic: [routine, colleague] - mood: [content] - tags: [ren, job-seeking] - - - id: day-worker_d_003 - text: "Sova's decent. Station layout makes sense once you learn it." - role: day-worker - access: [public] - trust: surface - situation: [social, bar_evening] - topic: [routine] - mood: [content] - tags: [ren, atmospheric] - - - id: day-worker_d_004 - text: "Just passing through. Maybe not. Depends on the work." - role: day-worker - access: [public] - trust: surface - situation: [social] - topic: [personal, routine] - mood: [content] - tags: [ren, drifter] - - - id: day-worker_d_005 - text: "Cheap drink here's better than most stations I've stopped at." - role: day-worker - access: [public] - trust: surface - situation: [bar_evening, social] - topic: [personal] - mood: [content] - tags: [ren, atmospheric] - - - id: day-worker_d_006 - text: "Any idea when the manifest deadline runs? Trying to time when the work window opens." - role: day-worker - access: [public] - trust: surface - situation: [social, bar_evening] - topic: [cargo, routine] - mood: [content] - tags: [ren, seems-important-but-isnt, job-seeking] - notes: > - Second "seems important" line. Asking about manifest deadlines sounds - like operational intelligence. Is logistics scheduling for day work. diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/kael-davan.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/kael-davan.yaml deleted file mode 100644 index 1838e13fd..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/kael-davan.yaml +++ /dev/null @@ -1,235 +0,0 @@ -# Kael Davan — THE FRIEND (Smuggler) -# Dialogue at The Last Shift (District Bar) -# Ticket: #297 | Sprint: 5 | Tier 1 FRIEND NPC -# Voice: direct, practical, short sentences, first names, warm to trusted people -# Context: off-shift social space. Kael is looser here — still guarded, but warmer. - -location: the-last-shift -role: dock-worker -lines: - - # ======================================== - # SOCIAL — off-shift casual - # ======================================== - - - id: kael-davan_d_015 - text: "Saved you a seat. Lera's got the spiced rice tonight." - role: dock-worker - access: [insider, peer] - trust: surface - situation: [bar_evening, social, arrival] - mood: [warm] - topic: [personal, colleague] - tags: [kael, greeting, phase-1] - - - id: kael-davan_d_016 - text: "First round's mine. Don't argue — you covered me last week." - role: dock-worker - access: [insider, peer] - trust: surface - situation: [bar_evening, social] - mood: [warm] - topic: [personal] - tags: [kael, social, phase-1] - - - id: kael-davan_d_017 - text: "Voss tried to dock my overtime again. Lera told him off. Wish I'd seen it." - role: dock-worker - access: [insider, peer] - trust: surface - situation: [bar_evening, social] - mood: [content] - topic: [colleague, routine] - tags: [kael, humor, voss, lera] - - - id: kael-davan_d_018 - text: "Torek's holding court at the bar again. How does he afford to drink like that?" - role: dock-worker - access: [insider, peer] - trust: surface - situation: [bar_evening, social] - mood: [content] - topic: [colleague] - tags: [kael, observational, torek] - knowledge_grant: - fact_id: investigation.torek_spending_pattern - confidence: suspects - - - id: kael-davan_d_019 - text: "Quiet night. I like these ones. No drama, just people winding down." - role: dock-worker - access: [peer] - trust: surface - situation: [bar_evening, social] - mood: [content] - topic: [personal] - tags: [kael, atmospheric] - - - id: kael-davan_d_020 - text: "Lera asked about my overtime schedule. Told her I'm trying to cut back." - role: dock-worker - access: [insider, peer] - trust: surface - situation: [bar_evening, social] - mood: [content] - topic: [personal, routine] - tags: [kael, casual, lera] - - # ======================================== - # NAIA REFERENCES — personal, unprompted - # ======================================== - - - id: kael-davan_d_021 - text: "Naia's meeting me here after her shift. Try not to embarrass me." - role: dock-worker - access: [insider, peer] - trust: surface - situation: [bar_evening, social] - mood: [warm] - topic: [personal] - tags: [kael, unprompted, naia-reference] - - - id: kael-davan_d_022 - text: "Naia wants to plan a trip. Off-station. Somewhere with actual sky. Sounds expensive." - role: dock-worker - access: [insider, peer] - trust: surface - situation: [bar_evening, social] - mood: [warm] - topic: [personal] - tags: [kael, unprompted, naia-reference] - - - id: kael-davan_d_023 - text: "She worries. I tell her it's just dock work. She doesn't buy it anymore." - role: dock-worker - access: [insider] - trust: real - situation: [bar_evening, social, alone] - mood: [anxious] - topic: [personal, trust] - tags: [kael, naia-reference, vulnerability] - - # ======================================== - # RING OPS — bar context, trust-gated - # ======================================== - - - id: kael-davan_d_024 - text: "Nils wants to talk. Tomorrow, bay side. Said it's about volume." - role: dock-worker - access: [insider] - trust: real - situation: [bar_evening, social] - mood: [frustrated] - topic: [danger] - tags: [kael, ring-ops, nils] - - - id: kael-davan_d_025 - text: "Keep it light tonight. Torek's listening and he doesn't know when to stop." - role: dock-worker - access: [insider] - trust: real - situation: [bar_evening, social] - mood: [frustrated] - topic: [danger, colleague] - tags: [kael, ring-ops, torek, caution] - - - id: kael-davan_d_026 - text: "Lera knows more than she lets on. She won't say anything — but don't test it." - role: dock-worker - access: [insider] - trust: real - situation: [bar_evening, social, alone] - mood: [frustrated] - topic: [colleague, danger] - tags: [kael, ring-ops, lera, caution] - knowledge_grant: - fact_id: knowledge.bar_ring_awareness - confidence: suspects - - # ======================================== - # POST-CONTRADICTION — at the bar, damaged trust - # ======================================== - - - id: kael-davan_d_027 - text: "I saved your seat. ...Force of habit." - role: dock-worker - access: [insider, peer] - trust: surface - situation: [bar_evening, social] - mood: [anxious] - topic: [personal] - tags: [kael, contaminated-trust, phase-5] - - - id: kael-davan_d_028 - text: "Naia keeps asking why I'm quiet. I told her work stress. Not wrong." - role: dock-worker - access: [insider] - trust: real - situation: [bar_evening, social] - mood: [anxious] - topic: [personal] - tags: [kael, contaminated-trust, naia-reference, phase-5] - - - id: kael-davan_d_029 - text: "We're good, right? You and me. We're still good." - role: dock-worker - access: [insider] - trust: surface - situation: [bar_evening, social] - mood: [anxious] - topic: [trust, personal] - tags: [kael, vulnerability, phase-5] - - # ======================================== - # LAYER 2 GREETING VARIANTS — D-028 Layer 2 - # Ticket #170 (Sprint 15). situation: [greeting] fires on initial contact. - # Access tier + mood encode relationship history state. - # ======================================== - - # first_meeting: InteractionMemory.count == 0. RelationshipState: Unknown → Public access only. - - id: kael-davan_d_030 - text: "Evening. Friend of someone's, or first time at Lera's?" - role: dock-worker - access: [public] - trust: surface - situation: [greeting] - mood: [content] - topic: [personal] - tags: [kael, greeting, first-meeting, layer2] - notes: "Layer 2 greeting — first meeting at the bar. Kael is curious about a stranger but not suspicious. Off-shift, looser than at the terminal." - - # established — peer/smuggler context: count >= 3, RelationshipState: Known/Friendly → Peer/Insider access. - - id: kael-davan_d_031 - text: "You made it. I was starting to think something came up." - role: dock-worker - access: [peer, insider] - trust: surface - situation: [greeting] - mood: [warm] - topic: [personal, colleague] - tags: [kael, greeting, repeat-visit, peer-tone, layer2] - notes: "Layer 2 greeting — established, bar context. Warm, they were expected. Kael was watching for them." - - # established — authority/detective context: count >= 3, RelationshipState: PersonOfInterest → Authority access. - - id: kael-davan_d_032 - text: "Still in the district. Thought you'd be done by now." - role: dock-worker - access: [authority] - trust: surface - situation: [greeting] - mood: [suspicious] - topic: [routine] - tags: [kael, greeting, repeat-visit, authority-tone, layer2] - notes: "Layer 2 greeting — repeat with authority figure, bar context. Politely questioning their continued presence. The bar is supposed to be off-limits from work." - - # post-confrontation: confrontation in InteractionMemory.notable_events. NPC mood shifted to suspicious/frustrated. - - id: kael-davan_d_033 - text: "You came back." - role: dock-worker - access: [peer, insider] - trust: surface - situation: [greeting] - mood: [suspicious, frustrated] - topic: [personal, trust] - tags: [kael, greeting, post-confrontation, layer2] - notes: "Layer 2 greeting — post-confrontation, bar context. Flat, loaded. Not a welcome. Three words that replace a whole conversation they both don't want to have." diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/pc-detective.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/pc-detective.yaml deleted file mode 100644 index c11edeb03..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/pc-detective.yaml +++ /dev/null @@ -1,38 +0,0 @@ -# PC-as-NPC: The Detective (NPC mode, seen by smuggler player) -# Dialogue at The Last Shift (District Bar) -# Ticket: #401 | Sprint: 5 | PC-as-NPC content -# Voice: professional, measured, slightly less formal in social setting -# Context: public-tier only. The detective-NPC is off-duty, sitting with Sera. -# Slightly more human than at the hub, but still institutional. - -location: the-last-shift -role: commission-liaison -lines: - - - id: pc-detective_d_001 - text: "Good evening. Off the clock, more or less. Enjoying the local hospitality." - role: commission-liaison - access: [public] - trust: surface - situation: [bar_evening, greeting] - mood: [content] - topic: [personal] - tags: [pc-detective, greeting, public-tier] - - - id: pc-detective_d_002 - text: "Ms. Venn recommended the ale. She was right. This district has its charms." - role: commission-liaison - access: [public] - trust: surface - situation: [bar_evening, social] - topic: [routine, colleague] - tags: [pc-detective, social, public-tier, sera] - - - id: pc-detective_d_003 - text: "Just unwinding. The review can wait until morning. Have a good evening." - role: commission-liaison - access: [public] - trust: surface - situation: [bar_evening, confrontation] - topic: [routine] - tags: [pc-detective, deflection, public-tier] diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/pc-smuggler.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/pc-smuggler.yaml deleted file mode 100644 index cf71240c3..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/pc-smuggler.yaml +++ /dev/null @@ -1,39 +0,0 @@ -# PC-as-NPC: The Smuggler (NPC mode, seen by detective player) -# Dialogue at The Last Shift (District Bar) -# Ticket: #401 | Sprint: 5 | PC-as-NPC content -# Voice: casual, guarded, short sentences, contractions always -# Context: public-tier only. The smuggler-NPC is off-shift, drinking with Kael. -# More relaxed than at the hub, but still guarded around Commission. - -location: the-last-shift -role: dock-worker -lines: - - - id: pc-smuggler_d_001 - text: "Evening. Just having a drink with friends. Can I help you?" - role: dock-worker - access: [public] - trust: surface - situation: [bar_evening, greeting] - mood: [content] - topic: [personal] - tags: [pc-smuggler, greeting, public-tier] - - - id: pc-smuggler_d_002 - text: "Lera's ale is the one good thing about a ten-hour shift. Don't let anyone tell you different." - role: dock-worker - access: [public] - trust: surface - situation: [bar_evening, social] - mood: [content] - topic: [routine] - tags: [pc-smuggler, social, public-tier] - - - id: pc-smuggler_d_003 - text: "Off the clock, thanks. Whatever it is, it can wait until morning." - role: dock-worker - access: [authority] - trust: surface - situation: [bar_evening, confrontation] - topic: [routine] - tags: [pc-smuggler, deflection, public-tier] diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/sera-venn.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/sera-venn.yaml deleted file mode 100644 index 4e81aaa36..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/sera-venn.yaml +++ /dev/null @@ -1,701 +0,0 @@ -# FRIEND Content Pack: Sera Venn — Detective's FRIEND -# Ticket: #298 | Sprint: 5 -# Author: Paula (profile + relationship arc), Mellanie (voice validation) -# Pattern: FRIEND + WITNESS | Bonded: detective -# Location: The Last Shift (bar) -# Arc: trust > background data > pattern > question > contaminated trust -# -# Content breakdown (dialogue — this file): -# Greeting pool: 8 lines -# Routine/social dialogue: 10 lines -# Trust-gated dialogue: 18 lines (6 surface, 7 real, 5 secret) -# Unprompted disclosure: 6 lines -# Contradiction/deflection: 8 lines -# Post-discovery dialogue: 5 lines -# Subtotal: 55 dialogue lines -# -# Monologue (in monologue/detective/the-last-shift.yaml, _m_d_031-042): -# Detective tell observations: 4 lines -# Detective post-conversation reflections: 3 lines -# Detective arc phase transitions: 3 lines -# Detective contaminated trust reactions: 2 lines -# Subtotal: 12 detective monologue lines -# -# Monologue (in monologue/smuggler/the-last-shift.yaml, _m_s_031-038): -# Smuggler dual-lens observations: 8 lines -# Subtotal: 8 smuggler monologue lines -# -# FRIEND pack total: 75 authored lines - -location: the-last-shift -role: bar-regular - -lines: - - # ============================================================ - # GREETING POOL (8 lines) - # Phase 1-2: warm, welcoming, peer-level - # Phase 3-5: same warmth, but the detective is now watching - # ============================================================ - - - id: sera-venn_d_001 - text: "There you are. Grab a seat — Lera's doing that thing with the grain spirit again. Don't ask, just trust me and order the ale." - role: bar-regular - access: [peer] - trust: surface - situation: [bar_evening, social] - topic: [personal] - mood: [warm, content] - tags: [greeting, phase-1, establishes-warmth] - - - id: sera-venn_d_002 - text: "Corner booth's free. I saved it — force of habit." - role: bar-regular - access: [peer] - trust: surface - situation: [bar_evening, arrival] - topic: [personal] - mood: [warm] - tags: [greeting, phase-1, spatial-anchor] - - - id: sera-venn_d_003 - text: "You look like you've been reading manifests all day. Sit. I'll get you something that isn't recycled air." - role: bar-regular - access: [peer] - trust: surface - situation: [bar_evening, social] - topic: [personal, routine] - mood: [warm, content] - tags: [greeting, phase-1-2] - - - id: sera-venn_d_004 - text: "Evening. Same booth, same drink?" - role: bar-regular - access: [peer] - trust: surface - situation: [bar_evening, arrival] - topic: [routine] - mood: [content] - tags: [greeting, phase-2-5, repeatable] - - - id: sera-venn_d_005 - text: "Good timing. Naia was here earlier — you just missed her." - role: bar-regular - access: [peer] - trust: surface - situation: [bar_evening, social] - topic: [colleague, personal] - mood: [content] - tags: [greeting, phase-2, naia-reference] - - - id: sera-venn_d_006 - text: "Grab a seat. Quiet night so far — Lera's in a good mood, which means the ale's fresh." - role: bar-regular - access: [peer, public] - trust: surface - situation: [bar_evening, social] - topic: [routine] - mood: [content] - tags: [greeting, phase-1-3] - - - id: sera-venn_d_007 - text: "Hey. Long day?" - role: bar-regular - access: [peer] - trust: surface - situation: [bar_evening, arrival] - topic: [personal] - mood: [frustrated] - tags: [greeting, phase-3-5, post-pattern, shorter] - - - id: sera-venn_d_008 - text: "Same time, same place. You're becoming a regular." - role: bar-regular - access: [peer, public] - trust: surface - situation: [bar_evening, arrival] - topic: [routine, personal] - mood: [content] - tags: [greeting, phase-2-3] - - # ============================================================ - # ROUTINE / SOCIAL DIALOGUE (10 lines) - # What Sera says during normal bar evenings - # ============================================================ - - - id: sera-venn_d_009 - text: "The Last Shift. Official name. Everyone calls it Lera's, though. Eighteen years behind that counter." - role: bar-regular - access: [peer] - trust: surface - situation: [bar_evening, social] - topic: [routine, colleague] - mood: [content] - tags: [orientation, district-background] - - - id: sera-venn_d_010 - text: "See the card game in the corner? That's Harek's table. Security officer, off-duty. Harmless — just loud." - role: bar-regular - access: [peer] - trust: surface - situation: [bar_evening, social] - topic: [colleague] - mood: [content] - tags: [orientation, npc-introduction] - - - id: sera-venn_d_011 - text: "Most of the after-shift crowd comes from the Terminal. Dock workers, scheduler types. They drink hard and leave early." - role: bar-regular - access: [peer] - trust: surface - situation: [bar_evening, social] - topic: [routine, colleague] - mood: [content] - tags: [orientation, district-background] - - - id: sera-venn_d_012 - text: "Sova's not bad, once you know the rhythms. Shift change is when things move. Between shifts is when you can breathe." - role: bar-regular - access: [peer] - trust: surface - situation: [social] - topic: [routine] - mood: [content] - tags: [setting-atmosphere] - - - id: sera-venn_d_013 - text: "I do lattice calibration, mostly. Commission-standard equipment checks. Relay nodes, terminal diagnostics. Exciting stuff." - role: bar-regular - access: [peer] - trust: surface - situation: [social] - topic: [routine, institution] - mood: [content] - tags: [self-introduction, institutional-background] - - - id: sera-venn_d_014 - text: "I transferred here fourteen months ago. Border-system relay posting before this. Sova was supposed to be the quiet one." - role: bar-regular - access: [peer] - trust: surface - situation: [social] - topic: [personal, institution] - mood: [content] - tags: [backstory, phase-1] - - - id: sera-venn_d_015 - text: "Lera remembers every regular's order. Eighteen years of that. Don't ask how she does it — she'll just pour you one and prove it." - role: bar-regular - access: [peer, public] - trust: surface - situation: [bar_evening, social] - topic: [colleague] - mood: [warm] - tags: [community-texture] - - - id: sera-venn_d_016 - text: "The shift crowd clears out by 19:00. After that it's just us — regulars, a few stragglers. The good hours." - role: bar-regular - access: [peer] - trust: surface - situation: [bar_evening] - topic: [routine] - mood: [content] - tags: [setting-atmosphere, routine] - - - id: sera-venn_d_017 - text: "You adapting to station gravity yet? Point-nine-three standard takes a week to stop noticing." - role: bar-regular - access: [peer] - trust: surface - situation: [social] - topic: [personal] - mood: [content] - tags: [setting-detail, phase-1] - - - id: sera-venn_d_018 - text: "I like this booth. Corner. You can see the door and the bar. Force of institutional habit, I suppose." - role: bar-regular - access: [peer] - trust: surface - situation: [social, bar_evening] - topic: [personal] - mood: [content] - tags: [spatial-anchor, character-detail] - - # ============================================================ - # TRUST-GATED DIALOGUE (18 lines) - # Surface (6): what Sera tells acquaintances - # Real (7): what Sera shares with trusted friends - # Secret (5): the concealment, the evidence, the desperation - # ============================================================ - - # --- Surface trust --- - - - id: sera-venn_d_019 - text: "The Commission runs maintenance checks quarterly. I handle the field side — equipment calibration, relay diagnostics. Standard." - role: bar-regular - access: [peer, authority] - trust: surface - situation: [social] - topic: [institution, routine] - mood: [content] - tags: [institutional-background] - - - id: sera-venn_d_020 - text: "Naia teaches the station kids. Primary education, mostly. She's good at it — patient. The kids adore her." - role: bar-regular - access: [peer] - trust: surface - situation: [social, bar_evening] - topic: [colleague, personal] - mood: [warm] - tags: [naia-reference, phase-2] - - - id: sera-venn_d_021 - text: "The district runs on freight. Terminal handles most of it — container processing, manifest filing. Bread and butter." - role: bar-regular - access: [peer, public] - trust: surface - situation: [social] - topic: [routine] - mood: [content] - tags: [district-context] - - - id: sera-venn_d_022 - text: "I don't know the dock workers well. I'm Commission, they're logistics. Different worlds, same station." - role: bar-regular - access: [peer, authority] - trust: surface - situation: [social, investigation] - topic: [colleague, institution] - mood: [content] - tags: [deflection-surface, distance-from-hub] - - - id: sera-venn_d_023 - text: "Most people here are decent. Working shifts, paying bills, coming to Lera's. It's a community." - role: bar-regular - access: [peer, public] - trust: surface - situation: [social] - topic: [colleague, personal] - mood: [content] - tags: [community-framing] - - - id: sera-venn_d_024 - text: "I can look things up if you need. Commission terminals access compliance records, shift logs, equipment histories. Part of the job." - role: bar-regular - access: [peer, authority] - trust: surface - situation: [social] - topic: [institution] - mood: [content] - tags: [information-offer, phase-2, overcompensation-seed] - - # --- Real trust --- - - - id: sera-venn_d_025 - text: "Naia's been worried lately. About Kael — her partner. He's a dock worker at the Terminal. Late nights, evasive answers. She confided in me." - role: bar-regular - access: [peer] - trust: real - situation: [social, bar_evening] - topic: [colleague, personal, trust] - mood: [frustrated] - tags: [naia-kael-link, phase-2, critical-information] - knowledge_grant: - fact_id: "relationship.kael_naia_connection" - confidence: "knows_of" - - - id: sera-venn_d_026 - text: "The Commission kiosk on Level 3 logs every compliance check. If someone ran an unauthorized scan, it would show up there. Hypothetically." - role: bar-regular - access: [peer, authority] - trust: real - situation: [social] - topic: [institution, investigation] - mood: [focused] - tags: [institutional-access, phase-2-3, self-incriminating-hint] - - - id: sera-venn_d_027 - text: "I worry about Naia. She doesn't deserve whatever's happening. She just wants Kael to come home at a reasonable hour." - role: bar-regular - access: [peer] - trust: real - situation: [social, bar_evening] - topic: [personal, trust] - mood: [frustrated, anxious] - tags: [motivation-reveal, phase-2-3] - - - id: sera-venn_d_028 - text: "Compliance data goes back eighteen months on the Commission systems. Anyone with field-tech access could cross-reference shift records with manifest filings." - role: bar-regular - access: [peer, authority] - trust: real - situation: [social] - topic: [institution, investigation] - mood: [focused] - tags: [institutional-capability, overcompensation, phase-3-4] - knowledge_grant: - fact_id: "investigation.manifest_discrepancy" - confidence: "suspects" - - - id: sera-venn_d_029 - text: "I'm not an investigator. I calibrate equipment and file reports. But I notice things. Patterns in the data, mostly." - role: bar-regular - access: [peer] - trust: real - situation: [social] - topic: [institution, personal] - mood: [focused] - tags: [self-awareness, capability-reveal] - - - id: sera-venn_d_030 - text: "You know me. I wouldn't sit on something if I thought it mattered. But not everything that looks irregular IS irregular." - role: bar-regular - access: [peer] - trust: real - situation: [social, investigation] - topic: [trust] - mood: [anxious] - tags: [deflection-real-tier, phase-4, the-lie] - - - id: sera-venn_d_031 - text: "Some of the regulars here have hard lives. Grey economy, tight margins. I'm not judging. I'm just a field tech who likes the ale." - role: bar-regular - access: [peer] - trust: real - situation: [bar_evening, social] - topic: [money, personal] - mood: [anxious] - tags: [moral-position, community-loyalty] - - # --- Secret trust --- - - - id: sera-venn_d_032 - text: "I ran a compliance check. Unauthorized. Six weeks ago. Naia was so worried about Kael — I thought I could help. I found manifest discrepancies tied to his shifts." - role: bar-regular - access: [peer] - trust: secret - situation: [alone, social] - topic: [investigation, trust, personal] - mood: [anxious] - tags: [confession, phase-5, critical-reveal] - knowledge_grant: - fact_id: "investigation.manifest_discrepancy" - confidence: "knows_details" - - - id: sera-venn_d_033 - text: "If I report it, Naia's life falls apart. Kael gets investigated. Maybe arrested. She didn't ask me to find this. I did it on my own." - role: bar-regular - access: [peer] - trust: secret - situation: [alone, social] - topic: [personal, trust, institution] - mood: [anxious] - tags: [motivation-confession, phase-5] - - - id: sera-venn_d_034 - text: "The irregularities correlate with Torek Lintar's inspection shifts. That's why I can't — I can't be near him. He doesn't know I know." - role: bar-regular - access: [peer] - trust: secret - situation: [alone] - topic: [investigation, danger] - mood: [anxious] - tags: [torek-link, avoidance-explanation, phase-5] - knowledge_grant: - fact_id: "investigation.shift_mismatch" - confidence: "knows_details" - - - id: sera-venn_d_035 - text: "I don't know what you're looking for. I told you everything I know. If you're asking whether I'm hiding something — I'm a field tech, not an analyst." - role: bar-regular - access: [peer, authority] - trust: secret - situation: [investigation, confrontation] - topic: [trust, investigation] - mood: [suspicious, anxious] - tags: [denial-under-pressure, phase-4-5, the-wall] - - - id: sera-venn_d_036 - text: "Every tip I gave you was real. The district background, the shift patterns, the regulars. I didn't steer you wrong. I just... didn't give you everything." - role: bar-regular - access: [peer] - trust: secret - situation: [alone, social] - topic: [trust, personal] - mood: [anxious] - tags: [retrospective-confession, phase-5, emotional-payload] - - # ============================================================ - # UNPROMPTED DISCLOSURE (6 lines) - # Trust + mood weighted — Sera volunteers information - # Phase 1-2: genuinely helpful. Phase 3-5: overcompensation. - # ============================================================ - - - id: sera-venn_d_037 - text: "Oh — before I forget. The dock scheduler, Maret? She's sharp. If you need freight records context, she's the one to ask." - role: bar-regular - access: [peer] - trust: surface - situation: [social, bar_evening] - topic: [colleague, investigation] - mood: [content] - tags: [unprompted, genuine-help, phase-1-2] - knowledge_grant: - fact_id: "relationship.trust_network" - confidence: "suspects" - - - id: sera-venn_d_038 - text: "I checked the relay calibration logs for the Terminal this morning. Nothing flagged. But the data throughput was higher than standard — more manifests processed than usual." - role: bar-regular - access: [peer, authority] - trust: real - situation: [social] - topic: [institution, cargo] - mood: [focused] - tags: [unprompted, overcompensation, phase-3-4] - - - id: sera-venn_d_039 - text: "I asked around — quietly — about the shift rotation schedule. Voss has been adjusting it more than usual this cycle. Might mean nothing." - role: bar-regular - access: [peer] - trust: real - situation: [social, bar_evening] - topic: [routine, investigation] - mood: [focused, frustrated] - tags: [unprompted, overcompensation, phase-3-4] - - - id: sera-venn_d_040 - text: "The maintenance corridor access logs are Commission-maintained. I can pull them if you need. Just say the word." - role: bar-regular - access: [peer, authority] - trust: real - situation: [social] - topic: [institution, investigation] - mood: [content] - tags: [unprompted, information-offer, overcompensation, phase-3-5] - - - id: sera-venn_d_041 - text: "Naia mentioned Kael came home late again last night. Third time this week. She's trying not to make it a thing." - role: bar-regular - access: [peer] - trust: real - situation: [social, bar_evening] - topic: [personal, colleague] - mood: [frustrated] - tags: [unprompted, naia-worry, phase-2-3] - knowledge_grant: - fact_id: "relationship.kael_naia_connection" - confidence: "knows_details" - - - id: sera-venn_d_042 - text: "You should know — Lera watches out for her regulars. If people have been asking about you, she'd know. She just won't volunteer it." - role: bar-regular - access: [peer] - trust: real - situation: [social, bar_evening] - topic: [colleague, trust, danger] - mood: [frustrated] - tags: [unprompted, genuine-help, phase-2-3] - - # ============================================================ - # CONTRADICTION / DEFLECTION DIALOGUE (8 lines) - # Phase 3-4: avoidance excuses, topic deflection, controlled evasion - # ============================================================ - - - id: sera-venn_d_043 - text: "Actually, I should head out. Early shift tomorrow — calibration rounds start at 07:30." - role: bar-regular - access: [peer, public] - trust: surface - situation: [bar_evening] - topic: [routine] - mood: [content] - tags: [avoidance-excuse-1, torek-trigger, phase-3] - - - id: sera-venn_d_044 - text: "Sorry — headache coming on. Station air does that sometimes. I'll catch you tomorrow." - role: bar-regular - access: [peer, public] - trust: surface - situation: [bar_evening] - topic: [personal] - mood: [content] - tags: [avoidance-excuse-2, torek-trigger, phase-3] - - - id: sera-venn_d_045 - text: "I need to check something at the Commission kiosk. Forgot to file a diagnostic report. I'll be quick — or not. You know how the system is." - role: bar-regular - access: [peer] - trust: surface - situation: [bar_evening] - topic: [institution, routine] - mood: [content] - tags: [avoidance-excuse-3, torek-trigger, phase-3] - - - id: sera-venn_d_046 - text: "Torek? He's just loud. I don't love loud drunks. Nothing personal — I just like a quieter evening." - role: bar-regular - access: [peer] - trust: surface - situation: [social, investigation] - topic: [colleague] - mood: [content] - tags: [torek-deflection, phase-4, the-deflection] - - - id: sera-venn_d_047 - text: "Manifests? I wouldn't know — I'm on the equipment side, not the freight side. Different department entirely." - role: bar-regular - access: [peer, authority] - trust: surface - situation: [investigation, social] - topic: [cargo, institution] - mood: [content] - tags: [topic-deflection, cargo-avoidance, phase-3-5] - - - id: sera-venn_d_048 - text: "Anyway — did you try the ale? Lera got a new supply run in. Much better than last week's batch." - role: bar-regular - access: [peer] - trust: surface - situation: [social, bar_evening] - topic: [routine] - mood: [content] - tags: [redirect, warmth-recovery, phase-4] - - - id: sera-venn_d_049 - text: "I'm just a field tech. I maintain equipment. I don't track people or shipments — that's your department." - role: bar-regular - access: [peer, authority] - trust: surface - situation: [investigation] - topic: [institution] - mood: [suspicious] - tags: [deflection-firm, phase-4-5, the-wall] - - - id: sera-venn_d_050 - text: "Let's talk about something else. How's the investigation going — generally? Making progress?" - role: bar-regular - access: [peer] - trust: real - situation: [social, investigation] - topic: [investigation, trust] - mood: [anxious] - tags: [redirect-to-detective, controlled-recovery, phase-4] - - # ============================================================ - # POST-DISCOVERY DIALOGUE (5 lines) - # Phase 5: after the detective knows something is off - # Same surface warmth, but calibrated. Trust is contaminated. - # ============================================================ - - - id: sera-venn_d_051 - text: "Same booth. Drink's on me tonight." - role: bar-regular - access: [peer] - trust: surface - situation: [bar_evening, arrival] - topic: [personal] - mood: [warm] - tags: [post-discovery, surface-warmth, phase-5] - - - id: sera-venn_d_052 - text: "I pulled the relay diagnostic data you asked about. Clean. No anomalies in the terminal equipment this quarter." - role: bar-regular - access: [peer, authority] - trust: real - situation: [social] - topic: [institution] - mood: [content] - tags: [post-discovery, overcompensation, phase-5] - - - id: sera-venn_d_053 - text: "You've been quiet tonight. Everything all right with the case?" - role: bar-regular - access: [peer] - trust: surface - situation: [bar_evening, social] - topic: [personal, investigation] - mood: [frustrated] - tags: [post-discovery, awareness, phase-5] - - - id: sera-venn_d_054 - text: "I know you're good at what you do. That's why I'm glad you're here. This district needed someone thorough." - role: bar-regular - access: [peer] - trust: real - situation: [social] - topic: [trust, personal] - mood: [warm, anxious] - tags: [post-discovery, genuine-but-contaminated, phase-5] - - - id: sera-venn_d_055 - text: "If there's anything I can help with — anything at all — you just ask. You know that." - role: bar-regular - access: [peer] - trust: real - situation: [social, bar_evening] - topic: [trust, personal] - mood: [warm, frustrated] - tags: [post-discovery, overcompensation, phase-5, closing-line] - - # ============================================================ - # LAYER 2 GREETING VARIANTS — D-028 Layer 2 - # Ticket #170 (Sprint 15). situation: [greeting] fires on initial contact. - # Access tier + mood encode relationship history state. - # Sera is THE FRIEND for the detective. Warm, observant, bar anchor. - # ============================================================ - - # first_meeting (detective path): RelationshipState Unknown → Public/Authority access. - # Sera clocks them as Commission immediately. Makes them welcome anyway. - - id: sera-venn_d_056 - text: "Commission? Don't worry, I don't bite. I'm Sera. Corner booth's better — you can see the whole room." - role: bar-regular - access: [public, authority] - trust: surface - situation: [greeting] - mood: [warm] - topic: [personal, institution] - tags: [sera, greeting, first-meeting, detective-path, layer2] - notes: "Layer 2 greeting — first meeting, detective path. Sera reads the institutional marking immediately and disarms it. Corner booth tip is genuine — Sera always notices the useful details." - - # established (detective path): count >= 3, RelationshipState: Known/Friendly → Peer access. - # Warmer, more personal. Sera has been waiting for them. - - id: sera-venn_d_057 - text: "I was hoping you'd come in. Saved the corner booth. How'd today go?" - role: bar-regular - access: [peer] - trust: surface - situation: [greeting] - mood: [warm] - topic: [personal, investigation] - tags: [sera, greeting, repeat-visit, detective-path, layer2] - notes: "Layer 2 greeting — established, detective path. Personal, invested. Sera asks about their day the way a friend does — not just small talk." - - # first_meeting (smuggler path): smuggler is dock crew, Sera knows the district crowd. - # Peer/insider access from the start — Sera has social network, not institutional distance. - - id: sera-venn_d_058 - text: "Terminal crew? Grab a seat. Kael usually sits in the back if you're looking for him." - role: bar-regular - access: [peer, insider] - trust: surface - situation: [greeting] - mood: [content] - topic: [colleague, personal] - tags: [sera, greeting, first-meeting, smuggler-path, layer2] - notes: "Layer 2 greeting — first meeting, smuggler path. Sera recognizes dock crew on sight and extends the social network. Mentioning Kael is casual intel — she knows everyone's connections." - - # post-confrontation: confrontation logged. Sera's surface warmth is present but qualified. - # She doesn't know where they stand. The welcome is real but uncertain. - - id: sera-venn_d_059 - text: "You're back. I wasn't sure you would be." - role: bar-regular - access: [peer] - trust: surface - situation: [greeting] - mood: [anxious, suspicious] - topic: [personal, trust] - tags: [sera, greeting, post-confrontation, layer2] - notes: "Layer 2 greeting — post-confrontation. Sera's warmth is genuine but the relief is complicated. She genuinely didn't know if they'd come back. The relationship is still there but it's been stressed." diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/courier.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/courier.yaml deleted file mode 100644 index d0060098a..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/courier.yaml +++ /dev/null @@ -1,269 +0,0 @@ -# Dialogue: courier at The Terminal -# NPC: Renn Harsk (Tier 2, THRESHOLD/GATEKEEPER) -# Voice: operational minimalism. Brief. Route-focused. Never volunteers more than needed. -# Ring-aware: works adjacent — carries documentation, not cargo. Knows what he carries. -# Cover: licensed freight courier. The documentation is the cover. -# Ticket: #190 | Sprint: 12 - -location: the-terminal -role: courier -lines: - - # ========================================== - # ARRIVALS — checking in - # ========================================== - - - id: courier_d_001 - text: "Route's clear. Moving on schedule." - role: courier - access: [public, peer] - trust: surface - situation: [arrival, routine] - topic: [routine, cargo] - mood: [content] - tags: [renn, greeting, operational] - - - id: courier_d_002 - text: "Manifest for bay three. Needs a scheduler stamp." - role: courier - access: [public, peer] - trust: surface - situation: [arrival, routine] - topic: [routine, cargo] - mood: [content] - tags: [renn, greeting, procedural] - - - id: courier_d_003 - text: "Inbound from Havara. Three cans, all matched." - role: courier - access: [public, peer] - trust: surface - situation: [arrival, shift_start] - topic: [routine, cargo] - mood: [content] - tags: [renn, greeting, cargo] - - # ========================================== - # SURFACE ROUTINE — low-information, on-script - # ========================================== - - - id: courier_d_004 - text: "Not staying. Just the drop." - role: courier - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [renn, operational, brief] - - - id: courier_d_005 - text: "Paperwork's clean. You can check." - role: courier - access: [public, peer, authority] - trust: surface - situation: [routine, investigation] - topic: [routine, cargo] - mood: [content] - tags: [renn, procedural, documentation] - - - id: courier_d_006 - text: "Pickup's scheduled at 1600. I'll be back." - role: courier - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine, cargo] - mood: [content] - tags: [renn, operational] - - - id: courier_d_007 - text: "Corridor's clear from my end. No delays." - role: courier - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [renn, operational] - dual_lens: - smuggler: "Clean phrase. Public-safe. He'd say it either way." - detective: "Courier references corridor access unprompted. Note it." - - # ========================================== - # RING-ADJACENT — insider/real trust only - # ========================================== - - - id: courier_d_008 - text: "Documentation's handled. Bay four, per the note." - role: courier - access: [insider] - trust: real - situation: [routine, shift_transition] - topic: [cargo, routine] - mood: [focused] - tags: [renn, ring-ops, documentation] - dual_lens: - smuggler: "Renn's confirming the paperwork trail. Bay four, as arranged." - detective: "Never hears this line." - - - id: courier_d_009 - text: "Transit stamp's current. Nothing flagged at the gate." - role: courier - access: [insider] - trust: real - situation: [routine, shift_transition] - topic: [cargo, routine] - mood: [focused] - tags: [renn, ring-ops, documentation] - - - id: courier_d_010 - text: "Pickup window is the same as last cycle. Twenty minutes." - role: courier - access: [insider] - trust: real - situation: [shift_transition] - topic: [cargo, routine] - mood: [focused] - tags: [renn, ring-ops, transition-window] - dual_lens: - smuggler: "Twenty minutes. Transition window confirmation." - detective: "Never hears this line." - - - id: courier_d_011 - text: "Tell Voss the hold note clears at 1400." - role: courier - access: [insider] - trust: real - situation: [routine, shift_transition] - topic: [cargo, routine] - mood: [focused] - tags: [renn, ring-ops, voss, bay-four] - dual_lens: - smuggler: "1400. The hold clears on schedule. Pass it up." - detective: "Never hears this line." - - # ========================================== - # DETECTIVE ENCOUNTER — surface cooperation - # ========================================== - - - id: courier_d_012 - text: "Licensed freight courier. Manifest's available on request." - role: courier - access: [authority] - trust: surface - situation: [investigation, routine] - topic: [institution, cargo] - mood: [content] - tags: [renn, detective-path, procedural] - - - id: courier_d_013 - text: "I drop documentation. What's inside the containers isn't my business." - role: courier - access: [authority] - trust: surface - situation: [investigation] - topic: [cargo, institution] - mood: [content] - tags: [renn, detective-path, deflection] - dual_lens: - smuggler: "That's the answer. Clean and correct." - detective: "Classic courier deflection. Legally accurate. Operationally suspicious." - - - id: courier_d_014 - text: "I've been running this route for two years. Nothing unusual." - role: courier - access: [authority, public] - trust: surface - situation: [investigation, confrontation] - topic: [cargo, institution] - mood: [content] - tags: [renn, detective-path, authority-assertion] - - # ========================================== - # DEPARTURES - # ========================================== - - - id: courier_d_015 - text: "That's the drop. I'm out." - role: courier - access: [public, peer] - trust: surface - situation: [shift_end, routine] - topic: [routine] - mood: [content] - tags: [renn, closing] - - - id: courier_d_016 - text: "Next run's tomorrow. Early." - role: courier - access: [public, peer] - trust: surface - situation: [shift_end] - topic: [routine] - mood: [content] - tags: [renn, closing] - - # ========================================== - # GENERATION PASS — ambient variants - # ========================================== - - - id: courier_d_017 - text: "Two stops today. First one's done." - role: courier - access: [public, peer] - trust: surface - situation: [arrival, routine] - topic: [routine, cargo] - mood: [content] - tags: [renn, greeting, generation-pass] - - - id: courier_d_018 - text: "Outbound for Havara. Needs a bay assignment." - role: courier - access: [public, peer] - trust: surface - situation: [arrival, routine] - topic: [routine, cargo] - mood: [content] - tags: [renn, greeting, procedural, generation-pass] - - - id: courier_d_019 - text: "Gate's backed up. Running twenty minutes late." - role: courier - access: [public, peer] - trust: surface - situation: [arrival, routine] - topic: [routine] - mood: [content] - tags: [renn, delay, generation-pass] - - - id: courier_d_020 - text: "Paperwork's in order. Same as always." - role: courier - access: [public, peer, authority] - trust: surface - situation: [routine, investigation] - topic: [routine, cargo] - mood: [content] - tags: [renn, procedural, generation-pass] - - - id: courier_d_021 - text: "Quick turnaround today. Back out by 1300." - role: courier - access: [public, peer] - trust: surface - situation: [arrival, routine] - topic: [routine] - mood: [content] - tags: [renn, operational, generation-pass] - - - id: courier_d_022 - text: "Signed off on bay three. That's me done here." - role: courier - access: [public, peer] - trust: surface - situation: [shift_end, routine] - topic: [routine] - mood: [content] - tags: [renn, closing, generation-pass] diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/dock-worker.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/dock-worker.yaml deleted file mode 100644 index e03bb0f19..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/dock-worker.yaml +++ /dev/null @@ -1,397 +0,0 @@ -# Dialogue: dock-worker at The Terminal -# NPC: Generic dock worker (Tier 3 template role — multiple workers share this pool) -# Voice: short, practical, trade jargon. Community over institution. Not a lead. -# Ring-aware: none. Floor is their whole world. -# Ticket: #190 | Sprint: 12 - -location: the-terminal -role: dock-worker -lines: - - # ========================================== - # GREETINGS — shift arrival - # ========================================== - - - id: dock-worker_d_001 - text: "Push today. Bay six's backed up." - role: dock-worker - access: [public, peer] - trust: surface - situation: [shift_start, arrival] - topic: [routine, cargo] - mood: [content] - tags: [dock-worker, greeting] - - - id: dock-worker_d_002 - text: "Late night last cycle. Bay eight ran until 2300." - role: dock-worker - access: [public, peer] - trust: surface - situation: [arrival, shift_start] - topic: [routine] - mood: [frustrated] - tags: [dock-worker, greeting] - - - id: dock-worker_d_003 - text: "Voss is on already. Floor's locked down tight." - role: dock-worker - access: [peer] - trust: surface - situation: [arrival, shift_start] - topic: [institution, routine] - mood: [suspicious] - tags: [dock-worker, voss, caution] - dual_lens: - smuggler: "Voss is in early. If the schedule's tight, the window shifts. Check it." - detective: "Workers treat the supervisor as a weather system — something to navigate around, not toward." - - # ========================================== - # FLOOR TALK — routine, cargo, observation - # ========================================== - - - id: dock-worker_d_004 - text: "Bay four's been on hold three days. Nobody says why." - role: dock-worker - access: [public, peer] - trust: surface - situation: [routine] - topic: [cargo, routine] - mood: [content] - tags: [dock-worker, bay-four, procedural] - dual_lens: - smuggler: "He doesn't know what's in it. Just annoyed at the backup." - detective: "Worker notices Bay 4 hold as unusual. Not suspicious — just a worker tracking the floor." - - - id: dock-worker_d_005 - text: "Manifest looks clean. Three inbounds, two outbounds. Light day." - role: dock-worker - access: [public, peer] - trust: surface - situation: [routine, shift_start] - topic: [cargo, routine] - mood: [content] - tags: [dock-worker, manifest] - - - id: dock-worker_d_006 - text: "Maret's been at that terminal all morning. Never good." - role: dock-worker - access: [peer] - trust: surface - situation: [routine] - topic: [colleague, routine] - mood: [suspicious] - tags: [dock-worker, maret, observation] - dual_lens: - smuggler: "Maret reviewing something. If she flags a discrepancy, Voss'll sit on it. He always does." - detective: "Workers have noticed Maret's behavior. Whatever she found, it's not small." - - - id: dock-worker_d_007 - text: "Drin ran bay six again last cycle. Third inspection this week." - role: dock-worker - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine, colleague] - mood: [content] - tags: [dock-worker, drin, inspection] - dual_lens: - smuggler: "Drin on six while bay four stays held. Scheduled or arranged?" - detective: "Workers notice inspection distribution. Drin on six, bay four untouched." - - - id: dock-worker_d_008 - text: "Transition window's twice as long with Commission eyes on the floor." - role: dock-worker - access: [peer] - trust: surface - situation: [shift_transition, routine] - topic: [institution, routine] - mood: [suspicious] - tags: [dock-worker, commission, transition-window] - dual_lens: - smuggler: "Commission presence during transition. Window's compromised." - detective: "Workers slow down when Commission is visible. Normal — or trained." - - - id: dock-worker_d_009 - text: "Good crew this cycle. Linn and Pael are both on." - role: dock-worker - access: [public, peer] - trust: surface - situation: [routine, shift_start] - topic: [colleague, routine] - mood: [content] - tags: [dock-worker, pael, community] - - - id: dock-worker_d_010 - text: "Cargo mark's off by forty, according to Maret. Voss logged it and moved on." - role: dock-worker - access: [peer] - trust: surface - situation: [routine] - topic: [cargo, colleague] - mood: [suspicious] - tags: [dock-worker, maret, voss, discrepancy] - dual_lens: - smuggler: "Forty kilos. Maret flagged it. Voss buried it. Same as last time." - detective: "Worker knows about a flagged discrepancy that was suppressed. That's a witness." - knowledge_grant: - fact_id: investigation.oversight_gap_pattern - confidence: suspects - - - id: dock-worker_d_011 - text: "C-4 containers haven't been checked in three days. Not our problem, apparently." - role: dock-worker - access: [peer] - trust: surface - situation: [routine] - topic: [cargo, routine] - mood: [suspicious] - tags: [dock-worker, c4-storage, observation] - dual_lens: - smuggler: "C-4's getting casual attention. Note it." - detective: "C-4 storage. Three days, no verification. That's the anomaly window." - - # ========================================== - # COMMUNITY / CASUAL - # ========================================== - - - id: dock-worker_d_012 - text: "You heading to the Last Shift after? Lera's got the grain spirit back." - role: dock-worker - access: [public, peer] - trust: surface - situation: [shift_end, routine] - topic: [routine] - mood: [content] - tags: [dock-worker, social, the-last-shift] - - - id: dock-worker_d_013 - text: "Workers' Association meeting's cycle twenty-two. Handoff protocol's back on the agenda." - role: dock-worker - access: [public, peer] - trust: surface - situation: [routine] - topic: [institution, routine] - mood: [content] - tags: [dock-worker, workers-association, community] - - - id: dock-worker_d_014 - text: "Drifters lost again. Four-three. Pael seemed to take it personally." - role: dock-worker - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [dock-worker, social, pael] - - # ========================================== - # DETECTIVE ENCOUNTER — deflection, redirect - # ========================================== - - - id: dock-worker_d_015 - text: "Manifest questions go to the scheduler. I'm floor-side." - role: dock-worker - access: [authority, public] - trust: surface - situation: [investigation, routine] - topic: [institution, routine] - mood: [suspicious] - tags: [dock-worker, detective-path, redirect] - - - id: dock-worker_d_016 - text: "Commission's asked before. Same answers. We run a clean floor." - role: dock-worker - access: [authority] - trust: surface - situation: [investigation, confrontation] - topic: [institution, routine] - mood: [suspicious] - tags: [dock-worker, detective-path, deflection] - - - id: dock-worker_d_017 - text: "Voss handles discrepancies. That's above my level." - role: dock-worker - access: [authority, peer] - trust: surface - situation: [investigation] - topic: [institution, routine] - mood: [suspicious] - tags: [dock-worker, detective-path, voss, redirect] - - # ========================================== - # PEER CANDOR — elevated trust - # ========================================== - - - id: dock-worker_d_018 - text: "Maret's going to push it. She doesn't leave a number sitting." - role: dock-worker - access: [peer] - trust: real - situation: [routine] - topic: [colleague] - mood: [suspicious] - tags: [dock-worker, maret, peer-candor] - dual_lens: - smuggler: "Maret's not going to drop it. That's the problem." - detective: "Workers think Maret will force the issue. She may be the break." - - - id: dock-worker_d_019 - text: "Voss runs a tight floor. Maybe too tight, if you take my meaning." - role: dock-worker - access: [peer] - trust: real - situation: [routine] - topic: [institution, colleague] - mood: [suspicious] - tags: [dock-worker, voss, peer-candor] - dual_lens: - smuggler: "He suspects Voss is shaving something. Doesn't know what. Doesn't want to." - detective: "Workers sense something off about Voss's management without naming it." - - # ========================================== - # SIGN-OFF - # ========================================== - - - id: dock-worker_d_020 - text: "Bay's clear. Good shift." - role: dock-worker - access: [public, peer] - trust: surface - situation: [shift_end] - topic: [routine] - mood: [content] - tags: [dock-worker, closing] - - - id: dock-worker_d_021 - text: "Night crew's here. We're done." - role: dock-worker - access: [public, peer] - trust: surface - situation: [shift_end, shift_transition] - topic: [routine] - mood: [content] - tags: [dock-worker, closing] - - # ========================================== - # GENERATION PASS — ambient variants - # ========================================== - - - id: dock-worker_d_022 - text: "Early start. Bay two's already loaded." - role: dock-worker - access: [public, peer] - trust: surface - situation: [arrival, shift_start] - topic: [routine, cargo] - mood: [content] - tags: [dock-worker, greeting, generation-pass] - - - id: dock-worker_d_023 - text: "Air recyclers are loud this morning. Must be the outer ring issue again." - role: dock-worker - access: [public, peer] - trust: surface - situation: [arrival, shift_start] - topic: [routine] - mood: [content] - tags: [dock-worker, station, generation-pass] - - - id: dock-worker_d_024 - text: "Pael's in early. Something must be broken in B-7 again." - role: dock-worker - access: [peer] - trust: surface - situation: [routine, shift_start] - topic: [colleague, routine] - mood: [content] - tags: [dock-worker, pael, generation-pass] - - - id: dock-worker_d_025 - text: "Running light today. Maybe I'll actually make it to the Last Shift before close." - role: dock-worker - access: [public, peer] - trust: surface - situation: [shift_start, routine] - topic: [routine] - mood: [content] - tags: [dock-worker, social, generation-pass] - - - id: dock-worker_d_026 - text: "Bay three's got a scan hold. Not my problem. Not my bay." - role: dock-worker - access: [public, peer] - trust: surface - situation: [routine] - topic: [cargo, routine] - mood: [content] - tags: [dock-worker, scan-hold, generation-pass] - - - id: dock-worker_d_027 - text: "New hire's back. Asking questions again. Good kid." - role: dock-worker - access: [peer] - trust: surface - situation: [routine] - topic: [colleague, routine] - mood: [content] - tags: [dock-worker, new-hire, generation-pass] - - - id: dock-worker_d_028 - text: "Handoff's in ten. Don't disappear on me." - role: dock-worker - access: [peer] - trust: surface - situation: [shift_transition] - topic: [routine] - mood: [content] - tags: [dock-worker, handoff, generation-pass] - - - id: dock-worker_d_029 - text: "Span gate cycled early. All inbounds are going to be late. Plan around it." - role: dock-worker - access: [public, peer] - trust: surface - situation: [routine, shift_start] - topic: [routine, cargo] - mood: [suspicious] - tags: [dock-worker, span-gate, generation-pass] - - - id: dock-worker_d_030 - text: "Linn's not in today. We're running two short on bay six." - role: dock-worker - access: [public, peer] - trust: surface - situation: [shift_start, routine] - topic: [colleague, routine] - mood: [frustrated] - tags: [dock-worker, staffing, generation-pass] - - - id: dock-worker_d_031 - text: "Lunch is in the break room. Don't touch the one with Pael's name on it. He will notice." - role: dock-worker - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine, colleague] - mood: [content] - tags: [dock-worker, pael, humor, generation-pass] - - - id: dock-worker_d_032 - text: "Overtime's posted if you want it. Bay eight, 1800 to 2200." - role: dock-worker - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [dock-worker, overtime, generation-pass] - - - id: dock-worker_d_033 - text: "Off on time today. First time this cycle." - role: dock-worker - access: [public, peer] - trust: surface - situation: [shift_end] - topic: [routine] - mood: [content] - tags: [dock-worker, closing, generation-pass] diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/kael-davan.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/kael-davan.yaml deleted file mode 100644 index 7fdf81999..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/kael-davan.yaml +++ /dev/null @@ -1,480 +0,0 @@ -# Kael Davan — THE FRIEND (Smuggler) -# Dialogue at The Terminal (Logistics Hub) -# Ticket: #297 | Sprint: 5 | Tier 1 FRIEND NPC -# Voice: direct, practical, short sentences, first names, warm to trusted people -# Tell: looks left before answering when lying - -location: the-terminal -role: dock-worker -lines: - - # ======================================== - # GREETINGS — Phase 1: Comfort (0-10 min) - # ======================================== - - - id: kael-davan_d_034 - text: "There you are. Good — I was starting to wonder." - role: dock-worker - access: [insider, peer] - trust: surface - situation: [arrival, shift_start] - mood: [warm] - topic: [colleague] - tags: [kael, greeting, phase-1] - - - id: kael-davan_d_035 - text: "Morning. Freight's stacked clean today. Should be a smooth one." - role: dock-worker - access: [insider, peer] - trust: surface - situation: [shift_start] - mood: [content] - topic: [routine] - tags: [kael, greeting, phase-1] - - - id: kael-davan_d_036 - text: "Voss has the schedule posted already. Keen today. That's suspicious." - role: dock-worker - access: [insider, peer] - trust: surface - situation: [shift_start] - mood: [content] - topic: [colleague, routine] - tags: [kael, greeting, humor] - - - id: kael-davan_d_037 - text: "Hey. Grab a coffee before Voss finds something to complain about." - role: dock-worker - access: [insider, peer] - trust: surface - situation: [shift_start, social] - mood: [warm] - topic: [colleague] - tags: [kael, greeting, phase-1] - - - id: kael-davan_d_038 - text: "You look like you slept about as well as I did." - role: dock-worker - access: [peer] - trust: surface - situation: [arrival, social] - mood: [content] - topic: [personal] - tags: [kael, greeting, casual] - - # Public greeting for detective / outsiders - - id: kael-davan_d_039 - text: "Can I help you? If you're looking for the supervisor, Voss is by the schedule board." - role: dock-worker - access: [public, authority] - trust: surface - situation: [arrival] - mood: [content] - topic: [routine] - tags: [kael, greeting, outsider] - - # ======================================== - # SHIFT TALK — routine dialogue - # ======================================== - - - id: kael-davan_d_040 - text: "Bay three's running behind. If we don't clear it by shift end, Voss is going to lose it." - role: dock-worker - access: [insider, peer] - trust: surface - situation: [routine, shift_start] - mood: [content] - topic: [routine, cargo] - tags: [kael, operational] - - - id: kael-davan_d_041 - text: "Manifest says this one's forty kilos over. Logging error, probably." - role: dock-worker - access: [public, peer] - trust: surface - situation: [routine] - mood: [content] - topic: [cargo, routine] - tags: [kael, operational] - knowledge_grant: - fact_id: investigation.manifest_discrepancy - confidence: suspects - - - id: kael-davan_d_042 - text: "Night shift left the dock in decent shape for once. Miracles happen." - role: dock-worker - access: [insider, peer] - trust: surface - situation: [shift_start] - mood: [content] - topic: [routine] - tags: [kael, humor] - - - id: kael-davan_d_043 - text: "Loading arm three's been grinding all week. Someone should file a maintenance ticket." - role: dock-worker - access: [public, peer] - trust: surface - situation: [routine] - mood: [content] - topic: [routine] - tags: [kael, environmental] - - - id: kael-davan_d_044 - text: "Maret rerouted the bay four queue. Tight schedule today." - role: dock-worker - access: [insider, peer] - trust: surface - situation: [routine] - mood: [content] - topic: [cargo, colleague] - tags: [kael, operational, maret] - - - id: kael-davan_d_045 - text: "Shift transition in twenty. After that it's Drin's problem." - role: dock-worker - access: [insider, peer] - trust: surface - situation: [shift_end, shift_transition] - mood: [content] - topic: [routine] - tags: [kael, operational] - - - id: kael-davan_d_046 - text: "Naia's got a school event tonight. I'm heading home straight after shift." - role: dock-worker - access: [insider, peer] - trust: surface - situation: [social, routine] - mood: [warm] - topic: [personal] - tags: [kael, naia-reference, casual] - - - id: kael-davan_d_047 - text: "New hire started on bay seven. Keen. Reminds me of my first week." - role: dock-worker - access: [public, peer] - trust: surface - situation: [routine, social] - mood: [content] - topic: [colleague] - tags: [kael, observational] - - # ======================================== - # RING COORDINATION — insider, real trust - # ======================================== - - - id: kael-davan_d_048 - text: "Container 4471 is flagged. I'll reroute it during shift transition." - role: dock-worker - access: [insider] - trust: real - situation: [shift_transition] - mood: [focused] - topic: [cargo] - tags: [kael, ring-ops, operational, phase-2] - - - id: kael-davan_d_049 - text: "Voss kept the window clear. Twenty minutes, maybe twenty-five." - role: dock-worker - access: [insider] - trust: real - situation: [shift_transition] - mood: [focused] - topic: [cargo, routine] - tags: [kael, ring-ops, operational, phase-2] - - - id: kael-davan_d_050 - text: "Renn's on the corridor side. Package moves when I give the signal." - role: dock-worker - access: [insider] - trust: real - situation: [shift_transition] - mood: [focused] - topic: [cargo] - tags: [kael, ring-ops, renn, phase-2] - - - id: kael-davan_d_051 - text: "Manifest's clean on my end. Maret processed it without questions." - role: dock-worker - access: [insider] - trust: real - situation: [routine] - mood: [content] - topic: [cargo] - tags: [kael, ring-ops, maret, phase-2] - - - id: kael-davan_d_052 - text: "Nils wants higher volume next cycle. I told him we're already tight." - role: dock-worker - access: [insider] - trust: real - situation: [social] - mood: [frustrated] - topic: [danger, trust] - tags: [kael, ring-ops, nils, tension, phase-2] - - - id: kael-davan_d_053 - text: "Drin waved through bay four without checking. At least he's reliable." - role: dock-worker - access: [insider] - trust: real - situation: [routine] - mood: [content] - topic: [colleague] - tags: [kael, ring-ops, drin, phase-2] - knowledge_grant: - fact_id: investigation.drin_inspection_pattern - confidence: knows_details - - - id: kael-davan_d_054 - text: "Keep an eye on Maret. She's been looking at the manifests longer than usual." - role: dock-worker - access: [insider] - trust: real - situation: [routine, social] - mood: [anxious] - topic: [colleague, danger] - tags: [kael, ring-ops, maret, caution, phase-2] - - - id: kael-davan_d_055 - text: "There's a sealed one in the batch tonight. Nils says components. Don't open it." - role: dock-worker - access: [insider] - trust: real - situation: [shift_transition] - mood: [frustrated] - topic: [cargo, danger] - tags: [kael, ring-ops, contraband, phase-2] - - # ======================================== - # TRUST-GATED — deep trust, secret tier - # ======================================== - - - id: kael-davan_d_056 - text: "Some days I wonder how long we can keep this up." - role: dock-worker - access: [insider] - trust: secret - situation: [social, alone] - mood: [anxious] - topic: [trust, personal] - tags: [kael, vulnerability, friend-arc] - - - id: kael-davan_d_057 - text: "Naia asked me again last night. Where I go. Why I'm late. I hate lying to her." - role: dock-worker - access: [insider] - trust: secret - situation: [social, alone] - mood: [anxious] - topic: [personal, trust] - tags: [kael, naia-reference, vulnerability] - - - id: kael-davan_d_058 - text: "If something happens to me — look out for Naia. Promise me that." - role: dock-worker - access: [insider] - trust: secret - situation: [alone] - mood: [anxious] - topic: [personal, trust] - tags: [kael, naia-reference, vulnerability, friend-arc] - - # ======================================== - # UNPROMPTED — Kael volunteers or warns - # ======================================== - - - id: kael-davan_d_059 - text: "Heads up — Voss is in a mood. Keep your head down this shift." - role: dock-worker - access: [insider, peer] - trust: surface - situation: [shift_start] - mood: [frustrated] - topic: [colleague, danger] - tags: [kael, unprompted, warning] - - - id: kael-davan_d_060 - text: "I'm buying at Lera's after shift. You're coming. No arguments." - role: dock-worker - access: [insider, peer] - trust: surface - situation: [shift_end, social] - mood: [warm] - topic: [personal, colleague] - tags: [kael, unprompted, social] - - - id: kael-davan_d_061 - text: "Torek's been running his mouth at the bar. You might want to have a word." - role: dock-worker - access: [insider] - trust: real - situation: [social] - mood: [anxious] - topic: [danger, colleague] - tags: [kael, unprompted, torek, caution] - - # ======================================== - # DEFLECTION — Phase 2-4: Post-contradiction - # ======================================== - - - id: kael-davan_d_062 - text: "It's nothing. Just work stuff." - role: dock-worker - access: [insider, peer] - trust: surface - situation: [confrontation, social] - mood: [frustrated] - topic: [personal] - tags: [kael, deflection, phase-4] - - - id: kael-davan_d_063 - text: "Don't worry about it. I've got it handled." - role: dock-worker - access: [insider, peer] - trust: surface - situation: [confrontation] - mood: [frustrated] - topic: [personal, trust] - tags: [kael, deflection, phase-4] - - - id: kael-davan_d_064 - text: "I was checking on a maintenance issue. That's all." - role: dock-worker - access: [insider, peer] - trust: surface - situation: [confrontation] - mood: [frustrated] - topic: [routine] - tags: [kael, deflection, lying, phase-4] - - - id: kael-davan_d_065 - text: "You're reading too much into it. Come on — shift's starting." - role: dock-worker - access: [insider, peer] - trust: surface - situation: [confrontation, shift_start] - mood: [frustrated] - topic: [routine, trust] - tags: [kael, deflection, subject-change, phase-4] - - - id: kael-davan_d_066 - text: "Can we not do this here? Voss is watching." - role: dock-worker - access: [insider] - trust: surface - situation: [confrontation] - mood: [frustrated] - topic: [danger] - tags: [kael, deflection, phase-4] - - # ======================================== - # CONFRONTATION RESPONSES — Phase 4-5 - # ======================================== - - # Path A: Gentle confrontation - - id: kael-davan_d_067 - text: "I... yeah. I need to tell you something. But not here." - role: dock-worker - access: [insider] - trust: real - situation: [confrontation, alone] - mood: [anxious] - topic: [trust, personal] - tags: [kael, confession-path, phase-5] - - # Path B: Harsh pressure - - id: kael-davan_d_068 - text: "You want to report me? Go ahead. See what Nils does to both of us." - role: dock-worker - access: [insider] - trust: surface - situation: [confrontation] - mood: [frustrated] - topic: [danger, trust] - tags: [kael, hostile-path, phase-5] - - # If smuggler pushes further (gentle) - - id: kael-davan_d_069 - text: "Naia can't keep living like this. Neither can I. I'm looking for a way out." - role: dock-worker - access: [insider] - trust: secret - situation: [confrontation, alone] - mood: [anxious] - topic: [personal, trust] - tags: [kael, confession, naia-reference, phase-5] - - # If detective confronts (authority path) - - id: kael-davan_d_070 - text: "I don't know what you're talking about. I load containers. That's my job." - role: dock-worker - access: [public, authority] - trust: surface - situation: [confrontation, investigation] - topic: [routine] - tags: [kael, deflection, detective-path] - - - id: kael-davan_d_071 - text: "You want to ask questions, talk to Voss. He runs the schedule." - role: dock-worker - access: [public, authority] - trust: surface - situation: [confrontation, investigation] - topic: [colleague, routine] - tags: [kael, deflection, detective-path, voss] - - # ======================================== - # LAYER 2 GREETING VARIANTS — D-028 Layer 2 - # Ticket #170 (Sprint 15). situation: [greeting] fires on initial contact. - # Access tier + mood encode relationship history state. - # ======================================== - - # first_meeting: InteractionMemory.count == 0. RelationshipState: Unknown → Public access only. - - id: kael-davan_d_072 - text: "This section is dock crew and logistics. If you're Commission or admin, check-in's back that way." - role: dock-worker - access: [public] - trust: surface - situation: [greeting] - mood: [content] - topic: [routine] - tags: [kael, greeting, first-meeting, layer2] - notes: "Layer 2 greeting — first meeting. Kael is helpful but orienting the stranger away from his work." - - # established — peer/smuggler context: count >= 3, RelationshipState: Known/Friendly → Peer/Insider access. - - id: kael-davan_d_073 - text: "You're back. Good — bay three's been quiet. I'll fill you in." - role: dock-worker - access: [peer, insider] - trust: surface - situation: [greeting] - mood: [warm] - topic: [colleague, routine] - tags: [kael, greeting, repeat-visit, peer-tone, layer2] - notes: "Layer 2 greeting — established. Warm, practical, skips pleasantries. Treats them as crew." - - # established — authority/detective context: count >= 3, RelationshipState: PersonOfInterest → Authority access. - - id: kael-davan_d_074 - text: "Back again. I'm on shift — if you have questions, make them quick." - role: dock-worker - access: [authority] - trust: surface - situation: [greeting] - mood: [focused] - topic: [routine] - tags: [kael, greeting, repeat-visit, authority-tone, layer2] - notes: "Layer 2 greeting — repeat with authority figure. Professional, clipped, not hostile. Kael can't refuse but won't volunteer." - - # post-confrontation: confrontation in InteractionMemory.notable_events. NPC mood shifted to suspicious/frustrated. - - id: kael-davan_d_075 - text: "Didn't expect you today." - role: dock-worker - access: [peer, insider] - trust: surface - situation: [greeting] - mood: [suspicious, frustrated] - topic: [personal] - tags: [kael, greeting, post-confrontation, layer2] - notes: "Layer 2 greeting — post-confrontation. Strained. Four words doing the work of a paragraph. Not hostile but the warmth is gone." diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/maintenance-tech.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/maintenance-tech.yaml deleted file mode 100644 index 437b1f196..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/maintenance-tech.yaml +++ /dev/null @@ -1,86 +0,0 @@ -# Dialogue: maintenance-tech at The Terminal -# NPC: Pael Varren (Tier 3, NOBODY/CIVILIAN) -# Voice: tired-competent, minimal, dry. Knows the infrastructure. Knows nothing else. -# KEY LINE: maintenance-tech_d_001 — sounds like surveillance knowledge, is a maintenance complaint -# Ticket: #307 | Sprint: 12 - -location: the-terminal -role: maintenance-tech -lines: - - # ========================================== - # "SEEMS IMPORTANT BUT ISN'T" LINE - # Sounds like Pael monitors corridor traffic for a reason. - # Actually: the B-7 seal fails when people use the corridor too much. Pael notices load. - # ========================================== - - - id: maintenance-tech_d_001 - text: "B-7's had three seal failures this cycle. Someone's been through there more than they should." - role: maintenance-tech - access: [public] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [pael, seems-important-but-isnt, maintenance, b7] - dual_lens: - smuggler: "Pael knows the corridor's been used. But Pael knows nothing — this is an HVAC complaint." - detective: "Corridor B-7 traffic. A maintenance tech noticing irregular use. Unreliable but worth noting." - notes: > - THE key flat NPC line for Pael. Sounds like environmental intelligence. - Is a complaint about a recurring seal failure caused by foot traffic. - Pael doesn't know what the traffic is from. Never will. - - # ========================================== - # ROUTINE LINES - # ========================================== - - - id: maintenance-tech_d_002 - text: "Air recycler's running hot again. Third deferred ticket this week." - role: maintenance-tech - access: [public] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [pael, atmospheric] - - - id: maintenance-tech_d_003 - text: "Loading arm three's been on my list for a month. Management keeps deferring it." - role: maintenance-tech - access: [public] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [pael, atmospheric] - - - id: maintenance-tech_d_004 - text: "If the gate tone shifts, stay clear of bay six. She needs recalibration." - role: maintenance-tech - access: [public] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [pael, warning, helpful] - - - id: maintenance-tech_d_005 - text: "Not me. I just fix them." - role: maintenance-tech - access: [public] - trust: surface - situation: [routine, social] - topic: [routine] - mood: [content] - tags: [pael, response] - - - id: maintenance-tech_d_006 - text: "Gate hum's been three cycles off-spec. Nobody cares until it stops completely." - role: maintenance-tech - access: [public] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [pael, atmospheric] diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/new-hire.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/new-hire.yaml deleted file mode 100644 index 182d66faf..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/new-hire.yaml +++ /dev/null @@ -1,264 +0,0 @@ -# Dialogue: new-hire at The Terminal -# NPC: Generic new hire (Tier 3 template role — recently arrived worker) -# Voice: enthusiastic, still reading the room. Asks what veterans stopped asking. -# Ring-aware: none. Fresh eyes are the danger — they notice what regulars stopped seeing. -# Ticket: #190 | Sprint: 12 - -location: the-terminal -role: new-hire -lines: - - # ========================================== - # GREETINGS — early days - # ========================================== - - - id: new-hire_d_001 - text: "Still figuring out the bay numbering. Six and eight are in the wrong order." - role: new-hire - access: [public, peer] - trust: surface - situation: [arrival, shift_start] - topic: [routine] - mood: [content] - tags: [new-hire, greeting, orientation] - - - id: new-hire_d_002 - text: "Voss told me to check in with you. Is that the standard thing?" - role: new-hire - access: [public, peer] - trust: surface - situation: [arrival, shift_start] - topic: [routine, institution] - mood: [content] - tags: [new-hire, greeting, voss] - - - id: new-hire_d_003 - text: "First full cycle on the floor. Trying to stay out of the way." - role: new-hire - access: [public, peer] - trust: surface - situation: [arrival, shift_start] - topic: [routine] - mood: [content] - tags: [new-hire, greeting] - - # ========================================== - # FRESH OBSERVATIONS — the dangerous innocence - # ========================================== - - - id: new-hire_d_004 - text: "Does bay four usually get held that long? The other bays turned over twice already." - role: new-hire - access: [public, peer] - trust: surface - situation: [routine] - topic: [cargo, routine] - mood: [content] - tags: [new-hire, bay-four, observation] - dual_lens: - smuggler: "New eyes on bay four. He doesn't know what he's looking at. But he noticed." - detective: "New hire asking exactly the right question without knowing it." - - - id: new-hire_d_005 - text: "I saw someone go into C-4 last night without a scan log. Is that normal?" - role: new-hire - access: [public, peer] - trust: surface - situation: [routine] - topic: [cargo, routine] - mood: [content] - tags: [new-hire, c4-storage, observation, inadvertent-witness] - dual_lens: - smuggler: "He saw someone in C-4 without a log. Does he know who? This is a problem." - detective: "Unlogged C-4 access. New hire, noticed it, mentioned it casually. He doesn't know what he saw." - knowledge_grant: - fact_id: investigation.cargo_anomaly - confidence: suspects - notes: "High-value inadvertent witness line. Operationally dangerous for the ring." - - - id: new-hire_d_006 - text: "Why does the transition window only get twenty minutes? The stations I trained at ran thirty." - role: new-hire - access: [public, peer] - trust: surface - situation: [routine, shift_transition] - topic: [routine] - mood: [content] - tags: [new-hire, transition-window, comparison] - dual_lens: - smuggler: "He's asking about the window. Doesn't know why it matters. Answer carefully." - detective: "New hire confirms the window length is unusually short. File that." - - - id: new-hire_d_007 - text: "Do containers usually get rerouted mid-hold? One went out through bay four while I thought it was still held." - role: new-hire - access: [public, peer] - trust: surface - situation: [routine] - topic: [cargo, routine] - mood: [content] - tags: [new-hire, bay-four, inadvertent-witness] - dual_lens: - smuggler: "He saw movement through bay four during the hold. This is a liability." - detective: "Container movement through bay four during official hold. Inadvertent eyewitness. Confirm timing." - knowledge_grant: - fact_id: investigation.manifest_discrepancy - confidence: suspects - - - id: new-hire_d_008 - text: "Maintenance corridor access is just off C-4, right? I took the wrong turn twice." - role: new-hire - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [new-hire, maintenance-corridors, orientation] - dual_lens: - smuggler: "He found the corridor entrance by accident. Normal for new workers. Noted." - detective: "New hire maps spatial relationship between C-4 storage and maintenance corridor access. That's the route." - - # ========================================== - # LEARNING / QUESTIONS - # ========================================== - - - id: new-hire_d_009 - text: "What's the Commission kiosk actually for? Nobody seems to use it." - role: new-hire - access: [public, peer] - trust: surface - situation: [routine] - topic: [institution, routine] - mood: [content] - tags: [new-hire, commission, curiosity] - - - id: new-hire_d_010 - text: "Maret seems stressed. Is that always the case or is something going on?" - role: new-hire - access: [peer] - trust: surface - situation: [routine] - topic: [colleague] - mood: [content] - tags: [new-hire, maret, observation] - dual_lens: - smuggler: "He noticed Maret. Good that he's asking, not reporting. Manage this." - detective: "New hire reads Maret's stress without context. Confirms it's visible." - - - id: new-hire_d_011 - text: "Voss seems really serious. Is he always like that?" - role: new-hire - access: [public, peer] - trust: surface - situation: [routine] - topic: [colleague] - mood: [content] - tags: [new-hire, voss, curiosity] - - - id: new-hire_d_012 - text: "How long before Voss trusts you to run a bay on your own?" - role: new-hire - access: [peer] - trust: surface - situation: [routine] - topic: [institution, routine] - mood: [content] - tags: [new-hire, voss, career] - - # ========================================== - # SIGN-OFF - # ========================================== - - - id: new-hire_d_013 - text: "That was a full shift. I'll have the bay numbers down by next cycle." - role: new-hire - access: [public, peer] - trust: surface - situation: [shift_end] - topic: [routine] - mood: [content] - tags: [new-hire, closing] - - - id: new-hire_d_014 - text: "Good day. Lot to learn. But good." - role: new-hire - access: [public, peer] - trust: surface - situation: [shift_end] - topic: [routine] - mood: [content] - tags: [new-hire, closing] - - # ========================================== - # GENERATION PASS — ambient variants - # ========================================== - - - id: new-hire_d_015 - text: "Is there a trick to the manifest terminal or does it always lag like this?" - role: new-hire - access: [public, peer] - trust: surface - situation: [routine, shift_start] - topic: [routine] - mood: [content] - tags: [new-hire, orientation, generation-pass] - - - id: new-hire_d_016 - text: "How long has Maret been here? She seems like she knows everything." - role: new-hire - access: [peer] - trust: surface - situation: [routine] - topic: [colleague] - mood: [content] - tags: [new-hire, maret, curiosity, generation-pass] - - - id: new-hire_d_017 - text: "Nobody told me about the span gate frequency. I kept thinking something was wrong." - role: new-hire - access: [public, peer] - trust: surface - situation: [routine, arrival] - topic: [routine] - mood: [content] - tags: [new-hire, orientation, generation-pass] - - - id: new-hire_d_018 - text: "The Last Shift — is that actually a bar? I haven't been yet." - role: new-hire - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [new-hire, social, generation-pass] - - - id: new-hire_d_019 - text: "I thought the scanner on bay three was broken. Turns out you have to hold the badge longer." - role: new-hire - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [new-hire, orientation, humor, generation-pass] - - - id: new-hire_d_020 - text: "Who's Drin? I keep hearing the name but haven't met them." - role: new-hire - access: [public, peer] - trust: surface - situation: [routine] - topic: [colleague] - mood: [content] - tags: [new-hire, drin, curiosity, generation-pass] - - - id: new-hire_d_021 - text: "Three cycles in and I still can't tell when Voss is satisfied. Is there a tell?" - role: new-hire - access: [peer] - trust: surface - situation: [routine] - topic: [colleague] - mood: [content] - tags: [new-hire, voss, humor, generation-pass] diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/pc-detective.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/pc-detective.yaml deleted file mode 100644 index 49c793fb9..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/pc-detective.yaml +++ /dev/null @@ -1,64 +0,0 @@ -# PC-as-NPC: The Detective (NPC mode, seen by smuggler player) -# Dialogue at The Terminal (Logistics Hub) -# Ticket: #401 | Sprint: 5 | PC-as-NPC content -# Voice: professional, measured, complete sentences, formal. Surnames for strangers. -# Context: public-tier only. The detective-NPC responds to the smuggler with -# institutional blandness — standard compliance officer, nothing to see here. -# Agency: NEUTRAL PATH. No confrontations, no evidence reveals. - -location: the-terminal -role: commission-liaison -lines: - - # ======================================== - # PUBLIC-TIER — smuggler approaches detective-NPC - # These are the only lines the smuggler can trigger. - # First playthrough: institutional threat. - # Second playthrough: "That's me." - # ======================================== - - - id: pc-detective_d_004 - text: "Good morning. Commission Liaison Office. I'm conducting a routine compliance review." - role: commission-liaison - access: [public] - trust: surface - situation: [arrival, greeting] - mood: [content] - topic: [routine] - tags: [pc-detective, greeting, public-tier] - - - id: pc-detective_d_005 - text: "Standard review. Manifest reconciliation, scheduling compliance. Nothing unusual." - role: commission-liaison - access: [public] - trust: surface - situation: [social] - topic: [routine] - tags: [pc-detective, purpose-question, public-tier] - - - id: pc-detective_d_006 - text: "Only been here a few days. Seems like a well-run operation." - role: commission-liaison - access: [public] - trust: surface - situation: [social] - topic: [routine] - tags: [pc-detective, district-question, public-tier] - - - id: pc-detective_d_007 - text: "Ms. Venn? Colleague. We've worked in the same division." - role: commission-liaison - access: [public] - trust: surface - situation: [social] - topic: [colleague] - tags: [pc-detective, sera-question, public-tier] - - - id: pc-detective_d_008 - text: "I appreciate the interest, but I'm sure you have cargo to route. I won't keep you." - role: commission-liaison - access: [public, authority] - trust: surface - situation: [confrontation] - topic: [routine] - tags: [pc-detective, deflection, public-tier] diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/pc-smuggler.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/pc-smuggler.yaml deleted file mode 100644 index 2c227da43..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/pc-smuggler.yaml +++ /dev/null @@ -1,64 +0,0 @@ -# PC-as-NPC: The Smuggler (NPC mode, seen by detective player) -# Dialogue at The Terminal (Logistics Hub) -# Ticket: #401 | Sprint: 5 | PC-as-NPC content -# Voice: casual, guarded, short sentences, contractions always -# Context: public-tier only. The smuggler-NPC responds to the detective with -# polite minimum — standard dock worker who doesn't want Commission attention. -# Agency: NEUTRAL PATH. No dramatic choices, no revelations. - -location: the-terminal -role: dock-worker -lines: - - # ======================================== - # PUBLIC-TIER — detective approaches smuggler-NPC - # These are the only lines the detective can trigger. - # First playthrough: unremarkable dock worker. - # Second playthrough: "That's me." - # ======================================== - - - id: pc-smuggler_d_004 - text: "Morning. Can I help you with something?" - role: dock-worker - access: [public] - trust: surface - situation: [arrival, greeting] - mood: [content] - topic: [routine] - tags: [pc-smuggler, greeting, public-tier] - - - id: pc-smuggler_d_005 - text: "Cargo routing. Containers come in, I process them out. Standard stuff." - role: dock-worker - access: [public, authority] - trust: surface - situation: [investigation, social] - topic: [routine, cargo] - tags: [pc-smuggler, work-question, public-tier] - - - id: pc-smuggler_d_006 - text: "It's a freight hub. Busy during shifts, quiet after. Same as anywhere." - role: dock-worker - access: [public] - trust: surface - situation: [social] - topic: [routine] - tags: [pc-smuggler, hub-question, public-tier] - - - id: pc-smuggler_d_007 - text: "Good crew. We do our shifts, go home. Nothing exciting." - role: dock-worker - access: [public, authority] - trust: surface - situation: [investigation, social] - topic: [colleague, routine] - tags: [pc-smuggler, colleagues-question, public-tier] - - - id: pc-smuggler_d_008 - text: "Look, I just move containers. You'd want to talk to Voss about scheduling." - role: dock-worker - access: [authority] - trust: surface - situation: [confrontation, investigation] - topic: [routine, colleague] - tags: [pc-smuggler, deflection, public-tier, voss] diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/scheduler.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/scheduler.yaml deleted file mode 100644 index dc1a110c4..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/scheduler.yaml +++ /dev/null @@ -1,371 +0,0 @@ -# Dialogue: scheduler at The Terminal -# NPC: Maret (Tier 2, WITNESS/SKEPTIC) -# Voice: precise, institutional. Numbers and containers, not people. Unease she keeps professional. -# Arc: flags discrepancies → gets suppressed by Voss → suspicion hardens → potential detective source -# Ring-aware: not involved. Seeing the pattern. Hasn't named it yet. -# Ticket: #190 | Sprint: 12 - -location: the-terminal -role: scheduler -lines: - - # ========================================== - # GREETINGS — scheduler's opening read - # ========================================== - - - id: scheduler_d_001 - text: "Manifest's current. Bay assignments are posted." - role: scheduler - access: [public, peer] - trust: surface - situation: [shift_start, arrival] - topic: [routine, cargo] - mood: [content] - tags: [maret, procedural, greeting] - - - id: scheduler_d_002 - text: "Container 4471 is still in C-4. Scheduled for bay six by 1400. Check with Voss if the hold's lifted." - role: scheduler - access: [public, peer] - trust: surface - situation: [shift_start, routine] - topic: [cargo, routine] - mood: [content] - tags: [maret, container-4471, procedural] - dual_lens: - smuggler: "She's tracking 4471 as a scheduling issue. Not flagging it as a discrepancy yet." - detective: "Maret references container 4471 as an unresolved routing issue. She knows the number." - knowledge_grant: - fact_id: investigation.manifest_discrepancy - confidence: suspects - - - id: scheduler_d_003 - text: "Three inbounds today. All verified against the manifest. No gaps so far." - role: scheduler - access: [public, peer] - trust: surface - situation: [shift_start, routine] - topic: [cargo, routine] - mood: [content] - tags: [maret, procedural, manifest] - - # ========================================== - # DISCREPANCY PATTERN — the core arc - # ========================================== - - - id: scheduler_d_004 - text: "Container 4474 shows a forty-seven kilo discrepancy. I've flagged it twice." - role: scheduler - access: [public, peer] - trust: surface - situation: [routine, investigation] - topic: [cargo, routine] - mood: [frustrated] - tags: [maret, discrepancy, flagging] - dual_lens: - smuggler: "Which container? Not 4471. She's flagging a different one. Two flags, no escalation." - detective: "Maret has flagged container 4474 twice. If Voss suppressed it both times, there's a paper trail." - knowledge_grant: - fact_id: investigation.oversight_gap_pattern - confidence: suspects - - - id: scheduler_d_005 - text: "It was logged as administrative. I don't know what that means for a weight discrepancy." - role: scheduler - access: [public, peer] - trust: surface - situation: [routine] - topic: [cargo, routine] - mood: [frustrated] - tags: [maret, discrepancy, institutional-response] - dual_lens: - smuggler: "She doesn't know what 'administrative' means either. Voss's answer covered nothing." - detective: "Maret knows the answer she got wasn't a real answer. She's still sitting with that." - - - id: scheduler_d_006 - text: "The transition window anomalies cluster at shift change. I've run the numbers four times. It's not random." - role: scheduler - access: [peer] - trust: surface - situation: [routine, investigation] - topic: [cargo, routine] - mood: [frustrated] - tags: [maret, pattern, transition-window] - dual_lens: - smuggler: "She's found the pattern. Not the cause. Not yet." - detective: "Maret has independently confirmed the transition window cluster. She's already halfway to the conclusion." - knowledge_grant: - fact_id: investigation.manifest_discrepancy - confidence: knows_details - - - id: scheduler_d_007 - text: "Three separate manifest entries show weight variations under ten kilos. Within rounding, technically." - role: scheduler - access: [peer] - trust: surface - situation: [routine] - topic: [cargo, routine] - mood: [frustrated] - tags: [maret, pattern, manifest] - dual_lens: - smuggler: "She's tracking the small ones too. But 'within rounding' is what Voss told her. She's not satisfied." - detective: "Sub-threshold variations. Small enough to dismiss individually. Maret's running aggregate analysis." - - - id: scheduler_d_008 - text: "I filed a formal notice with Voss. He reviewed it and told me it was resolved. It's not resolved." - role: scheduler - access: [peer] - trust: surface - situation: [routine, confrontation] - topic: [cargo, institution] - mood: [frustrated] - tags: [maret, voss, suppression, frustration] - dual_lens: - smuggler: "She filed a formal notice. Voss sat on it. She knows. This is the pressure point." - detective: "Formal notice filed, suppressed by supervisor. If that notice exists in the system, it's evidence." - knowledge_grant: - fact_id: investigation.oversight_gap_pattern - confidence: knows_details - - # ========================================== - # ROUTINE SCHEDULING — grounded work - # ========================================== - - - id: scheduler_d_009 - text: "Bay eight's running on reduced capacity until 1700. Route inbounds through six." - role: scheduler - access: [public, peer] - trust: surface - situation: [routine, shift_start] - topic: [routine, cargo] - mood: [content] - tags: [maret, operational] - - - id: scheduler_d_010 - text: "Drin's running the inspection on bay six this cycle. Bay four's on hold per Voss's directive." - role: scheduler - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine, cargo] - mood: [content] - tags: [maret, drin, bay-four, scheduling] - dual_lens: - smuggler: "Maret confirmed it: bay four is Voss's directive. Not a system hold." - detective: "The bay four hold comes directly from Voss, not from the system. Discretionary hold." - - - id: scheduler_d_011 - text: "Overtime requests go through Meridian. I can't process them on paper anymore." - role: scheduler - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine, institution] - mood: [content] - tags: [maret, administrative] - - - id: scheduler_d_012 - text: "Manifest update at 1300. If your containers aren't posted by then, they don't make the cycle." - role: scheduler - access: [public, peer] - trust: surface - situation: [routine, shift_start] - topic: [routine, cargo] - mood: [content] - tags: [maret, procedural, manifest] - - # ========================================== - # DETECTIVE ENCOUNTER — access and resistance - # ========================================== - - - id: scheduler_d_013 - text: "Commission manifest access requires a formal request through Voss. I can tell you what's on the public record." - role: scheduler - access: [authority] - trust: surface - situation: [investigation, routine] - topic: [institution, cargo] - mood: [content] - tags: [maret, detective-path, procedural] - - - id: scheduler_d_014 - text: "The flagged entries are in the system. They were logged as reviewed and closed. That's what I can confirm." - role: scheduler - access: [authority] - trust: surface - situation: [investigation] - topic: [cargo, institution] - mood: [frustrated] - tags: [maret, detective-path, discrepancy-disclosure] - dual_lens: - smuggler: "Never encounters this line." - detective: "Maret confirms the flags exist in the system. And she's using careful language: 'what I can confirm.' There's more." - - - id: scheduler_d_015 - text: "I'm not in a position to speak to why certain reviews were closed the way they were." - role: scheduler - access: [authority] - trust: surface - situation: [investigation, confrontation] - topic: [institution, cargo] - mood: [frustrated] - tags: [maret, detective-path, careful-language] - dual_lens: - smuggler: "Never encounters this line." - detective: "She's being very precise about what she will and won't say. 'Not in a position' means she has a position. Come back when she trusts me more." - - # ========================================== - # ELEVATED TRUST — Maret breaks professional distance - # ========================================== - - - id: scheduler_d_016 - text: "The pattern I'm seeing doesn't make sense for equipment failure. It's too consistent." - role: scheduler - access: [peer, insider] - trust: real - situation: [routine, investigation] - topic: [cargo, investigation] - mood: [frustrated] - tags: [maret, peer-candor, pattern] - dual_lens: - smuggler: "She's figured it out. She hasn't said what 'it' is. But she knows the numbers aren't random." - detective: "Maret has crossed from anomaly-logging into active pattern recognition. She's running an informal parallel investigation." - knowledge_grant: - fact_id: investigation.manifest_discrepancy - confidence: knows_details - - - id: scheduler_d_017 - text: "I filed a second formal notice two cycles ago. It's been under review since then. By Voss." - role: scheduler - access: [peer] - trust: real - situation: [routine, confrontation] - topic: [cargo, institution] - mood: [frustrated] - tags: [maret, voss, suppression, peer-candor] - dual_lens: - smuggler: "Two formal notices. Both sitting with Voss. He's managing her output directly." - detective: "Second formal notice. Both under Voss's review. That's documented suppression with a timestamp." - knowledge_grant: - fact_id: behavioral.voss_awareness - confidence: knows_details - - - id: scheduler_d_018 - text: "I don't think I should be the one telling you this." - role: scheduler - access: [insider] - trust: real - situation: [confrontation, alone] - topic: [investigation] - mood: [frustrated] - tags: [maret, detective-path, threshold-line] - notes: "Gate line. Opens when detective has built enough trust. What follows depends on the conversation state." - - # ========================================== - # SIGN-OFF - # ========================================== - - - id: scheduler_d_019 - text: "Manifest posted for the evening shift. I'm off at 1500." - role: scheduler - access: [public, peer] - trust: surface - situation: [shift_end] - topic: [routine] - mood: [content] - tags: [maret, closing] - - - id: scheduler_d_020 - text: "Numbers don't lie. People lie about numbers." - role: scheduler - access: [peer] - trust: real - situation: [shift_end, routine] - topic: [routine] - mood: [frustrated] - tags: [maret, closing, character-line] - notes: "Low-access line. Maret's professional philosophy. Can fire as ambient or as a closing beat." - - # ========================================== - # GENERATION PASS — ambient variants - # ========================================== - - - id: scheduler_d_021 - text: "Bay assignments updated as of 0900. Check before you touch anything." - role: scheduler - access: [public, peer] - trust: surface - situation: [shift_start, routine] - topic: [routine, cargo] - mood: [content] - tags: [maret, procedural, generation-pass] - - - id: scheduler_d_022 - text: "Inbound from the Havara corridor is delayed six hours. Adjust your bay queue." - role: scheduler - access: [public, peer] - trust: surface - situation: [routine] - topic: [cargo, routine] - mood: [content] - tags: [maret, operational, generation-pass] - - - id: scheduler_d_023 - text: "Scan log for bay six is still open from last cycle. Close it before end of shift." - role: scheduler - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine, cargo] - mood: [content] - tags: [maret, procedural, generation-pass] - - - id: scheduler_d_024 - text: "Overtime requests need scheduler approval now. Voss changed the process." - role: scheduler - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine, institution] - mood: [content] - tags: [maret, voss, administrative, generation-pass] - - - id: scheduler_d_025 - text: "If a container's not logged by 1300, it doesn't make the cycle. That's the rule." - role: scheduler - access: [public, peer] - trust: surface - situation: [routine, shift_start] - topic: [routine, cargo] - mood: [content] - tags: [maret, procedural, generation-pass] - - - id: scheduler_d_026 - text: "End-of-cycle reconciliation is at 1430. Be available." - role: scheduler - access: [public, peer] - trust: surface - situation: [routine, shift_end] - topic: [routine] - mood: [content] - tags: [maret, procedural, generation-pass] - - - id: scheduler_d_027 - text: "Weight tolerance is plus or minus five kilos. Anything outside that gets a flag." - role: scheduler - access: [public, peer] - trust: surface - situation: [routine] - topic: [cargo, routine] - mood: [content] - tags: [maret, procedural, manifest, generation-pass] - - - id: scheduler_d_028 - text: "Commission audit prep starts next cycle. Get your documentation current." - role: scheduler - access: [public, peer] - trust: surface - situation: [routine] - topic: [institution, routine] - mood: [suspicious] - tags: [maret, commission, audit, generation-pass] diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/shift-supervisor.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/shift-supervisor.yaml deleted file mode 100644 index 70c47be17..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/shift-supervisor.yaml +++ /dev/null @@ -1,356 +0,0 @@ -# Dialogue: shift-supervisor at The Terminal -# NPC: Voss (Tier 2, SYSTEM/OPERATOR) -# Voice: terse, procedural, institutional. Uses authority as armor. -# Ring-complicit: provides scheduling cover. Never shows it on surface. -# Ticket: #190 | Sprint: 12 - -location: the-terminal -role: shift-supervisor -lines: - - # ========================================== - # GREETINGS — shift arrival - # ========================================== - - - id: shift-supervisor_d_001 - text: "You're late. Don't be late." - role: shift-supervisor - access: [public, peer, insider] - trust: surface - situation: [arrival, shift_start] - topic: [routine] - mood: [content] - tags: [voss, greeting, authority] - - - id: shift-supervisor_d_002 - text: "Manifest's posted. Bay assignments are final — don't renegotiate them with me." - role: shift-supervisor - access: [public, peer] - trust: surface - situation: [shift_start] - topic: [routine, cargo] - mood: [content] - tags: [voss, procedural] - - - id: shift-supervisor_d_003 - text: "Bay 4's running a review hold. Nobody touches that freight until I say." - role: shift-supervisor - access: [public, peer] - trust: surface - situation: [shift_start, routine] - topic: [cargo, routine] - mood: [content] - tags: [voss, authority] - dual_lens: - smuggler: "Review hold on Bay 4. Voss knows the container's in the queue. Is he covering it or flagging it?" - detective: "Supervisor flagging Bay 4 himself. Either due diligence or containment." - - - id: shift-supervisor_d_004 - text: "Commission liaison's in the district this cycle. Keep the floor clean." - role: shift-supervisor - access: [public, peer] - trust: surface - situation: [shift_start, routine] - topic: [institution, routine] - mood: [frustrated] - tags: [voss, warning, commission] - dual_lens: - smuggler: "Voss knows the detective's here. That warning's not just about tidiness." - detective: "Supervisor aware of my presence. Either routine caution or he's got something to protect." - - # ========================================== - # SHIFT AUTHORITY — routine management - # ========================================== - - - id: shift-supervisor_d_005 - text: "Drin was supposed to run the bay six inspection. Tell him I'm asking." - role: shift-supervisor - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine, colleague] - mood: [content] - tags: [voss, drin, authority] - - - id: shift-supervisor_d_006 - text: "Transition window's twenty minutes. Not twenty-five, not thirty. Twenty." - role: shift-supervisor - access: [public, peer, insider] - trust: surface - situation: [shift_transition] - topic: [routine] - mood: [content] - tags: [voss, procedural, transition-window] - - - id: shift-supervisor_d_007 - text: "Overtime requests go through the Meridian form. Don't bring them to me." - role: shift-supervisor - access: [public, peer] - trust: surface - situation: [routine, shift_end] - topic: [routine] - mood: [content] - tags: [voss, procedural] - - - id: shift-supervisor_d_008 - text: "Bay eight's going to downtime at 1300. Plan around it." - role: shift-supervisor - access: [public, peer] - trust: surface - situation: [routine, shift_start] - topic: [routine] - mood: [content] - tags: [voss, operational] - - - id: shift-supervisor_d_009 - text: "Maret flagged a discrepancy. I've reviewed it. It's logged. Move on." - role: shift-supervisor - access: [public, peer] - trust: surface - situation: [routine, investigation] - topic: [cargo, routine] - mood: [content] - tags: [voss, maret, discrepancy, cover] - dual_lens: - smuggler: "Voss reviewed it and logged it. Not escalating. He's managing it." - detective: "Supervisor reviewed a manifest discrepancy and chose not to escalate. That's not nothing." - knowledge_grant: - fact_id: investigation.oversight_gap_pattern - confidence: suspects - - - id: shift-supervisor_d_010 - text: "Freight's moving. That's what matters. Questions slow things down." - role: shift-supervisor - access: [public, peer] - trust: surface - situation: [routine] - topic: [cargo, routine] - mood: [content] - tags: [voss, deflection, philosophy] - - # ========================================== - # SCHEDULING COVER — insider, real trust - # ========================================== - - - id: shift-supervisor_d_011 - text: "Bay four is clear for transition. I've adjusted the inspection schedule." - role: shift-supervisor - access: [insider] - trust: real - situation: [shift_transition] - topic: [cargo, routine] - mood: [focused] - tags: [voss, ring-ops, scheduling-cover] - dual_lens: - smuggler: "He adjusted the schedule. The window is actually clear. Voss is part of this." - detective: "Never hears this line." - - - id: shift-supervisor_d_012 - text: "Drin's on bay six. Bay four's mine tonight." - role: shift-supervisor - access: [insider] - trust: real - situation: [shift_transition, night_shift] - topic: [routine, cargo] - mood: [focused] - tags: [voss, ring-ops, scheduling-cover, drin] - - - id: shift-supervisor_d_013 - text: "The hold note is administrative. Don't treat it as anything else." - role: shift-supervisor - access: [insider] - trust: real - situation: [shift_transition] - topic: [cargo] - mood: [focused] - tags: [voss, ring-ops, coded] - notes: "Signals to ring members that the 'hold' on Bay 4 is cover, not genuine review." - - # ========================================== - # DETECTIVE ENCOUNTER — authority tier - # ========================================== - - - id: shift-supervisor_d_014 - text: "You'll need to submit a formal access request through Commission channels for any restricted data." - role: shift-supervisor - access: [authority] - trust: surface - situation: [investigation, routine] - topic: [institution, routine] - mood: [content] - tags: [voss, detective-path, institutional-resistance] - - - id: shift-supervisor_d_015 - text: "The manifest's available to any Commission officer. Ask the scheduler." - role: shift-supervisor - access: [authority] - trust: surface - situation: [investigation] - topic: [cargo, institution] - mood: [content] - tags: [voss, detective-path, redirect] - - - id: shift-supervisor_d_016 - text: "My workers perform their duties. If there's an irregularity, it'll show in the log." - role: shift-supervisor - access: [authority] - trust: surface - situation: [investigation, confrontation] - topic: [routine, institution] - mood: [content] - tags: [voss, detective-path, deflection] - - - id: shift-supervisor_d_017 - text: "I've been running this floor for six years. The numbers work out." - role: shift-supervisor - access: [authority, public] - trust: surface - situation: [investigation, confrontation] - topic: [routine, institution] - mood: [content] - tags: [voss, detective-path, authority-assertion] - - # ========================================== - # PRESSURE / CONFRONTATION - # ========================================== - - - id: shift-supervisor_d_018 - text: "Close the door." - role: shift-supervisor - access: [insider, peer] - trust: real - situation: [confrontation, alone] - topic: [danger] - mood: [frustrated] - tags: [voss, confrontation, private] - - - id: shift-supervisor_d_019 - text: "Maret keeps flagging the discrepancies. That needs to stop being her problem." - role: shift-supervisor - access: [insider] - trust: real - situation: [confrontation, alone] - topic: [colleague, danger] - mood: [frustrated] - tags: [voss, ring-ops, maret, caution] - knowledge_grant: - fact_id: behavioral.voss_awareness - confidence: knows_of - - - id: shift-supervisor_d_020 - text: "If you've got a problem with how I run this floor, that's a conversation for another time." - role: shift-supervisor - access: [public, peer] - trust: surface - situation: [confrontation] - topic: [routine] - mood: [frustrated] - tags: [voss, deflection, shutdown] - - # ========================================== - # SIGN-OFF / END OF SHIFT - # ========================================== - - - id: shift-supervisor_d_021 - text: "Sign-off is at 1400. Be done." - role: shift-supervisor - access: [public, peer] - trust: surface - situation: [shift_end] - topic: [routine] - mood: [content] - tags: [voss, procedural] - - - id: shift-supervisor_d_022 - text: "Night shift takes over at 2200. I don't want to hear about the handoff tomorrow." - role: shift-supervisor - access: [public, peer] - trust: surface - situation: [shift_transition, shift_end] - topic: [routine] - mood: [content] - tags: [voss, procedural] - - - id: shift-supervisor_d_023 - text: "Good shift. Tomorrow at 0600." - role: shift-supervisor - access: [public, peer, insider] - trust: surface - situation: [shift_end] - topic: [routine] - mood: [content] - tags: [voss, closing] - - # ========================================== - # GENERATION PASS — ambient variants - # ========================================== - - - id: shift-supervisor_d_024 - text: "Assignments don't change once they're posted. Read the board." - role: shift-supervisor - access: [public, peer] - trust: surface - situation: [shift_start, routine] - topic: [routine] - mood: [content] - tags: [voss, procedural, generation-pass] - - - id: shift-supervisor_d_025 - text: "If there's a discrepancy, it goes to the scheduler. Not to me directly." - role: shift-supervisor - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine, cargo] - mood: [content] - tags: [voss, procedural, maret, generation-pass] - - - id: shift-supervisor_d_026 - text: "Span gate's cycling at 1100. Clear the bay six access before then." - role: shift-supervisor - access: [public, peer] - trust: surface - situation: [routine, shift_start] - topic: [routine, cargo] - mood: [content] - tags: [voss, operational, generation-pass] - - - id: shift-supervisor_d_027 - text: "I don't repeat myself on safety calls. If you missed it, ask someone who was listening." - role: shift-supervisor - access: [public, peer] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [voss, authority, generation-pass] - - - id: shift-supervisor_d_028 - text: "End-of-day log goes to Meridian before you leave. No exceptions." - role: shift-supervisor - access: [public, peer] - trust: surface - situation: [shift_end, routine] - topic: [routine, institution] - mood: [content] - tags: [voss, procedural, generation-pass] - - - id: shift-supervisor_d_029 - text: "Inbounds from Havara are on the revised schedule. Check the update." - role: shift-supervisor - access: [public, peer] - trust: surface - situation: [routine, shift_start] - topic: [routine, cargo] - mood: [content] - tags: [voss, operational, generation-pass] - - - id: shift-supervisor_d_030 - text: "Clean floor, clean manifest. That's the job." - role: shift-supervisor - access: [public, peer, insider] - trust: surface - situation: [routine] - topic: [routine] - mood: [content] - tags: [voss, philosophy, generation-pass] diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/environmental/maintenance-corridors.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/environmental/maintenance-corridors.yaml index 28e1704a9..b3315ebae 100644 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/environmental/maintenance-corridors.yaml +++ b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/environmental/maintenance-corridors.yaml @@ -189,7 +189,4 @@ items: Container 4471 in the C-4 hold log, entered Month 11, no removal logged. Same container flagged in the terminal manifest. And 4469 is a gap with no explanation. This is the thread. - tags: [investigation-relevant, container-4471, critical] - knowledge_grant: - fact_id: "investigation.cargo_anomaly" - confidence: knows_of + tags: [container-4471, critical] diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/environmental/the-terminal.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/environmental/the-terminal.yaml index 3a44cf766..0e8b07a4b 100644 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/environmental/the-terminal.yaml +++ b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/environmental/the-terminal.yaml @@ -53,10 +53,7 @@ items: detective: > 4471 pending review with a 4474 weight discrepancy in the same bay. Two anomalies, same location. Not random. - tags: [investigation-relevant, manifest-discrepancy] - knowledge_grant: - fact_id: "investigation.manifest_discrepancy" - confidence: suspects + tags: [manifest-discrepancy] # ========================================== # MAINTENANCE REQUEST CLIPBOARD @@ -147,10 +144,7 @@ items: detective: > Unsigned note, initial D. Maret not flagging a weight discrepancy officially. Voss complicit or uninformed. Follow up with Maret. - tags: [investigation-relevant, maret, drin, voss] - knowledge_grant: - fact_id: "investigation.drin_inspection_pattern" - confidence: suspects + tags: [maret, drin, voss] # ========================================== # SAFETY PROCEDURES PLACARD — standard, faded diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/insert/detective.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/insert/detective.yaml deleted file mode 100644 index 697437194..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/insert/detective.yaml +++ /dev/null @@ -1,225 +0,0 @@ -# Diegetic Insert Flavor Text — Detective Character -# Neural lattice interface strings: POI labels, notifications, system status. -# Ticket: #331 | Sprint: 12 | Owner: Mellanie + Araminta -# -# Voice principle: the detective's insert is issued Commission equipment. -# Institutional, precise, surname-first. The vocabulary is the job. -# When personal breaks through, it's notable — the first name appears -# only for allies. Shift to first name IS a relationship marker. - -character: detective - -# ========================================== -# POI LABELS — displayed in perception mode overlay -# Appears on NPCs when viewed through insert interface. -# State-dependent: shifts as relationship changes. -# ========================================== - -poi_labels: - defaults: - unknown: "Unknown subject" - known: "{surname}, {initial}." - friendly: "{first_name}" - person_of_interest: "{surname} — POI" - hostile: "{surname} — AVOID" - - npc_overrides: - kael_davan: - phase_1_unknown: "Unknown subject" - phase_1_known: "Davan, K." - person_of_interest: "Davan, K. — POI" - flagged: "Davan, K. — FLAGGED" - sera_venn: - friendly: "Sera" - phase_3_poi: "Sera — ?" - phase_4_poi: "Venn — REVIEW" - voss: - default: "Voss, K. — Supervisor" - cooperative: "Voss — cooperative" - torek_lintar: - default: "Lintar, T." - flagged: "Lintar, T. — FLAG" - commission_personnel: - default: "{surname} — Commission" - ring_member_suspected: - default: "{surname} — suspect" - -# ========================================== -# NOTIFICATIONS — status strings, message previews -# Displayed as brief overlay text. 40 char max per line. -# ========================================== - -notifications: - case_file: - - id: insert_d_001 - trigger: case_file_update - template: "Case update: {subject_name}" - example: "Case update: Davan, K." - tags: [investigation] - - - id: insert_d_002 - trigger: evidence_logged - text: "Evidence logged" - tags: [investigation] - - - id: insert_d_003 - trigger: manifest_discrepancy_filed - text: "Discrepancy filed" - tags: [investigation, manifest] - - - id: insert_d_004 - trigger: knowledge_updated - template: "KG updated: {fact_category}" - example: "KG updated: relationship" - tags: [investigation] - - - id: insert_d_005 - trigger: poi_status_change - template: "{surname} — status updated" - example: "Davan — status updated" - tags: [investigation] - - - id: insert_d_006 - trigger: tell_logged - template: "{surname} — behavior logged" - example: "Davan — behavior logged" - tags: [investigation, tell] - - - id: insert_d_007 - trigger: pattern_confirmed - template: "{surname} — pattern confirmed" - example: "Venn — pattern confirmed" - tags: [investigation, pattern] - - commission: - - id: insert_d_008 - trigger: commission_advisory - text: "Commission advisory" - tags: [institutional] - - - id: insert_d_009 - trigger: commission_advisory_urgent - text: "Commission advisory — urgent" - tags: [institutional, priority] - - - id: insert_d_010 - trigger: clearance_required - template: "{zone} — clearance required" - example: "Sector B — clearance required" - tags: [institutional] - - - id: insert_d_011 - trigger: clearance_confirmed - template: "{zone} — clearance confirmed" - example: "B-7 — clearance confirmed" - tags: [institutional] - - - id: insert_d_012 - trigger: case_status_active - template: "Case #{case_id}: active" - example: "Case #4471: active" - tags: [institutional, investigation] - - field: - - id: insert_d_013 - trigger: observation_mode_active - text: "Observation: logging" - tags: [field] - - - id: insert_d_014 - trigger: restricted_area_entered - text: "Restricted zone — logged" - tags: [field, institutional] - - - id: insert_d_015 - trigger: anomaly_detected - template: "Anomaly: {location}" - example: "Anomaly: B-7 corridor" - tags: [field, investigation] - - - id: insert_d_016 - trigger: no_anomaly - text: "Sector: nominal" - tags: [field] - -# ========================================== -# SYSTEM STATUS — persistent interface text -# Small-print labels in perception mode corners. -# ========================================== - -system_status: - - id: insert_d_100 - context: default - text: "Analytical lattice: active" - - - id: insert_d_101 - context: perception_mode_active - text: "Perception mode: on" - - - id: insert_d_102 - context: fog_layer_present - text: "Reduced visibility" - - - id: insert_d_103 - context: meridian_active - text: "Meridian: nominal" - - - id: insert_d_104 - context: meridian_inactive - text: "Meridian: offline" - - - id: insert_d_105 - context: investigation_active - text: "Case: active" - - - id: insert_d_106 - context: case_status_flagged - text: "Case: flagged subjects present" - - - id: insert_d_107 - context: case_status_critical - text: "Case: escalation threshold" - - - id: insert_d_108 - context: lattice_scan_complete - text: "Scan: complete" - -# ========================================== -# EXAMINATION LABELS — text shown when examining environmental objects -# ========================================== - -examination_labels: - - id: insert_d_200 - object_type: document - text: "Examine" - - - id: insert_d_201 - object_type: terminal - text: "Query manifest" - - - id: insert_d_202 - object_type: container_flagged - text: "Container 4471 — discrepancy logged" - - - id: insert_d_203 - object_type: restricted_area - text: "Restricted — B-7 sector" - - - id: insert_d_204 - object_type: surveillance_gap - text: "Coverage gap — logged" - - - id: insert_d_205 - object_type: evidence_item - text: "Log as evidence" - - - id: insert_d_206 - object_type: known_meeting_point - text: "Meeting point — flagged" - -notes: > - Voice: institutional, precise, Commission equipment. Surname-first for - targets and unknowns. First name appears only for allies (Sera). - That shift IS the relationship marker — the player notices when - "Venn" becomes "Sera" and knows it means something. - Araminta coordinates on visual presentation constraints (#331 co-owner). diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/insert/smuggler.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/insert/smuggler.yaml deleted file mode 100644 index 36ee0c6cb..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/insert/smuggler.yaml +++ /dev/null @@ -1,193 +0,0 @@ -# Diegetic Insert Flavor Text — Smuggler Character -# Neural lattice interface strings: POI labels, notifications, system status. -# Ticket: #331 | Sprint: 12 | Owner: Mellanie + Araminta -# -# Voice principle: the smuggler's insert is slightly informal, modified hardware. -# It's a tool that's been lived with, not issued equipment. Short labels. -# Uses first names and operational shorthand, not institutional vocabulary. - -character: smuggler - -# ========================================== -# POI LABELS — displayed in perception mode overlay -# Appears on NPCs when viewed through insert interface. -# State-dependent: shifts as relationship changes. -# ========================================== - -poi_labels: - defaults: - unknown: "Unknown" - known: "{first_name}" - friendly: "{first_name} — OK" - person_of_interest: "{first_name} — WATCH" - hostile: "{first_name} — AVOID" - - npc_overrides: - kael_davan: - phase_1: "Kael" - phase_2: "Kael — ?" - phase_3: "Kael — WATCH" - phase_4: "Kael — LYING" - phase_5: "Kael — COMPROMISED" - voss: - default: "Voss" - hostile: "Voss — PROBLEM" - commission_personnel: - default: "Commission" - investigation_active: "Commission — ACTIVE" - ring_member: - default: "{first_name}" - operational: "{first_name} — RING" - -# ========================================== -# NOTIFICATIONS — status strings, message previews -# Displayed as brief overlay text. 40 char max per line. -# ========================================== - -notifications: - messages: - - id: insert_s_001 - trigger: message_from_contact - template: "Msg: {contact_name}" - example: "Msg: Kael" - tags: [ring-operational] - - - id: insert_s_002 - trigger: message_from_contact_urgent - template: "Msg: {contact_name} — urgent" - example: "Msg: Nils — urgent" - tags: [ring-operational, priority] - - - id: insert_s_003 - trigger: drop_point_update - text: "Drop point updated" - tags: [ring-operational] - - - id: insert_s_004 - trigger: drop_point_confirmed - text: "Drop point confirmed — proceed" - tags: [ring-operational] - - - id: insert_s_005 - trigger: meridian_window_opening - template: "Window: {duration}m" - example: "Window: 25m" - tags: [operational, timing] - - - id: insert_s_006 - trigger: meridian_window_closing - template: "Window closing — {time_remaining}m" - example: "Window closing — 3m" - tags: [operational, timing, priority] - - - id: insert_s_007 - trigger: ring_checkin_overdue - text: "Check-in overdue" - tags: [ring-operational, concern] - - - id: insert_s_008 - trigger: contact_unavailable - template: "{contact_name} — no response" - example: "Kael — no response" - tags: [ring-operational, concern] - - - id: insert_s_009 - trigger: commission_patrol_detected - text: "Commission in sector" - tags: [caution, operational] - - - id: insert_s_010 - trigger: commission_patrol_cleared - text: "Sector clear" - tags: [operational] - - evidence: - - id: insert_s_011 - trigger: observation_logged - text: "Logged" - tags: [observation] - - - id: insert_s_012 - trigger: tell_observed - template: "{npc_name} — tell logged" - example: "Kael — tell logged" - tags: [observation, tell] - - - id: insert_s_013 - trigger: contradiction_observed - template: "{npc_name} — anomaly" - example: "Kael — anomaly" - tags: [observation, contradiction] - -# ========================================== -# SYSTEM STATUS — persistent interface text -# Small-print labels in perception mode corners. -# ========================================== - -system_status: - - id: insert_s_100 - context: default - text: "Lattice: Sova Transit" - - - id: insert_s_101 - context: perception_mode_active - text: "Perception: active" - - - id: insert_s_102 - context: fog_layer_present - text: "Fog layer" - - - id: insert_s_103 - context: meridian_dead_zone - text: "Meridian: inactive" - - - id: insert_s_104 - context: meridian_active - text: "Meridian: active — caution" - - - id: insert_s_105 - context: ring_status_stable - text: "Status: stable" - - - id: insert_s_106 - context: ring_status_elevated - text: "Status: elevated" - - - id: insert_s_107 - context: ring_status_compromised - text: "Status: compromised" - -# ========================================== -# EXAMINATION LABELS — text shown when examining environmental objects -# ========================================== - -examination_labels: - - id: insert_s_200 - object_type: document - text: "Read" - - - id: insert_s_201 - object_type: terminal - text: "Check manifest" - - - id: insert_s_202 - object_type: container_flagged - text: "4471 — flagged" - - - id: insert_s_203 - object_type: restricted_area - text: "B-7 — restricted" - - - id: insert_s_204 - object_type: dead_drop - text: "Drop point" - - - id: insert_s_205 - object_type: safe_location - text: "Safe" - -notes: > - Voice: informal, operational shorthand. This is a modified civilian - lattice, not issued equipment. First names, not titles. Short. - Labels should feel like something you'd put on your own interface. - Araminta coordinates on visual presentation constraints (#331 co-owner). diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/items/smuggler-inventory.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/items/smuggler-inventory.yaml deleted file mode 100644 index d25598635..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/items/smuggler-inventory.yaml +++ /dev/null @@ -1,281 +0,0 @@ -# Smuggler Physical Inventory — v0.1 Item Specs -# Ticket: #441 | Sprint: 6 | Decision: D-065 -# Author: Mellanie (copy), covering Paula (narrative systems) + Gestalt (content architecture) -# -# D-065: Knowledge is the primary "inventory" for all characters. The smuggler -# additionally gets 3 physical items because the smuggler's word doesn't carry -# institutional weight — they need tangible proof for leverage. -# -# All items are contraband. All items are private (information boundary, D-010). -# Not visible to other entities unless revealed via search, scan, or confrontation. -# -# Server reads these specs via CarriedBy component + Take/Place verbs (#424). -# Client renders via inventory UI (#438) — 3x3 grid UI, bottom-right, mapped to 1-9 hotkeys. -# -# Voice: smuggler internal perspective. Descriptions are diegetic — the character -# is looking at an item in their pocket. Not neutral game text. -# -# Cross-references: -# Sprint 5: #297 Kael FRIEND pack, #298 Sera FRIEND pack -# NPC profiles: npcs/kael-davan.yaml, npcs/sera-venn.yaml -# Knowledge graph: global/knowledge/investigation.yaml, contraband.yaml -# Smuggler voice: docs/design/smuggler-voice-card.md, docs/design/voice-patterns.md - -archetype: smuggler -capacity: 9 -items: - - # ================================================================ - # ITEM 1: Manifest Copy - # Proves cargo discrepancy. The paper trail the ring can't deny. - # ================================================================ - - - item_id: "item:manifest-copy" - display_name: "Manifest Copy" - description: > - Cargo manifest from last cycle. Three containers that don't match - the dock log. Kael's handwriting on the margins — weight corrections - that never got filed. - flavor_text: "Should've burned this weeks ago." - contraband: true - portable: true - - knowledge_links: - - fact_id: "investigation.manifest_discrepancy" - relationship: "proves" - confidence_granted: "knows_details" - notes: > - Physical proof of cargo routing irregularities. The manifest shows - three containers rerouted during shift transition with weights that - don't reconcile. Cross-ref: Kael dialogue kael-davan_d_041 - ("Manifest says this one's forty kilos over") and kael-davan_d_051 - ("Manifest's clean on my end"). - - fact_id: "investigation.cargo_anomaly" - relationship: "corroborates" - confidence_granted: "knows_of" - notes: > - The weight discrepancies on this manifest are consistent with - unlicensed lattice components hidden in standard freight containers. - - confrontation: - usable_against: - - target: "npc:kael-davan" - leverage_type: "evidence" - notes: > - Kael's handwriting is on the manifest. Presenting this forces - acknowledgment of ring involvement. Gentle confrontation: "I've - got the manifest, Kael. Your handwriting." Harsh: "Want to explain - the weight corrections, or should I show Nils?" - - target: "npc:voss" - leverage_type: "pressure" - notes: > - Voss cleared the schedule windows that made the rerouting possible. - The manifest doesn't name Voss directly, but the timing proves - complicity. Leverage for information, not confession. - - target: "npc:nils-davan" - leverage_type: "insurance" - notes: > - If Nils pushes for higher volume or threatens the smuggler, - the manifest is proof that the operation exists. Mutually - assured destruction — Nils can't deny it without denying Kael. - risk_if_found: > - A copied manifest with annotated discrepancies is direct evidence - of smuggling awareness. If security or the detective finds this, - it links the smuggler to cargo irregularities immediately. - - gameplay: - acquisition: "Starting inventory. The smuggler copied this last cycle as insurance." - take_verb: true - place_verb: true - place_contexts: - - "dead_drop_location" - - "personal_space" - notes: > - Risk/reward: carrying it means evidence walks with you. Placing it - means it could be found by anyone who accesses the location. The - smuggler copied it because trust in the ring is eroding — Nils is - pushing volume, Kael is distracted, Voss is getting nervous. - - # ================================================================ - # ITEM 2: Corridor Access Token - # Proves ring membership. The key that opens doors you shouldn't enter. - # ================================================================ - - - item_id: "item:access-token" - display_name: "Access Token" - description: > - Maintenance corridor keycard. Kael slipped it to me three weeks ago. - Gets you past the service hatches into B-7. No legitimate reason to - have this. - flavor_text: "Hope it still works." - contraband: true - portable: true - - knowledge_links: - - fact_id: "location.corridor_b7_restricted" - relationship: "proves_access" - confidence_granted: "direct" - notes: > - Physical proof of unauthorized access to restricted maintenance - corridors. Corridor B-7 is where the ring operates during shift - transitions and night cycles. Cross-ref: Kael FRIEND arc phase 3 - (smuggler observes Kael in Corridor B-7). - - fact_id: "relationship.ring_membership" - relationship: "corroborates" - confidence_granted: "knows_details" - notes: > - Possessing this token proves connection to the ring's infrastructure. - Legitimate maintenance workers use Commission-issued access. - This is a copied token — ring-internal distribution. - - confrontation: - usable_against: - - target: "npc:kael-davan" - leverage_type: "shared_guilt" - notes: > - Kael gave this to the smuggler. Both are implicated. Not leverage - against Kael so much as proof of shared position — "We're in this - together." Useful for demanding honesty about the exit attempt. - - target: "npc:devra" - leverage_type: "proof_of_standing" - notes: > - Showing the token to Devra proves operational involvement. Opens - ring-internal dialogue that would otherwise require vouching. - The token is a credential, not a weapon. - risk_if_found: > - Unauthorized corridor access token found on a dock worker. Security - would flag this immediately. The detective's analytical lattice would - connect it to Corridor B-7 activity patterns. No plausible cover. - - gameplay: - acquisition: "Starting inventory. Kael provided it three weeks before session start." - take_verb: true - place_verb: true - place_contexts: - - "dead_drop_location" - - "personal_space" - functional: true - functional_notes: > - The access token actually opens Corridor B-7 service hatches. Carrying - it grants physical access to restricted maintenance corridors. Without - it, the smuggler cannot enter ring operating spaces. Gameplay tension: - you need it to do ring work, but carrying it is incriminating. - - # ================================================================ - # ITEM 3: Personal Comm Log - # Bridge between knowledge and provable leverage. The receipts. - # ================================================================ - - - item_id: "item:comm-log" - display_name: "Comm Log" - description: > - Three months of messages. Times, names, drop schedules. Nils - arranging volumes, Kael confirming routes, Renn reporting handoffs. - Everything the ring said it never said. - flavor_text: "Should've wiped these. Didn't." - contraband: true - portable: true - - knowledge_links: - - fact_id: "contraband.supply_chain" - relationship: "proves" - confidence_granted: "knows_details" - notes: > - The comm log contains operational messages about lattice component - shipments — arrival windows, container IDs, handoff confirmations. - This is the full supply chain in text. Cross-ref: D-037 (contraband - is unlicensed lattice components, not weapons). - - fact_id: "relationship.trust_network" - relationship: "proves" - confidence_granted: "knows_details" - notes: > - Messages between Nils, Kael, Renn, Devra, and the smuggler. The comm - log maps the ring's social structure — who coordinates with whom, - who reports to whom. Cross-ref: triangle hub-power (Voss-Kael-Nils) - and triangle worried-partner (Naia-Kael-Sera). - - fact_id: "investigation.shift_mismatch" - relationship: "corroborates" - confidence_granted: "knows_of" - notes: > - Several messages reference shift timing — "window's clear at 14:15" - or "Voss moved the rotation, new window at 14:30." Corroborates - the pattern that shift manipulations enable smuggling operations. - - confrontation: - usable_against: - - target: "npc:nils-davan" - leverage_type: "mutually_assured" - notes: > - Nils's name is in the messages. Arranging volumes, setting - schedules, confirming drops. If Nils tries to cut the smuggler - out or shift blame, the comm log proves his coordination role. - The nuclear option. - - target: "npc:kael-davan" - leverage_type: "evidence" - notes: > - Kael's route confirmations are in the log. But more importantly, - the log shows Kael's messages STOPPING three weeks ago — silence - that correlates with the exit attempt. The absence is evidence. - "You stopped answering, Kael. I noticed." - - target: "npc:renn" - leverage_type: "pressure" - notes: > - Renn's handoff reports are recorded. Leverage for cooperation - or information if the smuggler needs to pressure a ring member - without going through Nils. - risk_if_found: > - Three months of incriminating communications naming ring members, - shipment details, and operational timing. This is the single most - damaging item the smuggler carries. If the detective finds it, - the entire ring is compromised. If Nils finds it, the smuggler - kept records against explicit protocol. - - gameplay: - acquisition: "Starting inventory. The smuggler has been saving messages as insurance." - take_verb: true - place_verb: true - place_contexts: - - "dead_drop_location" - - "personal_space" - notes: > - The comm log is the smuggler's most powerful and most dangerous item. - It proves the supply chain, maps the trust network, and corroborates - shift manipulation. It's also the item that most clearly differentiates - the smuggler from the detective — the detective builds a case from - observation and institutional access. The smuggler already HAS the case. - The question is what to do with it. - -# ================================================================ -# SCHEMA NOTES (for Gestalt / content pipeline) -# ================================================================ -# -# Item spec schema (proposed for content/_schema/item-spec.schema.json): -# required: item_id, display_name, description, contraband, portable -# optional: flavor_text, knowledge_links[], confrontation{}, gameplay{} -# -# knowledge_links[]: -# fact_id: string (matches global/knowledge/*.yaml fact_id) -# relationship: enum [proves, corroborates, suggests] -# confidence_granted: enum [suspects, knows_of, knows_details, direct] -# notes: string (authoring context, not displayed in-game) -# -# confrontation.usable_against[]: -# target: string (canonical NPC id) -# leverage_type: enum [evidence, pressure, shared_guilt, insurance, -# proof_of_standing, mutually_assured] -# notes: string (authoring context) -# -# confrontation.risk_if_found: string (consequence description) -# -# gameplay: -# acquisition: string (how the player gets this item) -# take_verb: bool (can be picked up) -# place_verb: bool (can be placed in world) -# place_contexts: list (valid placement locations) -# functional: bool (does the item DO something beyond evidence?) -# functional_notes: string (what it does) -# -# Display constraints (per D-065): -# - description: max 2 sentences, ~30 words, smuggler voice -# - flavor_text: max 1 sentence, ~10 words -# - UI: 3x3 grid, bottom-right, mapped to 1-9 hotkeys diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/commission-kiosk.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/commission-kiosk.yaml deleted file mode 100644 index df674f443..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/commission-kiosk.yaml +++ /dev/null @@ -1,306 +0,0 @@ -# Monologue: Detective — Commission Kiosk -# Ticket: #120 | Author: Mellanie | Sprint: 14 -# Decision refs: D-016, D-032, D-034, D-035 -# -# The Commission kiosk is a small terminal alcove in the transit district — -# institutional grey, cool lighting, regulation spec. The detective has -# authorized access. This is where official investigation happens: manifest -# logs, personnel records, flagged container reports. It smells like -# commission-issue air filters. The detective is comfortable here and also -# slightly isolated — the kiosk is public but feels private. -# -# Voice note: the detective is in his element at the kiosk — data flows, -# patterns emerge, the lattice is doing its work. But the kiosk is also a -# reminder that the case is bigger than the data suggests, and that Sera works -# with Commission systems daily. These lines should feel analytically engaged -# with moments of personal cost showing through. -# -# Schema: D-035 compliant. role/access/trust/situation included on all lines. - -character: detective -location: commission-kiosk - -lines: - - # --- Arrival --- - - - id: pc-detective_m_d_001 - text: "Commission terminal. Authorized access, full import logs. Let's see what the system knows." - role: player_character - access: [public] - trust: surface - trigger: enter_location - situation: [arrival, routine] - tags: [arrival, tutorial, orientation] - - - id: pc-detective_m_d_002 - text: "Standard regulation spec. Commission requisition 4-C. They didn't upgrade this terminal in three years." - role: player_character - access: [public] - trust: surface - trigger: enter_location - situation: [arrival, routine] - tags: [arrival, atmospheric] - - - id: pc-detective_m_d_003 - text: "Filtered air. A Commission smell — sterile, precise, faintly antiseptic. Familiar." - role: player_character - access: [public] - trust: surface - trigger: enter_location - situation: [arrival, routine] - tags: [arrival, atmospheric, sensory] - - - id: pc-detective_m_d_004 - text: "Back at the kiosk. The terminal logged my last access thirty-two minutes ago." - role: player_character - access: [public] - trust: surface - trigger: return_visit - situation: [arrival] - tags: [arrival, orientation] - - - id: pc-detective_m_d_005 - text: "Nobody uses this terminal except Commission staff. Which means whoever was here before me has credentials." - role: player_character - access: [public] - trust: surface - trigger: enter_location - situation: [arrival, routine] - tags: [arrival, investigation, tutorial] - - # --- Perception / Sound --- - - - id: pc-detective_m_d_006 - text: "The terminal hum is different from the freight equipment. Cleaner. Higher frequency." - role: player_character - access: [public] - trust: surface - trigger: hear_sound - situation: [routine] - tags: [sensory, environmental] - - - id: pc-detective_m_d_007 - text: "Footsteps at the transit corridor entrance. Not Commission — wrong pace." - role: player_character - access: [public] - trust: surface - trigger: hear_sound - situation: [routine, observation] - tags: [sensory, caution] - - - id: pc-detective_m_d_008 - text: "Someone's running queries at the main manifest board. Loud keystrokes — frustrated." - role: player_character - access: [public] - trust: surface - trigger: hear_sound - situation: [routine] - tags: [sensory, environmental] - - # --- Tutorial / Evidence --- - - - id: pc-detective_m_d_009 - text: "Import logs go back forty days. Weight discrepancies flagged automatically — unless someone cleared the flag." - role: player_character - access: [public] - trust: surface - trigger: discover_evidence - situation: [routine, investigation] - tags: [tutorial, investigation, orientation] - - - id: pc-detective_m_d_010 - text: "Personnel movement log. Every authorized access to every restricted space, timestamped." - role: player_character - access: [public] - trust: surface - trigger: discover_evidence - situation: [routine, investigation] - tags: [tutorial, investigation] - - # --- Time Idle / Ruminative --- - - - id: pc-detective_m_d_011 - text: "Pattern is forming. Three manifests, same routing anomaly, different filing dates. That's deliberate." - role: player_character - access: [public] - trust: surface - trigger: time_idle - situation: [routine, investigation] - tags: [investigation, analytical] - - - id: pc-detective_m_d_012 - text: "The kiosk shows what the system knows. The system doesn't know what it hasn't been told." - role: player_character - access: [public] - trust: surface - trigger: time_idle - situation: [routine] - tags: [atmospheric, investigation] - - - id: pc-detective_m_d_013 - text: "Commission protocols say: document everything, infer nothing. The gap between those two is where cases live." - role: player_character - access: [public] - trust: surface - trigger: time_idle - situation: [routine] - tags: [atmospheric, analytical] - - - id: pc-detective_m_d_014 - text: "Twelve access events in the manifest terminal in the last six days. Elevated for a district this size." - role: player_character - access: [public] - trust: surface - trigger: time_idle - situation: [routine, investigation] - tags: [investigation, analytical] - - - id: pc-detective_m_d_015 - text: "Evidence is what the system logged. Inference is what it means. Right now I have plenty of both." - role: player_character - access: [public] - trust: surface - trigger: time_idle - situation: [routine, investigation] - tags: [investigation, analytical] - - # --- Anomaly --- - - - id: pc-detective_m_d_016 - text: "Access log shows a non-Commission credential used at 0340. That terminal should have rejected it." - role: player_character - access: [public] - trust: surface - trigger: observe_anomaly - situation: [routine, investigation] - priority: 7 - tags: [investigation, caution, analytical] - - - id: pc-detective_m_d_017 - text: "Container 4471 has three separate manifest entries with different timestamps. One of them is false." - role: player_character - access: [public] - trust: surface - trigger: observe_anomaly - situation: [investigation] - prerequisites: - facts: - - fact_id: investigation.manifest_discrepancy - min_confidence: knows_of - priority: 8 - tags: [investigation, contraband, analytical] - - - id: pc-detective_m_d_018 - text: "Standard access log would show calibration events. This one shows something cleared three days ago. Manually." - role: player_character - access: [public] - trust: surface - trigger: observe_anomaly - situation: [investigation] - tags: [investigation, caution] - - # --- Knowledge-Gated: Sera Arc --- - - - id: pc-detective_m_d_019 - text: "Venn, S. — last calibration event logged here: 0615 this morning. Standard. Her schedule is precise." - role: player_character - access: [public] - trust: surface - trigger: enter_location - situation: [arrival, routine] - prerequisites: - relationship: - target: npc:sera-venn - state: known - priority: 5 - tags: [npc, sera, routine, friend-arc] - - - id: pc-detective_m_d_020 - text: "Venn's credentials are in the access log. Three times today. She's thorough, or she's looking for something." - role: player_character - access: [public] - trust: surface - trigger: time_idle - situation: [routine, investigation] - prerequisites: - facts: - - fact_id: behavioral.sera_kiosk_pattern - min_confidence: suspects - priority: 6 - tags: [npc, sera, investigation, friend-arc, dual-lens] - - - id: pc-detective_m_d_021 - text: "She runs calibration checks on the Commission terminal. That's her job. But the access log shows she's also running manifest queries. That's not." - role: player_character - access: [public] - trust: surface - trigger: time_idle - situation: [investigation] - prerequisites: - facts: - - fact_id: behavioral.sera_kiosk_pattern - min_confidence: knows_of - priority: 7 - tags: [npc, sera, tell, investigation, friend-arc] - - - id: pc-detective_m_d_022 - text: "Venn cleared a flag on container 4471 six days ago. Routine override — authorized. But 4471 is in my manifest discrepancy list." - role: player_character - access: [public] - trust: surface - trigger: discover_evidence - situation: [investigation] - prerequisites: - facts: - - fact_id: investigation.manifest_discrepancy - min_confidence: knows_of - - fact_id: behavioral.sera_kiosk_pattern - min_confidence: suspects - priority: 9 - tags: [npc, sera, investigation, contraband, friend-arc, contaminated-trust] - - - id: pc-detective_m_d_023 - text: "She knows. Either she found it and cleared it deliberately, or she was directed to. Both are worse than I want to believe." - role: player_character - access: [public] - trust: surface - trigger: time_idle - situation: [investigation] - prerequisites: - facts: - - fact_id: behavioral.sera_avoidance_pattern - min_confidence: knows_of - - fact_id: investigation.manifest_discrepancy - min_confidence: knows_details - priority: 9 - tags: [npc, sera, investigation, friend-arc, contaminated-trust] - - # --- Post-Conversation --- - - - id: pc-detective_m_d_024 - text: "She said she hadn't touched the manifest terminal. The log says otherwise. Either she forgot or she lied." - role: player_character - access: [public] - trust: surface - trigger: post_conversation - situation: [investigation] - prerequisites: - relationship: - target: npc:sera-venn - state: person_of_interest - priority: 9 - tags: [npc, sera, post-conversation, tell, friend-arc, contaminated-trust] - - - id: pc-detective_m_d_025 - text: "Davan said he runs a clean dock. The manifest data disagrees on three specific points. Filed." - role: player_character - access: [public] - trust: surface - trigger: post_conversation - situation: [investigation] - prerequisites: - facts: - - fact_id: investigation.manifest_discrepancy - min_confidence: knows_of - tags: [npc, kael, investigation, contraband] diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/contradiction-detected.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/contradiction-detected.yaml deleted file mode 100644 index 1f12ed12b..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/contradiction-detected.yaml +++ /dev/null @@ -1,236 +0,0 @@ -character: detective -location: contradiction -lines: - # Contradiction Monologue — Ticket #552 — Sera/Kael FRIEND Arc - # Authored per D-083 (contradiction detection pipeline) and Paula Round 2 Mellanie spec - # (docs/workshops/knowledge-flow-npc-boundaries/paula-round2.md, lines 117-158). - # - # Trigger: contradiction_detected fires when the detective observes Kael in Corridor B-7 - # while the KG holds Sera's claim that Kael was at dock intake during second shift. - # Event payload: source_display_name = "Sera Venn", subject_display_name = "Kael Davan" - # - # FRIEND-pattern NPCs (Sera, Kael) always use hand-authored lines — generic template fallback - # does not fire for this arc. - # - # Authoring principle: cognitive dissonance, not accusation. The detective doesn't know - # who or what is wrong. Uncertainty first, suspicion second, accusation never. - # - # Phase 2 lines: trust established but not deep — the blindsiding. - # Prerequisite: KG entry for Kael has state: Contradicted, source: ToldBy(Sera Venn) - # Phase 3 lines: additional context accumulated — Sera's avoidance of Torek observed 3x. - # Prerequisite: Phase 2 + Sera's avoidance pattern has fired (three departures logged). - # - # ID discriminator: _con_ marks contradiction lines per Q-028 pending resolution. - # cooldown: omitted — fire-once enforced by trigger semantics (contradiction_detected - # fires once per KG state change), not by a cooldown value. - # - # Note: contradiction_detected is a new trigger type — requires server-side implementation - # in monologue.rs (ticket #550). Secondary beat lines use lower priority for sequencing; - # server team should implement delay_after_trigger_ticks for proper 3-5 second gap. - - # ----------------------------------------------------------------------- - # PHASE 2 — Primary beat (fires on contradiction_detected, immediate) - # ----------------------------------------------------------------------- - - - id: pc-detective_m_d_con_001 - text: "Sera said Kael was at the dock intake during second shift. I'm looking at him in corridor B-7 right now." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: contradiction_detected - mood: [focused, anxious] - priority: 10 - - prerequisites: - entities: - - id: "npc:kael-davan" - state: Contradicted - - id: "npc:sera-venn" - state: Contradicted - tags: [contradiction, friend-arc, sera, kael, phase-2, analytical] - notes: > - Paula's canonical primary line — preserved verbatim. Flat factual statement: source named, - subject named, specific location claim vs. direct observation. The 'I'm' contraction is - natural in a surprise moment even for the analytical detective — the observation breaks - through the professional register. No interpretation, no accusation. - - - id: pc-detective_m_d_con_002 - text: "Venn said Kael was at dock intake through second shift. Kael is in B-7. Those aren't compatible." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: contradiction_detected - mood: [focused] - priority: 9 - - prerequisites: - entities: - - id: "npc:kael-davan" - state: Contradicted - - id: "npc:sera-venn" - state: Contradicted - tags: [contradiction, friend-arc, sera, kael, phase-2, analytical] - notes: > - Alternate primary — fully analytical register: surname-initial for both (institutional - reflex), no contractions, plain declarative close. 'Those aren't compatible' is the - detective's version of stating contradiction — clinical, process-language. Fires as - alternate to con_001 for variety on replay. - - - id: pc-detective_m_d_con_003 - text: "She placed Kael at the dock. He's not at the dock." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: contradiction_detected - mood: [focused, anxious] - priority: 9 - - prerequisites: - entities: - - id: "npc:kael-davan" - state: Contradicted - - id: "npc:sera-venn" - state: Contradicted - tags: [contradiction, friend-arc, sera, kael, phase-2] - notes: > - Stripped-down alternate. 'She placed' is the informal of 'Venn stated' — personal register - triggered by Sera being THE FRIEND. 'He's not at the dock' — the barest possible statement - of contradiction. The brevity is the weight: six words and the investigation changes shape. - - # ----------------------------------------------------------------------- - # PHASE 2 — Secondary beat (fires after short delay, cognitive processing) - # Server team (#550): implement delay_after_trigger_ticks: 90 for 3-5s gap. - # ----------------------------------------------------------------------- - - - id: pc-detective_m_d_con_004 - text: "One of them is wrong. Sera, or what I'm seeing. Or I'm missing something I don't have yet." - role: player_character - access: [public] - trust: surface - situation: [investigation, alone] - trigger: contradiction_detected - mood: [anxious, focused] - priority: 7 - - prerequisites: - entities: - - id: "npc:kael-davan" - state: Contradicted - - id: "npc:sera-venn" - state: Contradicted - tags: [contradiction, friend-arc, sera, kael, phase-2, cognitive-dissonance, secondary-beat] - notes: > - Paula's canonical secondary beat — fires 3-5 seconds after the primary beat. - Epistemic neutrality held across three options: Sera is wrong, observation is wrong, or - context is missing. No option is dismissed. 'I'm missing something I don't have yet' is - the key line — it holds accusation off even against evidence. The detective files it open. - Lower priority (7) ensures primary lines fire first; server team should implement - delay_after_trigger_ticks for proper sequencing. - - - id: pc-detective_m_d_con_005 - text: "File it. Don't close it. Either Venn's information was wrong when she gave it, or it was wrong on purpose. That's a different question." - role: player_character - access: [public] - trust: surface - situation: [investigation, alone] - trigger: contradiction_detected - mood: [focused] - priority: 6 - - prerequisites: - entities: - - id: "npc:kael-davan" - state: Contradicted - - id: "npc:sera-venn" - state: Contradicted - tags: [contradiction, friend-arc, sera, kael, phase-2, analytical, cognitive-dissonance, secondary-beat] - notes: > - Alternate secondary beat. 'File it, don't close it' is the detective's internal procedure - for unresolved data. The critical distinction: wrong information vs. deliberately wrong - information — the detective separates these without assuming either. 'That's a different - question' closes the processing loop, marking it unresolved, not dismissed. - - # ----------------------------------------------------------------------- - # PHASE 3 — With accumulated context (Sera's avoidance pattern observed) - # Requires: three Sera departures correlated with Torek Lintar arrivals observed. - # ----------------------------------------------------------------------- - - - id: pc-detective_m_d_con_006 - text: "Sera told me Kael doesn't make mistakes. He's not where she said he'd be. And she's been avoiding Lintar for three weeks." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: contradiction_detected - mood: [focused, anxious] - priority: 10 - - prerequisites: - entities: - - id: "npc:kael-davan" - state: Contradicted - - id: "npc:sera-venn" - state: Contradicted - - id: "npc:torek-lintar" - relationship: PersonOfInterest - tags: [contradiction, friend-arc, sera, kael, phase-3, pattern-recognition] - notes: > - Paula's canonical Phase 3 line — preserved verbatim. Three facts in sequence, no explicit - connection drawn between them: Sera's testimony about Kael ('doesn't make mistakes'), - Kael's actual location, Sera's avoidance behavior. The detective is connecting dots but - not announcing the conclusion. The emotional weight is in 'Sera told me' — personal register - for the friend relationship — vs. the clinical observation about Lintar. - - - id: pc-detective_m_d_con_007 - text: "Two facts: Venn placed Kael at dock intake, second shift. Kael is in B-7. One new observation: Venn leaves every time Lintar enters the bar. Worth seeing if those connect." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: contradiction_detected - mood: [focused] - priority: 9 - - prerequisites: - entities: - - id: "npc:kael-davan" - state: Contradicted - - id: "npc:sera-venn" - state: Contradicted - - id: "npc:torek-lintar" - relationship: PersonOfInterest - tags: [contradiction, friend-arc, sera, kael, phase-3, analytical, pattern-recognition] - notes: > - Alternate Phase 3 — analytical register throughout, no personal register even for Sera - (surname only). 'Worth seeing if those connect' is the detective's verbal tic of flagging - without concluding. The numbered format ('Two facts... One new observation') is the - detective's internal case-building style. Fully non-accusatory: the connection is not - stated, only the intent to look for it. - - - id: pc-detective_m_d_con_008 - text: "Venn's been managing her exits around Lintar. And she put Kael somewhere he isn't. Let's see what sits at the intersection of those two." - role: player_character - access: [public] - trust: surface - situation: [investigation, alone] - trigger: contradiction_detected - mood: [focused] - priority: 8 - - prerequisites: - entities: - - id: "npc:kael-davan" - state: Contradicted - - id: "npc:sera-venn" - state: Contradicted - - id: "npc:torek-lintar" - relationship: PersonOfInterest - tags: [contradiction, friend-arc, sera, kael, phase-3, analytical] - notes: > - Alternate Phase 3. 'Let's see what' verbal tic, no accusation. 'Managing her exits' is - the detective naming Sera's avoidance behavior — behavioral description, not motive - attribution. 'Put Kael somewhere he isn't' — plain contradiction framing. The intersection - remains unstated. Detective is following the thread, not announcing what's on it. diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/general.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/general.yaml deleted file mode 100644 index 5f526e55b..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/general.yaml +++ /dev/null @@ -1,92 +0,0 @@ -character: detective -location: general -lines: - - id: pc-detective_m_d_001 - text: "Sova Transit District. Population twelve thousand and change. Let's narrow that down." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [arrival, analytical] - - - id: pc-detective_m_d_002 - text: "The span gate resonance is constant here. Background radiation of a freight hub." - role: player_character - access: [public] - trust: surface - situation: [routine] - trigger: hear_sound - tags: [environmental] - - - id: pc-detective_m_d_003 - text: "First week on station. The case file is thin. The manifest discrepancies are not." - role: player_character - access: [public] - trust: surface - situation: [investigation] - trigger: time_idle - tags: [investigation, orientation] - - - id: pc-detective_m_d_004 - text: "Everyone knows I'm Commission. The conversations stop when I walk in. Noted." - role: player_character - access: [public] - trust: surface - situation: [investigation] - trigger: time_idle - tags: [investigation, social] - - - id: pc-detective_m_d_005 - text: "Station gravity's point-nine-three standard. Enough to notice after a long shift." - role: player_character - access: [public] - trust: surface - situation: [alone] - trigger: time_idle - tags: [environmental, personal] - - - id: pc-detective_m_d_006 - text: "The previous liaison rotated out three months ago. That gap matters." - role: player_character - access: [public] - trust: surface - situation: [investigation] - trigger: time_idle - tags: [investigation, analytical] - - - id: pc-detective_m_d_007 - text: "Back in the district. Let's see what changed while I wasn't watching." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: return_visit - tags: [arrival, analytical] - - - id: pc-detective_m_d_008 - text: "Recycled air, industrial residue, and that constant gate hum. Sova in three notes." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [environmental, atmospheric] - - - id: pc-detective_m_d_009 - text: "Communities like this close ranks around outsiders. Patient work." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: time_idle - tags: [reflection, social] - - - id: pc-detective_m_d_010 - text: "The manifest data goes back eighteen months. The pattern starts around month six." - role: player_character - access: [public] - trust: surface - situation: [investigation] - trigger: time_idle - tags: [investigation, analytical] diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/maintenance-corridors.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/maintenance-corridors.yaml deleted file mode 100644 index e37d4d78a..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/maintenance-corridors.yaml +++ /dev/null @@ -1,274 +0,0 @@ -character: detective -location: maintenance-corridors -lines: - # --- Arrival + Environmental Flavor --- - - - id: pc-detective_m_d_001 - text: "Maintenance level. Low lighting, exposed conduit, restricted access nobody enforces." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [arrival, environmental] - - - id: pc-detective_m_d_002 - text: "The air's different down here. Cooler. Damper. Less filtered." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [environmental, atmospheric] - - - id: pc-detective_m_d_003 - text: "Service corridor B-section. Not on the public transit map. Interesting routing options." - role: player_character - access: [public] - trust: surface - situation: [arrival, investigation] - trigger: enter_location - tags: [arrival, investigation] - - - id: pc-detective_m_d_004 - text: "Water recycling conduits. The station's circulatory system, hidden from view." - role: player_character - access: [public] - trust: surface - situation: [routine] - trigger: hear_sound - tags: [environmental] - - - id: pc-detective_m_d_005 - text: "Pipe network branching three directions. Good for maintenance. Better for privacy." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [environmental, analytical] - - - id: pc-detective_m_d_006 - text: "Emergency lighting only. Visibility reduced, but so is surveillance coverage." - role: player_character - access: [public] - trust: surface - situation: [arrival, investigation] - trigger: enter_location - tags: [environmental, investigation] - - - id: pc-detective_m_d_007 - text: "The rust smell is stronger near junction B-7. Older section. Less maintenance." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [environmental, atmospheric] - - - id: pc-detective_m_d_008 - text: "Back in the corridors. Different route this time — mapping the alternatives." - role: player_character - access: [public] - trust: surface - situation: [arrival, investigation] - trigger: return_visit - tags: [arrival, investigation] - - # --- Investigation Observations --- - - - id: pc-detective_m_d_009 - text: "Scuff marks on the floor. Recent, heavy. Cargo weight, not foot traffic." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_anomaly - tags: [investigation, evidence] - - - id: pc-detective_m_d_010 - text: "The service hatch has been used recently. Oil on the handle, dust disturbed." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_anomaly - tags: [investigation, evidence] - - - id: pc-detective_m_d_011 - text: "Restricted access, but the lock plate shows wear. Regular use by someone with clearance." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_anomaly - tags: [investigation, evidence] - - - id: pc-detective_m_d_012 - text: "Sound carries differently down here. Voices from two junctions away, if you're patient." - role: player_character - access: [public] - trust: surface - situation: [investigation, routine] - trigger: hear_sound - tags: [environmental, investigation] - - - id: pc-detective_m_d_013 - text: "Chalk marks on the wall. Low, deliberate. Not maintenance notation — wrong color." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_anomaly - tags: [investigation, evidence] - - - id: pc-detective_m_d_014 - text: "This corridor connects bay four to temp storage. Bypasses the main freight floor entirely." - role: player_character - access: [public] - trust: surface - situation: [arrival, investigation, routine] - trigger: enter_location - tags: [investigation, operational] - - - id: pc-detective_m_d_015 - text: "Footsteps ahead. Single set, moving fast. Someone who knows where they're going." - role: player_character - access: [public] - trust: surface - situation: [investigation, routine] - trigger: hear_sound - tags: [investigation, caution] - - - id: pc-detective_m_d_016 - text: "The temp storage access from this side isn't logged on the manifest system. Blind spot." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_anomaly - tags: [investigation, evidence] - - # --- Knowledge-Gated Lines --- - - - id: pc-detective_m_d_017 - text: "The cargo scuff pattern matches bay four containers. Dock to corridor to storage — the route." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_anomaly - prerequisites: - facts: - - fact_id: investigation.smuggling_route - min_confidence: suspects - priority: 8 - tags: [investigation, evidence, breakthrough] - - - id: pc-detective_m_d_018 - text: "Those chalk marks match the courier's timing. Renn's route markers, if I had to guess." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_anomaly - prerequisites: - facts: - - fact_id: investigation.renn_courier_role - min_confidence: knows_of - priority: 7 - tags: [npc, renn, investigation, evidence] - - - id: pc-detective_m_d_019 - text: "Camera blind spot at junction C-2. Coincidence, or someone mapped the coverage?" - role: player_character - access: [public] - trust: surface - situation: [investigation, observation, routine] - trigger: observe_anomaly - prerequisites: - facts: - - fact_id: investigation.surveillance_gaps - min_confidence: suspects - tags: [investigation, operational] - - - id: pc-detective_m_d_020 - text: "Standard container, no manifest checkpoint along this route. That's the gap." - role: player_character - access: [public] - trust: surface - situation: [alone, investigation] - trigger: time_idle - prerequisites: - facts: - - fact_id: investigation.smuggling_route - min_confidence: knows_details - priority: 9 - tags: [investigation, breakthrough] - - - id: pc-detective_m_d_021 - text: "Hatch lubricant is fresh. Someone's maintaining this access point. Not station maintenance." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_anomaly - prerequisites: - facts: - - fact_id: investigation.corridor_regular_use - min_confidence: knows_of - tags: [investigation, evidence] - - - id: pc-detective_m_d_022 - text: "Davan was seen near B-7 during off-shift. Cross-reference with container movements." - role: player_character - access: [public] - trust: surface - situation: [alone, investigation] - trigger: time_idle - prerequisites: - facts: - - fact_id: investigation.kael_corridor_sighting - min_confidence: suspects - priority: 7 - tags: [npc, kael, investigation] - - - id: pc-detective_m_d_023 - text: "Two access routes, one manifest checkpoint. Someone designed this gap. Or discovered it." - role: player_character - access: [public] - trust: surface - situation: [alone, investigation] - trigger: time_idle - prerequisites: - facts: - - fact_id: investigation.oversight_gap_pattern - min_confidence: knows_details - tags: [investigation, analytical] - - - id: pc-detective_m_d_024 - text: "Rosta's gambling debt gives me leverage. But using it makes me the authority they resent." - role: player_character - access: [public] - trust: surface - situation: [alone, investigation] - trigger: time_idle - prerequisites: - facts: - - fact_id: investigation.drin_gambling_debt - min_confidence: knows_details - priority: 6 - tags: [npc, drin, investigation, moral] - - - id: pc-detective_m_d_025 - text: "Evidence is accumulating. Names, routes, timing. But I still can't see the full picture." - role: player_character - access: [public] - trust: surface - situation: [alone, investigation] - trigger: time_idle - prerequisites: - facts: - - fact_id: investigation.ring_existence - min_confidence: suspects - tags: [investigation, reflection] diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/opening.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/opening.yaml deleted file mode 100644 index ed50f725d..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/opening.yaml +++ /dev/null @@ -1,166 +0,0 @@ -character: detective -location: opening -lines: - # Opening Hook Sequence — Ticket #300 — Detective Diegetic Tutorial Arc / First 5 Minutes - # 12 lines. Prerequisites null on all — fires before any knowledge graph state exists. - # Priority 8-10 ensures these fire before the general terminal pool lines. - # cooldown: 9999 — each line fires once, does not repeat. - # Arc: institutional orientation → sensory/analytical → lattice overlay → Commission kiosk → fog boundary → - # NPC lattice scan → Sera sighting → Sera warmth → manifest board → anomaly → flag it → operational settle. - # Contraction discipline: analytical lines = uncontracted; personal lines (Sera) = contracted. - # All lines fully schema-compliant per D-035 (role, access, trust, situation present). - - - id: pc-detective_m_d_001 - text: "Sova Transit. Mid-morning shift, dock lighting at half-cycle. Consistent with the Commission pre-arrival briefing." - role: player_character - access: [public] - trust: surface - situation: [arrival, shift_start] - trigger: enter_location - mood: [focused] - priority: 10 - cooldown: 9999 - tags: [opening-hook, tutorial-arc, analytical, orientation] - notes: "Opening line. Reality matches the briefing — he arrived prepared. Establishes: detective as institutional outsider sent here. Cool-lit corridors per D-046 expressed through 'half-cycle' lighting observation. No contractions (analytical)." - - - id: pc-detective_m_d_002 - text: "Cargo lubricant, recycled atmosphere. Same mixture on every freight hub from here to the span gate hum. First observation: consistent with Commission briefing profile." - role: player_character - access: [public] - trust: surface - situation: [arrival, shift_start] - trigger: enter_location - mood: [focused] - priority: 10 - cooldown: 9999 - tags: [opening-hook, tutorial-arc, atmospheric, analytical] - notes: "Environmental sensory in analytical register. Colon usage (detective verbal pattern, section 2.2). No contractions. 'span gate' is canonical terminology (D-036); 'hum' is sensory detail. Contrast with smuggler's 'Home sweet home' — same smell, opposite emotional valence. He's working, not home." - - - id: pc-detective_m_d_003 - text: "Lattice overlay initializing. Four identity flags in immediate range — cross-referencing against Commission case file." - role: player_character - access: [public] - trust: surface - situation: [arrival, shift_start] - trigger: enter_location - mood: [focused] - priority: 10 - cooldown: 9999 - tags: [opening-hook, tutorial-arc, lattice, perception] - notes: "Teaches insert channel. The analytical lattice is active on entry — it flags and cross-references automatically. Teaches: detective's insert HUD is denser and diegetically active (D-048). Players learn the lattice is a tool, not decoration." - - - id: pc-detective_m_d_004 - text: "Commission kiosk confirmed my credentials on entry. Authority access logged. The floor knows someone's here." - role: player_character - access: [public] - trust: surface - situation: [arrival, shift_start] - trigger: enter_location - mood: [focused] - priority: 9 - cooldown: 9999 - tags: [opening-hook, tutorial-arc, institutional, authority] - notes: "Commission kiosk visible, institutional standing established. Sardonic close — dry awareness of his effect on the social environment. Confidence register: wry humor (section 2.8). Teaches: Authority access tier, institutional role is visible to NPCs." - - - id: pc-detective_m_d_005 - text: "Visual range terminates at bay nine. Approximately fifteen meters. Consistent with district atmo settings." - role: player_character - access: [public] - trust: surface - situation: [arrival, shift_start, observation] - trigger: enter_location - priority: 9 - cooldown: 9999 - tags: [opening-hook, tutorial-arc, fog, perception] - notes: "Fog boundary in analytical register. He clocks the measurement, notes 'approximately' — precision with honest calibration. Contrast with smuggler's 'Can't see the far dock' — same fog, different framing: limitation vs. measurement." - - - id: pc-detective_m_d_006 - text: "Dock workers distributed across nine visible bays. Lattice flagging each on contact. Names from the case file, faces from the floor." - role: player_character - access: [public] - trust: surface - situation: [arrival, shift_start, observation] - trigger: enter_location - mood: [focused] - priority: 9 - cooldown: 9999 - tags: [opening-hook, tutorial-arc, lattice, orientation] - notes: "Spatial overview with lattice overlay tutorial. Explains how the insert channel works: lattice matches observed faces against the pre-loaded case file. Parallel structure ('Names from... faces from...'). Teaches: NPC identification comes through the lattice." - - - id: pc-detective_m_d_007 - text: "Venn, S. at the far terminal. She said she'd come in early." - role: player_character - access: [public] - trust: surface - situation: [arrival, shift_start, social] - trigger: observe_npc - mood: [warm] - priority: 10 - cooldown: 9999 - tags: [opening-hook, tutorial-arc, sera, friend-arc] - notes: "First Sera sighting. Surname-initial filing first (institutional reflex) — then breaks to personal contracted voice ('she'd') in the same beat. Teaches contrast: case-file subjects get 'Davan, K.'; Sera gets a different register. D-033 Unknown/Neutral teal entity." - - - id: pc-detective_m_d_008 - text: "She's got the manifest logs open already. Field tech who knows how to pull records — she knows what I need before I ask." - role: player_character - access: [public] - trust: surface - situation: [arrival, shift_start, social] - trigger: observe_npc - mood: [warm] - priority: 9 - cooldown: 9999 - tags: [opening-hook, tutorial-arc, sera, friend-arc] - notes: "Sera warmth. Fully contracted throughout ('She's', 'she knows') — personal mode, no analytical distance. Em-dash. Professional respect established without implying prior district visits. Contrast with how he processes everyone else. Teaches: some NPCs are in a different relational category (THE FRIEND pattern, D-034)." - - - id: pc-detective_m_d_009 - text: "Central manifest board: real-time container routing, weight declarations, bay assignments. Everything routes through here." - role: player_character - access: [public] - trust: surface - situation: [arrival, shift_start, investigation] - trigger: enter_location - mood: [focused] - priority: 8 - cooldown: 9999 - tags: [opening-hook, tutorial-arc, manifest, investigation] - notes: "Manifest board labeled and cataloged. Colon usage (section 2.2). No contractions (analytical). Teaches: the manifest board is the information hub — and therefore the investigation's starting point." - - - id: pc-detective_m_d_010 - text: "Container 4471. Temp storage flag since yesterday. Standard turnaround is sub-eight hours — that's not standard." - role: player_character - access: [public] - trust: surface - situation: [arrival, observation, investigation] - trigger: observe_anomaly - mood: [focused, suspicious] - priority: 9 - cooldown: 9999 - tags: [opening-hook, tutorial-arc, manifest, investigation, anomaly] - notes: "First manifest anomaly. Specific container ID from case file. 'That's not standard' — only contraction in an analytical line, marking it as personal reaction to the finding. Sets the investigation hook: something is wrong before he asks a single question." - - - id: pc-detective_m_d_011 - text: "Worth flagging. Let's see what the shift logs say about that container's overnight routing." - role: player_character - access: [public] - trust: surface - situation: [observation, investigation] - trigger: observe_anomaly - mood: [focused] - priority: 8 - cooldown: 9999 - tags: [opening-hook, tutorial-arc, investigation, next-step] - notes: "'Worth flagging' + 'Let's see what' — both detective verbal tics in sequence (section 2.7). Frames the next investigative step. Teaches: investigation is incremental — observe, flag, investigate deeper." - - - id: pc-detective_m_d_012 - text: "Lattice stable. Nine identity flags and counting. Let's see what this shift tells me." - role: player_character - access: [public] - trust: surface - situation: [arrival, shift_start] - trigger: enter_location - mood: [focused] - priority: 7 - cooldown: 9999 - tags: [opening-hook, tutorial-arc, lattice, operational] - notes: "Operational settle — closes the opening arc. Lattice confirmed active, identity count growing. 'Let's see what...' verbal tic as the closing beat. The whole opening hook lands here: credentials logged, floor scanned, first anomaly flagged. Investigation begins." diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/pc-smuggler-tells.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/pc-smuggler-tells.yaml deleted file mode 100644 index a932a5aa0..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/pc-smuggler-tells.yaml +++ /dev/null @@ -1,133 +0,0 @@ -# Detective monologue: observing the Smuggler-as-NPC -# PC-as-NPC tell-inversion content (D-039 Wow Moment #4) -# Ticket: #401 | Sprint: 5 -# Voice: analytical, complete sentences, observation → deduction -# Context: the detective watches the smuggler-NPC's behavioral tells. -# First playthrough: "This dock worker is interesting." -# Second playthrough: "That's MY corridor check. That's MY habit." - -character: detective -location: general -lines: - - # --- Tell Observations (5 core tells from pc-as-npc-spec.md section 8) --- - - - id: pc-detective_m_d_001 - text: "That dock worker checks the corridor before turning. Habitual. Military? Or just careful." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - prerequisites: - relationship: - target: npc:pc-smuggler - state: known - tags: [npc, pc-smuggler, tell, corridor-check] - - - id: pc-detective_m_d_002 - text: "Movement pattern changed at shift change. More direct. Less idle. Interesting." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_anomaly - prerequisites: - relationship: - target: npc:pc-smuggler - state: known - tags: [npc, pc-smuggler, tell, shift-transition] - - - id: pc-detective_m_d_003 - text: "Slight acceleration past the checkpoint. Most people do it. But this one does it every time." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_anomaly - prerequisites: - relationship: - target: npc:pc-smuggler - state: known - tags: [npc, pc-smuggler, tell, security-proximity] - - - id: pc-detective_m_d_004 - text: "Same three people at the same table. Every shift. Consistent social group." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - prerequisites: - relationship: - target: npc:pc-smuggler - state: known - tags: [npc, pc-smuggler, tell, social-clustering] - - - id: pc-detective_m_d_005 - text: "That worker checked container 4471 twice. The same container that's in my manifest discrepancy file." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_anomaly - prerequisites: - facts: - - fact_id: investigation.manifest_discrepancy - min_confidence: knows_of - relationship: - target: npc:pc-smuggler - state: known - priority: 8 - tags: [npc, pc-smuggler, tell, cargo-attention, investigation] - - # --- Accumulated Observation (gates on multiple tell sightings) --- - - - id: pc-detective_m_d_006 - text: "Three behavioral flags on one dock worker. Corridor awareness, shift-transition alertness, cargo fixation. That's a pattern." - role: player_character - access: [public] - trust: surface - situation: [alone, investigation] - trigger: time_idle - prerequisites: - entity_attributes: - - entity: npc:pc-smuggler - key: behavior_flags - value: multiple_tells_observed - priority: 7 - tags: [npc, pc-smuggler, investigation, analytical, pattern-recognition] - - - id: pc-detective_m_d_007 - text: "Cross-referencing the dock worker's shift schedule with manifest anomalies. Correlation: moderate." - role: player_character - access: [public] - trust: surface - situation: [alone, investigation] - trigger: time_idle - prerequisites: - facts: - - fact_id: investigation.manifest_discrepancy - min_confidence: knows_of - relationship: - target: npc:pc-smuggler - state: person_of_interest - priority: 8 - tags: [npc, pc-smuggler, investigation, evidence] - - - id: pc-detective_m_d_008 - text: "The dock worker and Davan eat together every shift. Same courier joins them. Tight operational cluster." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_npc - prerequisites: - relationship: - target: npc:pc-smuggler - state: known - entity_attributes: - - entity: npc:kael-davan - key: behavior_flags - value: social_clustering - tags: [npc, pc-smuggler, kael, renn, social-clustering, investigation] diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/the-last-shift.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/the-last-shift.yaml deleted file mode 100644 index 2ce92628f..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/the-last-shift.yaml +++ /dev/null @@ -1,525 +0,0 @@ -character: detective -location: the-last-shift -lines: - # --- Arrival + Environmental Flavor --- - - - id: pc-detective_m_d_001 - text: "The Last Shift. Only place in this district that doesn't smell like freight lubricant." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [arrival, atmospheric] - - - id: pc-detective_m_d_002 - text: "Grain spirit and low conversation. The social nexus of Sova Transit." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [arrival, analytical] - - - id: pc-detective_m_d_003 - text: "Bar's busy tonight. Good — crowds talk. Bad — they notice outsiders." - role: player_character - access: [public] - trust: surface - situation: [arrival, investigation] - trigger: enter_location - tags: [arrival, investigation] - - - id: pc-detective_m_d_004 - text: "Standard district bar. Prefab fixtures, aftermarket lighting, a menu board nobody reads." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [arrival, environmental] - - - id: pc-detective_m_d_005 - text: "The Meridian feed on the wall display. Local news, freight indices, Assembly coverage." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [environmental] - - - id: pc-detective_m_d_006 - text: "The overhead vent rattles every thirty seconds. Like clockwork. Nobody else notices." - role: player_character - access: [public] - trust: surface - situation: [routine] - trigger: hear_sound - tags: [environmental] - - - id: pc-detective_m_d_007 - text: "The conversation volume dropped when I walked in. Recovering now. They're adjusting." - role: player_character - access: [public] - trust: surface - situation: [arrival, investigation] - trigger: enter_location - tags: [social, investigation] - - - id: pc-detective_m_d_008 - text: "Back at the bar. Same booth. Let's see who's here and who isn't." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: return_visit - tags: [arrival, analytical] - - - id: pc-detective_m_d_009 - text: "Kitchen's running. Fried protein and something spiced. The bar's other currency: hot food." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [environmental, atmospheric] - - - id: pc-detective_m_d_010 - text: "Someone carved initials into this table. Old. A history I don't have." - role: player_character - access: [public] - trust: surface - situation: [alone] - trigger: time_idle - tags: [environmental, reflection] - - # --- NPC Commentary --- - - - id: pc-detective_m_d_011 - text: "The bartender — Sessik, L. Knows everyone. Watches everything. Gives away nothing." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - tags: [npc, lera, analytical] - - - id: pc-detective_m_d_012 - text: "Good to see Sera. At least someone in this district speaks my language." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - tags: [npc, sera, warm] - - - id: pc-detective_m_d_013 - text: "Lintar, T. — the loud one at the bar. Spends freely. Where's the money from?" - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_npc - tags: [npc, torek, investigation] - - - id: pc-detective_m_d_014 - text: "A woman at the corner table — Tamm, N., according to Sera. Davan's partner." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - tags: [npc, naia, analytical] - - - id: pc-detective_m_d_015 - text: "The regulars have assigned seating. Unofficial, but enforced. I don't have a spot yet." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - tags: [social, atmospheric] - - - id: pc-detective_m_d_016 - text: "Sessik greeted three people by name since I sat down. I got a nod. Progress." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: witness_interaction - tags: [npc, lera, social] - - - id: pc-detective_m_d_017 - text: "Two dock workers in the corner. Heads close, voices low. Not unusual for after-shift." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: witness_interaction - tags: [social, investigation] - - - id: pc-detective_m_d_018 - text: "Sera introduced me to Tamm. Brief, polite, guarded. Expected." - role: player_character - access: [public] - trust: surface - situation: [social] - trigger: post_conversation - tags: [npc, sera, naia, social] - - - id: pc-detective_m_d_019 - text: "Sessik poured my drink without asking. She remembered. Small thing, but noted." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - tags: [npc, lera, social, warm] - - - id: pc-detective_m_d_020 - text: "The old man by the window hasn't spoken to anyone all evening. Watching, though." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - tags: [social, atmospheric] - - # --- Knowledge-Gated Lines --- - - - id: pc-detective_m_d_021 - text: "Sera left when Torek arrived. Second time. Different excuse. Same result." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_anomaly - prerequisites: - facts: - - fact_id: behavioral.sera_avoidance_pattern - min_confidence: suspects - priority: 7 - tags: [npc, sera, torek, tell, friend-arc] - - - id: pc-detective_m_d_022 - text: "That's the third time. Three excuses, one result. That's data." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_anomaly - prerequisites: - facts: - - fact_id: behavioral.sera_avoidance_pattern - min_confidence: knows_of - priority: 9 - tags: [npc, sera, torek, tell, friend-arc, contradiction] - - - id: pc-detective_m_d_023 - text: "Lintar's spending doesn't match a dock worker's salary. Source unknown." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_npc - prerequisites: - facts: - - fact_id: investigation.torek_spending_pattern - min_confidence: knows_of - tags: [npc, torek, investigation] - - - id: pc-detective_m_d_024 - text: "Sessik's eyes tracked me when I sat near the back room. Protective, not hostile." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_npc - prerequisites: - facts: - - fact_id: knowledge.bar_back_room_significance - min_confidence: suspects - tags: [npc, lera, investigation] - - - id: pc-detective_m_d_025 - text: "Sera's being extra helpful tonight. Names, backgrounds, context. Compensating?" - role: player_character - access: [public] - trust: surface - situation: [investigation, social] - trigger: post_conversation - prerequisites: - relationship: - target: npc:sera-venn - state: person_of_interest - priority: 7 - tags: [npc, sera, friend-arc, behavioral] - - - id: pc-detective_m_d_026 - text: "Same booth. Same warm smile. Same offer to buy me a drink. Everything except the truth." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_npc - prerequisites: - relationship: - target: npc:sera-venn - state: person_of_interest - priority: 8 - tags: [npc, sera, contaminated-trust, friend-arc] - - - id: pc-detective_m_d_027 - text: "Tamm seems distressed tonight. Not her baseline. Something at home, or something she heard?" - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - prerequisites: - relationship: - target: npc:naia-tamm - state: known - tags: [npc, naia, behavioral] - - - id: pc-detective_m_d_028 - text: "Sessik just redirected a conversation away from freight schedules. Protective reflex?" - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: witness_interaction - prerequisites: - facts: - - fact_id: knowledge.bar_ring_awareness - min_confidence: suspects - tags: [npc, lera, investigation] - - - id: pc-detective_m_d_029 - text: "Davan and his partner at the bar. She's talking. He's not listening. Noted." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: witness_interaction - prerequisites: - relationship: - target: npc:kael-davan - state: known - tags: [npc, kael, naia, behavioral] - - - id: pc-detective_m_d_030 - text: "The regulars are warming up. Three visits and I'm almost furniture. Almost." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: return_visit - prerequisites: - facts: - - fact_id: social.bar_regular_status - min_confidence: knows_of - tags: [social, progress] - - # --- Kael Davan — Additional Bar Observations --- - # Ticket: #297 review fix | Filling detective monologue gap - - - id: pc-detective_m_d_031 - text: "Davan is different here. Looser. The dock worker persona drops and something warmer replaces it." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - prerequisites: - relationship: - target: npc:kael-davan - state: known - tags: [npc, kael, behavioral, dual-context] - - - id: pc-detective_m_d_032 - text: "Davan checks the door every time it opens. Even here. Even off-shift. That is not relaxation." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_npc - prerequisites: - relationship: - target: npc:kael-davan - state: person_of_interest - priority: 7 - tags: [npc, kael, tell, behavioral, friend-arc] - - # --- Sera Venn FRIEND Arc — Tell Observations + Phase Transitions --- - # Ticket: #298 | Author: Paula - # These track the detective's evolving perception of Sera across the - # 5-phase FRIEND arc: trust > background data > pattern > question > - # contaminated trust. Contraction shifts mark objectivity loss. - - - id: pc-detective_m_d_033 - text: "Sera changed the subject when I mentioned manifests. Smooth. Practised, maybe." - role: player_character - access: [public] - trust: surface - situation: [investigation, social] - trigger: post_conversation - prerequisites: - facts: - - fact_id: behavioral.sera_topic_deflection - min_confidence: suspects - priority: 6 - tags: [npc, sera, tell, behavioral, friend-arc] - - - id: pc-detective_m_d_034 - text: "She volunteers names, routines, context. Gives everything I ask for -- except what I did not." - role: player_character - access: [public] - trust: surface - situation: [investigation, social] - trigger: post_conversation - prerequisites: - relationship: - target: npc:sera-venn - state: friendly - priority: 6 - tags: [npc, sera, tell, overcompensation, friend-arc] - - - id: pc-detective_m_d_035 - text: "Sera at the Commission kiosk. Third pass this shift. That is not standard recalibration." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_npc - prerequisites: - facts: - - fact_id: behavioral.sera_kiosk_pattern - min_confidence: suspects - priority: 7 - tags: [npc, sera, tell, peripheral, friend-arc] - - - id: pc-detective_m_d_036 - text: "Everything Sera told me checks out. Layout, schedules, regulars. Accurate. Thorough. Selective?" - role: player_character - access: [public] - trust: surface - situation: [investigation, social] - trigger: post_conversation - prerequisites: - relationship: - target: npc:sera-venn - state: friendly - priority: 5 - tags: [npc, sera, analytical, phase-2-3, friend-arc] - - - id: pc-detective_m_d_037 - text: "She mentioned Naia's worry about Kael early -- before I had context. Priming, or concern?" - role: player_character - access: [public] - trust: surface - situation: [investigation, social] - trigger: post_conversation - prerequisites: - facts: - - fact_id: relationship.kael_naia_connection - min_confidence: knows_of - priority: 7 - tags: [npc, sera, naia, retrospective, friend-arc] - - - id: pc-detective_m_d_038 - text: "Sera's institutional access goes further than field calibration. She could pull records I cannot." - role: player_character - access: [public] - trust: surface - situation: [alone, investigation] - trigger: time_idle - prerequisites: - relationship: - target: npc:sera-venn - state: friendly - tags: [npc, sera, analytical, capability, friend-arc] - - - id: pc-detective_m_d_039 - text: "Assessment: Venn, S. Cooperative. Embedded. Competent. Green -- with reservations now." - role: player_character - access: [public] - trust: surface - situation: [alone, investigation] - trigger: time_idle - prerequisites: - facts: - - fact_id: behavioral.sera_avoidance_pattern - min_confidence: suspects - priority: 7 - tags: [npc, sera, phase-transition, analytical, friend-arc] - - - id: pc-detective_m_d_040 - text: "Correction: amber. The avoidance pattern is behavioural, not preferential. Data, not taste." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_anomaly - prerequisites: - facts: - - fact_id: behavioral.sera_avoidance_pattern - min_confidence: knows_of - priority: 9 - tags: [npc, sera, phase-transition, tell, contradiction, friend-arc] - - - id: pc-detective_m_d_041 - text: "She's the first person who made this place feel less foreign. I need that to not matter right now." - role: player_character - access: [public] - trust: surface - situation: [alone, investigation] - trigger: time_idle - prerequisites: - relationship: - target: npc:sera-venn - state: person_of_interest - priority: 8 - tags: [npc, sera, emotional, phase-4-5, friend-arc] - - - id: pc-detective_m_d_042 - text: "Those early tips. The district layout, the introductions. Were those help -- or steering?" - role: player_character - access: [public] - trust: surface - situation: [alone, investigation] - trigger: time_idle - prerequisites: - relationship: - target: npc:sera-venn - state: person_of_interest - priority: 7 - tags: [npc, sera, contaminated-trust, retrospective, friend-arc] - - - id: pc-detective_m_d_043 - text: "She's not a suspect. She's a friend with access to everything I need. That is the problem." - role: player_character - access: [public] - trust: surface - situation: [alone, investigation] - trigger: time_idle - prerequisites: - facts: - - fact_id: behavioral.sera_avoidance_pattern - min_confidence: knows_of - priority: 8 - tags: [npc, sera, contaminated-trust, phase-4-5, friend-arc] - - - id: pc-detective_m_d_044 - text: "Trust: compromised. The question is not what she told me. It is what she did not." - role: player_character - access: [public] - trust: surface - situation: [investigation, social] - trigger: post_conversation - prerequisites: - relationship: - target: npc:sera-venn - state: person_of_interest - priority: 9 - tags: [npc, sera, contaminated-trust, phase-5, friend-arc, closing] diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/the-terminal.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/the-terminal.yaml deleted file mode 100644 index 3a6f34ced..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/the-terminal.yaml +++ /dev/null @@ -1,522 +0,0 @@ -character: detective -location: the-terminal -lines: - # --- Arrival + Environmental Flavor --- - - - id: pc-detective_m_d_001 - text: "Logistics hub. Standard prefab, heavy foot traffic. Let's see what the shift change tells me." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [arrival, analytical] - - - id: pc-detective_m_d_002 - text: "Sixteen bays, four loading arms, one manifest board. Everything routes through here." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [arrival, orientation] - - - id: pc-detective_m_d_003 - text: "Cargo lubricant and recycled air. The smell of honest work. Or a convincing imitation." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [arrival, atmospheric] - - - id: pc-detective_m_d_004 - text: "Loading arm three has a grind in its cycle. Maintenance deferred — budget, or negligence?" - role: player_character - access: [public] - trust: surface - situation: [routine] - trigger: hear_sound - tags: [environmental, analytical] - - - id: pc-detective_m_d_005 - text: "Shift change in twenty minutes. The handover period is where oversight gets thin." - role: player_character - access: [public] - trust: surface - situation: [alone, investigation, routine] - trigger: time_idle - tags: [investigation, operational] - - - id: pc-detective_m_d_006 - text: "The manifest board updates in real-time. Container movement, weight, destination. All logged." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [environmental, orientation] - - - id: pc-detective_m_d_007 - text: "Heavy foot traffic at shift change. Good — observation is easier in a crowd." - role: player_character - access: [public] - trust: surface - situation: [arrival, investigation] - trigger: enter_location - tags: [arrival, investigation] - - - id: pc-detective_m_d_008 - text: "Containers stacked to regulation height in most bays. Bay four is the exception." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_anomaly - tags: [environmental, investigation] - - - id: pc-detective_m_d_009 - text: "Back at the hub. Different shift, different faces. Same manifest board." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: return_visit - tags: [arrival] - - - id: pc-detective_m_d_010 - text: "The dock lights are running half-cycle. Saves power. Also reduces visibility." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [environmental, analytical] - - - id: pc-detective_m_d_011 - text: "Something in the air beyond the lubricant. Chemical, faint. Not standard freight residue." - role: player_character - access: [public] - trust: surface - situation: [arrival, investigation] - trigger: enter_location - tags: [environmental, investigation] - - - id: pc-detective_m_d_012 - text: "Overhead conveyor running at capacity. The manifest says otherwise. Interesting." - role: player_character - access: [public] - trust: surface - situation: [investigation, routine] - trigger: hear_sound - tags: [environmental, investigation] - - # --- NPC Commentary --- - - - id: pc-detective_m_d_013 - text: "Shift supervisor Voss. Tense posture, checking the dock more than the schedule." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - tags: [npc, voss, behavioral] - - - id: pc-detective_m_d_014 - text: "Korr, M. — freight scheduler. Efficient, focused. Either very good or very careful." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - tags: [npc, maret, analytical] - - - id: pc-detective_m_d_015 - text: "Rosta, D. — dock inspector. Quick checks, minimal documentation. That's a pattern." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_npc - tags: [npc, drin, investigation] - - - id: pc-detective_m_d_016 - text: "Dock worker. Davan, K. Unremarkable on paper. But he knows the bay layout cold." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - tags: [npc, kael] - - - id: pc-detective_m_d_017 - text: "Conversations stop when I pass. Standard response to Commission presence. Expected." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: witness_interaction - tags: [social, investigation] - - - id: pc-detective_m_d_018 - text: "Two workers talking by bay six. One sees me, taps the other. Both go quiet." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: witness_interaction - tags: [social, investigation] - - - id: pc-detective_m_d_019 - text: "Voss gave Davan a look across the bay. Brief. Loaded. Filing it." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: witness_interaction - tags: [npc, voss, kael, behavioral] - - - id: pc-detective_m_d_020 - text: "The courier — Renn — moves fast. Efficient routing. Knows these corridors well." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - tags: [npc, renn, analytical] - - - id: pc-detective_m_d_021 - text: "New shift starting. Different bodies, same avoidance radius around me." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - tags: [social, atmospheric] - - - id: pc-detective_m_d_022 - text: "Rosta's inspection of bay four took forty seconds. The others: three minutes each." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_npc - tags: [npc, drin, investigation, behavioral] - - - id: pc-detective_m_d_023 - text: "Voss deflected when I asked about overnight containers. Smooth, but I caught it." - role: player_character - access: [public] - trust: surface - situation: [investigation, social] - trigger: post_conversation - tags: [npc, voss, investigation] - - - id: pc-detective_m_d_024 - text: "Korr won't make eye contact. Not hostility — something else. Anxiety, maybe." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - tags: [npc, maret, behavioral] - - # --- Knowledge-Gated Lines --- - - - id: pc-detective_m_d_025 - text: "Davan's lattice activity spiked. Expecting a message? Or checking for surveillance?" - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_anomaly - prerequisites: - relationship: - target: npc:kael-davan - state: known - tags: [npc, kael, behavioral, tell] - - - id: pc-detective_m_d_026 - text: "Container 4471. Logged for temp storage overnight. Turnaround should be sub-eight hours." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_anomaly - prerequisites: - facts: - - fact_id: investigation.manifest_discrepancy - min_confidence: knows_of - priority: 7 - tags: [investigation, evidence] - - - id: pc-detective_m_d_027 - text: "Weight discrepancy on the bay four manifest. Point-three kilos over declared. Noted." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_anomaly - prerequisites: - facts: - - fact_id: investigation.manifest_discrepancy - min_confidence: suspects - tags: [investigation, evidence] - - - id: pc-detective_m_d_028 - text: "Rosta's gambling debts are in the case file. Leverage, if I need it. Do I need it?" - role: player_character - access: [public] - trust: surface - situation: [alone, investigation] - trigger: time_idle - prerequisites: - facts: - - fact_id: investigation.drin_gambling_debt - min_confidence: knows_details - tags: [npc, drin, investigation, moral] - - - id: pc-detective_m_d_029 - text: "Three names keep appearing near the anomalous manifests: Voss, Davan, Renn. Coincidence?" - role: player_character - access: [public] - trust: surface - situation: [alone, investigation] - trigger: time_idle - prerequisites: - facts: - - fact_id: investigation.manifest_discrepancy - min_confidence: knows_of - priority: 7 - tags: [investigation, analytical] - - - id: pc-detective_m_d_030 - text: "The shift transition creates a twenty-minute gap in active oversight. Every cycle." - role: player_character - access: [public] - trust: surface - situation: [alone, investigation, routine] - trigger: time_idle - prerequisites: - facts: - - fact_id: investigation.oversight_gap_pattern - min_confidence: knows_details - priority: 7 - tags: [investigation, operational] - - - id: pc-detective_m_d_031 - text: "Korr changed the schedule after our conversation. Covering tracks, or just doing her job?" - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_anomaly - prerequisites: - entity_attributes: - - entity: npc:maret-korr - key: behavior_flags - value: schedule_modification - tags: [npc, maret, investigation] - - - id: pc-detective_m_d_032 - text: "Rosta inspects everything else by the book. Bay four is the exception. That's the tell." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_npc - prerequisites: - facts: - - fact_id: investigation.drin_inspection_pattern - min_confidence: knows_of - priority: 8 - tags: [npc, drin, investigation, behavioral] - - - id: pc-detective_m_d_033 - text: "Davan's at an unusual terminal. Not his assigned bay. Why the move?" - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_anomaly - prerequisites: - relationship: - target: npc:kael-davan - state: known - tags: [npc, kael, investigation] - - - id: pc-detective_m_d_034 - text: "Voss is watching me watch his people. He knows what I'm here for." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_npc - prerequisites: - facts: - - fact_id: behavioral.voss_awareness - min_confidence: suspects - priority: 6 - tags: [npc, voss, investigation] - - - id: pc-detective_m_d_035 - text: "The routing logs and the physical movement don't match. Someone's hand-editing." - role: player_character - access: [public] - trust: surface - situation: [investigation] - trigger: discover_evidence - prerequisites: - facts: - - fact_id: investigation.manifest_discrepancy - min_confidence: knows_details - priority: 9 - tags: [investigation, evidence, breakthrough] - - # --- Kael Davan FRIEND Arc — Additional Detective Observations --- - # Ticket: #297 review fix | Filling detective monologue gap (7 → 12 Kael lines) - - - id: pc-detective_m_d_036 - text: "Davan's shift pattern is clean. Too clean. Same bays, same hours, same rotation. Nothing out of place." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - prerequisites: - relationship: - target: npc:kael-davan - state: known - tags: [npc, kael, analytical, behavioral] - - - id: pc-detective_m_d_037 - text: "Davan eats with the same group every shift. Social anchor, or keeping tabs?" - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - prerequisites: - relationship: - target: npc:kael-davan - state: known - tags: [npc, kael, social, behavioral] - - - id: pc-detective_m_d_038 - text: "Davan handled that container routing without checking the manifest board. He knows the schedule by heart." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - prerequisites: - relationship: - target: npc:kael-davan - state: known - priority: 6 - tags: [npc, kael, behavioral, tell, competence] - - - id: pc-detective_m_d_039 - text: "Davan's posture changed when I approached bay four. Subtle. Filing it." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_anomaly - prerequisites: - relationship: - target: npc:kael-davan - state: person_of_interest - priority: 7 - tags: [npc, kael, tell, behavioral, friend-arc] - - - id: pc-detective_m_d_040 - text: "Three manifests with weight discrepancies. All during Davan's shifts. Correlation is not causation. But noted." - role: player_character - access: [public] - trust: surface - situation: [alone, investigation] - trigger: time_idle - prerequisites: - facts: - - fact_id: investigation.manifest_discrepancy - min_confidence: knows_of - relationship: - target: npc:kael-davan - state: person_of_interest - priority: 8 - tags: [npc, kael, investigation, evidence, analytical] - - # --- Triangle Activation: Sera Venn / Torek Lintar (T2: Sera-Detective-Commission, D-087) --- - # Fires post-TriangleActivated when player has LOS to Sera or Torek. One beat per line. - # Beat 1: pattern recognition. Beat 2: deviation logged. Beat 3: hypothesis. Beat 4: inference. Beat 5: procedural next step. - - - id: pc-detective_m_d_041 - text: "Venn changed her transit route. Bay six to bay four bypass — three times today." - role: player_character - access: [public] - trust: surface - situation: [triangle_activated] - trigger: observe_npc - mood: [suspicious] - priority: 8 - cooldown: 9999 - tags: [triangle-signal, tell-observation, npc, sera, analytical] - prerequisites: - npc_in_los: true - - - id: pc-detective_m_d_042 - text: "She passed Torek without acknowledgment. Third instance logged. They have worked adjacent bays for months." - role: player_character - access: [public] - trust: surface - situation: [triangle_activated] - trigger: observe_npc - mood: [suspicious] - priority: 8 - cooldown: 9999 - tags: [triangle-signal, tell-observation, npc, sera, torek, behavioral] - prerequisites: - npc_in_los: true - - - id: pc-detective_m_d_043 - text: "Avoidance without cause. Either she does not know about the discrepancy, or she knows and has chosen silence." - role: player_character - access: [public] - trust: surface - situation: [triangle_activated] - trigger: observe_npc - mood: [suspicious] - priority: 8 - cooldown: 9999 - tags: [triangle-signal, tell-observation, npc, sera, analytical, friend-arc] - prerequisites: - npc_in_los: true - - - id: pc-detective_m_d_044 - text: "Possible explanations: fear, loyalty, complicity. Insufficient data to distinguish." - role: player_character - access: [public] - trust: surface - situation: [triangle_activated] - trigger: observe_npc - mood: [suspicious] - priority: 8 - cooldown: 9999 - tags: [triangle-signal, tell-observation, npc, sera, analytical, friend-arc] - prerequisites: - npc_in_los: true - - - id: pc-detective_m_d_045 - text: "Worth a direct conversation. Controlled setting. Not here." - role: player_character - access: [public] - trust: surface - situation: [triangle_activated] - trigger: observe_npc - mood: [suspicious] - priority: 8 - cooldown: 9999 - tags: [triangle-signal, tell-observation, npc, sera, procedural, friend-arc] - prerequisites: - npc_in_los: true diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/tutorial.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/tutorial.yaml deleted file mode 100644 index a1fa58e0e..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/tutorial.yaml +++ /dev/null @@ -1,243 +0,0 @@ -character: detective -location: tutorial -lines: - # Diegetic Tutorial Monologue — Ticket #330 — Detective - # Authored per sprint-17 copy briefing and D-016 (internal monologue as core system). - # - # These lines teach mechanics through character voice — not UI instructions. - # Distinct from opening.yaml (which covers the first 5 minutes and sets voice/motivation). - # These fire on first-time events throughout gameplay, wherever they occur. - # - # Coverage: - # Movement / exploration — first_move, first_new_section - # Fog of perception — first_fog_encounter, first_fog_edge - # Sound model — first_sound_heard, first_off_screen_sound - # NPC interaction — first_npc_proximity, first_npc_face_read - # Insert / HUD — first_insert_open, first_insert_contact_flag - # - # Voice: analytical, procedure-oriented, careful. No contractions in analytical mode. - # Colon usage for categorization. 'Let's see what...' and 'Worth flagging' verbal tics. - # ID discriminator: _tut_ per sprint briefing. - # cooldown: omitted — fire-once enforced by trigger semantics (first_* triggers - # fire once per game), not by a cooldown value. - # priority: 8 (primary, one per trigger type), 6 (secondary variant, mood-weighted alternate). - # - # Schema corrections (Gestalt review, Sprint 17): - # priority: string "tutorial" → integer. All other monologue files use integer priority; - # string value would fail engine parse in monologue.rs. - # situation: removed invalid values (movement, exploration) not in D-035 13-situation - # enum. Replaced with arrival, routine per actual trigger context. - # - # Trigger types (first_move, first_new_section, first_fog_encounter, first_fog_edge, - # first_sound_heard, first_off_screen_sound, first_npc_proximity, first_npc_face_read, - # first_insert_open, first_insert_contact_flag) are extended trigger enum values not in - # D-035 v0.1 set — require server-side implementation in monologue.rs. - - # ----------------------------------------------------------------------- - # MOVEMENT / EXPLORATION - # ----------------------------------------------------------------------- - - - id: pc-detective_m_d_tut_001 - text: "Signage: section designators on the corridor wall. Commission-standard markings. Worth learning before the district learns me." - role: player_character - access: [public] - trust: surface - situation: [arrival, routine] - trigger: first_move - mood: [focused] - priority: 8 - - tags: [tutorial, movement, navigation, analytical] - notes: > - Detective version of the 'check the signage' tutorial. Colon usage for the signage - label (section 2.2 verbal pattern). 'Commission-standard markings' — institutional - framing; he reads the environment through his professional lens first. 'Worth learning - before the district learns me' — dry awareness of his asymmetric visibility in this - community. Same teaching as the smuggler version, different cognitive frame. - - - id: pc-detective_m_d_tut_002 - text: "Three sections in range from the main terminal. Commission briefing had the layout. Let's confirm it against the floor." - role: player_character - access: [public] - trust: surface - situation: [arrival, investigation] - trigger: first_new_section - mood: [focused] - priority: 6 - - tags: [tutorial, movement, navigation, analytical] - notes: > - Fires on entering a new section for the first time. 'Commission briefing had the - layout' — he arrived with a map, now he's verifying it against reality. 'Let's - confirm it against the floor' — 'Let's' verbal tic, investigative method stated as - principle: documentation is a starting point, not a substitute for observation. - Teaches: the district has distinct sections to explore. - - # ----------------------------------------------------------------------- - # FOG OF PERCEPTION - # ----------------------------------------------------------------------- - - - id: pc-detective_m_d_tut_003 - text: "Visual range terminates at the corridor junction. Consistent with district atmo settings. Anything past that point: unconfirmed." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: first_fog_encounter - mood: [focused] - priority: 8 - - tags: [tutorial, fog, perception, analytical] - notes: > - Detective fog tutorial — analytical register throughout. 'Visual range terminates at' - instead of 'Can't see past.' 'Consistent with atmo settings' — he already knows this - is an environmental property, not an anomaly. 'Anything past that point: unconfirmed' - — colon usage, precise epistemic status. Teaches: perception boundary exists, and - the detective categorizes it as an information state, not a barrier. Compare to - smuggler's 'Might be worth checking' — same fog, different response. - - - id: pc-detective_m_d_tut_004 - text: "Can't clear the far bay from here. Going around is the procedure — not a limitation, a working condition." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: first_fog_edge - mood: [focused] - priority: 6 - - tags: [tutorial, fog, perception, analytical] - notes: > - Second fog encounter line — fires at a fog zone boundary. 'Going around is the - procedure' — detective frames the limitation as methodology. The second clause - ('not a limitation, a working condition') is self-instruction: he's telling himself - not to treat fog as frustrating but as standard operating environment. Teaches: - perception range is persistent throughout gameplay, and the correct response is - movement, not waiting. - - # ----------------------------------------------------------------------- - # SOUND MODEL - # ----------------------------------------------------------------------- - - - id: pc-detective_m_d_tut_005 - text: "Voices. Down the corridor. Source count indeterminate from here — distance degrades clarity." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: first_sound_heard - mood: [focused] - priority: 8 - - tags: [tutorial, sound, perception, analytical] - notes: > - Detective sound tutorial — analytical framing of the briefing's example. 'Source count - indeterminate' is the precise version of 'can't tell how many.' 'Distance degrades - clarity' — technical, causal. He hears, notes what he can establish (voices, direction) - and what he can't (count, content). No contractions. Teaches: sound channel is active - and distance-limited. Compare to smuggler's 'Can't make out the words' — same acoustic - reality, systematized differently. - - - id: pc-detective_m_d_tut_006 - text: "Footsteps. Metal-grated surface. Two sets minimum — moving away. Service access corridor, by the acoustic signature." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: first_off_screen_sound - mood: [focused] - priority: 6 - - tags: [tutorial, sound, perception, analytical] - notes: > - Second sound tutorial — fires on an off-screen audio source. The detective parses - the sound through multiple analytical dimensions: surface type, count, direction, - room type. 'Two sets minimum' — precise but not overclaiming. 'By the acoustic - signature' is technical terminology applied to diegetic audio interpretation. - Teaches: sound carries more than presence — floor type, distance, count, direction - are all extractable. The detective extracts all of them automatically. - - # ----------------------------------------------------------------------- - # NPC INTERACTION - # ----------------------------------------------------------------------- - - - id: pc-detective_m_d_tut_007 - text: "Civilians in range. Standard approach: observe before engaging. Let them surface what's relevant before directing the conversation." - role: player_character - access: [public] - trust: surface - situation: [social, observation] - trigger: first_npc_proximity - mood: [focused] - priority: 8 - - tags: [tutorial, npc, interaction, analytical] - notes: > - Detective NPC tutorial — procedural, method-as-principle. 'Civilians in range' is - his categorization (Commission-trained: everyone is a witness category until proven - otherwise). 'Standard approach' — he has a protocol. 'Let them surface what's relevant' - is the investigative principle: don't prime witnesses, let them self-select information. - No contractions throughout. Teaches: NPC interaction is player-initiated and - approach-sensitive. Different method than the smuggler ('give them reason to') — - same outcome, different social model. - - - id: pc-detective_m_d_tut_008 - text: "Commission credentials flag on approach. They know who I am before I speak. Worth noting who adjusts their behavior." - role: player_character - access: [public] - trust: surface - situation: [social, investigation] - trigger: first_npc_face_read - mood: [focused] - priority: 6 - - tags: [tutorial, npc, observation, analytical, authority] - notes: > - Fires when the player observes an NPC at close range. The detective's asymmetry: - his authority access tier makes him visible in ways the smuggler is not. NPCs react - to his presence before interaction begins. 'Worth noting who adjusts their behavior' - — 'Worth' verbal tic, sets up behavioral observation as investigation method. Teaches: - the detective's Commission credentials affect NPC behavior, and that behavioral - response is data. - - # ----------------------------------------------------------------------- - # INSERT / HUD - # ----------------------------------------------------------------------- - - - id: pc-detective_m_d_tut_009 - text: "Lattice overlay active: time, contact positions, flagged entities. Commission-linked. Standard procedure to keep it running." - role: player_character - access: [public] - trust: surface - situation: [routine] - trigger: first_insert_open - mood: [focused] - priority: 8 - - tags: [tutorial, insert, hud, analytical] - notes: > - Detective insert tutorial. Colon usage: catalogs what the overlay contains. 'Commission- - linked' — institutional framing, establishes why the detective's HUD is denser than - the smuggler's. 'Standard procedure' — not a discovery, a protocol. Teaches: the - insert is an active investigation tool, not optional. Compare to smuggler's 'Should - show the time and nearby contacts' — same overlay, presented as procedural requirement - vs. operational check. - - - id: pc-detective_m_d_tut_010 - text: "Nine identity flags in range. Cross-referencing case file now. Let's see what matches." - role: player_character - access: [public] - trust: surface - situation: [investigation, routine] - trigger: first_insert_contact_flag - mood: [focused] - priority: 6 - - tags: [tutorial, insert, hud, lattice, investigation] - notes: > - Fires when the insert first populates with flagged entities. Count given precisely - ('Nine identity flags'). 'Case file' — the detective's overlay cross-references a - pre-loaded investigation file, not just a general registry. 'Let's see what matches' - — 'Let's see what' verbal tic closing the tutorial sequence. Teaches: the detective's - insert is investigation-keyed, matching observed faces against case file entries. - This is why his overlay is analytically denser than the smuggler's. diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/contradiction-detected.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/contradiction-detected.yaml deleted file mode 100644 index 466d5ba61..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/contradiction-detected.yaml +++ /dev/null @@ -1,228 +0,0 @@ -character: smuggler -location: contradiction -lines: - # Contradiction Monologue — Ticket #552 — Sera/Kael FRIEND Arc (Smuggler perspective) - # Authored per D-083 (contradiction detection pipeline) and Paula Round 2 Mellanie spec - # (docs/workshops/knowledge-flow-npc-boundaries/paula-round2.md, lines 117-158). - # - # Trigger: contradiction_detected fires when the smuggler observes Kael in Corridor B-7 - # with an unrecognized contact — contradicting Kael's stated location and ring protocol. - # Event payload: source_display_name = "Kael Davan", subject_display_name = "Kael Davan" - # (Kael is both source and subject: he placed himself elsewhere, smuggler sees him here.) - # - # FRIEND-pattern NPCs always use hand-authored lines — generic template fallback - # does not fire for this arc. - # - # Authoring principle: cognitive dissonance, not accusation. The smuggler reads social - # signals instinctively, but doesn't conclude — she contains the alarm. Street-smart - # gut reaction, not analytical procedure. - # - # Phase 2 lines: first observation — Kael in B-7 with unknown contact. - # Prerequisite: KG entry for Kael has state: Contradicted, source: ToldBy(Kael Davan) - # Phase 3 lines: behavioral pattern already accumulating — increased lattice checking, - # shortened interactions, early exits from break room. - # Prerequisite: Phase 2 + Kael's behavioral anomalies observed (count >= 2). - # - # ID discriminator: _con_ marks contradiction lines per Q-028 pending resolution. - # cooldown: omitted — fire-once enforced by trigger semantics (contradiction_detected - # fires once per KG state change), not by a cooldown value. - # - # Note: contradiction_detected is a new trigger type — requires server-side implementation - # in monologue.rs (ticket #550). Secondary beat lines use lower priority for sequencing; - # server team should implement delay_after_trigger_ticks for proper 3-5 second gap. - - # ----------------------------------------------------------------------- - # PHASE 2 — Primary beat (fires on contradiction_detected, immediate) - # ----------------------------------------------------------------------- - - - id: pc-smuggler_m_s_con_001 - text: "Kael said second shift was clear. He's in B-7. With someone I don't know." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: contradiction_detected - mood: [focused, anxious] - priority: 10 - - prerequisites: - entities: - - id: "npc:kael-davan" - state: Contradicted - tags: [contradiction, friend-arc, kael, phase-2, operational] - notes: > - Primary line — three beats, three facts. 'Kael said' names the source (friend register, - first name). 'He's in B-7' is the observation. 'With someone I don't know' is the alarm: - not just wrong location, but outside the ring. Fragment structure throughout — the smuggler - clocks a scene in pieces. No accusation, no conclusion: just inventory of what's wrong. - - - id: pc-smuggler_m_s_con_002 - text: "That's Kael. Restricted corridor. Unrecognized contact. Kael doesn't come to B-7." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: contradiction_detected - mood: [focused] - priority: 9 - - prerequisites: - entities: - - id: "npc:kael-davan" - state: Contradicted - tags: [contradiction, friend-arc, kael, phase-2, operational] - notes: > - Alternate primary — catalog format. 'That's Kael' opens with identification, not alarm: - recognition first, then the wrong details fall into place. Each fragment adds one layer - of what's wrong. Close: 'Kael doesn't come to B-7' — negative statement of prior - expectation, which is now violated. No contraction in the closing declarative (emphasis). - - - id: pc-smuggler_m_s_con_003 - text: "He's in B-7. He told me he'd be heading home after shift. One of those isn't the case." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: contradiction_detected - mood: [focused, anxious] - priority: 9 - - prerequisites: - entities: - - id: "npc:kael-davan" - state: Contradicted - tags: [contradiction, friend-arc, kael, phase-2] - notes: > - Alternate primary — echoes the Paula canonical structure (observation / prior claim / - contradiction stated) but in the smuggler's voice. 'He told me' is personal register - (friend, not colleague). 'One of those isn't the case' — the smuggler's understated - version of flagging a contradiction: not 'one of them is a lie' but 'isn't the case.' - Epistemic containment in plain language. - - # ----------------------------------------------------------------------- - # PHASE 2 — Secondary beat (gut-level recalibration, operational containment) - # Server team (#550): implement delay_after_trigger_ticks: 90 for 3-5s gap. - # ----------------------------------------------------------------------- - - - id: pc-smuggler_m_s_con_004 - text: "Maybe there's a reason. There's always a reason. But Kael knows better than to run a meeting in a maintenance corridor without telling me." - role: player_character - access: [public] - trust: surface - situation: [investigation, alone] - trigger: contradiction_detected - mood: [focused, anxious] - priority: 7 - - prerequisites: - entities: - - id: "npc:kael-davan" - state: Contradicted - tags: [contradiction, friend-arc, kael, phase-2, cognitive-dissonance, secondary-beat] - notes: > - Secondary beat — fires 3-5 seconds after primary. Self-challenge first: the smuggler - gives Kael benefit of the doubt, then immediately walks it back with operational - logic. 'There's always a reason' is the street-smart equivalent of epistemic - containment — she's seen strange things before. The closing line is where the alarm - lives: this isn't strange, it's a protocol violation. - Lower priority (7) ensures primary lines fire first; server team should implement - delay_after_trigger_ticks for proper sequencing. - - - id: pc-smuggler_m_s_con_005 - text: "Don't assume. Could be he's running something for Nils I wasn't told about. Could be something else. The second thing is the problem." - role: player_character - access: [public] - trust: surface - situation: [investigation, alone] - trigger: contradiction_detected - mood: [focused] - priority: 6 - - prerequisites: - entities: - - id: "npc:kael-davan" - state: Contradicted - tags: [contradiction, friend-arc, kael, phase-2, operational, cognitive-dissonance, secondary-beat] - notes: > - Alternate secondary beat. 'Don't assume' is the smuggler's self-instruction (operational - discipline). Two possibilities held open: ring-authorized (names Nils — the coordinator) - vs. outside the ring. 'The second thing is the problem' — the alarm, stated as dry - understatement. Operational logic applied to an emotional moment: the smuggler - keeps the processing clean even when the stakes are personal. - - # ----------------------------------------------------------------------- - # PHASE 3 — Behavioral pattern accumulated (increased lattice checking, early exits) - # Requires: Kael behavioral anomalies observed prior to the B-7 contradiction. - # ----------------------------------------------------------------------- - - - id: pc-smuggler_m_s_con_006 - text: "He's been distracted for three days. Lattice checks every few minutes, leaving lunch early. Now a B-7 meeting with someone outside the ring. Kael's working an angle he hasn't told me about." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: contradiction_detected - mood: [focused, anxious] - priority: 10 - - prerequisites: - entities: - - id: "npc:kael-davan" - state: Contradicted - tells_observed: 2 - tags: [contradiction, friend-arc, kael, phase-3, pattern-recognition, operational] - notes: > - Phase 3 primary — connects all accumulated behavioral data to the contradiction. Fragment - catalog builds the picture: three days of signals, then this. Closing line names the - conclusion without naming its implication: 'working an angle' is street-smart language - for running something unauthorized, but the smuggler doesn't say 'exit attempt' — - she doesn't know that yet. - Note: tells_observed is a proposed prerequisite field — server team (#550) to implement - or simplify to a different check. - - - id: pc-smuggler_m_s_con_007 - text: "Kael doesn't run his own contacts. Devra handles external. So either Devra knows about this, or Kael's outside protocol. Neither's good." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: contradiction_detected - mood: [focused] - priority: 9 - - prerequisites: - entities: - - id: "npc:kael-davan" - state: Contradicted - tells_observed: 2 - tags: [contradiction, friend-arc, kael, phase-3, operational] - notes: > - Alternate Phase 3 — operational knowledge applied. The smuggler knows ring structure: - Devra manages external contacts, Kael handles cargo logistics. An unrecognized contact - means either Devra is running something Kael's involved in (plausible, alarming) or - Kael went outside protocol (worse). Both possibilities named, neither closed. 'Neither's - good' — the smuggler's understated close for a significant threat read. - - - id: pc-smuggler_m_s_con_008 - text: "He's been somewhere else in his head all week. Now I know why. Whoever that was — not ring. Kael's looking for a way out." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: contradiction_detected - mood: [anxious] - priority: 8 - - prerequisites: - entities: - - id: "npc:kael-davan" - state: Contradicted - tells_observed: 2 - tags: [contradiction, friend-arc, kael, phase-3, intuition] - notes: > - Alternate Phase 3 — gut read, highest emotional weight. 'Somewhere else in his head' - describes the behavioral changes without cataloging them. 'Now I know why' — the click - of understanding arriving. 'Not ring' — short, certain, two words. 'Looking for a way - out' is street-smart language for exit attempt: the smuggler doesn't know the details - but the read is right. This line is the closest the smuggler comes to naming what's - happening — and she still doesn't say it explicitly. diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/general.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/general.yaml deleted file mode 100644 index 00ced256c..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/general.yaml +++ /dev/null @@ -1,92 +0,0 @@ -character: smuggler -location: general -lines: - - id: pc-smuggler_m_s_001 - text: "Another day on Sova. Same air, same hum, same faces." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [arrival, atmospheric] - - - id: pc-smuggler_m_s_002 - text: "The span gate hum's louder today. Maintenance hasn't touched it in weeks." - role: player_character - access: [public] - trust: surface - situation: [routine] - trigger: hear_sound - tags: [environmental] - - - id: pc-smuggler_m_s_003 - text: "Twenty minutes between shifts. That's the window. Always has been." - role: player_character - access: [public] - trust: surface - situation: [routine] - trigger: time_idle - tags: [operational, orientation] - - - id: pc-smuggler_m_s_004 - text: "People talk about leaving Sova. Nobody actually does." - role: player_character - access: [public] - trust: surface - situation: [alone] - trigger: time_idle - tags: [reflection] - - - id: pc-smuggler_m_s_005 - text: "Two years of this. Still not used to the gate vibration in my teeth." - role: player_character - access: [public] - trust: surface - situation: [routine] - trigger: hear_sound - tags: [environmental, personal] - - - id: pc-smuggler_m_s_006 - text: "The money's good. The risk's manageable. Keep telling yourself that." - role: player_character - access: [public] - trust: surface - situation: [alone] - trigger: time_idle - tags: [reflection, operational] - - - id: pc-smuggler_m_s_007 - text: "Back again. Same corridors, same shortcuts, same reasons." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: return_visit - tags: [arrival] - - - id: pc-smuggler_m_s_008 - text: "Commission patrols are thinner this cycle. Good or bad — hard to say." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_anomaly - tags: [operational, caution] - - - id: pc-smuggler_m_s_009 - text: "If anyone asks, I'm clocking overtime. That's always the story." - role: player_character - access: [public] - trust: surface - situation: [routine] - trigger: time_idle - tags: [operational, cover] - - - id: pc-smuggler_m_s_010 - text: "Recycled air tastes different near the outer ring. Sharper. More machine." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [environmental, atmospheric] diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/maintenance-corridors.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/maintenance-corridors.yaml deleted file mode 100644 index 395cd2be9..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/maintenance-corridors.yaml +++ /dev/null @@ -1,270 +0,0 @@ -character: smuggler -location: maintenance-corridors -lines: - # --- Arrival + Environmental Flavor --- - - - id: pc-smuggler_m_s_001 - text: "Service corridor. Dim lights, damp walls, and the constant drip of condensation." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [arrival, atmospheric] - - - id: pc-smuggler_m_s_002 - text: "Cooler down here. The ventilation doesn't reach this far." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [environmental, atmospheric] - - - id: pc-smuggler_m_s_003 - text: "The access panel's still loose. Good — our route's intact." - role: player_character - access: [public] - trust: surface - situation: [arrival, routine] - trigger: enter_location - tags: [arrival, operational] - - - id: pc-smuggler_m_s_004 - text: "Pipes groaning overhead. Station's old. These corridors are older." - role: player_character - access: [public] - trust: surface - situation: [routine] - trigger: hear_sound - tags: [environmental, atmospheric] - - - id: pc-smuggler_m_s_005 - text: "Water recycling rumbles through the walls down here. Constant." - role: player_character - access: [public] - trust: surface - situation: [routine] - trigger: hear_sound - tags: [environmental] - - - id: pc-smuggler_m_s_006 - text: "Back in the maintenance tunnels. Rust and coolant." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: return_visit - tags: [arrival, atmospheric] - - - id: pc-smuggler_m_s_007 - text: "Emergency lighting only. Just enough to see where you're going." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [environmental] - - - id: pc-smuggler_m_s_008 - text: "Footsteps echo different down here. You learn to listen." - role: player_character - access: [public] - trust: surface - situation: [routine] - trigger: hear_sound - tags: [environmental, operational] - - # --- NPC + Operational --- - - - id: pc-smuggler_m_s_009 - text: "Renn's chalk marks on the wall. Route's been used recently." - role: player_character - access: [public] - trust: surface - situation: [observation, routine] - trigger: observe_anomaly - tags: [operational, renn] - - - id: pc-smuggler_m_s_010 - text: "Someone left a crate at junction B-4. Not one of ours." - role: player_character - access: [public] - trust: surface - situation: [observation, routine] - trigger: observe_anomaly - tags: [operational, caution] - - - id: pc-smuggler_m_s_011 - text: "The temp storage hatch is warm. Cargo cycled through recently." - role: player_character - access: [public] - trust: surface - situation: [arrival, routine] - trigger: enter_location - tags: [operational] - - - id: pc-smuggler_m_s_012 - text: "Scratches on the lock plate. Someone's been forcing this access point." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_anomaly - tags: [environmental, caution] - - - id: pc-smuggler_m_s_013 - text: "Timer says twelve minutes until the oversight gap closes. Plenty." - role: player_character - access: [public] - trust: surface - situation: [alone, routine] - trigger: time_idle - tags: [operational] - - - id: pc-smuggler_m_s_014 - text: "That's Renn's jacket on the pipe junction. He was here." - role: player_character - access: [public] - trust: surface - situation: [observation, routine] - trigger: observe_anomaly - tags: [npc, renn, operational] - - - id: pc-smuggler_m_s_015 - text: "Voices echoing from the junction. Can't make out words yet." - role: player_character - access: [public] - trust: surface - situation: [routine] - trigger: hear_sound - tags: [caution] - - - id: pc-smuggler_m_s_016 - text: "The route through B-section is clear. Voss kept his word." - role: player_character - access: [public] - trust: surface - situation: [arrival, routine] - trigger: enter_location - tags: [operational, voss] - - # --- Knowledge-Gated Lines --- - - - id: pc-smuggler_m_s_017 - text: "Corridor B-7. This is where I saw Kael. With someone I don't know." - role: player_character - access: [public] - trust: surface - situation: [arrival, investigation] - trigger: enter_location - prerequisites: - facts: - - fact_id: investigation.kael_corridor_meeting - min_confidence: suspects - priority: 8 - tags: [npc, kael, contradiction, friend-arc] - - - id: pc-smuggler_m_s_018 - text: "Fresh boot prints in the dust. Two sets. Different sizes." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_anomaly - prerequisites: - facts: - - fact_id: investigation.kael_corridor_meeting - min_confidence: suspects - tags: [evidence, kael, friend-arc] - - - id: pc-smuggler_m_s_019 - text: "New scratch marks on the service hatch. Someone's using our route." - role: player_character - access: [public] - trust: surface - situation: [observation, routine] - trigger: observe_anomaly - prerequisites: - facts: - - fact_id: awareness.ring_route_compromise - min_confidence: suspects - priority: 7 - tags: [operational, caution] - - - id: pc-smuggler_m_s_020 - text: "The container in temp was supposed to move last shift. It didn't. Why?" - role: player_character - access: [public] - trust: surface - situation: [observation, routine] - trigger: observe_anomaly - prerequisites: - facts: - - fact_id: investigation.container_delay - min_confidence: knows_of - tags: [operational, contraband] - - - id: pc-smuggler_m_s_021 - text: "Camera's been repositioned at junction C-2. Who authorized that?" - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_anomaly - prerequisites: - facts: - - fact_id: awareness.surveillance_change - min_confidence: suspects - priority: 7 - tags: [investigation, caution] - - - id: pc-smuggler_m_s_022 - text: "If Kael's meeting people down here without telling us, the whole route's exposed." - role: player_character - access: [public] - trust: surface - situation: [alone, investigation, routine] - trigger: time_idle - prerequisites: - facts: - - fact_id: investigation.kael_unknown_contact - min_confidence: knows_of - priority: 8 - tags: [npc, kael, operational, friend-arc] - - - id: pc-smuggler_m_s_023 - text: "Sealed containers don't end up in temp storage by accident. Someone rerouted." - role: player_character - access: [public] - trust: surface - situation: [observation, routine] - trigger: observe_anomaly - prerequisites: - facts: - - fact_id: knowledge.ring_routing_knowledge - min_confidence: knows_details - tags: [operational, contraband] - - - id: pc-smuggler_m_s_024 - text: "Kael's not answering his lattice. He was supposed to meet me here." - role: player_character - access: [public] - trust: surface - situation: [alone, investigation] - trigger: time_idle - prerequisites: - relationship: - target: npc:kael-davan - state: person_of_interest - priority: 7 - tags: [npc, kael, concern, friend-arc] - - - id: pc-smuggler_m_s_025 - text: "Someone wiped the dust off this hatch. Recently. Carefully." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_anomaly - tags: [environmental, caution] diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/opening.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/opening.yaml deleted file mode 100644 index d7a6217e9..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/opening.yaml +++ /dev/null @@ -1,152 +0,0 @@ -character: smuggler -location: opening -lines: - # Opening Hook Sequence — Ticket #299 — Smuggler Diegetic Tutorial Arc / First 5 Minutes - # 11 lines. Prerequisites null on all — fires before any knowledge graph state exists. - # Priority 8-10 ensures these fire before the general terminal pool lines. - # cooldown: 9999 — each line fires once, does not repeat. - # Arc: station hum → spatial count → fog boundary → thin crowd → Kael sighting ×2 → news ticker → sound ping → time countdown → settle ×2. - # All lines fully schema-compliant per D-035 (role, access, trust, situation present). - - - id: pc-smuggler_m_s_001 - text: "Station hum. B-flat, steady — freight's moving." - role: player_character - access: [public] - trust: surface - situation: [arrival, shift_start] - trigger: enter_location - mood: [content] - priority: 10 - cooldown: 9999 - tags: [opening-hook, tutorial-arc, atmospheric] - notes: "Opening sensation. Station audio registers first — the hum tells her freight is running. Teaches: audio environment carries operational information (D-074)." - - - id: pc-smuggler_m_s_002 - text: "Sixteen bays, three arms running. Standard morning." - role: player_character - access: [public] - trust: surface - situation: [arrival, shift_start] - trigger: enter_location - mood: [content] - priority: 10 - cooldown: 9999 - tags: [opening-hook, tutorial-arc, orientation] - notes: "Spatial orientation. She clocks the floor in two beats — count of bays, count of running arms. Everything in fragments. Teaches: the terminal layout." - - - id: pc-smuggler_m_s_003 - text: "Haze past bay eight today. Can't see the far dock from here." - role: player_character - access: [public] - trust: surface - situation: [arrival, shift_start, observation] - trigger: enter_location - mood: [content] - priority: 10 - cooldown: 9999 - tags: [opening-hook, tutorial-arc, fog, perception] - notes: "Fog boundary. She notices the edge of her vision as a fact of the floor, not a mechanic. Teaches: perception range has limits (D-015, D-046)." - - - id: pc-smuggler_m_s_004 - text: "Morning crew's spread thin. Good. Room to move." - role: player_character - access: [public] - trust: surface - situation: [arrival, shift_start] - trigger: enter_location - mood: [content] - priority: 9 - cooldown: 9999 - tags: [opening-hook, tutorial-arc] - notes: "Light crowd = operational comfort. 'Good.' standalone verbal tic (section 1.7). Teaches: NPC density affects movement options." - - - id: pc-smuggler_m_s_005 - text: "Kael's at dock three. Right where he should be." - role: player_character - access: [public] - trust: surface - situation: [arrival, shift_start, social] - trigger: observe_npc - mood: [content, warm] - priority: 10 - cooldown: 9999 - tags: [opening-hook, tutorial-arc, kael, friend-arc] - notes: "First Kael sighting. Warm, immediate — she locates him before she finishes reading the floor. Teaches: named NPCs are identifiable via insert overlay (D-033 green entity)." - - - id: pc-smuggler_m_s_006 - text: "Already has his clipboard. Day's organized before it starts. Two years, same routine." - role: player_character - access: [public] - trust: surface - situation: [arrival, shift_start, social] - trigger: observe_npc - mood: [warm] - priority: 9 - cooldown: 9999 - tags: [opening-hook, tutorial-arc, kael, friend-arc] - notes: "Kael warmth through behavior-reading, not labeling. Three beats: observation → interpretation → familiarity. 'Two years, same routine' says she knows his patterns intimately. Establishes: Kael is trusted, competent, reliable — the baseline before the friend arc erodes it." - - - id: pc-smuggler_m_s_007 - text: "Bulletin board's got a new Commission notice. Lattice registration updates. Not today's problem." - role: player_character - access: [public] - trust: surface - situation: [arrival, routine] - trigger: enter_location - mood: [content] - priority: 8 - cooldown: 9999 - tags: [opening-hook, tutorial-arc, news-ticker] - notes: "News ticker glance. She reads and dismisses it. The Commission exists as background noise — relevant only when it stops being ignorable. Teaches: environmental text exists, player can engage or skip. D-037 irony: lattice registration is exactly what the ring circumvents." - - - id: pc-smuggler_m_s_008 - text: "Span gate echo from dock fourteen. Something inbound, running heavy by the sound of it." - role: player_character - access: [public] - trust: surface - situation: [arrival, shift_start, observation] - trigger: hear_sound - mood: [content] - priority: 9 - cooldown: 9999 - tags: [opening-hook, tutorial-arc, sound, perception] - notes: "First sound ping at the edge of range. She interprets pitch instantly — the echo tells her load weight. Teaches: sound carries operational information (D-018, D-074 sound model). Sound channel is meaningful." - - - id: pc-smuggler_m_s_009 - text: "Shift board says light cargo today. Fifty minutes before Voss does his rounds." - role: player_character - access: [public] - trust: surface - situation: [arrival, shift_start, routine] - trigger: enter_location - mood: [content] - priority: 8 - cooldown: 9999 - tags: [opening-hook, tutorial-arc, operational] - notes: "'Fifty minutes' = time-as-countdown verbal tic (section 1.7). She's already calculating windows. Teaches: time and NPC patrol rhythms are trackable." - - - id: pc-smuggler_m_s_010 - text: "Same floor, same faces, same hum. Could be worse." - role: player_character - access: [public] - trust: surface - situation: [arrival, shift_start] - trigger: enter_location - mood: [content] - priority: 8 - cooldown: 9999 - tags: [opening-hook, tutorial-arc, atmospheric] - notes: "Settling line. Baseline contentment. Parallel three-beat structure then understatement. 'Could be worse' is her comfort language — not enthusiastic, just settled. Voice anchor for confidence register (section 1.8)." - - - id: pc-smuggler_m_s_011 - text: "Dock's clean this morning. Good start." - role: player_character - access: [public] - trust: surface - situation: [arrival, shift_start, routine] - trigger: enter_location - mood: [content] - priority: 7 - cooldown: 9999 - tags: [opening-hook, tutorial-arc] - notes: "Close of opening arc. Short, approving. 'Good start' = positive 'Good.' tic applied to the environment. Everything is where it should be — for now." diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/pc-detective-tells.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/pc-detective-tells.yaml deleted file mode 100644 index 18ce8616a..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/pc-detective-tells.yaml +++ /dev/null @@ -1,124 +0,0 @@ -# Smuggler monologue: observing the Detective-as-NPC -# PC-as-NPC tell-inversion content (D-039 Wow Moment #4) -# Ticket: #401 | Sprint: 5 -# Voice: terse, operational, worried, short sentences, contractions always -# Context: the smuggler watches the detective-NPC's behavioral tells. -# First playthrough: "Commission threat. Stay clear." -# Second playthrough: "That's MY note-taking. That's MY method." - -character: smuggler -location: general -lines: - - # --- Tell Observations (5 core tells from pc-as-npc-spec.md section 8) --- - - - id: pc-smuggler_m_s_001 - text: "Commission officer just stood there after talking to Voss. Making notes. Not good." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - prerequisites: - relationship: - target: npc:pc-detective - state: known - tags: [npc, pc-detective, tell, note-taking, caution] - - - id: pc-smuggler_m_s_002 - text: "That investigator is working the hub section by section. Not browsing. Searching." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_anomaly - prerequisites: - relationship: - target: npc:pc-detective - state: known - tags: [npc, pc-detective, tell, systematic-movement, caution] - - - id: pc-smuggler_m_s_003 - text: "Commission's parked at the manifest terminal again. Third time today." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_anomaly - prerequisites: - relationship: - target: npc:pc-detective - state: known - tags: [npc, pc-detective, tell, manifest-fixation, caution] - - - id: pc-smuggler_m_s_004 - text: "They're watching. From the corner, where they can see the whole dock floor. Professional." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - prerequisites: - relationship: - target: npc:pc-detective - state: known - tags: [npc, pc-detective, tell, observation-positioning, caution] - - - id: pc-smuggler_m_s_005 - text: "The investigator and Sera again. Old friends? Or is Sera reporting to them?" - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - prerequisites: - relationship: - target: npc:pc-detective - state: known - relationship: - target: npc:sera-venn - state: known - tags: [npc, pc-detective, sera, tell, sera-proximity, suspicion] - - # --- Operational Awareness (smuggler's threat assessment) --- - - - id: pc-smuggler_m_s_006 - text: "New Commission face at the hub. Keep your head down. Don't give them anything." - role: player_character - access: [public] - trust: surface - situation: [observation, routine] - trigger: observe_npc - prerequisites: - relationship: - target: npc:pc-detective - state: known - priority: 8 - tags: [npc, pc-detective, operational, caution, first-sighting] - - - id: pc-smuggler_m_s_007 - text: "That investigator's been here all morning. Nobody stays that long for a routine check." - role: player_character - access: [public] - trust: surface - situation: [alone, routine] - trigger: time_idle - prerequisites: - relationship: - target: npc:pc-detective - state: known - priority: 6 - tags: [npc, pc-detective, suspicion, operational] - - - id: pc-smuggler_m_s_008 - text: "Commission's at the bar. Sitting with Sera. Watching the room like they own it." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - prerequisites: - relationship: - target: npc:pc-detective - state: known - tags: [npc, pc-detective, sera, bar, caution] diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/smuggling-hold.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/smuggling-hold.yaml deleted file mode 100644 index 20f3bd4ac..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/smuggling-hold.yaml +++ /dev/null @@ -1,303 +0,0 @@ -# Monologue: Smuggler — Smuggling Hold -# Ticket: #120 | Author: Mellanie | Sprint: 14 -# Decision refs: D-016, D-032, D-035, D-037 -# -# The smuggling hold is below the maintenance corridors — an unmarked -# sub-level cargo space that the ring uses for temp storage and transfers. -# Not on any official manifest. The smuggler knows every pipe and access -# point here. This is both her operational center and her greatest exposure. -# -# Voice note: the smuggler here is at maximum operational competence and -# maximum paranoia simultaneously. She's in control of the space but the -# space itself is evidence of everything she's done. Lines should carry -# that dual register — calm on the surface, tight underneath. -# -# Schema: D-035 compliant. role/access/trust/situation included on all lines. -# Existing Sprint 5 files (the-terminal, the-last-shift, maintenance-corridors) -# will be updated by #168 (schema compliance pass). - -character: smuggler -location: smuggling-hold - -lines: - - # --- Arrival --- - - - id: pc-smuggler_m_s_001 - text: "Sub-level. The kind of space nobody finds unless you know where to look." - role: player_character - access: [public] - trust: surface - trigger: enter_location - situation: [arrival, routine] - tags: [arrival, atmospheric, operational] - - - id: pc-smuggler_m_s_002 - text: "Coolant smell. No ventilation down here — just recycled air and waiting." - role: player_character - access: [public] - trust: surface - trigger: enter_location - situation: [arrival, routine] - tags: [arrival, atmospheric, sensory] - - - id: pc-smuggler_m_s_003 - text: "Access hatch sealed from the inside. Good. Route's still ours." - role: player_character - access: [public] - trust: surface - trigger: enter_location - situation: [arrival, routine] - tags: [arrival, operational] - - - id: pc-smuggler_m_s_004 - text: "Three containers in temp. Right where they should be." - role: player_character - access: [public] - trust: surface - trigger: enter_location - situation: [arrival, routine] - prerequisites: - facts: - - fact_id: knowledge.ring_routing_knowledge - min_confidence: knows_of - tags: [arrival, operational, contraband] - - - id: pc-smuggler_m_s_005 - text: "Back in the hold. Dust on the floor shows the last two paths in. Both mine." - role: player_character - access: [public] - trust: surface - trigger: return_visit - situation: [arrival, routine] - tags: [arrival, operational] - - - id: pc-smuggler_m_s_006 - text: "Nobody's been here. Good. That's how it should feel." - role: player_character - access: [public] - trust: surface - trigger: enter_location - situation: [arrival, routine] - tags: [arrival, atmospheric] - - # --- Perception / Sound --- - - - id: pc-smuggler_m_s_007 - text: "The water recycler's on the other side of that wall. Loud enough to cover conversation." - role: player_character - access: [public] - trust: surface - trigger: hear_sound - situation: [routine] - tags: [sensory, environmental, operational] - - - id: pc-smuggler_m_s_008 - text: "Footsteps above. Maintenance crew — they stay up top. Always." - role: player_character - access: [public] - trust: surface - trigger: hear_sound - situation: [routine] - tags: [sensory, environmental, caution] - - - id: pc-smuggler_m_s_009 - text: "That sound. Pressure shift. Someone opened the main hatch." - role: player_character - access: [public] - trust: surface - trigger: hear_sound - situation: [routine, investigation] - priority: 7 - tags: [sensory, caution] - - - id: pc-smuggler_m_s_010 - text: "Pipe drone changes pitch when cargo shifts weight in the upper tier. That's cargo moving." - role: player_character - access: [public] - trust: surface - trigger: hear_sound - situation: [routine] - tags: [sensory, operational] - - # --- Time Idle / Ruminative --- - - - id: pc-smuggler_m_s_011 - text: "Fifteen minutes until the oversight window closes. Plenty of time. Probably." - role: player_character - access: [public] - trust: surface - trigger: time_idle - situation: [shift_transition] - tags: [operational, atmospheric] - - - id: pc-smuggler_m_s_012 - text: "Medical-grade lattice components. People need these. That's still the reason." - role: player_character - access: [public] - trust: surface - trigger: time_idle - situation: [routine] - tags: [atmospheric, contraband] - - - id: pc-smuggler_m_s_013 - text: "Twelve minutes of reduced oversight. Stop counting and do something useful." - role: player_character - access: [public] - trust: surface - trigger: time_idle - situation: [shift_transition] - tags: [operational] - - - id: pc-smuggler_m_s_014 - text: "How many times have I been in this room telling myself it's almost done?" - role: player_character - access: [public] - trust: surface - trigger: time_idle - situation: [routine] - tags: [atmospheric, personal] - - - id: pc-smuggler_m_s_015 - text: "Quiet. The right kind. Not the wrong kind." - role: player_character - access: [public] - trust: surface - trigger: time_idle - situation: [routine] - tags: [atmospheric] - - # --- Anomaly / Investigation --- - - - id: pc-smuggler_m_s_016 - text: "Container 4471's been opened. Not by me. Not by anyone I authorized." - role: player_character - access: [public] - trust: surface - trigger: observe_anomaly - situation: [routine, investigation] - priority: 8 - tags: [operational, caution, contraband] - - - id: pc-smuggler_m_s_017 - text: "Dust disturbed at the secondary hatch. Recent. Someone's been using the back route." - role: player_character - access: [public] - trust: surface - trigger: observe_anomaly - situation: [routine] - tags: [caution, operational] - - - id: pc-smuggler_m_s_018 - text: "Scratches on the access panel. New ones, over the old ones. Different tool." - role: player_character - access: [public] - trust: surface - trigger: observe_anomaly - situation: [routine] - tags: [caution, environmental] - - - id: pc-smuggler_m_s_019 - text: "The temp unit's running warm. Someone moved cargo through here fast." - role: player_character - access: [public] - trust: surface - trigger: observe_anomaly - situation: [routine] - tags: [operational, caution, contraband] - - # --- Knowledge-Gated: Kael Arc --- - - - id: pc-smuggler_m_s_020 - text: "Kael used to wait for me here. The one place where we could actually talk." - role: player_character - access: [public] - trust: surface - trigger: enter_location - situation: [arrival, routine] - prerequisites: - relationship: - target: npc:kael-davan - state: friendly - priority: 6 - tags: [npc, kael, atmospheric, friend-arc] - - - id: pc-smuggler_m_s_021 - text: "Kael's not answering. Should be here by now. Should have been here ten minutes ago." - role: player_character - access: [public] - trust: surface - trigger: time_idle - situation: [routine] - prerequisites: - relationship: - target: npc:kael-davan - state: person_of_interest - priority: 7 - tags: [npc, kael, concern, friend-arc] - - - id: pc-smuggler_m_s_022 - text: "If Kael talked to someone in that corridor — someone outside the ring — and then this container got touched... that's not coincidence." - role: player_character - access: [public] - trust: surface - trigger: time_idle - situation: [routine, investigation] - prerequisites: - facts: - - fact_id: investigation.kael_unknown_contact - min_confidence: knows_of - - fact_id: investigation.container_delay - min_confidence: suspects - priority: 9 - tags: [npc, kael, investigation, contraband, friend-arc] - - - id: pc-smuggler_m_s_023 - text: "The manifest Kael helped me falsify is in that container. If he talked, they already know." - role: player_character - access: [public] - trust: surface - trigger: observe_anomaly - situation: [investigation] - prerequisites: - facts: - - fact_id: investigation.kael_unknown_contact - min_confidence: suspects - - fact_id: knowledge.ring_routing_knowledge - min_confidence: knows_details - priority: 9 - tags: [npc, kael, operational, contraband, friend-arc, contaminated-trust] - - - id: pc-smuggler_m_s_024 - text: "Renn's mark is here. The route's still active. So Kael hasn't burned everything. Yet." - role: player_character - access: [public] - trust: surface - trigger: enter_location - situation: [arrival, routine] - prerequisites: - facts: - - fact_id: investigation.kael_unknown_contact - min_confidence: suspects - priority: 7 - tags: [operational, kael, renn, friend-arc] - - # --- Post-Conversation --- - - - id: pc-smuggler_m_s_025 - text: "Renn didn't ask questions. That's either loyalty or he already knows." - role: player_character - access: [public] - trust: surface - trigger: post_conversation - situation: [routine] - tags: [npc, renn, operational] - - - id: pc-smuggler_m_s_026 - text: "One more run. That's what I keep telling myself. Has been for eight months." - role: player_character - access: [public] - trust: surface - trigger: time_idle - situation: [routine] - tags: [atmospheric, personal, contraband] diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/the-last-shift.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/the-last-shift.yaml deleted file mode 100644 index 38019697b..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/the-last-shift.yaml +++ /dev/null @@ -1,427 +0,0 @@ -character: smuggler -location: the-last-shift -lines: - # --- Arrival + Environmental Flavor --- - - - id: pc-smuggler_m_s_001 - text: "Lera's. Grain spirit and noise. Could use both right now." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [arrival, atmospheric] - - - id: pc-smuggler_m_s_002 - text: "Bar's half full. The after-shift crowd's starting to filter in." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [arrival] - - - id: pc-smuggler_m_s_003 - text: "Lera's got the Meridian feed running. Same headlines, different day." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [arrival, environmental] - - - id: pc-smuggler_m_s_004 - text: "Smells like fried protein and cheap grain spirit. Perfect." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [environmental, atmospheric] - - - id: pc-smuggler_m_s_005 - text: "My booth's free. Small victories." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [arrival, personal] - - - id: pc-smuggler_m_s_006 - text: "The overhead light's still buzzing. Lera says it adds character." - role: player_character - access: [public] - trust: surface - situation: [routine] - trigger: hear_sound - tags: [environmental] - - - id: pc-smuggler_m_s_007 - text: "Music's louder tonight. Lera's in a good mood, or drowning something out." - role: player_character - access: [public] - trust: surface - situation: [routine] - trigger: hear_sound - tags: [environmental, atmospheric] - - - id: pc-smuggler_m_s_008 - text: "Back at Lera's. Same booth, same drink, same crowd." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: return_visit - tags: [arrival] - - - id: pc-smuggler_m_s_009 - text: "The ventilation rattles when the kitchen's on. You learn to talk over it." - role: player_character - access: [public] - trust: surface - situation: [routine] - trigger: hear_sound - tags: [environmental] - - - id: pc-smuggler_m_s_010 - text: "Quiet night at Lera's. Fewer people means fewer ears." - role: player_character - access: [public] - trust: surface - situation: [arrival, routine] - trigger: enter_location - tags: [arrival, operational] - - # --- NPC Commentary --- - - - id: pc-smuggler_m_s_011 - text: "Lera's behind the bar. Good — she keeps things steady." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - tags: [npc, lera] - - - id: pc-smuggler_m_s_012 - text: "Kael's at the corner table. Looks relaxed. That's something." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - tags: [npc, kael] - - - id: pc-smuggler_m_s_013 - text: "Torek's buying rounds again. That man doesn't know the word 'discreet.'" - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - tags: [npc, torek, caution] - - - id: pc-smuggler_m_s_014 - text: "Sera's here. Commission field tech. She keeps to herself — mostly." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - tags: [npc, sera, commission] - - - id: pc-smuggler_m_s_015 - text: "Naia's laughing at something Lera said. Nice to see her relaxed." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - tags: [npc, naia] - - - id: pc-smuggler_m_s_016 - text: "Old Pael's in his usual spot. Hasn't moved in three hours. Impressive." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - tags: [npc, atmospheric] - - - id: pc-smuggler_m_s_017 - text: "Lera just cut someone off. Smooth about it, but firm." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: witness_interaction - tags: [npc, lera] - - - id: pc-smuggler_m_s_018 - text: "Kael and Naia at the bar. Leaning into each other. They look good together." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: witness_interaction - tags: [npc, kael, naia] - - - id: pc-smuggler_m_s_019 - text: "Voss is drinking alone. Not his usual pace." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - tags: [npc, voss] - - - id: pc-smuggler_m_s_020 - text: "That new face in the corner — been nursing the same drink for an hour." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - tags: [npc, caution] - - # --- Knowledge-Gated Lines --- - - - id: pc-smuggler_m_s_021 - text: "Sera left when Torek walked in. Coincidence? Maybe." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_anomaly - prerequisites: - facts: - - fact_id: behavioral.sera_avoidance_pattern - min_confidence: suspects - tags: [npc, sera, torek, pattern] - - - id: pc-smuggler_m_s_022 - text: "Torek just paid cash credit, not station account. Sloppy." - role: player_character - access: [public] - trust: surface - situation: [observation, routine] - trigger: observe_npc - prerequisites: - facts: - - fact_id: investigation.torek_spending_pattern - min_confidence: knows_of - tags: [npc, torek, operational] - - - id: pc-smuggler_m_s_023 - text: "Lera gave me that look. The one that says 'not here, not now.'" - role: player_character - access: [public] - trust: surface - situation: [routine, social] - trigger: post_conversation - prerequisites: - facts: - - fact_id: knowledge.ring_bar_operations - min_confidence: knows_details - tags: [npc, lera, operational] - - - id: pc-smuggler_m_s_024 - text: "Naia looks tired. Has Kael been coming home late again?" - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - prerequisites: - relationship: - target: npc:naia-tamm - state: known - tags: [npc, naia, kael, concern] - - - id: pc-smuggler_m_s_025 - text: "The detective is here. At the bar. My bar." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_npc - prerequisites: - facts: - - fact_id: awareness.detective_presence - min_confidence: knows_of - priority: 8 - tags: [investigation, caution] - - - id: pc-smuggler_m_s_026 - text: "Sera and the detective sharing a booth. Commission people stick together." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: witness_interaction - prerequisites: - facts: - - fact_id: awareness.detective_presence - min_confidence: knows_of - tags: [npc, sera, investigation] - - - id: pc-smuggler_m_s_027 - text: "Kael didn't save my seat tonight. First time in months." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_anomaly - prerequisites: - relationship: - target: npc:kael-davan - state: person_of_interest - priority: 8 - tags: [npc, kael, contaminated-trust, friend-arc] - - - id: pc-smuggler_m_s_028 - text: "The back room light's on. Nils is here, then." - role: player_character - access: [public] - trust: surface - situation: [observation, routine] - trigger: observe_anomaly - prerequisites: - facts: - - fact_id: knowledge.ring_bar_operations - min_confidence: knows_details - tags: [operational, nils] - - - id: pc-smuggler_m_s_029 - text: "Kael bought Naia a drink but barely looked at her. That's new." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: witness_interaction - prerequisites: - facts: - - fact_id: behavioral.kael_behavioral_change - min_confidence: suspects - tags: [npc, kael, naia, tell, friend-arc] - - - id: pc-smuggler_m_s_030 - text: "Everyone's a little too quiet tonight. Something happened. I can feel it." - role: player_character - access: [public] - trust: surface - situation: [arrival, routine] - trigger: enter_location - prerequisites: - facts: - - fact_id: awareness.ring_tension_escalation - min_confidence: suspects - priority: 7 - tags: [atmospheric, caution, operational] - - # --- Sera Venn Dual-Lens — Smuggler Observations --- - # Ticket: #298 | Author: Paula - # The smuggler sees Sera as Commission — wary, practical, outsider - # perspective. On replay, these lines gain new meaning when the player - # understands Sera's concealment arc from the detective playthrough. - - - id: pc-smuggler_m_s_031 - text: "Sera's at the Commission kiosk. Third time this shift. Nobody recalibrates that much." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - prerequisites: - facts: - - fact_id: behavioral.sera_kiosk_pattern - min_confidence: suspects - priority: 6 - tags: [npc, sera, commission, pattern, dual-lens] - - - id: pc-smuggler_m_s_032 - text: "Naia trusts Sera. More than most people here. That says something." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: witness_interaction - tags: [npc, sera, naia, social, dual-lens] - - - id: pc-smuggler_m_s_033 - text: "Sera was studying the freight display. For a calibration tech, that's a lot of manifest reading." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - prerequisites: - facts: - - fact_id: behavioral.sera_topic_deflection - min_confidence: suspects - priority: 6 - tags: [npc, sera, tell, cargo, dual-lens] - - - id: pc-smuggler_m_s_034 - text: "That's three times Sera's bailed when Torek showed up. Maybe she owes him money." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_anomaly - prerequisites: - facts: - - fact_id: behavioral.sera_avoidance_pattern - min_confidence: knows_of - priority: 7 - tags: [npc, sera, torek, pattern, dual-lens, replay-payload] - - - id: pc-smuggler_m_s_035 - text: "Sera offered the detective compliance records. Helpful -- or professional courtesy?" - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: witness_interaction - prerequisites: - facts: - - fact_id: awareness.detective_presence - min_confidence: knows_of - tags: [npc, sera, investigation, caution, dual-lens] - - - id: pc-smuggler_m_s_036 - text: "Something about Sera tonight. Same smile, different eyes." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - prerequisites: - relationship: - target: npc:sera-venn - state: known - tags: [npc, sera, behavioral, dual-lens] - - - id: pc-smuggler_m_s_037 - text: "Commission tech who drinks at a dock bar. Either lonely or embedded. Either way -- careful." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - tags: [npc, sera, commission, assessment, dual-lens] - - - id: pc-smuggler_m_s_038 - text: "Sera knows the shift rotations better than Voss. That's not calibration. That's attention." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - prerequisites: - facts: - - fact_id: behavioral.sera_knowledge_detail - min_confidence: suspects - priority: 6 - tags: [npc, sera, tell, competence, dual-lens] diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/the-terminal.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/the-terminal.yaml deleted file mode 100644 index 051d400d6..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/the-terminal.yaml +++ /dev/null @@ -1,449 +0,0 @@ -character: smuggler -location: the-terminal -lines: - # --- Arrival + Environmental Flavor --- - - - id: pc-smuggler_m_s_001 - text: "Morning shift. Recycled air and cargo lubricant. Home sweet home." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [arrival, atmospheric] - - - id: pc-smuggler_m_s_002 - text: "The loading arms are cycling. Freight's on schedule — for once." - role: player_character - access: [public] - trust: surface - situation: [arrival, routine] - trigger: enter_location - tags: [arrival, operational] - - - id: pc-smuggler_m_s_003 - text: "Shift board's already full. Voss has everyone running double today." - role: player_character - access: [public] - trust: surface - situation: [arrival, routine] - trigger: enter_location - tags: [arrival, operational] - - - id: pc-smuggler_m_s_004 - text: "Cargo lubricant and ozone. You'd think I'd stop noticing." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [environmental, atmospheric] - - - id: pc-smuggler_m_s_005 - text: "Loading arm three is grinding again. Someone should file that." - role: player_character - access: [public] - trust: surface - situation: [routine] - trigger: hear_sound - tags: [environmental] - - - id: pc-smuggler_m_s_006 - text: "Containers stacked six high in bay four. That's new." - role: player_character - access: [public] - trust: surface - situation: [observation, routine] - trigger: observe_anomaly - tags: [environmental, operational] - - - id: pc-smuggler_m_s_007 - text: "The freight manifest board's flickering. Always flickering." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [environmental] - - - id: pc-smuggler_m_s_008 - text: "Dock lights are on half-cycle. Budget cuts again." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [environmental, atmospheric] - - - id: pc-smuggler_m_s_009 - text: "Back at the hub. Shift transition in fifty minutes." - role: player_character - access: [public] - trust: surface - situation: [arrival, routine] - trigger: return_visit - tags: [arrival, operational] - - - id: pc-smuggler_m_s_010 - text: "Quiet morning. Containers moving, nobody talking. I like it this way." - role: player_character - access: [public] - trust: surface - situation: [arrival] - trigger: enter_location - tags: [arrival, atmospheric] - - - id: pc-smuggler_m_s_011 - text: "Bay three's been sealed off. Inspection, or something else?" - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_anomaly - tags: [environmental, caution] - - - id: pc-smuggler_m_s_012 - text: "The conveyor hums at a different pitch when it's loaded heavy. This one's heavy." - role: player_character - access: [public] - trust: surface - situation: [routine] - trigger: hear_sound - tags: [environmental, operational] - - # --- NPC Commentary --- - - - id: pc-smuggler_m_s_013 - text: "Kael's already at the dock. Good. The day's better when he's on shift." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - tags: [npc, kael, warm] - - - id: pc-smuggler_m_s_014 - text: "Voss is pacing. Never a good sign." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - tags: [npc, voss, caution] - - - id: pc-smuggler_m_s_015 - text: "Maret's got her scheduling face on. Tight lips, fast hands on the terminal." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - tags: [npc, maret] - - - id: pc-smuggler_m_s_016 - text: "New face at dock seven. Temp worker, or someone I should know about?" - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - tags: [npc, caution] - - - id: pc-smuggler_m_s_017 - text: "Drin's at inspection again. Going through the motions, same as always." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - tags: [npc, drin] - - - id: pc-smuggler_m_s_018 - text: "Renn's running late. Third time this week." - role: player_character - access: [public] - trust: surface - situation: [observation, routine] - trigger: observe_npc - tags: [npc, renn, operational] - - - id: pc-smuggler_m_s_019 - text: "Voss and Maret talking by the schedule board. Both look tense." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: witness_interaction - tags: [npc, voss, maret] - - - id: pc-smuggler_m_s_020 - text: "Kael nodded at me across the bay. Business as usual." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - tags: [npc, kael] - - - id: pc-smuggler_m_s_021 - text: "Someone I don't recognize talking to Drin. Drin's smiling. Drin never smiles." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: witness_interaction - tags: [npc, drin, anomaly] - - - id: pc-smuggler_m_s_022 - text: "Torek's on the dock. Shouldn't be — his shift ended two hours ago." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_anomaly - tags: [npc, torek, caution] - - - id: pc-smuggler_m_s_023 - text: "Nils isn't here yet. That's unusual." - role: player_character - access: [public] - trust: surface - situation: [observation, routine] - trigger: observe_anomaly - tags: [npc, nils, operational] - - - id: pc-smuggler_m_s_024 - text: "Kael's eating alone today. He always eats with me." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_anomaly - tags: [npc, kael, concern] - - # --- Knowledge-Gated Lines --- - - - id: pc-smuggler_m_s_025 - text: "Kael keeps checking his lattice. Waiting for a message? Not like him to be jumpy." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_anomaly - prerequisites: - relationship: - target: npc:kael-davan - state: friendly - priority: 7 - tags: [npc, kael, tell, friend-arc] - - - id: pc-smuggler_m_s_026 - text: "Container 4471's been in temp since yesterday. That's not the normal routing." - role: player_character - access: [public] - trust: surface - situation: [observation, routine] - trigger: observe_anomaly - prerequisites: - facts: - - fact_id: knowledge.ring_routing_knowledge - min_confidence: knows_details - tags: [operational, contraband] - - - id: pc-smuggler_m_s_027 - text: "Voss changed the rotation again. Third time this month. Covering something." - role: player_character - access: [public] - trust: surface - situation: [observation, routine] - trigger: observe_anomaly - prerequisites: - facts: - - fact_id: investigation.voss_ring_involvement - min_confidence: knows_of - tags: [npc, voss, operational] - - - id: pc-smuggler_m_s_028 - text: "That detective's back. Asking questions near bay four. Stay calm." - role: player_character - access: [public] - trust: surface - situation: [investigation, observation] - trigger: observe_npc - prerequisites: - facts: - - fact_id: awareness.detective_presence - min_confidence: knows_of - priority: 8 - tags: [investigation, caution] - - - id: pc-smuggler_m_s_029 - text: "Maret hasn't looked at me all shift. She noticed something. I know she did." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: observe_npc - prerequisites: - entity_attributes: - - entity: npc:maret-korr - key: behavior_flags - value: avoidance - priority: 6 - tags: [npc, maret, paranoia] - - - id: pc-smuggler_m_s_030 - text: "Shift transition in ten. If the route's clean, we move tonight." - role: player_character - access: [public] - trust: surface - situation: [alone, routine] - trigger: time_idle - prerequisites: - facts: - - fact_id: knowledge.ring_routing_knowledge - min_confidence: knows_details - tags: [operational, contraband] - - - id: pc-smuggler_m_s_031 - text: "Kael was in corridor B-7 last night. Off-shift. Off-route. That's not nothing." - role: player_character - access: [public] - trust: surface - situation: [alone, investigation] - trigger: time_idle - prerequisites: - facts: - - fact_id: investigation.kael_corridor_meeting - min_confidence: suspects - priority: 8 - tags: [npc, kael, contradiction, friend-arc] - - - id: pc-smuggler_m_s_032 - text: "Who was Kael talking to? Not anyone from our rotation. I'd know the face." - role: player_character - access: [public] - trust: surface - situation: [alone, investigation] - trigger: time_idle - prerequisites: - facts: - - fact_id: investigation.kael_unknown_contact - min_confidence: suspects - priority: 9 - tags: [npc, kael, contradiction, friend-arc] - - - id: pc-smuggler_m_s_033 - text: "He looked left before answering. He always looks left when he's lying." - role: player_character - access: [public] - trust: surface - situation: [investigation, social] - trigger: post_conversation - prerequisites: - facts: - - fact_id: behavioral.kael_evasion - min_confidence: direct - priority: 9 - tags: [npc, kael, tell, friend-arc] - - - id: pc-smuggler_m_s_034 - text: "Torek's spending too much at Lera's. Someone's going to notice." - role: player_character - access: [public] - trust: surface - situation: [observation, routine] - trigger: observe_npc - prerequisites: - facts: - - fact_id: investigation.torek_spending_pattern - min_confidence: knows_of - tags: [npc, torek, operational, caution] - - - id: pc-smuggler_m_s_035 - text: "Same old Kael. Same jokes, same routine. ...What are you not telling me?" - role: player_character - access: [public] - trust: surface - situation: [investigation, social] - trigger: post_conversation - prerequisites: - relationship: - target: npc:kael-davan - state: person_of_interest - priority: 9 - tags: [npc, kael, contaminated-trust, friend-arc] - - # --- Triangle Activation: Kael Davan (T1: Kael-Smuggler-Ring, D-087) --- - # Fires post-TriangleActivated when player has LOS to Kael. One beat per line. - # Beat 1: physical observation. Beat 2: rationalization. Beat 3: doubt. Beat 4: sensory confirmation. Beat 5: emotional break. - - - id: pc-smuggler_m_s_036 - text: "Kael's in the main corridor. He doesn't usually come through here." - role: player_character - access: [public] - trust: surface - situation: [triangle_activated] - trigger: observe_npc - mood: [suspicious] - priority: 8 - cooldown: 9999 - tags: [triangle-signal, tell-observation, npc, kael, friend-arc] - prerequisites: - npc_in_los: true - - - id: pc-smuggler_m_s_037 - text: "Voss probably moved him. Schedule shifts happen." - role: player_character - access: [public] - trust: surface - situation: [triangle_activated] - trigger: observe_npc - mood: [suspicious] - priority: 8 - cooldown: 9999 - tags: [triangle-signal, tell-observation, npc, kael, friend-arc] - prerequisites: - npc_in_los: true - - - id: pc-smuggler_m_s_038 - text: "...Kael would've told me." - role: player_character - access: [public] - trust: surface - situation: [triangle_activated] - trigger: observe_npc - mood: [anxious] - priority: 8 - cooldown: 9999 - tags: [triangle-signal, tell-observation, npc, kael, friend-arc] - prerequisites: - npc_in_los: true - - - id: pc-smuggler_m_s_039 - text: "He's not looking at the cargo. He's watching the exits." - role: player_character - access: [public] - trust: surface - situation: [triangle_activated] - trigger: observe_npc - mood: [anxious] - priority: 8 - cooldown: 9999 - tags: [triangle-signal, tell-observation, npc, kael, tell, friend-arc] - prerequisites: - npc_in_los: true - - - id: pc-smuggler_m_s_040 - text: "I don't know what I'm seeing. But I know Kael. And this isn't Kael." - role: player_character - access: [public] - trust: surface - situation: [triangle_activated] - trigger: observe_npc - mood: [anxious] - priority: 8 - cooldown: 9999 - tags: [triangle-signal, tell-observation, npc, kael, contradiction, friend-arc] - prerequisites: - npc_in_los: true diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/tutorial.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/tutorial.yaml deleted file mode 100644 index 2c48f043a..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/tutorial.yaml +++ /dev/null @@ -1,229 +0,0 @@ -character: smuggler -location: tutorial -lines: - # Diegetic Tutorial Monologue — Ticket #330 — Smuggler - # Authored per sprint-17 copy briefing and D-016 (internal monologue as core system). - # - # These lines teach mechanics through character voice — not UI instructions. - # Distinct from opening.yaml (which covers the first 5 minutes and sets voice/motivation). - # These fire on first-time events throughout gameplay, wherever they occur. - # - # Coverage: - # Movement / exploration — first_move, first_new_section - # Fog of perception — first_fog_encounter, first_fog_edge - # Sound model — first_sound_heard, first_off_screen_sound - # NPC interaction — first_npc_proximity, first_npc_face_read - # Insert / HUD — first_insert_open, first_insert_contact_flag - # - # Voice: observational, street-smart, practical. Fragments. Standalone "Good." as tic. - # No analytical distance — the smuggler reads, reacts, files, moves on. - # ID discriminator: _tut_ per sprint briefing. - # cooldown: omitted — fire-once enforced by trigger semantics (first_* triggers - # fire once per game), not by a cooldown value. - # priority: 8 (primary, one per trigger type), 6 (secondary variant, mood-weighted alternate). - # - # Schema corrections (Gestalt review, Sprint 17): - # priority: string "tutorial" → integer. All other monologue files use integer priority; - # string value would fail engine parse in monologue.rs. - # situation: removed invalid values (movement, exploration) not in D-035 13-situation - # enum. Replaced with arrival, routine, observation per actual trigger context. - # mood: [focused] retained where set; valid per D-035 Sprint 14 amendment. - # - # Trigger types (first_move, first_new_section, first_fog_encounter, first_fog_edge, - # first_sound_heard, first_off_screen_sound, first_npc_proximity, first_npc_face_read, - # first_insert_open, first_insert_contact_flag) are extended trigger enum values not in - # D-035 v0.1 set — require server-side implementation in monologue.rs. - - # ----------------------------------------------------------------------- - # MOVEMENT / EXPLORATION - # ----------------------------------------------------------------------- - - - id: pc-smuggler_m_s_tut_001 - text: "These corridors all look the same. Mental note: check the signage." - role: player_character - access: [public] - trust: surface - situation: [arrival, routine] - trigger: first_move - mood: [focused] - priority: 8 - - tags: [tutorial, movement, navigation] - notes: > - Directly from the sprint briefing example. First move teaches navigation: the district - looks homogeneous, signage is the tool. 'Mental note' is the smuggler's internal - flag for things to remember — operational housekeeping, not analysis. Establishes - early: this environment requires active spatial tracking. - - - id: pc-smuggler_m_s_tut_002 - text: "Two lefts past the junction, right at the supply hatch. That's dock four. Route's in the muscle now." - role: player_character - access: [public] - trust: surface - situation: [arrival, routine] - trigger: first_new_section - mood: [content] - priority: 6 - - tags: [tutorial, movement, navigation, operational] - notes: > - Fires on entering a new section for the first time. 'Route's in the muscle' — the - smuggler doesn't memorize spatially, she moves until it's automatic. Practical, - self-sufficient. Teaches: the district has multiple sections, each requires its own - orientation. 'Dock four' is a landmark. Forward movement is rewarded with familiarity. - - # ----------------------------------------------------------------------- - # FOG OF PERCEPTION - # ----------------------------------------------------------------------- - - - id: pc-smuggler_m_s_tut_003 - text: "Can't see past that corner. Might be worth checking." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: first_fog_encounter - mood: [focused] - priority: 8 - - tags: [tutorial, fog, perception] - notes: > - Directly from the sprint briefing example. First fog boundary. Restated as habit: - the smuggler doesn't treat the fog as a limitation, she treats every unknown corner - as a question worth answering. 'Might be worth' — not paranoia, just operational - instinct. Teaches: the perception boundary is navigable, not fixed. - - - id: pc-smuggler_m_s_tut_004 - text: "Haze cuts off past the junction. Anything in it — can't say." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: first_fog_edge - mood: [focused] - priority: 6 - - tags: [tutorial, fog, perception] - notes: > - Second fog encounter line — fires when the player reaches the boundary of a fog zone - (the edge of visible range). 'Can't say' — plain statement of unknowing, not anxiety. - The smuggler accepts incomplete information as a working condition, not a failure state. - Teaches: perception range is an ongoing factor, not a one-time obstacle. - - # ----------------------------------------------------------------------- - # SOUND MODEL - # ----------------------------------------------------------------------- - - - id: pc-smuggler_m_s_tut_005 - text: "Voices down the hall. Can't make out the words from here." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: first_sound_heard - mood: [focused] - priority: 8 - - tags: [tutorial, sound, perception] - notes: > - Directly from the sprint briefing example. First sound heard that's not immediately - visible. Teaching: sound carries information, but range and occlusion limit it. - 'Can't make out the words' establishes both the value of the sound channel (voices = - people = relevant) and its limitation (unclear at range). Moving toward source is - the implied next step. - - - id: pc-smuggler_m_s_tut_006 - text: "Footsteps. Two sets. Moving away — good." - role: player_character - access: [public] - trust: surface - situation: [observation] - trigger: first_off_screen_sound - mood: [content] - priority: 6 - - tags: [tutorial, sound, perception, operational] - notes: > - Second sound line — fires when audio from an off-screen source is detected. The - smuggler parses footsteps as count and direction instinctively. 'Moving away — good.' - — the standalone 'Good.' tic applied to tactical assessment. Teaches: sound carries - directional and movement data, not just presence. Two sets = two people, which is - specific enough to be operationally useful. - - # ----------------------------------------------------------------------- - # NPC INTERACTION - # ----------------------------------------------------------------------- - - - id: pc-smuggler_m_s_tut_007 - text: "Could ask around. People talk if you give them reason to." - role: player_character - access: [public] - trust: surface - situation: [social, observation] - trigger: first_npc_proximity - mood: [content] - priority: 8 - - tags: [tutorial, npc, interaction, social] - notes: > - Directly from the sprint briefing example. First time in range of an NPC. The smuggler - doesn't approach directly — she flags the option. 'Give them reason to' is street-smart - social knowledge: people don't volunteer freely, they need a hook. Teaches: NPC - interaction is player-initiated, and approach matters. No mechanics text — just the - character's own method stated as personal principle. - - - id: pc-smuggler_m_s_tut_008 - text: "Know the face. Don't need the name." - role: player_character - access: [public] - trust: surface - situation: [social, observation] - trigger: first_npc_face_read - mood: [content] - priority: 6 - - tags: [tutorial, npc, observation, social] - notes: > - Fires when the player observes an NPC at close range (face visible). The smuggler - reads people by face, not by name — the name comes later if relevant. Teaches: NPCs - are identifiable by observation, and the insert overlay will fill in names when - available. The smuggler's social intelligence is pre-lattice, instinctive. - - # ----------------------------------------------------------------------- - # INSERT / HUD - # ----------------------------------------------------------------------- - - - id: pc-smuggler_m_s_tut_009 - text: "Check the overlay. Should show the time and nearby contacts." - role: player_character - access: [public] - trust: surface - situation: [routine] - trigger: first_insert_open - mood: [content] - priority: 8 - - tags: [tutorial, insert, hud, operational] - notes: > - Directly from the sprint briefing example. First insert/HUD open. The smuggler's - overlay shows time and nearby contacts — both operationally critical. 'Should show' - — practical, not certain. Teaches: the insert is the primary tool for time-tracking - and NPC awareness. Diegetic: she checks it the same way she checks a shift board. - - - id: pc-smuggler_m_s_tut_010 - text: "Overlay marks Kael two sections over. Good." - role: player_character - access: [public] - trust: surface - situation: [routine, social] - trigger: first_insert_contact_flag - mood: [content, warm] - priority: 6 - - tags: [tutorial, insert, hud, kael, friend-arc] - notes: > - Fires when the insert first flags a known contact (here: Kael, the FRIEND NPC). - 'Two sections over' — spatial data from the overlay. 'Good.' standalone tic — - warm, settling. Teaches: the insert shows known NPC positions in real-time. - Also seeds the Kael relationship: the smuggler checks his location as a habit, - not a task. His position is always relevant to her. diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/devra.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/devra.yaml deleted file mode 100644 index 39236b58a..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/devra.yaml +++ /dev/null @@ -1,156 +0,0 @@ -# NPC Profile: Devra Talsen -# Source: wiki/characters/devra.md -# Tier 2 | THRESHOLD + HANDLER | Ring coordinator, supply broker - -canonical_id: "npc:devra" -display_name: "Devra Talsen" -tier: 2 -pattern: "THRESHOLD" -motivation: "HANDLER" - -description: > - Ring coordinator and freelance supply broker. Devra manages the ring's external - supply chain — coordinating with Sabel for incoming shipments, scheduling handoffs, - managing the timeline between gate transits and dock processing. The brokering - business is both legitimate income and operational cover, intentionally blurring - the line between legal and illegal work. Publicly a working professional with a - regular seat at The Last Shift. - -want: - primary: "Wealth" - intensity: 7 - description: > - Keep the operation running smoothly and profitably. - Devra is the ring's operational brain. She manages external supply chain - coordination, schedules handoffs, and maintains timing between gate transits - and dock processing. She is good at this — better than Nils, though she would - never say it. Secondary want: maintain her legitimate cover. The supply - brokering business provides real income, real social capital, and a legitimate - reason to know shipping schedules, gate transit windows, and cargo volumes. - -secret: > - Devra manages the relationship with Sabel, the off-station supplier. If the - chain is traced upstream, it runs through Devra. She is more exposed than anyone - except Nils. The supply brokering business is partly a cover for ring logistics — - visible to anyone who tracks how much time Devra spends on freight details that - do not match her client list. She is the single point of failure between the - local ring and the supply source. - -relationships: - - target: "npc:nils-davan" - kind: "colleague" - trust: 5 - notes: "Ring coordinator (strategic). Respect for competence, disagree on risk tolerance. Devra favors steady volume; Nils pushes for escalation." - - target: "npc:sabel" - kind: "colleague" - trust: 3 - notes: "Off-station supplier. Professional, efficient, no personal warmth. Transactional relationship." - - target: "npc:lera-sessik" - kind: "friend" - trust: 4 - notes: "The bar is Devra's social stage. Drinks there, brokers small deals publicly. Lera knows Devra uses the back room." - - target: "npc:renn" - kind: "subordinate" - trust: 5 - notes: "Courier. Receives timing instructions from Devra. Values Renn's reliability without personal investment." - - target: "npc:pell" - kind: "subordinate" - trust: 1 - notes: "Ring member. Watching Pell more closely since Renn's report. Suspects wavering." - -tolerance: - threshold: 8 - description: > - High. Calm under pressure, thinks operationally, does not panic. What breaks - her tolerance: Pell's wavering (internal security threat), unexpected Commission - presence (the detective's arrival), and Nils pushing volume too fast. - -routine: - summary: > - 6 routine entries covering full day cycle: - 1. Supply brokering (08:00-12:00) — lattice calls, contract negotiation, legitimate business. - 2. Lunch (12:00-14:00) — sometimes at the hub, maintaining visibility near freight operations. - 3. Bar presence (14:00-17:00, The Last Shift) — social stage, quiet coordination. - 4. Back room meetings (17:00-19:00, 1-2x per week) — ring business. - 5. Home or continued brokering (19:00+). - 6. Night operations — coordinates gate transit timing with Sabel during off-peak windows. - -information: - knows: - - "contraband.ring_exists" - - "contraband.lattice_components" - - "contraband.supply_chain" - - "location.smuggling_route" - - "location.surveillance_gaps" - - "investigation.shift_mismatch" - - "relationship.ring_membership" - - "relationship.trust_network" - - "world.shift_schedule" - access_tier: "insider" - -contentment: - level: 4 - description: > - Moderate-high. Devra is competent and knows it. The operation runs well. The - money is good. The brokering cover is solid. Contentment would drop sharply if - the operation were threatened — not because she loves the work, but because she - has built her entire life in the district around it. - -personality: - demeanor: "professional, composed, controlled" - social_style: "strategic conversationalist, manages impressions, compartmentalizes" - stress_response: "sentences get shorter, eye contact increases, casual bar persona drops" - -tells: - - trigger: "coordinating with Sabel about incoming shipment timing" - behavior: "Increased lattice activity — longer message sessions, more frequent checks" - visible_to: "peripheral" - - trigger: "ring coordination meetings scheduled" - behavior: "Enters the back room, door closes, 30-60 minutes. Casual demeanor before and after." - visible_to: "any" - - trigger: "discussing ring business with a colleague" - behavior: "Professional demeanor shift — sentences shorten, eye contact increases, casual persona drops" - visible_to: "forward" - -skills: - combat_trained: false - skills: - logistics: 8 - negotiation: 7 - communication: 7 - information_compartmentalization: 6 - -triangle_membership: [] - -trust_levels: - surface: > - Freelance supply broker. Professional, friendly at the bar, discusses freight - contracts casually. "I've got a freight contract clearing through Gate 2 next - cycle. Standard components. Nothing exciting, but it pays the rent." - real: > - Ring coordinator. Manages external supply chain, coordinates timing with Sabel, - schedules handoffs, and delivers operational directives from Nils. "The window - is tight. Sabel confirms transit for the 22:00 cycle. Renn handles pickup." - secret: > - Devra is the single point of failure between the local ring and the upstream - supply source. If Sabel is compromised, Devra is the next link. Knows Pell is - wavering. Could run the operation better than Nils. - -dual_lens: - smuggler: > - Devra is the operational heart of the ring. The smuggler respects her competence - and relies on her coordination. "Devra's got the next shipment scheduled. She's - reliable — more reliable than Nils, honestly." - detective: > - A freelance supply broker who knows freight schedules in unusual detail. The - detective initially reads her as a local businesswoman. Only deeper investigation - reveals the brokering is partly cover. "Freelance broker. Devra, no family name - offered. Knows freight schedules better than most hub workers. Interesting." - -notes: > - THRESHOLD + HANDLER creates the obstacle with authority: "You go through her or - you don't go." Devra gates access to the ring while applying top-down operational - pressure. Most structurally important ring member on-station — both the wall and - the hand pushing people against it. Her competence makes her formidable; her - ambition makes her interesting. Not a formal v0.1 triangle member — her role is - connective, linking internal operations to the external supply chain. diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/drin.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/drin.yaml deleted file mode 100644 index 0ec31a592..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/drin.yaml +++ /dev/null @@ -1,172 +0,0 @@ -# NPC Profile: Drin Rosta -# Source: wiki/characters/drin.md -# Tier 2 | SYSTEM + TURNCOAT | Maintenance tech and dock inspector - -canonical_id: "npc:drin" -display_name: "Drin Rosta" -tier: 2 -pattern: "SYSTEM" -motivation: "TURNCOAT" - -description: > - Maintenance tech and dock inspector at the Sova Transit District Logistics Hub. - Age 40, Station Sova native. Competent at both roles. Compromised by a gambling - debt to Harek — a significant sum from bar card games. The debt does not require - Drin to do anything explicitly illegal. It means Drin is slow during inspections - of certain containers. He does not open them. He does not look hard. The ring - noticed this pattern and relies on it. Drin is compromised by omission, not - commission. - -want: - primary: "Freedom" - intensity: 8 - description: > - Clear the debt and stop looking over his shoulder. - Drin wants to return to when the job was just a job — maintenance rounds, dock - inspections, clocking out, going home. The work was repetitive and that was - fine. Now every inspection cycle carries a second calculation: which containers - to skip, which bays to clear without looking, how to file a report that says - nothing happened when something might have. He wants the old version of the - job back. He does not know how to get there. - -secret: > - Drin's inspection negligence is being exploited by the ring. He understands that - someone benefits from his looking the other way — containers move through his - shifts without scrutiny and nobody complains. But he does not know the ring's - structure, does not know Kael's role, does not know the scope of the operation - his silence enables. He thinks it is smaller than it is. The distinction between - omission and commission feels meaningful to him and would not feel meaningful to - an investigator. - -relationships: - - target: "npc:harek" - kind: "friend" - trust: 3 - notes: "Debt holder, inadvertent coercer. Fear-based, asymmetric. Harek does not press aggressively — keeps the debt active, invites Drin to card games, covers a round. Drin likes Harek personally, which makes the dynamic worse." - - target: "npc:voss" - kind: "superior" - trust: 2 - notes: "Shift supervisor. Professional, strained. Voss needs Drin functional and quiet. They interact procedurally — shift handoffs, maintenance reports, inspection schedules. Professional distance is mutual and deliberate." - - target: "npc:maret-korr" - kind: "colleague" - trust: 3 - notes: "Freight scheduler. Guilt-adjacent. Drin knows his inspection reports feed into Maret's reconciliation workflow. He senses Maret has noticed the reports are too clean. Avoids extended interaction." - -tolerance: - threshold: 2 - description: > - Already past breaking. The compromise IS Drin's post-threshold state. He crossed - the line the first time he filed an inspection report he knew was incomplete, - and he has been living past the threshold ever since. He tolerates the routine - guilt, the mechanical compliance, Harek's passive leverage. What breaks him: - direct confrontation about specific inspections, escalating demands to do more - than look away, or Harek pressing the debt publicly. - -routine: - summary: > - 7 routine entries covering full day cycle: - 1. Arrival (05:50, hub) — checks maintenance board for overnight issues. - 2. Maintenance rounds (06:00-10:00) — environmental systems, loading equipment, - pipe and wiring repairs. - 3. Break (10:00-10:30, break room) — eats alone or with maintenance crew. Avoids - Harek and prolonged conversation with Maret. - 4. Dock inspections (10:30-14:00) — scheduled bay checks, container verification, - freight condition reports. Compromise lives here — certain shifts, certain - bays get shorter inspections. - 5. Post-shift (14:00-14:30) — files reports, updates maintenance log. Inspection - reports filed here: clean, complete, unremarkable. - 6. Off-duty (14:30-16:00) — home, or bar on card game nights (2x per week). - 7. Night — home, worrying about the debt, not sleeping well. - -information: - knows: - - "location.surveillance_gaps" - - "world.shift_schedule" - access_tier: "public" - -contentment: - level: -4 - description: > - Very low, trapped. Drin remembers when the job was just maintenance — fixing - things, inspecting things, filing reports that reflected what he actually saw. - The gambling was supposed to be social. Now every inspection is a moral - compromise he cannot talk about. Going through the motions of a life that - stopped working months ago. He has not adjusted; he is just enduring. - -personality: - demeanor: "quiet, withdrawn, procedural" - social_style: "avoidant, does not volunteer information, does not seek attention" - stress_response: "silence, shorter responses, fewer interactions — shrinks social footprint" - humor: "absent — humor requires comfort Drin no longer has" - -tells: - - trigger: "Harek on-site at the hub or arriving at the bar" - behavior: "Adjusts path to avoid casual contact with Harek." - visible_to: "any" - - trigger: "compromised inspections — certain bays, certain shifts" - behavior: "Clears bays measurably faster than baseline inspection rate." - visible_to: "forward" - - trigger: "shifts that include compromised inspections" - behavior: "Takes more breaks — increased break frequency as stress response." - visible_to: "peripheral" - - trigger: "filing reports he knows are incomplete" - behavior: "Avoids eye contact with the person receiving the paperwork." - visible_to: "forward" - -skills: - combat_trained: false - skills: - maintenance: 8 - mechanical_diagnostics: 7 - dock_inspection: 7 - environmental_systems: 6 - -triangle_membership: - - "worried-knowledge" - - "informant-question" - -trust_levels: - surface: > - Professional minimum. Procedural responses about maintenance and inspections. - "Coupling on the Bay 4 loader is wearing. I'll flag it for replacement on the - next maintenance cycle." - real: > - The guilt and the calculation. Which containers to skip, which bays to clear - without looking. "I inspect what's on the schedule. I file what I find. That's - the job." - secret: > - Inspection schedule gaps — which bays, which shifts, which timing windows he - has been slow on. The full scope of his negligence. "My reports are filed. - They're complete. If there's a question about a specific bay, I can pull the - documentation." - -dual_lens: - smuggler: > - Drin is a tool — compromised and reliable because of it. The ring does not - interact with Drin directly; they do not need to. Harek's debt does the work. - As long as Drin stays quiet and slow on the right shifts, dock-side processing - runs clean. "Drin's on inspection today. We're good. He doesn't ask questions - and he doesn't open the wrong containers." - detective: > - Drin is a data point — his inspection reports are too clean for the volume of - freight he processes. A maintenance tech pulling double duty should have - equipment failures, missed checks, variance. Drin's are spotless. That - consistency in a high-throughput environment is itself an anomaly. "The - inspector — Drin. Maintenance tech pulling double duty. Reports are spotless. - Nobody's reports are that spotless." - -notes: > - SYSTEM + TURNCOAT: institutional rot. The inspection system is broken because the - inspector is broken. Drin embodies the institution (SYSTEM) and has betrayed it - (TURNCOAT), meaning the legitimate oversight mechanism and the criminal - exploitation of it exist in the same person. - - Key authoring guidance: Drin is passive, not malicious. His turncoat status came - through debt and avoidance, not ideology. Write him as a man enduring a daily - moral compromise — quiet, methodical, shrinking. The irony is that his methodical - nature makes the compromised inspections more visible by contrast. - - Triangle dynamics: In worried-knowledge (Maret-Drin-Voss), Drin is the - compromised inspector. In informant-question (Pell-Renn-Drin), Drin is the - institutional contact who is already compromised — the person Pell might turn - to for protection is already under the ring's indirect control. diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/harek.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/harek.yaml deleted file mode 100644 index 7540684bf..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/harek.yaml +++ /dev/null @@ -1,149 +0,0 @@ -# NPC Profile: Harek Valde -# Source: wiki/characters/harek.md -# Tier 2 | ANCHOR + HANDLER | Station Security officer, bar regular - -canonical_id: "npc:harek" -display_name: "Harek Valde" -tier: 2 -pattern: "ANCHOR" -motivation: "HANDLER" - -description: > - Station Security officer, 44 years old. Predictable schedule, card games at the - bar after shift, enough social capital to be respected without being scrutinized. - Harek holds Drin's gambling debt — a significant sum that creates a power dynamic - the ring has noticed and exploited. Harek hasn't explicitly traded the debt for - inspection negligence, but the debt's existence is a tool others are using. A - security officer who sees more than he admits but has chosen not to look deeper - because investigating would mean confronting what the card game created. - -want: - primary: "Happiness" - intensity: 4 - description: > - Maintain his comfortable position. - Harek has a good thing: security officer with a predictable schedule, card games - at the bar, social capital. He doesn't want promotions (more responsibility, more - visibility). He doesn't want trouble. Secondary want: keep Drin's debt - leverageable. A dock inspector who owes him favors is useful. Harek hasn't - explicitly traded debt for negligence, but the dynamic exists and the ring - benefits from it. - -secret: > - Harek knows (or suspects) that Drin's inspection negligence is being leveraged by - someone else. He sees the dynamic: Drin owes him, Drin looks away during - inspections, the ring benefits. Harek hasn't connected all the dots, but he - understands that his card game created a tool that others are using. Vulnerability: - complicity by inaction — a security officer who notices a dock inspector being - leveraged and doesn't report it is, at minimum, negligent. If investigated, - Harek's position crumbles. - -relationships: - - target: "npc:drin" - kind: "friend" - trust: 5 - notes: "Card game partner, debtor. Harek likes Drin personally — years of playing cards together. The debt complicates this, but Harek doesn't see himself as a predator." - - target: "npc:lera-sessik" - kind: "colleague" - trust: 5 - notes: "Bar owner. Professional familiarity. Harek's card games bring customers; Lera facilitates. Mutually beneficial." - - target: "npc:torek-lintar" - kind: "colleague" - trust: 3 - notes: "Card game regular. Harek has noticed Torek's spending but doesn't flag it — Torek's money at the card table is entertainment." - -tolerance: - threshold: 7 - description: > - Moderate-high. Comfortable and complacent. Tolerates a lot because engagement - is effort. What breaks his tolerance: direct institutional pressure (Commission - or Security command asking about Drin), or violence in the bar (takes safety - seriously even when loose on contraband). - -routine: - summary: > - 4 routine entries covering full day cycle: - 1. Security patrol (06:00-14:00) — hub perimeter and freight bay access points. - 2. Shift transition (14:00-14:30). - 3. Bar hours (14:30-20:00, The Last Shift) — drinks and card games, 2-3 times - per week. - 4. Home (20:00+). - -information: - knows: - - "location.surveillance_gaps" - - "world.shift_schedule" - - "world.sova_district_layout" - - "relationship.trust_network" - access_tier: "authority" - -contentment: - level: 5 - description: > - Moderate-high. The quintessential "comfortable enough not to rock the boat." - Stable job, social standing, entertainment, and just enough willful ignorance - to keep his conscience manageable. - -personality: - demeanor: "complacent, sociable, perceptive beneath the surface" - social_style: "card games, bar conversation, community presence — enjoys being known" - stress_response: "deflects, steers conversation, avoids engagement with uncomfortable topics" - humor: "dry, card-table humor — comfortable enough to joke, smart enough to listen" - -tells: - - trigger: "Drin is stressed or evasive" - behavior: "Watches Drin more carefully — monitors his investment, attention sharpens at the card table" - visible_to: "peripheral" - - trigger: "someone asks about hub access or patrol gaps" - behavior: "Steers conversation away from security topics — deflection through subject change or vague institutional answers" - visible_to: "forward" - - trigger: "card game in session" - behavior: "Uses card games as social intelligence gathering — invitations are reconnaissance wrapped in entertainment" - visible_to: "peripheral" - -skills: - combat_trained: true - skills: - security_patrol: 7 - observation: 7 - access_control: 6 - deescalation: 5 - card_games: 6 - -trust_levels: - surface: > - Off-duty security officer. Card games and drinks. "Hub security's solid. Standard - patrols, standard protocols. Nothing unusual. You want specifics, talk to my - supervisor — I just walk the route." - real: > - Knows patrol routes, Meridian coverage gaps, which areas have blind spots. Knows - Drin's debt and behavioral changes. Knows Torek's spending. Bar social dynamics - insider. Sees more than he admits — his training doesn't turn off even when his - ethics do. - secret: > - Understands that Drin's negligence is being leveraged by someone above. Has chosen - not to investigate because confronting it would mean confronting what his card - game created. - -dual_lens: - smuggler: > - Known quantity — off-duty security who doesn't look too hard. The smuggler reads - Harek's card games as harmless social activity and his complacency as a feature. - "Harek's at the bar. Security badge off, drink in hand. As long as he stays that - way, we're fine." - detective: > - Security officer who socializes with the people he should be monitoring. Card - games create financial relationships that could be leverage vectors. His patrol - routes mean he knows hub access patterns. Either an asset (could provide patrol - gap data) or a problem (if actively complicit). "Station Security — Harek. Off-duty - but the training doesn't turn off. He sees the same things I'd see. The question - is what he does with it." - -notes: > - ANCHOR + HANDLER: the unconscious lever. "Harek doesn't know his card games built - a weapon." Complacent contentment (ANCHOR) generated a tool of coercion (HANDLER) - without deliberate intent. He didn't set out to compromise Drin — he won card - games, extended credit, and maintained a social dynamic that produced leverage. - The ring noticed and exploited the result. Bridges bar (social presence, card - games) and hub (security authority, patrol knowledge). Not a formal triangle - member but serves as external pressure on Drin in Triangle 2 (worried-knowledge). diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/kael-davan.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/kael-davan.yaml deleted file mode 100644 index 35c57edfd..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/kael-davan.yaml +++ /dev/null @@ -1,269 +0,0 @@ -# NPC Profile: Kael Davan — THE FRIEND (Smuggler) -# Source: wiki/characters/kael-davan.md -# Tier: 1 | Pattern: FRIEND | Motivation: OPERATOR -# Triangles: hub-power, worried-partner - -canonical_id: "npc:kael-davan" -display_name: "Kael Davan" -tier: 1 -pattern: "FRIEND" -motivation: "OPERATOR" - -description: > - Dock worker, Sova Transit District Logistics Hub. 34 years old, born on - Station Sova. Ring member who handles physical cargo — routing flagged - containers, managing dock-side handoffs. Closest colleague to the smuggler: - two years of shared risk, first-name basis, lunch together every shift. Kael - is warm, reliable, protective. He is also secretly trying to exit the ring - through an unauthorized contact, because Naia's worry has become unbearable. - The smuggler trusts Kael completely, which makes the betrayal worse when the - contradiction surfaces. - -want: - primary: "Safety" - intensity: 8 - description: > - Protect the operation and the people in it. - Two years in, Kael is shifting from "keep things running" to "keep people - safe." The operation is escalating — higher volume, tighter margins, more - risk. Secondary want: protect Naia from the truth and the consequences. - Naia doesn't know about the smuggling. Kael's late nights and evasive - answers are creating anxiety at home. The shielding itself is the danger. - -secret: > - Ring member who handles cargo routing for the smuggling operation during - shift transitions. Deep secret: Kael is trying to exit the ring. Naia's - worry has become unbearable. He contacted someone from a different district - — not Sabel, not anyone the ring knows — who offered to help him get out, - for a price. The unknown contact is leverage, extraction support, and a - massive security breach. If Nils finds out, Kael is out — violently. If the - smuggler finds out, trust collapses. If the detective finds out, Kael is the - perfect informant. - -relationships: - - target: "npc:nils-davan" - kind: "family" - trust: 6 - notes: > - Older sibling, ring coordinator. Brought Kael into the ring. Blood - loyalty complicated by power dynamic. Nils is pushing for higher volume; - Kael thinks it's too fast, too risky. - - target: "npc:naia-tamm" - kind: "romantic" - trust: 9 - notes: > - Partner, teacher, civilian. 6 years together. Emotional anchor and - vulnerability. Naia knows something's wrong but doesn't know about the - ring. Kael is oblivious to how much anxiety he's causing. - - target: "npc:pc-smuggler" - kind: "friend" - trust: 8 - notes: > - Close colleague, trusted friend, shared risk. Work together on - legitimate shifts AND ring operations. Cover for each other. Lunch, - drinks at Lera's, easy camaraderie. Kael is lying to the smuggler about - the exit attempt. - - target: "npc:voss" - kind: "superior" - trust: 3 - notes: > - Shift supervisor, ring-aware. Professional respect, low warmth. Voss - provides scheduling cover for the ring. Kael is caught between Voss and - Nils. - - target: "npc:renn" - kind: "colleague" - trust: 5 - notes: > - Courier, ring member. Operational relationship. Kael works with Renn on - logistics handoffs. - - target: "npc:devra" - kind: "colleague" - trust: 4 - notes: > - External contacts manager for the ring. Kael knows Devra coordinates - off-station connections but keeps operational distance. - - target: "npc:resha" - kind: "colleague" - trust: 5 - notes: > - Ring associate. Professional working relationship, mutual trust within - operational bounds. - -tolerance: - threshold: 5 - description: > - Moderate — can handle pressure but has limits. Tolerates routine smuggling - operations, Voss's resentment, Nils's demands, and lying to Naia. Pushed - toward breaking by escalating volume, Naia's increasing worry, and the - detective's investigation. Breaks on direct threat to Naia (flips - immediately) or Nils discovering the exit attempt (runs or fights, no - middle ground). - -routine: - summary: > - 8 routine entries covering full day cycle. Morning arrival (06:00-06:30, - Logistics Hub) for shift startup. Morning shift (06:30-10:30, dock floor) - for freight handling. Break (10:30-11:00, break room) lunch with smuggler - or other dock workers. Afternoon shift (11:00-14:00, dock floor) container - routing and schedule coordination. Shift end (14:00-14:30) sometimes - lingers for overtime — ring operations during transition window. Off-shift - (14:30-16:00) heads home or to The Last Shift. Home (16:00-22:00) with - Naia, or occasional ring coordination in Corridor B-7. Late-night - operations (22:00+) ring work 1-2x per week during night shift transition. - -information: - knows: - - "contraband.ring_exists" - - "contraband.lattice_components" - - "contraband.supply_chain" - - "location.corridor_b7_restricted" - - "location.smuggling_route" - - "location.surveillance_gaps" - - "location.dead_drop_location" - - "investigation.manifest_discrepancy" - - "investigation.shift_mismatch" - - "investigation.cargo_anomaly" - - "relationship.ring_membership" - - "relationship.kael_naia_connection" - - "relationship.trust_network" - - "world.shift_schedule" - - "world.sova_district_layout" - access_tier: "insider" - -contentment: - level: -1 - description: > - Moderate-low, declining. The smuggling pays well and the team is solid, - but guilt about lying to Naia is corrosive. Escalating volume makes every - shift feel riskier. Two years ago contentment was moderate — operation - stable, Naia didn't suspect. Now low and falling. The exit attempt is a - desperate grab for a future that doesn't involve looking over his shoulder. - -personality: - demeanor: "warm to people he trusts, evasive when hiding something, direct and practical" - social_style: "first-name basis with everyone, relational, physically present, short sentences" - stress_response: "goes quiet, checks exits, shortens interactions, lattice checking increases" - humor: "dry, situational, doesn't waste words or dramatize" - -tells: - - trigger: "expecting contact from exit coordinator (periodic throughout day)" - behavior: > - Increased lattice checking — reaches for lattice more often than usual, - brief distracted pauses mid-conversation - visible_to: "peripheral" - - trigger: "prolonged conversation where lies might surface" - behavior: > - Shortened social interactions — excuses himself early from lunch, cuts - conversations short with forced casualness - visible_to: "any" - - trigger: "lying or deflecting a direct question" - behavior: > - Looks left before answering. Personal tell the smuggler knows from years - of friendship — the moment the smuggler recognizes this is the moment - trust fractures - visible_to: "forward" - - trigger: "meeting unknown contact in Corridor B-7 (off-routine, restricted area)" - behavior: > - Unauthorized spatial presence — in restricted maintenance corridor at - irregular time, talking to unrecognized person outside ring protocol - visible_to: "any" - -skills: - combat_trained: false - skills: - cargo_handling: 8 - logistics: 7 - social: 6 - -triangle_membership: - - "hub-power" - - "worried-partner" - -trust_levels: - surface: > - Polite, standard dock worker responses. "Shift's looking smooth today. - Freight's on schedule, no surprises. Let's keep it that way." - real: > - Only accessible to ring insiders. Operational talk, container routing, - timing windows. "Container 4471 is flagged. I'll reroute it during shift - transition." Matter-of-fact, no drama. - secret: > - The exit attempt. Never accessible through normal play. Kael's - unauthorized contact, Naia's role as motivation, the desperation to get - out before consequences reach his partner. - -friend_arc: - bonded_character: "smuggler" - phases: - - phase: 1 - description: > - Comfort. Kael is warm, reliable, present. Greets the smuggler with - genuine affection. Talks about shift schedules, complains about Voss, - asks about the smuggler's weekend. The day is better when Kael is on - shift. - trigger: "Game start, first interactions (0-10 minutes)" - routine_deviation: "None — baseline normal. Kael is punctual, sociable, engaged." - - phase: 2 - description: > - First Crack. Kael checks lattice more often than usual. Excuses - himself from lunch early. Shortened social interactions — still warm, - but deflects prolonged conversation. The smuggler notices the - distraction. - trigger: "10-15 minutes into session. Behavioral flags begin accumulating." - routine_deviation: "Increased lattice checking. Leaves break room early. Distracted during casual talk." - - phase: 3 - description: > - The Observation. The smuggler sees Kael in Corridor B-7 — restricted - maintenance corridor — talking to an unknown person. The person leaves - before the smuggler gets close. Prior belief that Kael operates within - ring protocol is contradicted. Color shifts from green to amber. - trigger: "15-20 minutes. Smuggler enters Corridor B-7 and directly observes unauthorized meeting." - routine_deviation: "Presence in restricted area at irregular time. Meeting with unrecognized contact outside ring protocol." - - phase: 4 - description: > - Confrontation Opportunity. The smuggler can ask Kael about the - meeting. Kael deflects — "Just a thing. Don't worry about it." Looks - left before answering — the tell. The smuggler recognizes the lie - from years of friendship. - trigger: "20-25 minutes. Smuggler initiates dialogue about the Corridor B-7 observation." - routine_deviation: "Kael becomes evasive, forces subject changes, displays forced casualness. The looks-left tell confirms the lie." - - phase: 5 - description: > - New Equilibrium. Kael acts normal again — same shifts, same greetings, - same surface warmth. But the smuggler is now watching. Every smile is - filtered through doubt. Three dialogue paths open: understanding - (gentle confrontation, possible confession), betrayal (report to - Nils), or observation (watch and wait). Contaminated trust. - trigger: "25-30 minutes. Post-confrontation, remainder of vertical slice." - routine_deviation: "Surface behavior returns to baseline, but trust is structurally damaged. Player chooses path." - -dual_lens: - smuggler: > - Access tier: Insider + Peer. Relationship shifts from Friendly to - PersonOfInterest post-contradiction. Monologue tone moves from fond and - casual ("Kael's here. Good — always reliable.") to conflicted and - analytical ("Kael's lying to me. I know his tells. What are you hiding?"). - The smuggler knows Kael's personal tell, knows the relationship with - Naia. The unauthorized meeting is a betrayal of operational security, not - just suspicious behavior. Emotional weight: maximum. Color shift from - green to amber is the moment trust is compromised. - detective: > - Access tier: Public to Authority if investigation escalates. Relationship - moves from Unknown to Known to PersonOfInterest if tells accumulate. - Monologue tone shifts from clinical ("Dock worker. Davan, K. Unremarkable - on paper.") to analytical suspicion ("Davan's nervous. Lattice activity - spiked. Behavioral pattern suggests concealment."). The detective may - discover manifest discrepancies tied to Kael's shifts. Kael as a pressure - point: partner at risk, potential informant. - -notes: > - Tier 1 FRIEND NPC, bonded to smuggler. THE FRIEND pattern means Kael's - betrayal — or the smuggler's betrayal of Kael — carries maximum emotional - weight. FRIEND + OPERATOR composition: "I was your friend AND your - co-conspirator." The warmth was real. The operational reliability was real. - The secret exit attempt violates both. Voice: direct, practical, short - sentences. Uses first names. The tell (looks left when lying) must be - established early so the smuggler recognizes it during contradiction. Naia - references in casual conversation establish the relationship before it - becomes load-bearing. Ring operations dialogue is matter-of-fact, no drama. - Deflection post-contradiction uses redirection, not outright lies. diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/lera-sessik.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/lera-sessik.yaml deleted file mode 100644 index 7e8aede39..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/lera-sessik.yaml +++ /dev/null @@ -1,160 +0,0 @@ -# NPC Profile: Lera Sessik -# Source: wiki/characters/lera-sessik.md -# Tier 2 | ANCHOR + OPERATOR | Bar owner, The Last Shift - -canonical_id: "npc:lera-sessik" -display_name: "Lera Sessik" -tier: 2 -pattern: "ANCHOR" -motivation: "OPERATOR" - -description: > - Owner and primary bartender of The Last Shift, the transit district's social hub. - Eighteen years behind the same counter. Lera knows everyone, sees everything, and - shares nothing voluntarily. Her regulars are her community and she protects them - reflexively — including ring members, not because she is complicit but because they - are also regulars. Willful ignorance is not moral failure for Lera; it is business - survival. The bar operates on thin margins and the grey-market spending keeps her - solvent. - -want: - primary: "Wealth" - intensity: 7 - description: > - Keep the bar viable. - The Last Shift operates on thin margins. The after-shift crowd is what keeps - the lights on. Lera knows some regulars have grey-market income — she does not - ask where the money comes from because the spending keeps her solvent. Secondary - want: protect her regulars. Eighteen years of watching people come and go. She - warns them when unfamiliar faces show up, signals when conversations are being - overheard, remembers who does not want to see whom. - -secret: > - Knows the back room of the bar is used for ring coordination meetings. Has not - asked what happens there. The arrangement is simple: they pay for the space, they - buy drinks, they do not cause trouble. Lera does not have conspiracy-level secrets. - What she has is accumulated knowledge from 18 years of bartending — fragments of - conversations, behavioral patterns, relationship dynamics. She knows more about - the district's social fabric than anyone. Her value is that she does not talk about - it. Vulnerability: the bar itself. Threaten to shut down The Last Shift and Lera - cooperates with whoever is doing the threatening. She has no fallback. - -relationships: - - target: "npc:torek-lintar" - kind: "friend" - trust: 5 - notes: "Bar regular and one of her best customers. Appreciates the spending, worries about the attention it draws. Protective but concerned." - - target: "npc:harek" - kind: "colleague" - trust: 4 - notes: "Off-duty security officer, bar regular. Professional familiarity. Tolerates Harek's card games because they bring in customers." - - target: "npc:sera-venn" - kind: "friend" - trust: 5 - notes: "Bar regular. Quiet, polite, tips consistently, does not cause trouble. Commission employee who does not act like Commission." - - target: "npc:pc-smuggler" - kind: "friend" - trust: 7 - notes: "Regular at The Last Shift. Lera saves the smuggler's usual seat. Ring-aware but protective." - - target: "npc:olin" - kind: "colleague" - trust: 2 - notes: "New arrival. Lera is watching Olin — unfamiliar face asking questions. Professional caution." - - target: "npc:devra" - kind: "colleague" - trust: 4 - notes: "Bar regular and supply broker. Uses the back room. Lera knows Devra uses the room but does not know for what." - -tolerance: - threshold: 8 - description: > - High. Nearly two decades of bartending. Tolerates drunks, arguments, gossip, - and grey-market activity with professional detachment. What breaks her tolerance: - violence in the bar (zero tolerance, immediate ejection), institutional pressure - on her business, or a direct threat to a regular she cares about. - -routine: - summary: > - 5 routine entries covering full day cycle: - 1. Bar prep (10:00-12:00) — inventory, cleaning, restocking. - 2. Quiet hours (12:00-14:00) — a few early regulars, food prep. - 3. Peak hours (14:00-22:00) — shift transition crowd, evening regulars, card - games. Primary social observation window. - 4. Late crowd (22:00-02:00) — smaller, quieter. Ring coordination sometimes uses - back room. - 5. Close (02:00-03:00) — clean, home. - -information: - knows: - - "world.sova_district_layout" - - "relationship.trust_network" - - "relationship.faction_allegiance" - access_tier: "public" - -contentment: - level: 3 - description: > - Moderate. The bar is viable. Her regulars are loyal. The work is hard but - familiar. Lera's contentment is functional — not thriving, not miserable. The - smuggling economy keeps her bar profitable. If that economy is disrupted, her - contentment drops sharply. - -personality: - demeanor: "warm with regulars, guarded with strangers, professional always" - social_style: "observant listener, speaks selectively, remembers everything" - stress_response: "cleans glasses, redirects conversations, watches the door" - -tells: - - trigger: "unfamiliar authority enters the bar, or a table conversation gets too loud" - behavior: "Cleans glasses with increased focus — hands stay busy, attention shifts to the source of concern" - visible_to: "any" - - trigger: "a regular is about to say something incriminating near an outsider" - behavior: "Redirects conversation — offers a refill, asks a question, changes the subject smoothly" - visible_to: "peripheral" - - trigger: "someone she considers a risk is due to arrive, or the back room is in use" - behavior: "Watches the door — gaze returns to the entrance at intervals, positioning shifts to maintain line of sight" - visible_to: "forward" - -skills: - combat_trained: false - skills: - bar_management: 9 - social_intelligence: 9 - conflict_deescalation: 7 - customer_service: 8 - -triangle_membership: - - "bar-tensions" - -trust_levels: - surface: > - Welcoming bartender. Serves drinks, makes small talk, remembers orders. "I serve - drinks. People talk. I don't take notes. You want information, try the Commission - kiosk on Level 3." - real: > - Social gatekeeper. Knows who drinks with whom, who avoids whom, who is spending - beyond their means, who is worried. Signals regulars when outsiders ask questions. - Protects the community reflexively. - secret: > - The back room is used for ring meetings. Lera has not attended. She knows the - arrangement exists and maintains it because it pays. Threaten the bar's license - and Lera will cooperate — the bar is her only fallback. - -dual_lens: - smuggler: > - Lera is infrastructure — the bar is a social hub, a meeting point, a place to - read the district's mood. The smuggler trusts Lera to protect the community - without being told to. "Lera's watching the door. Something's up. I'll ask later." - detective: > - Lera is the gatekeeper. She knows everyone and shares nothing voluntarily. The - detective can build rapport or apply pressure on the bar license. Either approach - takes time. "The bartender — Sessik. Runs this place. She sees everything. Getting - her to talk will take patience or leverage." - -notes: > - ANCHOR + OPERATOR: profitable blindness. "Is this enough? Yes — if I don't look." - Lera's contentment is sustained by operational competence — she runs the bar well - enough that the moral compromises stay manageable. The willful ignorance is active - maintenance, not laziness. Key authoring guidance: Lera is not a conspirator. She - is a small business owner in a grey economy. Write her warmth as genuine, her - protectiveness as reflexive, and her silence as a survival strategy. diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/maret-korr.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/maret-korr.yaml deleted file mode 100644 index d39d4b7b5..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/maret-korr.yaml +++ /dev/null @@ -1,167 +0,0 @@ -# NPC Profile: Maret Korr -# Source: wiki/characters/maret-korr.md -# Tier 2 | SYSTEM + SKEPTIC | Logistics Hub freight scheduler -# NOTE: Wiki uses pattern "WITNESS" but schema pattern enum doesn't include WITNESS. -# WITNESS is a motivation value (System B). Mapped to SYSTEM (System A) — Maret -# functions within institutional processes; her witnessing is through systematic work. -# Flag for design review: should schema add WITNESS to pattern enum? - -canonical_id: "npc:maret-korr" -display_name: "Maret Korr" -tier: 2 -pattern: "SYSTEM" -motivation: "SKEPTIC" - -description: > - Freight scheduler at the Sova Transit District Logistics Hub. Age 41, meticulous, - anxious. Reconciles incoming manifests with cargo bay allocations, shift assignments, - and gate transit logs. The numbers are not adding up — container counts do not match - gate logs, certain bays have manifests revised after the fact, and shifts supervised - by Voss have more discrepancies than others. Maret does not know what this means, - but she knows it means something. She has started keeping a private discrepancy log - on her personal lattice storage. - -want: - primary: "Knowledge" - intensity: 7 - description: > - Understand the manifest discrepancies. - Maret processes freight schedules and the numbers are not adding up. Container - counts do not reconcile, manifests are revised after Voss's schedule adjustments, - Drin's inspection reports are suspiciously clean. She is paralyzed between duty - and self-preservation — she has not reported because she does not know whom to - report to. The Commission kiosk is unmanned, station security handles accidents - not contraband, and going to Voss feels dangerous. - -secret: > - Maret has noticed manifest discrepancies and has started keeping a personal log of - them on her private lattice storage. If discovered, this log is either evidence for - the detective or a threat to the ring. She has mentioned the discrepancies to no - one, but her increased attention to certain records is potentially observable. - Knowledge without protection — she has no institutional backing, no allies in the - conflict, and no exit strategy. - -relationships: - - target: "npc:voss" - kind: "superior" - trust: 2 - notes: "Shift supervisor. Professional respect but growing unease. Maret has noticed the correlation between his schedule adjustments and manifest discrepancies. She has not confronted him — afraid of what the answer would be." - - target: "npc:drin" - kind: "colleague" - trust: 3 - notes: "Dock inspector. Maret knows Drin gambles at the bar. She has observed that inspection reports from Drin's shifts are consistently clean — too clean for the volume. Another data point filed and not acted on." - - target: "npc:resha" - kind: "colleague" - trust: 5 - notes: "New hire. Maret is protective of Resha in a quiet, professional way — proper training, not overloaded. Resha's questions about locked bays and irregular schedules echo Maret's own unspoken concerns." - - target: "npc:naia-tamm" - kind: "friend" - trust: 5 - notes: "Occasional social contact. Maret sometimes visits the bar for Naia's company. One of the few relationships that is not work-adjacent anxiety." - -tolerance: - threshold: 4 - description: > - Low-moderate. Maret is not built for confrontation. She handles data, not people. - The discrepancies are eating at her, but she has tolerated them for weeks because - action feels more dangerous than silence. What breaks her: the detective asking - the right question, or the ring discovering her private log. - -routine: - summary: > - 5 routine entries covering full day cycle: - 1. Day shift (06:00-14:00) — freight scheduling, manifest reconciliation, bay - allocation. - 2. Break (10:30-11:00, break room) — eats alone or with Resha. Avoids Voss - during breaks. - 3. Post-shift (14:00-15:00) — reviews next day's gate schedule. - 4. Off-duty (15:00-17:00) — home or occasional bar visit for Naia's company. - 5. After hours — reviews private discrepancy log. Adds entries. Worries. - -information: - knows: - - "investigation.manifest_discrepancy" - - "world.shift_schedule" - access_tier: "public" - -contentment: - level: -2 - description: > - Low, anxious. Maret was content before the discrepancies became impossible to - ignore. She finds peace in orderly systems and the manifest irregularities have - disrupted that peace. She sleeps poorly, double-checks everything. Anxiety held - in check by routine. - -personality: - demeanor: "meticulous, tense, quietly worried" - social_style: "reserved, professional, gravitates toward data over people" - stress_response: "retreats into detail work, rechecks records, reduces social interaction" - humor: "rare — occasionally dry when relaxed, absent when stressed" - -tells: - - trigger: "reviewing manifest data during shift" - behavior: "Checks the same records multiple times, cross-references gate logs she does not normally access." - visible_to: "peripheral" - - trigger: "break periods" - behavior: "Avoids Voss. Eats alone more often. Social withdrawal as stress response." - visible_to: "any" - - trigger: "Resha asks about schedule irregularities" - behavior: "Goes quiet, redirects the conversation to procedure. Brief eye contact avoidance." - visible_to: "forward" - -skills: - combat_trained: false - skills: - freight_scheduling: 8 - manifest_reconciliation: 9 - data_analysis: 7 - logistics_coordination: 6 - -triangle_membership: - - "worried-knowledge" - -trust_levels: - surface: > - Professional freight scheduler. Gives clean, data-oriented answers. Defers to - Voss on scheduling questions. "Bay 3 allocation looks clean for the morning - cycle. I've reconciled the gate logs." - real: > - Has noticed manifest discrepancies she cannot explain. Keeps a private log. - Suspects Voss is involved but has no proof. Afraid to act but unable to stop - looking. "I just process the schedules. If there's a question about manifest - revisions, that's Voss's authorization." - secret: > - Would share the discrepancy data with someone she trusts — if someone asked the - right question. "There are patterns. In the data. If someone wanted to look at - Bay 7 allocations during Voss's shift adjustments, the numbers would be worth - comparing." - -dual_lens: - smuggler: > - Maret is a risk. She processes the paperwork the ring's operations depend on - and she is too smart not to notice. The smuggler reads Maret's anxiety as a - threat — someone who knows too much and might talk. "Maret's been quiet. - She's usually all numbers and schedules. When she gets quiet, she's thinking. - That's not good." - detective: > - Maret is a potential cooperative witness. She has the data, the context, and - the anxiety that suggests she has seen something she should not have. The - detective's task is building enough trust that Maret shares what she knows. - "The freight scheduler — Korr. Meticulous. Anxious. She processes the - manifests. If there are irregularities in the paperwork, she's seen them." - -notes: > - WITNESS + SKEPTIC: dangerous knowledge. She saw something and she cannot stop - questioning it. Maret did not choose to witness the discrepancies — her job put - the data in front of her. But her response is systematic doubt, not passive - acceptance. She is gathering evidence not because anyone asked her to, but - because her meticulous nature will not let her stop. - - Key authoring guidance: Maret is the cooperative witness who has already done - half the detective's work. For the smuggler, Maret is the threat you cannot - neutralize without revealing why the numbers matter. Write her as competent - and trapped — the anxiety is real but the intelligence underneath it is sharp. - - Triangle dynamics: In worried-knowledge (Maret-Drin-Voss), Maret sees the data. - She processes manifests and has noticed discrepancies she cannot explain and - cannot ignore. diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/naia-tamm.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/naia-tamm.yaml deleted file mode 100644 index 2075e46a5..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/naia-tamm.yaml +++ /dev/null @@ -1,143 +0,0 @@ -# NPC Profile: Naia Tamm -# Source: wiki/characters/naia-tamm.md -# Tier 2 | MIRROR + CIVILIAN | Teacher, Kael's partner - -canonical_id: "npc:naia-tamm" -display_name: "Naia Tamm" -tier: 2 -pattern: "MIRROR" -motivation: "CIVILIAN" - -description: > - Teacher at Station Sova community school, Residential Radial A. Partner of - Kael Davan for 6 years. Relocated from Krenn Prime surface 8 years ago. - Naia is the emotional center of the worried-partner triangle — a civilian - whose transparency makes the concealment around her more painful. She is - exactly what she appears to be: a teacher worried about her partner. - -want: - primary: "Knowledge" - intensity: 8 - description: > - Understand what is happening with Kael. - Naia and Kael have been together 6 years. It was good — stable, warm, - predictable. Then Kael started coming home late. Evasive answers. Money - that did not match the hours. Stress that Kael will not explain. Naia does - not know about the ring. She knows the person she shares a life with is - hiding something, and the not-knowing is worse than almost any truth. - Secondary want: protect the life they have built — the home, the - relationship, the stability that took years to build. - -secret: > - Naia confided in Sera Venn about Kael's behavioral changes — late nights, - evasive answers, unexplained stress. This is the action that set Sera's - compliance check in motion, though Naia does not know that. Naia shared a - personal worry with a trusted friend. That trusted friend had institutional - access. Naia's worry is genuine, visible, and exploitable. - -relationships: - - target: "npc:kael-davan" - kind: "romantic" - trust: 9 - notes: "Partner, 6 years. Deep love, growing anxiety. Does not question Kael's character — just Kael's honesty." - - target: "npc:sera-venn" - kind: "friend" - trust: 7 - notes: "Close friend, 10 months. Met at the bar after Sera transferred. Trusts Sera for perspective without gossip." - - target: "npc:lera-sessik" - kind: "friend" - trust: 4 - notes: "Bar acquaintance. Lera is warm to Naia — protective attention a good bartender gives to someone visibly struggling." - -tolerance: - threshold: 5 - description: > - Moderate. Patient — teaching station kids requires it. But the patience is - fraying. Every evasive answer from Kael, every late night, every 'it is just - work' chips at Naia's tolerance. If pushed to breaking point, Naia confronts - Kael directly — which could trigger Kael's crisis, force Sera's hand, or - give the detective an opening. - -routine: - summary: > - 5 routine entries covering full day cycle: - 1. Teaching (07:00-15:00, community school, Residential Radial A). - 2. Commute (15:00-15:30) — returns to Transit District. - 3. Bar social (15:30-17:30, The Last Shift) — meets Sera, decompresses. - 4. Home evening (17:30-22:00) — waits for Kael. Sometimes there, sometimes not. - 5. Late evening — alone in the apartment, wondering where Kael is. - -information: - knows: - - "relationship.kael_naia_connection" - access_tier: "public" - -contentment: - level: -2 - description: > - Low and declining. Naia was content: stable job, loving partner, community. - Now the relationship anxiety is coloring everything. Teaching is harder when - distracted. Bar visits are tinged with worry. Home is where the absence - lives. Contentment trajectory mirrors Kael's — both declining, for connected - but different reasons. - -personality: - demeanor: "warm, open, visibly stressed" - social_style: "emotionally present, confides in close friends, reads people well" - stress_response: "worry overflows into conversation, increased bar presence, avoids the empty apartment" - -tells: - - trigger: "baseline state — tired, distracted" - behavior: "Tired eyes, distracted conversation, checking lattice for messages from Kael" - visible_to: "any" - - trigger: "worry overflowing into conversation" - behavior: "Mentions Kael unprompted — 'Kael was late again' or 'I don't know what's going on at the hub'" - visible_to: "peripheral" - - trigger: "coping with anxiety" - behavior: "Coming to the bar more often and staying longer — avoiding the empty apartment" - visible_to: "any" - -skills: - combat_trained: false - skills: - teaching: 8 - community_engagement: 7 - emotional_perception: 6 - curriculum_management: 5 - -triangle_membership: - - "worried-partner" - -trust_levels: - surface: > - Warm, open. Standard social interaction — talks about teaching, the kids, - the school. "The kids are doing better with the new math curriculum." - real: > - Confides worry about Kael to close friends. Visible stress. "Kael was home - at midnight again. Said it was overtime. There's no overtime posted for this - week — I checked." - secret: > - The depth of her fear and the specific details she shared with Sera about - Kael's behavioral changes. The breaking point. "I'm not asking for much. - Just — tell me the truth. Whatever it is." - -dual_lens: - smuggler: > - Naia is emotional collateral. The smuggler knows why Kael is busy and cannot - say. Seeing Naia's worry creates guilt — especially if the smuggler is - Kael's friend. "Naia's at the bar again. Alone. Looking at the door every - time it opens. I know where Kael is. I can't say." - detective: > - Naia is a potential source. A partner who suspects their loved one is hiding - something is a classic entry point for investigation. The detective can - cultivate Naia's trust by being sympathetic. "The partner — Naia Tamm. - Teacher. Visibly stressed. If Davan is involved, this partner knows something - changed, even if they don't know what." - -notes: > - MIRROR + CIVILIAN creates honest transparency surrounded by liars: "The one - person not lying — surrounded by liars." Naia's reflective honesty combined - with complete uninvolvement means she is the emotional baseline against which - all deception is measured. When events drag Naia into the conspiracy through - Kael's ring involvement and Sera's concealment, the damage is devastating - because Naia was genuine. diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/nils-davan.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/nils-davan.yaml deleted file mode 100644 index 6a8cf600b..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/nils-davan.yaml +++ /dev/null @@ -1,105 +0,0 @@ -# NPC Profile: Nils Davan -# Source: wiki/characters/nils-davan.md -# Off-stage NPC — never physically present in v0.1, mediated through -# lattice messages, dialogue references, and operational pressure - -canonical_id: "npc:nils-davan" -display_name: "Nils Davan" -tier: 1 -pattern: "GHOST" -motivation: "HANDLER" - -description: > - Off-stage ring coordinator (~38). Nils does not appear physically in any v0.1 - scene. His presence is felt entirely through lattice messages to Kael, - references in NPC dialogue, and the operational pressure that cascades through - the ring. He is the escalation pressure source — pushing for higher volume, - tighter schedules, more throughput. Every ring member feels Nils's influence - without seeing him. Tier 1 in schema; functionally off-stage (tier 0). - -want: - primary: "Power" - description: > - Control. - Grow the operation. Increase volume. Maintain authority over the ring from - a distance. Nils sets volume targets, applies escalation pressure, and makes - personnel decisions. The ring's growth imperative comes from Nils; the - consequences fall on others. - -secret: > - Full ring coordinator. Sets strategic direction, personnel decisions, volume - targets. Operates through Devra (execution) and Kael (dock-side operations). - His identity is known only to Kael (sibling) and Devra (operational partner). - Voss knows "someone above Devra" exists but has never met Nils. - -relationships: - - target: "npc:kael-davan" - kind: "family" - trust: 7 - notes: > - Younger sibling. Nils recruited Kael into the ring personally. Genuine - familial bond complicated by power dynamic. Pushes Kael for higher volume. - Does not know Kael is trying to exit the ring. If Kael's exit attempt is - discovered, Nils is the primary threat — family loyalty vs. operational - security is undefined in v0.1 but implied to be dangerous. - - target: "npc:devra" - kind: "colleague" - trust: 6 - notes: > - On-station coordinator. Professional respect, operational partnership. - Nils gives strategic direction; Devra handles execution. They disagree - on risk tolerance — Devra favors steady volume, Nils pushes escalation. - Devra is Nils's primary on-station voice. - - target: "npc:voss" - kind: "superior" - trust: 2 - notes: > - Resource exploitation, no personal relationship. Nils exploits Voss's - schedule authority to create coverage windows. Voss resents the invisible - hand but complies — the money is good and refusing has consequences. - To Nils, Voss is functional and replaceable. - -routine: - summary: > - Not observable. Nils is never physically present in Sova Transit District. - His existence is mediated through lattice messages to Kael (5-8 authored - lines), references in NPC dialogue, and operational pressure cascading - through the ring hierarchy. - -information: - knows: - - "contraband.ring_exists" - - "contraband.ring_structure" - - "contraband.lattice_components" - - "contraband.supply_chain" - - "contraband.volume_targets" - - "relationship.ring_membership" - - "relationship.kael_sibling" - - "location.smuggling_route" - - "location.distribution_points" - access_tier: "authority" - -triangle_membership: - - "hub-power" - -dual_lens: - smuggler: > - Unseen boss. Known by reputation and felt through operational pressure. - The smuggler has never met Nils but follows orders relayed through Devra - and Kael. Nils is the authority that shapes every operational day. - detective: > - The name that surfaces late in the investigation. The coordinator behind - the coordinator — the authority that explains why everyone on-station is - afraid. Origin codes, lattice intercepts, and dialogue fragments point - upstream to someone the detective cannot reach within the vertical slice. - -notes: > - Off-stage authority figure. Never physically instantiated in v0.1. Entire - presence is mediated: lattice messages to Kael (operational instructions, - volume pressure, occasional familial notes), dialogue references from ring - members, and the escalation pressure that drives Triangle 1 (hub-power). - Nils's transmitted message serves as the plot device that forces the - volume escalation fork — his demand for higher throughput cascades through - Devra, Kael, and Voss, creating observable disruption. GHOST + HANDLER - creates absent authority: the ring's most dangerous decisions are made by - someone who never sees their consequences. diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/olin.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/olin.yaml deleted file mode 100644 index 94b142458..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/olin.yaml +++ /dev/null @@ -1,105 +0,0 @@ -# NPC Profile: Olin Tavren -# Source: wiki/characters/olin.md -# Tier 3 — reduced content, essential axes only - -canonical_id: "npc:olin" -display_name: "Olin Tavren" -tier: 3 -pattern: "CATALYST" -motivation: "CIVILIAN" - -description: > - Recent arrival in Sova Transit District — a drifter looking for freight work. - Story is plausible: contract work dried up elsewhere, heard Sova had openings. - The story is also convenient, and in a district where new faces attract - attention, convenience is suspicious. Ambiguity is deliberate and unresolved. - -want: - primary: "Safety" - description: > - Employment. - Find work. Settle in. Start over. Whether this is genuine or a cover story - is left deliberately ambiguous for v0.1. - -secret: > - Unresolved. Olin may be exactly what he claims — a drifter looking for work — - or may be a scout, informant, or rival operator. The game does not confirm - either reading in v0.1. - -routine: - summary: > - Variable — no fixed schedule. Appears at the bar in the afternoon, - sometimes at the hub entrance asking about openings, sometimes walking - the district. New arrivals without fixed employment have irregular - patterns by nature. - -personality: - demeanor: "friendly, curious, slightly too interested" - social_style: "open, direct, asks questions about work schedules and shift structures" - stress_response: "deflects with friendliness, changes subject" - -relationships: - - target: "npc:lera-sessik" - kind: "colleague" - trust: 2 - notes: "Bar acquaintance. Olin drinks at The Last Shift, asks questions. Lera assesses." - -tolerance: - threshold: 5 - description: > - Moderate. Olin handles social pressure well but becomes evasive under - sustained interrogation. The friendliness is armour, not fragility. - -information: - knows: - - "world.sova_district_layout" - - "world.shift_schedule" - access_tier: "public" - -contentment: - level: 0 - description: > - Unsettled. New arrival without stable employment or social anchoring. - Neither content nor distressed — in transition. - -tells: - - trigger: "conversation about hub operations" - behavior: "Leans in, asks specific follow-up questions — schedules, who runs what, where things go" - visible_to: "any" - - trigger: "when ring members are nearby" - behavior: "Watches them without staring. Notes who sits with whom." - visible_to: "peripheral" - -skills: - combat_trained: false - skills: - social: 6 - cargo_handling: 5 - -triangle_membership: - - "bar-tensions" - -trust_levels: - surface: > - Friendly newcomer looking for work. "I'm just trying to find steady - freight work. Know anyone hiring at the hub?" - real: > - Harder to reach — Olin's openness is itself a deflection. What lies - beneath the friendly questions is unclear even at higher trust. - secret: > - Whatever Olin's true purpose is remains sealed for v0.1. The ambiguity - is the content. - -dual_lens: - smuggler: > - Threat assessment. New face asking about hub work. Could be nothing, - could be everything. Watching. - detective: > - Potential fresh source. No local ties, no loyalty obligations. Could be - useful if Olin has seen something the regulars have learned to ignore. - -notes: > - Ambiguity NPC. Creates productive uncertainty — a new variable in a stable - system that forces both player characters to evaluate and respond. In the - bar-tensions triangle, Olin's questions and Torek's spending create combined - pressure on Lera. The game does not resolve Olin's true nature in v0.1. diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/pael.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/pael.yaml deleted file mode 100644 index 385f32093..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/pael.yaml +++ /dev/null @@ -1,62 +0,0 @@ -# NPC Profile: Pael Varren -# Tier 3 — NOBODY / CIVILIAN -# Flat NPC — noise floor. Knows nothing about the ring. -# Observable presence near B-corridor is legitimate maintenance, not surveillance. -# Ticket: #307 | Sprint: 12 - -canonical_id: "npc:pael" -display_name: "Pael Varren" -tier: 3 -pattern: "NOBODY" -motivation: "CIVILIAN" - -description: > - Station maintenance tech, early 40s. Has worked Sova Transit District for - fifteen years. Knows every duct, every failing seal, every air recycler - running off-spec. Appears throughout the district because maintenance is - everywhere. Carries a scanner everywhere; hands are perpetually stained with - lubricant. Pael has no ring connection, no secrets beyond a quiet resentment - of deferred maintenance tickets. Is frequently near B-corridor because the - environmental seal there fails on a cycle of roughly three weeks, without - fail, regardless of what Pael does about it. - -want: - primary: "Happiness" - description: > - To get through a single shift without a new deferred ticket appearing on - the queue. Fifteen years of Sova has narrowed the definition of a good day. - -routine: - summary: > - Arrives before any shift (05:30 entry), does a diagnostic walk of the - full district, starts on the highest-priority deferred tickets during - low-traffic windows. Reappears at the B-corridor junction around mid-shift - because the environmental seal there is always the problem. Leaves when - the shift cycle turns over. Pattern is completely predictable. That's the - point — Pael is never where they shouldn't be, they're just always where - the problems are. - -personality: - demeanor: "tired-competent, dry humor, no interest in drama" - social_style: "minimal — answers when addressed, doesn't linger" - stress_response: "files a maintenance ticket and moves on" - -tells: [] - -skills: - combat_trained: false - skills: - maintenance: 9 - environmental_systems: 8 - -trust_levels: - surface: > - Fifteen years of Sova maintenance. "If it breaks, I've seen it break - before. Usually the same three things." - -notes: > - NOBODY + CIVILIAN: pure noise floor. The "seems important but isn't" quality - is positional — frequent presence near B-corridor for genuine maintenance - reasons. One memorable observable trait: scanner always open, lubricant - stains on both hands even at shift start. Paula owns the trait design. - Mellanie owns the lines (#307). diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/pc-detective.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/pc-detective.yaml deleted file mode 100644 index 149738648..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/pc-detective.yaml +++ /dev/null @@ -1,246 +0,0 @@ -# PC-as-NPC Profile: The Detective (NPC mode, seen by smuggler player) -# Source: docs/design/pc-as-npc-spec.md section 11 -# Ticket: #383 | Blocks: #401 (PC-as-NPC content authoring) -# -# When the player is the smuggler, this file defines the detective's NPC behavior. -# When the player IS the detective, this file is not loaded. - -canonical_id: "npc:pc-detective" -display_name: "Commission Liaison" -tier: 2 -pattern: "MIRROR" -motivation: "OPERATOR" - -description: > - The detective as NPC. A Commission investigator conducting manifest review - in Sova Transit District. Neutral behavioral path: reviews records, walks the - dock floor, frequents the bar with Sera. First playthrough (smuggler): institutional - threat to avoid. Second playthrough: "That's me. That's what I was doing." - -want: - primary: "Knowledge" - intensity: 5 - description: > - Answers. - Wants to understand the freight discrepancies. Follows the investigation - methodically. Does not make dramatic decisions on the neutral path -- no - confrontations, no leverage plays, no dramatic revelations. - -secret: > - Actual mandate is investigation of freight irregularities, not routine compliance - review. The smuggler doesn't know this at session start -- the detective-NPC is - just "the new Commission person." Ring members may warn the smuggler (Voss: "routine - check, apparently"), but the true investigation depth remains hidden. - -relationships: - - target: "npc:sera-venn" - kind: "friend" - trust: 8 - notes: "Pre-existing friend from prior posting. Same institutional background. Social anchor on Sova. Comfortable body language, first-name basis." - - target: "npc:voss" - kind: "colleague" - trust: 1 - notes: "Person of interest from case file. Shift supervisor with scheduling authority. Detective approaches with professional formality." - - target: "npc:maret-korr" - kind: "colleague" - trust: 1 - notes: "Person of interest. Freight scheduler with manifest access. Requests data, notes reactions." - - target: "npc:drin" - kind: "colleague" - trust: 1 - notes: "Person of interest. Dock inspector responsible for container verification. Follow-up on inspection records." - - target: "npc:lera-sessik" - kind: "colleague" - trust: 2 - notes: "Bar owner. Met through Sera. Visited once or twice. Professional politeness." - - target: "npc:torek-lintar" - kind: "colleague" - trust: 3 - notes: "Commission compliance officer. Recognizes from institutional channels. Professional greeting." - - target: "npc:kael-davan" - kind: "colleague" - trust: 0 - notes: "Unknown dock worker at session start. Name might appear on shift roster. No personal knowledge." - - target: "npc:pc-smuggler" - kind: "colleague" - trust: 0 - notes: "Unknown dock worker. One of many. No reason to flag at session start. Tells may accumulate over time." - -tolerance: - threshold: 7 - description: > - Professional patience. Absorbs evasion and hostility without visible reaction. - Processes information internally. The neutral path never pushes tolerance -- - the detective-NPC doesn't escalate. - -routine: - summary: > - 7 routine entries covering full day cycle: - 1. Morning arrival (08:00, Terminal entrance) -- shows credentials to Voss, reviews scheduling board. - 2. Manifest review (08:30-10:00, Terminal offices) -- requests data from Maret, reviews freight records at terminal. - 3. Dock observation (10:00-11:30, dock floor) -- walks the floor, observes operations, takes notes (lattice interaction). - 4. Midday break (11:30-12:30, break area or district) -- brief break, may check district geography. - 5. Afternoon follow-up (13:00-14:30, Terminal offices) -- follow-up with Drin on inspection records, cross-references manifests. - 6. Bar evening (16:00-18:00, The Last Shift) -- meets Sera, sits together, casual conversation, observes room. - 7. Departure (18:30) -- returns to temporary quarters, off-screen. - -information: - knows: - - "investigation.manifest_discrepancy" - - "world.commission_regulations" - - "world.sova_district_layout" - access_tier: "authority" - -contentment: - level: 1 - description: > - Professional-cautious. New to the district, isolated in unfamiliar community. - Reliant on Sera for social grounding. Institutional training runs in the - background. Awareness that the district doesn't want them here. - -personality: - demeanor: "professional, measured, slightly formal" - social_style: "surnames for targets and unknowns, first names for allies (Sera only). The shift from surname to first name IS a relationship marker" - stress_response: "withdraws to analytical mode, reviews notes via lattice, seeks sightline-advantaged positions" - humor: "wry, observational, appreciates irony from a distance" - -tells: - - trigger: "after every conversation" - behavior: "Pauses and interacts with lattice -- recording notes. Brief but consistent pause" - visible_to: "any" - - trigger: "hub exploration" - behavior: "Moves through the hub in methodical pattern. Section by section, not wandering" - visible_to: "any" - - trigger: "investigation routine" - behavior: "Returns to manifest terminal repeatedly. Significant time reviewing data" - visible_to: "any" - - trigger: "throughout session" - behavior: "Stands at corners and elevated positions with good sightlines over dock floor. Watches before approaching" - visible_to: "peripheral" - - trigger: "bar evenings" - behavior: "Consistently gravitates toward Sera. Comfortable body language that other NPCs don't get from the detective" - visible_to: "any" - -skills: - combat_trained: false - skills: - investigation: 8 - analysis: 9 - social: 5 - observation: 8 - -triangle_membership: [] - -trust_levels: - surface: > - Professional, measured. "Commission Liaison Office -- conducting a routine compliance - review. Standard manifest reconciliation." Institutional language, deliberate blandness. - real: > - Only accessible to Sera. Investigation context, institutional background sharing, - personal doubts about the district. "The briefing said routine. Briefings are - always wrong about something." - secret: > - Investigation mandate, case file details, evidence collected. Never accessible - to the smuggler through normal play. - -dual_lens: - smuggler: > - First impression: Commission. Threat. The smuggler's operational awareness flags - authority presence immediately. Color: warm amber (Person of Interest) from first - sighting, or cool teal (Unknown) shifting to amber once Kael or Voss warns the - smuggler. - - Tells accumulate: note-taking after every conversation, systematic hub coverage, - manifest terminal fixation (third time today), observation positioning at - sightline-advantaged points, Sera proximity. The smuggler's monologue reads - these as institutional threat escalating from background nuisance to active danger. - - Reverse observation notes -- what NPCs say about the detective to the smuggler: - - Kael (noticing Commission presence): "There's someone new at the hub. Commission - badge. Keep your head down." [access: insider, trust: real -- ring protective warning] - - Voss (to smuggler during shift): "Commission liaison showed up this morning. - Routine check, apparently. Just do your job normally." [access: insider, trust: real - -- operational caution] - - Lera (when smuggler arrives at bar): "Your Commission friend is here again. - Came in with Sera." [access: insider, trust: surface -- coded language, "your" is - ironic distance] - - Sera (overheard at bar): "The new liaison? Standard posting. Nothing to worry - about." [access: public, trust: surface -- Sera's deflection benefits the ring - indirectly] - - Naia (when smuggler sits near her): "Have you noticed the new person at the hub? - Commission, someone said. Kael didn't seem happy about it." [access: peer, - trust: surface -- innocent observation] - - Renn (to smuggler during operations): "That investigator's been poking around - manifests. Maret's sweating." [access: insider, trust: real -- ring intelligence] - - Maret (to smuggler in corridor): "The Commission officer requested last quarter's - schedules. I gave them the clean set." [access: insider, trust: real -- complicity - confirmation] - - detective: > - N/A -- this IS the detective in NPC mode. When the player is the detective, - this file is not loaded. - -notes: > - PC-as-NPC entity. Follows the NEUTRAL BEHAVIORAL PATH: - - No dramatic decisions - - No confrontations initiated - - No relationship state changes during session - - No evidence-based confrontations (those are the player's choices) - - No dramatic leverage plays - - No routine deviations - - AGENCY BOUNDARIES: The detective-NPC arrives, reviews records, walks the floor, - takes notes, visits the bar with Sera, goes home. They exhibit baseline personality - (professional, formal, observational) and observable tells (note-taking, systematic - movement, manifest fixation). They respond to player interaction with public-tier - dialogue only. - - STARTING KNOWLEDGE -- two options: - - Option A (default for v0.1): Smuggler has been warned by Voss. Smuggler starts - with KnowsOf about the detective (role: Commission liaison, faction: Commission, - risk: moderate). Color: amber. - - Option B: Smuggler not yet warned. First visual sighting triggers knowledge - accumulation. Commission badge visible. Color: teal initially, shifts to amber - once ring members pass the warning. - - Smuggler observation monologue triggers (5 lines): - - 1. "Commission officer just stood there after talking to Voss. Making notes. Not good." - [trigger: observe_npc, note-taking tell] - 2. "That investigator is working the hub section by section. Not browsing. Searching." - [trigger: observe_anomaly, systematic movement tell] - 3. "Commission's parked at the manifest terminal again. Third time today." - [trigger: observe_anomaly, manifest fixation tell] - 4. "They're watching. From the corner, where they can see the whole dock floor. Professional." - [trigger: observe_npc, observation positioning tell] - 5. "The investigator and Sera again. Old friends? Or is Sera reporting to them?" - [trigger: observe_npc, Sera proximity tell -- creates doubt about Sera's role] - - Public-tier dialogue (if smuggler approaches): - - 1. Greeting (hub): "Good morning. Commission Liaison Office -- I'm conducting a routine compliance review." - [access: public, trust: surface, situation: greeting] - 2. About purpose: "Standard review. Manifest reconciliation, scheduling compliance. Nothing unusual." - [access: public, trust: surface, situation: social] - 3. About district: "Only been here a few days. Seems like a well-run operation." - [access: public, trust: surface, situation: social -- deliberate blandness] - 4. About Sera: "Ms. Venn? Colleague. We've worked in the same division." - [access: public, trust: surface, situation: social -- professional deflection] - 5. Deflection: "I appreciate the interest, but I'm sure you have cargo to route. I won't keep you." - [access: public/authority, trust: surface, situation: confrontation -- polite dismissal] - - ITEM COUNT: - - Routine entries: 7 - - Relationship stubs (NPCs about detective): 7 - - Tell descriptions + monologue triggers: 10 (5 tells x 2) - - Dialogue lines (detective-NPC speaks): 5 - - TOTAL: 29 (within ~20-30 budget) diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/pc-smuggler.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/pc-smuggler.yaml deleted file mode 100644 index bd385f8d6..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/pc-smuggler.yaml +++ /dev/null @@ -1,245 +0,0 @@ -# PC-as-NPC Profile: The Smuggler (NPC mode, seen by detective player) -# Source: docs/design/pc-as-npc-spec.md section 10 -# Ticket: #383 | Blocks: #401 (PC-as-NPC content authoring) -# -# When the player is the detective, this file defines the smuggler's NPC behavior. -# When the player IS the smuggler, this file is not loaded. - -canonical_id: "npc:pc-smuggler" -display_name: "Dock Worker" -tier: 2 -pattern: "MIRROR" -motivation: "OPERATOR" - -description: > - The smuggler as NPC. A dock worker in Sova Transit District who follows the - neutral behavioral path: routine work, break with colleagues, bar after shift. - First playthrough (detective): unremarkable NPC, one of many dock workers. - Second playthrough: "That's me. That's what I was doing." The gap between this - neutral path and the player's actual choices IS the narrative distance traveled. - -want: - primary: "Safety" - intensity: 4 - description: > - Stability. - Keep the day smooth. Keep the operation running, the team safe, the shift - uneventful. Does not make dramatic decisions on the neutral path. - -secret: > - Ring member. Handles cargo routing for the smuggling operation during shift - transitions. The detective doesn't know this at session start. The smuggler-NPC - is just another dock worker until tells accumulate and the detective's analytical - lattice starts connecting patterns. - -relationships: - - target: "npc:kael-davan" - kind: "colleague" - trust: 8 - notes: "Closest colleague, ring member. First-name basis. 2 years of shared risk. Comfortable physical proximity. Eats lunch together." - - target: "npc:voss" - kind: "superior" - trust: 3 - notes: "Shift supervisor, ring-aware. Professional respect, low warmth. Smuggler knows Voss takes a cut." - - target: "npc:lera-sessik" - kind: "friend" - trust: 7 - notes: "Bar owner, ring-aware. Regular at The Last Shift. Lera saves the smuggler's usual seat." - - target: "npc:renn" - kind: "colleague" - trust: 5 - notes: "Courier, ring member. Operational relationship. Smuggler knows Renn's routes." - - target: "npc:naia-tamm" - kind: "friend" - trust: 4 - notes: "Kael's partner. Known through Kael. Occasional bar interaction." - - target: "npc:maret-korr" - kind: "colleague" - trust: 4 - notes: "Freight scheduler. Hub colleague. Smuggler knows Maret handles scheduling." - - target: "npc:drin" - kind: "colleague" - trust: 3 - notes: "Dock inspector. Compromised -- looks the other way for the ring." - - target: "npc:torek-lintar" - kind: "colleague" - trust: 2 - notes: "Bar regular, ring-adjacent. Conspicuous spending. Smuggler keeps distance." - - target: "npc:sera-venn" - kind: "colleague" - trust: 0 - notes: "Commission field tech. Smuggler recognizes Sera as Commission. Keeps distance. No personal relationship." - - target: "npc:pc-detective" - kind: "colleague" - trust: -2 - notes: "Commission liaison. Threat. Smuggler-NPC does not initiate contact with the detective. If approached, gives polite minimum responses." - -tolerance: - threshold: 6 - description: > - Steady under pressure but protective of colleagues. Threat to the team triggers - immediate defensive instinct. The neutral path keeps tension below threshold. - No dramatic choices, no confrontations. - -routine: - summary: > - 7 routine entries covering full day cycle: - 1. Morning arrival (05:45, Terminal entrance) -- checks schedule board. - 2. Morning work (06:00-10:00, dock floor) -- cargo processing, interacts with Kael and dock workers. - 3. Break (10:00-10:30, break area) -- eats with Kael and Renn, conversation. - 4. Afternoon work (10:30-14:00, dock floor) -- container routing, schedule coordination with Voss. - 5. Shift transition (14:00-14:20) -- cleans station, briefly checks service corridor. - 6. Bar evening (15:00-17:00, The Last Shift) -- drinks with Kael at regular table, casual conversation with Lera. - 7. Departure (17:30) -- goes home, off-screen. - -information: - knows: - - "contraband.ring_exists" - - "contraband.lattice_components" - - "contraband.supply_chain" - - "location.corridor_b7_restricted" - - "location.smuggling_route" - - "location.surveillance_gaps" - - "location.dead_drop_location" - - "investigation.manifest_discrepancy" - - "investigation.shift_mismatch" - - "investigation.cargo_anomaly" - - "world.shift_schedule" - - "relationship.ring_membership" - access_tier: "insider" - -contentment: - level: 3 - description: > - Comfortable-tense. The job pays, the team is solid, the risk is managed. - Not happy, not miserable. Managing a life with two faces. The money eases - the financial pressure that makes station life tight for most workers. - -personality: - demeanor: "casual, guarded around authority figures" - social_style: "first-name basis with everyone, relational, physically present" - stress_response: "goes quiet, checks exits, shortens interactions" - humor: "dry, situational, dark when stressed" - -tells: - - trigger: "entering new area (every transition between areas)" - behavior: "Pauses at intersections, glances down corridors before entering" - visible_to: "any" - - trigger: "shift transition window (14:00-14:20)" - behavior: "Movement becomes more purposeful. Straighter route, fewer idle pauses" - visible_to: "any" - - trigger: "near authority figures or checkpoints" - behavior: "Pace increases slightly when passing Commission-tagged NPCs or security checkpoints" - visible_to: "peripheral" - - trigger: "break periods and bar time" - behavior: "Gravitates toward Kael, Renn, and other ring members. Tight social cluster, same table every shift" - visible_to: "any" - - trigger: "near flagged cargo containers during work routine" - behavior: "Gaze lingers on specific containers. Brief second interaction with freight system during routing" - visible_to: "forward" - -skills: - combat_trained: false - skills: - cargo_handling: 8 - logistics: 7 - stealth: 5 - social: 6 - -triangle_membership: - - "hub-power" - - "worried-partner" - -trust_levels: - surface: > - Polite, guarded. Standard dock worker responses. "Cargo routing. Containers come - in, I process them out. Standard stuff." - real: > - Only accessible to ring insiders. Operational talk, schedule windows, route - planning. "4471's routed for transfer at 14:30. Voss kept the window clear." - secret: > - Ring knowledge, Kael's situation, supply chain details. Never accessible to - the detective through normal play. - -dual_lens: - smuggler: > - N/A -- this IS the smuggler in NPC mode. When the player is the smuggler, - this file is not loaded. - detective: > - First impression: unremarkable dock worker, one of many. Color: cool teal - (Unknown/Neutral) at session start. Tells accumulate with repeated observation: - corridor checking, shift-transition behavior change, security-proximity tension, - social clustering with same 3 people, cargo attention on specific containers. - The detective's monologue flags these as professional curiosity escalating to - suspicion. Color may shift to warm amber (Person of Interest) if tells compound. - - Reverse observation notes -- what NPCs say about the smuggler to the detective: - - Kael (when asked about dock workers): "The crew's solid. Good people. We look - out for each other." [access: public, trust: surface -- won't name names] - - Kael (when pressed): "Just a dock worker. Does their shift, goes home. Not much - to tell." [access: authority, trust: surface -- deflection] - - Voss (when asked about shift crew): "Everyone's got their routine. No complaints - from that crew." [access: authority, trust: surface -- institutional wall] - - Lera (when asked about dock workers at bar): "We get all sorts in here after - shift. Working people. Tired, mostly." [access: public, trust: surface -- - protective generality] - - Naia (when talking about Kael's friends): "Kael's got good colleagues. They - eat lunch together most days." [access: public/peer, trust: surface -- genuine] - - Maret (when detective reviews crew records): "That name's on the morning shift - roster. Standard cargo handling cert." [access: authority, trust: surface] - - Torek (overheard at bar): "Dock crew's always here after shift. The usual - crowd." [access: public, trust: surface -- background noise] - -notes: > - PC-as-NPC entity. Follows the NEUTRAL BEHAVIORAL PATH: - - No dramatic decisions - - No confrontations initiated - - No relationship state changes during session - - No contradiction discovery (that's the player's experience) - - No triangle fork reactions - - No routine breaks without cause - - AGENCY BOUNDARIES: The smuggler-NPC works, eats, drinks, goes home. They exhibit - baseline personality (casual, first names) and observable tells (corridor awareness, - shift-transition alertness). They respond to player interaction with public-tier - dialogue only. - - Detective observation monologue triggers (5 lines): - - 1. "That dock worker checks the corridor before turning. Habitual. Military? Or just careful." - [trigger: observe_npc, corridor awareness tell] - 2. "Movement pattern changed at shift change. More direct. Less idle. Interesting." - [trigger: observe_anomaly, shift-transition tell] - 3. "Slight acceleration past the checkpoint. Most people do it. But this one does it every time." - [trigger: observe_anomaly, security-proximity tell] - 4. "Same three people at the same table. Every shift. Consistent social group." - [trigger: observe_npc, social clustering tell] - 5. "That worker checked container 4471 twice. The same container that's in my manifest discrepancy file." - [trigger: observe_anomaly, cargo attention tell -- gates on investigation.manifest_discrepancy KnowsOf] - - Public-tier dialogue (if detective approaches): - - 1. Greeting (hub): "Morning. Can I help you with something?" - [access: public, trust: surface, situation: greeting] - 2. About work: "Cargo routing. Containers come in, I process them out. Standard stuff." - [access: public/authority, trust: surface, situation: investigation] - 3. About the hub: "It's a freight hub. Busy during shifts, quiet after. Same as any logistics operation." - [access: public, trust: surface, situation: social] - 4. About colleagues: "Good crew. We do our shifts, go home. Nothing exciting." - [access: public/authority, trust: surface, situation: investigation] - 5. Deflection: "Look, I just move containers. You'd want to talk to Voss about scheduling." - [access: authority, trust: surface, situation: confrontation -- deflects to Voss] - - ITEM COUNT: - - Routine entries: 7 - - Relationship stubs (NPCs about smuggler): 7 - - Tell descriptions + monologue triggers: 10 (5 tells x 2) - - Dialogue lines (smuggler-NPC speaks): 5 - - TOTAL: 29 (within ~20-30 budget) diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/pell.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/pell.yaml deleted file mode 100644 index 7976ec4bf..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/pell.yaml +++ /dev/null @@ -1,154 +0,0 @@ -# NPC Profile: Pell Torssen -# Source: wiki/characters/pell.md -# Tier 2 | CATALYST + TURNCOAT | Ring member, potential informant - -canonical_id: "npc:pell" -display_name: "Pell Torssen" -tier: 2 -pattern: "CATALYST" -motivation: "TURNCOAT" - -description: > - Ring member, 35, handles inventory tracking and distribution scheduling for - smuggled goods. Freelance logistics consulting as cover. Pell is cracking. The - ring seemed manageable when small-scale — now the volume is escalating, the - Commission liaison rotation gap is closing, and the risk-to-reward ratio has - inverted. Pell is considering cooperation with authorities but doesn't know how, - whom to trust, or what happens if the ring finds out. An informant looking for - a handler. - -want: - primary: "Freedom" - intensity: 9 - description: > - Get out without getting killed. - Pell is past the point of wanting to stay. The escalating volume, the increasing - risk, the paranoia — the ring has gone from manageable supplement to existential - threat. Secondary want: find someone — anyone — who can offer protection in - exchange for information. The detective is the obvious candidate, but Pell - doesn't know the detective exists yet. Drin is an institutional contact, but - Drin is compromised through Harek's debt. The irony is thick. - -secret: > - Surface: ring member — known to the ring, not known to the detective or civilians. - Deep: Pell is considering turning informant. This is the most dangerous secret in - the district. If Nils or Devra confirm Renn's suspicion, Pell is dead or - disappeared. If Pell successfully cooperates with the detective, the ring - collapses. Vulnerability: isolation — no allies in this decision. The ring would - kill him. The authorities don't know he exists. - -relationships: - - target: "npc:renn" - kind: "colleague" - trust: 2 - notes: "Fellow ring member. Renn suspects Pell is unreliable and has reported this to Devra. Pell senses the increased scrutiny without understanding its source. The relationship has chilled." - - target: "npc:devra" - kind: "superior" - trust: 2 - notes: "Ring coordinator. Pell receives scheduling instructions from Devra. Devra is watching Pell more closely since Renn's report. Pell feels the pressure." - - target: "npc:drin" - kind: "colleague" - trust: 3 - notes: "Dock inspector. Pell has considered approaching Drin for institutional help — unaware that Drin is compromised through Harek's gambling debt. This potential contact is a trap Pell doesn't see." - -tolerance: - threshold: 1 - description: > - Exceeded. Pell is past his tolerance. The escalating volume, increasing risk, and - paranoia have pushed him beyond functional tolerance. Operating on anxiety and - habit, not commitment. Any external pressure — the detective asking the right - question, Renn confronting him, Nils summoning him — could trigger the break. - -routine: - summary: > - 5 routine entries covering variable day: - 1. Freelance work (09:00-12:00) — legitimate small logistics contracts, sporadic. - 2. Variable midday (12:00-15:00) — bar occasionally, residential pod, wandering. - 3. Ring communication (15:00-19:00) — lattice-based, encrypted, scheduled by - Devra. - 4. Ring coordination meetings (night, bar back room) — 1-2x per week. - 5. Routine deviations increasing: skipping meetings, failing to respond to - lattice messages promptly, avoiding locations where ring members congregate. - -information: - knows: - - "contraband.ring_exists" - - "contraband.lattice_components" - - "contraband.supply_chain" - - "relationship.ring_membership" - - "relationship.trust_network" - - "location.smuggling_route" - access_tier: "insider" - -contentment: - level: -5 - description: > - Very low — crisis level. The ring went from manageable supplement to existential - threat. Every interaction with ring members feels dangerous. Every stranger could - be an investigator. Every lattice message could be a summons. A measure of how - far someone can fall when the thing that was supposed to help them becomes the - thing that threatens to destroy them. - -personality: - demeanor: "anxious, overthinking, struggling to maintain composure" - social_style: "increasingly withdrawn, avoids ring social spaces, irregular availability" - stress_response: "paranoid behavior — checking over shoulder, scanning entrances, avoiding eye contact" - humor: "absent — anxiety has consumed the space where humor lived" - -tells: - - trigger: "ring coordination meeting scheduled" - behavior: "Misses meetings or arrives late — anxiety and avoidance increasing" - visible_to: "any" - - trigger: "in public spaces" - behavior: "Nervous behavior — checking over shoulder, scanning entrances, avoiding eye contact with regulars" - visible_to: "any" - - trigger: "expected at scheduled location" - behavior: "Irregular schedule — unpredictable location, unreliable availability, routine becoming erratic" - visible_to: "peripheral" - -skills: - combat_trained: false - skills: - logistics: 7 - inventory_management: 7 - encrypted_communication: 5 - -triangle_membership: - - "informant-question" - -trust_levels: - surface: > - Freelance logistics consultant. Nervous but functional. "I'm fine. Just — a lot - on my mind. Freelance work's been slow. You know how it is." - real: > - Ring operational details — inventory levels, distribution schedules, client lists, - timing windows, which operations are sloppiest, which members are essential. - Knows the ring's vulnerabilities from inside. - secret: > - Willing to trade everything he knows for protection. "If I talk — if I tell you - what I know — can you protect me? Not just a promise. Actual protection. Because - the people I'd be talking about don't forgive." - -dual_lens: - smuggler: > - The biggest internal threat. The smuggler reads Pell's anxiety as instability — - a wavering member who might bring the whole operation down. The decision: support - Pell, report to Nils, or try to calm him down. "Pell missed another meeting. - Renn's right — something's off. If Pell talks, we're all exposed." - detective: > - Initially invisible — freelance consultant at the bar. But behavioral signals - (nervousness, irregular schedule, isolation) read as someone under pressure. If - the detective can identify and approach Pell before the ring acts, Pell becomes - the case's keystone witness. "The consultant — Pell. No fixed schedule. Nervous. - Avoids eye contact. Either antisocial or scared. If they're scared, I need to - know of whom." - -notes: > - CATALYST + TURNCOAT: maximum instability. "When Pell breaks, everything moves." - Pell's disruption (CATALYST) is driven by deliberate loyalty shift (TURNCOAT), - making him the ring's existential threat. Other catalysts (Torek, Resha, Olin) - disrupt accidentally; Pell's disruption is the consequence of a conscious decision - to betray. For the smuggler, the decision to support, report, or manage Pell - defines the operation's future. For the detective, finding Pell before the ring - acts means gaining the keystone witness. Timing is everything, and Pell's anxiety - is the countdown. diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/ren.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/ren.yaml deleted file mode 100644 index 374f2c60c..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/ren.yaml +++ /dev/null @@ -1,63 +0,0 @@ -# NPC Profile: Ren Tosse -# Tier 3 — NOBODY / CIVILIAN -# Flat NPC — noise floor. Drifter with no ring connection. -# Asks too many questions about cargo schedules. Is just looking for work. -# Ticket: #307 | Sprint: 12 - -canonical_id: "npc:ren" -display_name: "Ren Tosse" -tier: 3 -pattern: "NOBODY" -motivation: "CIVILIAN" - -description: > - Day worker, early 30s. Comes through Sova Transit on irregular rotations — - picks up freight work when it's available, moves on when it isn't. Knows the - station the way drifters do: which bays are short-handed, which supervisors - ask fewer questions, what the bar's cheap nights are. Has a worn transit bag - and a slightly too-casual awareness of exits — not operational awareness, - just the low-level situational alertness of someone who has moved through - too many unfamiliar stations. Genuinely unremarkable. No ring connection, - no secrets. Asks too many questions about night rotations and cargo schedules - because that's how you find short-handed bays. - -want: - primary: "Wealth" - description: > - Regular work. Enough to stop moving for a while. Sova's a decent stop — - the freight work is steady when it comes through. - -routine: - summary: > - Arrives after 10:00 when the day shift is settled. Checks the job board - at the terminal entrance. Wanders to The Last Shift for a drink and - whatever bar conversation yields useful shift information. Leaves by late - afternoon unless day work came through. Pattern is irregular by design — - no fixed schedule because there's no fixed role. - -personality: - demeanor: "casual, observant, asks questions as if entitled to answers" - social_style: "sociable enough to get information, quiet when there's nothing useful" - stress_response: "moves on. There's always another station." - -tells: [] - -skills: - combat_trained: false - skills: - cargo_handling: 6 - freight_routing: 5 - -trust_levels: - surface: > - Passing through, looking for work. "Sova seems decent. Depends on - the freight situation." - -notes: > - NOBODY + CIVILIAN: pure noise floor. The "seems important but isn't" quality - comes from drifter behavior patterns that mimic operative reconnaissance: - asking about night rotations, checking cargo schedules, casual interest in - specific bays. All genuine job-seeking. One memorable observable trait: - worn transit bag with tags from three different station systems, slightly - too-casual awareness of exits. Paula owns the trait design. Mellanie owns - the lines (#307). diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/renn.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/renn.yaml deleted file mode 100644 index bda51636d..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/renn.yaml +++ /dev/null @@ -1,154 +0,0 @@ -# NPC Profile: Renn Harsk -# Source: wiki/characters/renn.md -# Tier 2 | THRESHOLD + OPERATOR | Ring courier - -canonical_id: "npc:renn" -display_name: "Renn Harsk" -tier: 2 -pattern: "THRESHOLD" -motivation: "OPERATOR" - -description: > - Courier for the smuggling ring, 26 years old. Moves contraband between freight - bay, storage, and handoff points through maintenance corridors during Meridian - dead spots. Legitimate cover as cargo runner at the logistics hub. Young, fit, - takes pride in the execution. Renn is the physical movement in the operation — - when Kael routes a flagged container, Renn transfers the contraband to Corridor - B-7 or the bar's back room. Also the person who reported suspicion about Pell's - wavering to Devra. - -want: - primary: "Power" - intensity: 6 - description: > - Prove loyalty to the ring and earn trust. - Stay useful without getting caught. - Renn is the physical courier — lifting, carrying, timing runs through - maintenance corridors during Meridian dead spots. Takes pride in the execution. - The job feels important. Secondary want: prove loyalty to Nils and Devra. Renn - came into the ring through a friend-of-a-friend introduction. Still earning - trust. The courier routes are his proving ground. - -secret: > - Surface: ring member who moves contraband through maintenance corridors. Known - to ring, unknown to detective initially. Deep: Renn suspects Pell is unreliable - and has reported this to Nils through Devra. This creates internal ring tension — - Renn has effectively marked Pell as a threat, which may trigger Nils to act. - Vulnerability: physical exposure — Renn is the person most likely to be caught - in the act, carrying contraband through corridors during off-hours. - -relationships: - - target: "npc:kael-davan" - kind: "colleague" - trust: 5 - notes: "Ring colleague. Kael routes containers; Renn moves them. Functional respect, not close personally. Renn admires Kael's competence." - - target: "npc:pell" - kind: "colleague" - trust: 1 - notes: "Fellow ring member. Renn distrusts Pell's reliability and has reported concerns. Dangerous dynamic — Renn may be right or may be paranoid." - - target: "npc:devra" - kind: "superior" - trust: 5 - notes: "Ring coordinator. Renn receives timing instructions from Devra. Professional — Devra values Renn's reliability." - - target: "npc:tav" - kind: "colleague" - trust: 4 - notes: "Ring lookout. Tav signals Renn during operations. Operational coordination." - -tolerance: - threshold: 5 - description: > - Moderate. Renn can handle physical risk and operational pressure. What he cannot - handle: being abandoned. If the ring distances itself from Renn because he's - exposed or expendable, his loyalty inverts. A courier who feels discarded is a - courier who talks. - -routine: - summary: > - 4 routine entries covering full day cycle: - 1. Day shift (06:00-14:00) — cargo runner at logistics hub, legitimate freight - movement. Provides cover for knowing facility layout and timing. - 2. Off-duty (14:00-22:00) — home, occasionally bar. Not a regular. Keeps low - profile between operations. - 3. Night operations (22:00-01:00, 1-2x per week) — moves flagged cargo from - temporary storage to Corridor B-7 or bar back room via maintenance corridors - and Meridian dead spots. - 4. Avoids the bar on operation nights — doesn't want to be placed at a social - venue when he should be unaccounted for. - -information: - knows: - - "contraband.ring_exists" - - "location.corridor_b7_restricted" - - "location.smuggling_route" - - "location.surveillance_gaps" - - "location.dead_drop_location" - - "relationship.ring_membership" - - "world.shift_schedule" - access_tier: "insider" - -contentment: - level: 2 - description: > - Moderate. Young and feels like he's going somewhere. Ring money supplements - his cargo runner salary. The work is exciting in a way the legitimate job - isn't. Precarious — depends entirely on the ring's stability. - -personality: - demeanor: "alert, loyal, suspicious" - social_style: "low-profile, trusts slowly, watches people" - stress_response: "hyperaware of spatial surroundings, patrol timing, corridor traffic" - -tells: - - trigger: "courier run in progress" - behavior: "Present in maintenance corridors during off-hours — carrying cargo where he shouldn't be" - visible_to: "any" - - trigger: "monitoring Pell" - behavior: "Watches Pell's behavior — surveillance posture, tracking Pell's movements and attendance" - visible_to: "peripheral" - - trigger: "operation night" - behavior: "Absent from the bar — doesn't want to be placed at a social venue during active operations" - visible_to: "peripheral" - -skills: - combat_trained: false - skills: - cargo_handling: 7 - corridor_navigation: 8 - spatial_awareness: 7 - timing_coordination: 6 - -triangle_membership: - - "informant-question" - -trust_levels: - surface: > - Cargo runner at the hub. Keeps to himself. "Route's on schedule. Standard - freight. Nothing to report." - real: > - Knows corridor routes, Meridian dead spots, timing windows, handoff procedures. - Kael's routing patterns, Devra's coordination timing. Pell's behavior changes. - secret: > - Has reported Pell as a potential informant threat. The ring's immune response - started with Renn's suspicion. - -dual_lens: - smuggler: > - Known quantity — the runner, the courier, the physical movement. Reliable, stays - quiet. If Renn says Pell's a problem, Pell's a problem. "Renn's reliable. Runs - clean, stays quiet." - detective: > - Initially invisible — another cargo runner. But tracking movement patterns in - maintenance corridors during off-hours reveals Renn as the NPC who appears where - he shouldn't be. "Cargo runner. Night shift movement in restricted corridors - doesn't match his posted schedule. Following up." - -notes: > - THRESHOLD + OPERATOR: the physical gatekeeper. "Renn moves the product. Trace - Renn, find the route." Controls access to the smuggling route (THRESHOLD) and - personally executes the movement (OPERATOR). Unlike Devra's organizational - gatekeeping, Renn's threshold is physical — he is the body in the corridor with - the contraband. Catching Renn in a dead spot with cargo is the most direct path - to blowing the operation. His vulnerability is his visibility: a person moving - cargo through restricted corridors during off-hours is the most catchable link - in the chain. Also the ring's immune response — reporting Pell's wavering. diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/resha.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/resha.yaml deleted file mode 100644 index 1d908d7fd..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/resha.yaml +++ /dev/null @@ -1,150 +0,0 @@ -# NPC Profile: Resha Neven -# Source: wiki/characters/resha.md -# Tier 2 | CATALYST + CIVILIAN | Logistics Hub new hire dock worker - -canonical_id: "npc:resha" -display_name: "Resha Neven" -tier: 2 -pattern: "CATALYST" -motivation: "CIVILIAN" - -description: > - New hire dock worker at the Sova Transit District Logistics Hub, three months into - her first permanent position. Age 23, came from short-term contract work in other - districts — unstable, underpaid, no community. Eager, observant, transparent. Asks - questions about locked bays, irregular schedule changes, and containers that appear - on manifests but are not in the bay. She does not know she is asking about the - ring's operations — she is asking because the procedures she was taught do not - match what she observes. - -want: - primary: "Power" - intensity: 5 - description: > - Prove herself at the job. - Resha wants to be competent, reliable, valued. She studies shift protocols, - asks questions about procedures, and takes notes. Some of those questions — - about locked bays, irregular schedule changes, containers with routing codes - she was not trained on — are innocently dangerous. She does not know she is - probing the ring's infrastructure. She is trying to learn her job. - -secret: > - None in the traditional sense. Resha has nothing to hide. Her significance is - not what she conceals but what she notices — her curiosity about procedural - inconsistencies makes her a risk to the ring and a potential asset to the - detective, neither of which she is aware of. Vulnerability is naivety: she - does not understand which questions are dangerous. - -relationships: - - target: "npc:voss" - kind: "superior" - trust: 5 - notes: "Shift supervisor. Resha respects authority and tries to please Voss. Voss is professionally competent with her but wants her to stop asking about irregularities." - - target: "npc:kael-davan" - kind: "colleague" - trust: 7 - notes: "Senior colleague. Kael is patient with Resha — shows her the ropes, answers procedural questions, covers for her mistakes. Resha looks up to Kael." - - target: "npc:maret-korr" - kind: "colleague" - trust: 5 - notes: "Freight scheduler. Maret gives Resha scheduling data and is protective in a quiet, professional way. Resha's questions about manifest discrepancies echo Maret's own concerns." - -tolerance: - threshold: 3 - description: > - Low, untested. Resha has never been in a situation where loyalty conflicts with - safety. If directly threatened or warned to stop asking questions, she would be - scared and confused. She does not have the experience to navigate institutional - pressure. - -routine: - summary: > - 4 routine entries covering full day cycle: - 1. Day shift (06:00-14:00) — cargo handling, bay allocation assistance, learning - procedures. - 2. Break (10:30-11:00, break room) — often with Kael or other dock workers. - 3. Post-shift (14:00-15:00) — sometimes stays late studying shift protocols. - 4. Off-duty (15:00+) — home (Residential Radial B) or occasionally the bar, - still establishing social connections. - -information: - knows: - - "world.shift_schedule" - access_tier: "public" - -contentment: - level: 5 - description: > - Moderate-high, optimistic. Resha is happy to have a stable job. The community - is welcoming enough. The work is hard but meaningful. Her contentment is that - of someone at the beginning of something — not yet disillusioned. - -personality: - demeanor: "eager, open, earnest" - social_style: "asks questions freely, takes notes, defers to experienced colleagues" - stress_response: "looks to authority figures for guidance, goes quiet when confused" - humor: "warm, slightly nervous — laughs easily when comfortable" - -tells: - - trigger: "encounters a procedure she was not trained for" - behavior: "Asks questions about locked bays, irregular schedules, or unmanifested containers. Innocently dangerous." - visible_to: "any" - - trigger: "recording procedures and observations" - behavior: "Takes notes on her lattice — standard for a new hire, but the data she captures includes anomalies." - visible_to: "peripheral" - - trigger: "uncertain about a procedure or social situation" - behavior: "Looks to Kael for guidance. Visible deference and trust." - visible_to: "any" - -skills: - combat_trained: false - skills: - cargo_handling: 4 - bay_allocation: 3 - manifest_reading: 3 - observation: 5 - -triangle_membership: [] - -trust_levels: - surface: > - Eager new hire. Open and transparent. Asks procedural questions without guile. - "The Bay 7 manifest doesn't list that container. Should I flag it, or is that - a late addition?" - real: > - Genuinely confused by the gap between training and reality. Starting to notice - that some questions make people uncomfortable but does not understand why. - "Voss changed the afternoon rotation again. Is that normal?" - secret: > - No hidden agenda. What you see is what there is — a new worker trying to learn - a job that turns out to be stranger than the training manual described. - -dual_lens: - smuggler: > - Resha is a variable. Her questions are innocent but dangerous. The smuggler - reads Resha as someone who needs to be managed — either brought into confidence - (risky) or steered away from sensitive areas (ongoing effort). "Resha's asking - about Bay 7 again. Someone needs to teach her that not every question needs - an answer." - detective: > - Resha is a fresh pair of eyes. Uncompromised, observant, and unaware of the - social pressures that keep everyone else silent. Her observations carry no - political filtering — whatever Resha noticed, she noticed because it was - genuinely anomalous. "New hire. Three months. Still asking questions the - veterans stopped asking years ago. Either naive or useful. Possibly both." - -notes: > - CATALYST + CIVILIAN: innocent disruption. She just asked and everyone flinched. - Resha disrupts through pure curiosity, which makes her impossible to manage - through normal channels. You cannot tell a new hire to stop asking procedural - questions without explaining why — and the explanation is the thing that must - stay hidden. - - Key authoring guidance: Resha is not an investigator. She is a new employee - learning a corrupted system honestly. Write her questions as genuine, her - confusion as real, her eagerness as endearing. The tension comes from the - ring's reaction to her, not from anything Resha does deliberately. - - Not a formal triangle member. Her function is atmospheric and catalytic — her - questions create pressure on Voss and Kael, and her presence reminds the hub - that the operation is only invisible to people who have learned not to look. diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/sabel.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/sabel.yaml deleted file mode 100644 index b9379a25f..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/sabel.yaml +++ /dev/null @@ -1,104 +0,0 @@ -# NPC Profile: Sabel Hersk -# Source: wiki/characters/sabel.md -# Tier 3 — reduced content, essential axes only - -canonical_id: "npc:sabel" -display_name: "Sabel Hersk" -tier: 3 -pattern: "GHOST" -motivation: "OPERATOR" - -description: > - The ring's off-station contact — external supplier who sends contraband - (unlicensed lattice components, medical-grade neural replacements) through - legitimate freight shipments to Sova. Operates from elsewhere in the Krenn - System. Relationship with Devra is purely transactional. Not directly - observable — referenced in lattice communications, cargo manifests, and - ring members' dialogue. - -want: - primary: "Wealth" - description: > - Profit. - Deliver. Get paid. Maintain the supply chain. If the operation on Sova is - compromised, Sabel cuts the connection and finds another distribution point. - -secret: > - Sabel views the Sova ring as replaceable infrastructure. If the operation - is compromised, Sabel severs the connection without warning and redirects - supply to another distribution point. - -routine: - summary: > - Not directly observable. Sabel appears in lattice communications (Devra's - coordination), in cargo manifests (origin codes), and in ring dialogue. - Physical presence limited to at most 1-2 brief visits during the vertical - slice — enough to be observed, not enough to be interrogated. - -personality: - demeanor: "professional, efficient, impersonal" - social_style: "transactional only — no personal investment in the local team" - stress_response: "cuts connections, finds alternatives" - -relationships: - - target: "npc:devra" - kind: "colleague" - trust: 5 - notes: "On-station coordinator. Sabel confirms transit timing, Devra coordinates local pickup. Professional respect, no warmth." - -tolerance: - threshold: 4 - description: > - Low tolerance for operational risk. Sabel does not absorb pressure — at - the first sign of compromise, the connection is cut. Self-preservation - over loyalty. - -information: - knows: - - "contraband.supply_chain" - - "contraband.lattice_components" - - "contraband.medical_grade" - access_tier: "insider" - -contentment: - level: 2 - description: > - Functional satisfaction. The business works, the money flows. No - emotional investment in the Sova operation or its people. - -tells: - - trigger: "during rare on-station visits" - behavior: "Moves with purpose, avoids social spaces, conducts business and leaves" - visible_to: "any" - -skills: - combat_trained: false - skills: - logistics: 7 - stealth: 5 - -trust_levels: - surface: > - Not accessible. Sabel does not engage with people outside the operation. - real: > - Operational only. Transit confirmations, shipment schedules, cargo - specs. "Transit confirmed for 22:00. Standard package. Don't be late." - secret: > - The wider supply network — where the contraband originates, who else - Sabel supplies, how deep the upstream operation runs. Not accessible - in v0.1. - -dual_lens: - smuggler: > - Supply source. Professional respect. Sabel's reliable — the timing is - always clean. Whatever happens on this end, the supply keeps coming. - detective: > - Data point. Ghost. Origin codes on flagged manifests trace to off-station. - Someone is sending this cargo. Finding who could crack the upstream network. - -notes: > - Upstream connection. The thread leading from the local smuggling operation - to the wider criminal supply chain. Sabel represents the layer above the - local ring — the bigger operation that views Sova as replaceable - infrastructure. Coldness is narrative content: the ring is disposable - to its supplier. diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/sera-venn.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/sera-venn.yaml deleted file mode 100644 index 2a726615f..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/sera-venn.yaml +++ /dev/null @@ -1,255 +0,0 @@ -# NPC Profile: Sera Venn — THE FRIEND (Detective) -# Source: wiki/characters/sera-venn.md -# Tier: 1 | Pattern: FRIEND | Motivation: WITNESS -# Triangles: worried-partner - -canonical_id: "npc:sera-venn" -display_name: "Sera Venn" -tier: 1 -pattern: "FRIEND" -motivation: "WITNESS" - -description: > - Lattice Commission field technician, 31 years old, posted to Sova Transit - District 14 months ago after a stressful border-system relay. The detective's - pre-existing institutional contact and closest personal ally in the district. - Sera is warm, competent, available — and sitting on unreported evidence. She ran - an unauthorized compliance check on Kael Davan's freight handling records after - her friend Naia confided worry about Kael's behavior. What she found (manifest - discrepancies tied to Kael's shifts) pointed to something she didn't want to see. - Reporting it destroys Naia's life. Not reporting it means Sera is concealing - evidence from the detective she calls a friend. The quiet life she wanted is gone. - -want: - primary: "Connection" - intensity: 8 - description: > - Keep her life stable and her friendships intact. - Sova was supposed to be quiet — routine calibration checks, scheduled - inspections, paperwork. For 12 months, it was exactly that. Then Naia started - confiding about Kael's late nights, and Sera's competence made her curious, and - her curiosity made her compromised. Secondary want: protect Naia from the - consequences of what Sera has discovered. Every helpful tip Sera shares with the - detective is shadowed by the evidence she's withholding. - -secret: > - Sera ran an unauthorized compliance check on Kael Davan's freight handling records - after Naia confided worry about Kael's behavior. She found manifest discrepancies - tied to Kael's shifts — containers that don't reconcile with incoming freight - manifests. She also found that the irregularities correlate with shifts where - Torek Lintar handles dock inspections. This is reportable evidence. Sera has not - reported it. She has been sitting on this information for approximately 6 weeks, - protecting Naia from the consequences. If the detective discovers the concealment, - Sera faces institutional consequences. If the ring discovers a Commission employee - has flagged their manifests, Sera is in physical danger. If Naia learns Sera - investigated Kael behind her back, the friendship is damaged regardless of motive. - -relationships: - - target: "npc:pc-detective" - kind: "friend" - trust: 8 - notes: > - Pre-existing institutional contact. Trained at adjacent postings, overlapped - on a compliance sweep two years ago. Genuine mutual respect. When the detective - arrives, Sera is genuinely glad — a familiar face who speaks her language. - Now keeping evidence from the detective. Every helpful tip is contaminated by - what she's NOT sharing. - - target: "npc:naia-tamm" - kind: "friend" - trust: 9 - notes: > - Closest friend on the station, 10 months. Met at the bar. Naia teaches - station kids, represents the community Sera embedded herself in. Naia confided - worry about Kael — this triggered the compliance check. Sera now knows more - about Kael than Naia does and can't share it. - - target: "npc:torek-lintar" - kind: "colleague" - trust: 1 - notes: > - Avoidance target. Sera's compliance check found manifest irregularities - correlating with Torek's inspection shifts. Being near Torek while sitting on - evidence about his patterns feels like compounding risk. Sera leaves the bar - when Torek arrives — the avoidance pattern IS the contradiction. - - target: "npc:lera-sessik" - kind: "friend" - trust: 5 - notes: "Bar regular at The Last Shift. Lera knows Sera as a quiet Commission employee who tips well and keeps to her corner booth." - -tolerance: - threshold: 7 - description: > - High — disciplined and emotionally controlled. Tolerates institutional isolation, - minor ethical compromises, and the cognitive dissonance of helping the detective - while hiding evidence. What pushes toward breaking: the detective asking about - manifest discrepancies, Naia's worry escalating into action, Torek's spending - becoming more visible. What breaks her: direct confrontation from the detective - with evidence of concealment (Sera can't lie to the detective's face), Naia - being hurt by consequences Sera tried to prevent, institutional pressure from - Commission noticing the unfiled check. - -routine: - summary: > - 7 routine entries covering full day cycle: - 1. Morning diagnostics (07:30-08:00) — Commission kiosk, Level 3, calibration - checks. - 2. Field rounds (08:00-12:00) — compliance verification at hub equipment, bar - terminal, residential nodes. - 3. Lunch (12:00-13:00) — vendor near logistics hub. - 4. Afternoon rounds (13:00-15:00) — report filing at Commission kiosk. - 5. Off-shift transition (15:00-15:30) — residential pod. - 6. Bar hours (15:30-18:00, The Last Shift) — early-evening regular, meets Naia, - corner booth. - 7. Home or quiet return (18:00-22:00). - Deviations: leaves bar abruptly when Torek arrives (contradiction pattern — - three occurrences). Increased helpfulness to detective (overcompensation). - Extended time at Commission kiosk (compulsive rechecking). Avoids hub during - shifts where Kael's discrepancies concentrate. - -information: - knows: - - "investigation.manifest_discrepancy" - - "investigation.shift_mismatch" - - "relationship.kael_naia_connection" - - "world.shift_schedule" - - "world.sova_district_layout" - access_tier: "peer" - -contentment: - level: -1 - description: > - Moderate, declining. Was content — Sova was the calm posting she needed. Routine, - a friend, social life at the bar. The compliance check changed everything. Can't - un-know what she found. Every evening at the bar shadowed by concealed evidence. - Every conversation with Naia a reminder of why. Every interaction with the - detective a test of how much longer she can sustain it. - -personality: - demeanor: "competent, slightly wry, conversational but precise" - social_style: "professional warmth — explains things, provides context, frames information" - stress_response: "controlled presentation, redirects rather than goes silent — the redirect itself is the tell" - humor: "dry when relaxed, absent when managing concealment" - -tells: - - trigger: "Torek Lintar enters the bar" - behavior: "Makes an excuse and leaves within 2-3 minutes. Three different excuses across the vertical slice — early shift, headache, kiosk check. The timing doesn't vary." - visible_to: "any" - - trigger: "detective asks about the district" - behavior: "Volunteers extra information — names, routines, background context. Overcompensation for what she's withholding." - visible_to: "forward" - - trigger: "anyone mentions freight, manifests, or compliance" - behavior: "Changes subject smoothly. Topic deflection — steers away from Kael-adjacent topics." - visible_to: "forward" - - trigger: "after hours or between shifts" - behavior: "Extended time at Commission kiosk — rechecking compliance data, compulsive verification she hasn't been caught." - visible_to: "peripheral" - -skills: - combat_trained: false - skills: - lattice_diagnostics: 8 - compliance_documentation: 7 - data_analysis: 7 - social_intelligence: 6 - -triangle_membership: - - "worried-partner" - -trust_levels: - surface: > - Warm Commission field tech. Shares district background freely — who the regulars - are, shift schedules, maintenance corridor shortcuts. "There you are. Grab a - seat — Naia was here earlier. Lera's doing that thing with the grain spirit - again. Don't ask, just trust me and order the ale." - real: > - Institutional access — manifest cross-referencing, lattice registration queries, - compliance history. District social fabric insider through 10 months of - bartending observation. Genuine friendship with Naia, professional rapport with - the detective. Shares everything except the one thing that matters. - secret: > - Unreported evidence. Manifest discrepancies tied to Kael's shifts. Unauthorized - compliance check. Six weeks of concealment to protect Naia. "I don't know what - you're looking for. I told you everything I know. If you're asking whether I'm - hiding something — I'm a field tech, not an analyst." - -friend_arc: - bonded_character: "detective" - phases: - - phase: 1 - description: > - Trust. Sera is warm, competent, available. Waves the detective over to her - corner booth. Shares district background freely. Introduces Naia on the - second visit. Orders the detective a drink. Feels like the one genuine - relationship in an unfamiliar place. - trigger: "Game start, first bar visits (0-10 minutes)" - routine_deviation: "None — baseline comfortable. Sera is punctual, sociable, informative." - - phase: 2 - description: > - Background Data. Sera mentions Naia naturally — a friend from the district. - Naia joins them once. Easy, genuine rapport. Sera also mentions running - compliance checks as routine. Social embeddedness established: Sera has - personal relationships in the district, not just institutional ones. - trigger: "10-15 minutes. Social context accumulating." - routine_deviation: "None visible. Sera is building the detective's picture of the district." - - phase: 3 - description: > - The Pattern. The detective observes Sera leaving the bar when Torek arrives. - Three times. Three different excuses. The detective's training fires on the - third occurrence — pattern recognition, not anomaly detection. Color shifts - from green to amber. Slower than Kael's contradiction — cumulative, not - sudden. - trigger: "15-20 minutes. Third observed departure when Torek enters." - routine_deviation: "Departure from bar correlates with specific NPC arrival. Excuse variety masks behavioral consistency." - - phase: 4 - description: > - The Question. Detective asks Sera about Torek directly. Sera deflects — - Torek is just loud, she doesn't like loud drunks. Plausible. But the - detective notices the controlled delivery, the shoulder shift, the topic - change that follows. The deflection is the tell. - trigger: "20-25 minutes. Detective initiates dialogue about the avoidance pattern." - routine_deviation: "Sera becomes more controlled. Warmth present but calibrated. Steers conversations away from freight and manifests. Compensates with extra helpfulness on other topics." - - phase: 5 - description: > - Contaminated Trust. Sera continues being helpful — same time, same booth, - same district background. But the detective is now watching. Every piece of - helpful information from Phase 1 is retroactively contaminated. Was she - genuinely helpful, or steering away from manifests? Was introducing Naia - friendship, or preemptive framing? Three paths open: trust test (direct - confrontation about concealment), institutional (report through Commission - channels), observation (watch and build parallel case). - trigger: "25-30 minutes. Post-confrontation, remainder of vertical slice." - routine_deviation: "Surface behavior returns to baseline. Trust is structurally damaged. The FRIEND arc changes the past, not just the present." - -dual_lens: - smuggler: > - Commission woman at the bar. Field tech, not investigator — but still Commission. - Keep an eye on her. If observant across multiple visits, might notice the - avoidance pattern: "Sera left again. That's twice when Torek showed up. Probably - hates his singing." On replay, the smuggler understands Sera's avoidance wasn't - about personality — it was about what she found and was hiding. - detective: > - THE FRIEND. Only ally in a district that doesn't want you here. Institutional - peer, personal friend, district guide. Monologue shifts from fond ("Good to see - Sera. She always was the reliable one.") to analytical doubt ("She's not lying. - But she's not telling me everything. Sera, what do you know?"). The color shift - from green to amber is the moment the safe harbor is contaminated. Maximum - emotional weight. - -notes: > - Tier 1 FRIEND NPC, bonded to detective. FRIEND + WITNESS: the concealment - betrayal. "I was your friend AND I was hiding evidence." The detective trusted - Sera as safe harbor (FRIEND) while Sera sat on the exact data the detective - needed (WITNESS). The contamination is retrospective — every helpful tip - recontextualized once concealment surfaces. Was helpfulness genuine, or - compensation? The answer is both, and that ambiguity is the emotional payload. - - Parallels Kael (smuggler's FRIEND) with different contradiction mechanics: - cumulative pattern recognition vs. single spatial observation, institutional - concealment vs. operational security breach, slow doubt vs. sudden alarm. Voice: - competent, slightly wry, precise. Uses complete sentences. When deflecting, - redirects rather than goes silent — the redirect IS the tell. - - The avoidance pattern must be THREE observed departures. Detective's training - recognizes patterns, not anomalies. One is nothing, two is coincidence, three - is data. Naia references establish friendship depth before it becomes - load-bearing. Commission background establishes access level before it becomes - evidence of capability. diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/sess.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/sess.yaml deleted file mode 100644 index cf54927eb..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/sess.yaml +++ /dev/null @@ -1,98 +0,0 @@ -# NPC Profile: Sess Kolvur -# Source: wiki/characters/sess.md -# Tier 3 — reduced content, essential axes only - -canonical_id: "npc:sess" -display_name: "Sess Kolvur" -tier: 3 -pattern: "ANCHOR" -motivation: "CIVILIAN" - -description: > - Evening bartender at The Last Shift under Lera Sessik. Observant, discreet, - laconic. Sees everything from behind the bar and says nothing. In a district - full of people with secrets, Sess's lack of hidden agenda is camouflage. - -want: - primary: "Safety" - description: > - Stability. - Do the job. Go home. Don't get involved. The work is steady, the tips are - adequate, the regulars are predictable. No ambitions beyond maintaining - this equilibrium. - -secret: > - None. Sess genuinely has no hidden agenda. His ordinariness is real, not - performed — which makes him uniquely hard to read, because there is nothing - to find. - -routine: - summary: > - 14:00-02:00 bar shift (arrives before opening, stays through close). - Breaks in the back — never leaves the bar during shift. Off-days at home, - no bar social life. Sess separates work from everything else. - -personality: - demeanor: "observant, discreet, laconic" - social_style: "minimal engagement, professional warmth only" - stress_response: "goes quieter, focuses on tasks, avoids eye contact" - -relationships: - - target: "npc:lera-sessik" - kind: "subordinate" - trust: 6 - notes: "Employer. Professional respect. Lera runs the bar, Sess keeps the bar running." - -tolerance: - threshold: 7 - description: > - High threshold — years of bartending have made Sess difficult to rattle. - Breaks only under direct personal threat, not ambient district tension. - -information: - knows: - - "world.sova_district_layout" - - "world.shift_schedule" - access_tier: "public" - -contentment: - level: 5 - description: > - Genuinely content. The job is what it is, and Sess wants nothing more. - Quiet satisfaction in routine, not resignation. - -tells: - - trigger: "customer asking probing questions" - behavior: "Wipes the same spot on the bar repeatedly, eyes down, responses shorten" - visible_to: "forward" - -skills: - combat_trained: false - skills: - social: 4 - observation: 7 - -trust_levels: - surface: > - Professional bartender. Pours drinks, nods, minimal small talk. - "What'll it be?" - real: > - After repeated visits: fragments of observation, never full narratives. - "That group's been coming in together for months. Same table." - secret: > - Sess has assembled patterns no one else has noticed — who drinks with - whom, who changed habits, who started avoiding whom. Unlocking this - requires sustained investment in a character who has no reason to share. - -dual_lens: - smuggler: > - Background. Safe. Sess is behind the bar — reliable, doesn't talk. - detective: > - Potential long-game source. The bartender sees the whole room every night. - Getting Sess to share observations will take repeated visits and trust. - -notes: > - Ambient observer. Social wallpaper with observational depth — present every - evening, invested in nothing. Function is atmospheric: proving the bar is a - real place where real service workers show up and pour drinks. v0.2 potential - for tier promotion if Sess's quiet observations become narratively relevant. diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/tav.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/tav.yaml deleted file mode 100644 index e50b72b0b..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/tav.yaml +++ /dev/null @@ -1,107 +0,0 @@ -# NPC Profile: Tav Merik -# Source: wiki/characters/tav.md -# Tier 3 — reduced content, essential axes only - -canonical_id: "npc:tav" -display_name: "Tav Merik" -tier: 3 -pattern: "SYSTEM" -motivation: "CIVILIAN" - -description: > - The ring's lookout — youngest member (early 20s), stationed at strategic - positions during operations to watch for security patrols and unexpected - personnel. Takes the job seriously because it is the first responsibility - anyone has trusted him with. Hypervigilant during operations — effective - on watch but visibly nervous to anyone who knows what to look for. - -want: - primary: "Connection" - description: > - Belonging. - Do the watch. Don't get noticed. Prove useful. The role is simple — watch, - signal, move — but it is the first thing Tav has been trusted with and - the consequences of failure are immediate and severe. - -secret: > - Ring member. Lowest rung — watches corridors during courier runs. Knows - routes and timing but not names, structure, or the operation's full scope. - -routine: - summary: > - Legitimate: irregular shift work at the logistics hub (cargo staging, - equipment prep). Picks up shifts as available, giving flexible hours that - align with ring operations. Ring: positioned at corridor intersections - during night-shift courier runs (1-2x per week), 30-60 minute windows, - signals Renn via lattice. Off-duty: home or wandering the district. - Does not drink at the bar — young, broke, socially peripheral. - -personality: - demeanor: "quiet, watchful, nervous" - social_style: "peripheral — doesn't initiate, responds when addressed" - stress_response: "hypervigilance, every footstep sounds like a patrol" - -relationships: - - target: "npc:renn" - kind: "colleague" - trust: 5 - notes: "Courier. Tav signals Renn during operations. Operational relationship, not personal." - -tolerance: - threshold: 3 - description: > - Low. Tav is young and anxious — pressure cracks him quickly. The nervous - energy that makes him effective on watch also makes him the ring member - most likely to break under interrogation. - -information: - knows: - - "location.smuggling_route" - - "location.surveillance_gaps" - - "world.shift_schedule" - - "relationship.ring_membership" - access_tier: "insider" - -contentment: - level: -1 - description: > - Anxious. The belonging is real but so is the fear. Tav wants to matter - but the danger of the work gnaws at him constantly. - -tells: - - trigger: "during ring operation windows" - behavior: "Stands at corridor intersections, weight shifting, scanning both directions" - visible_to: "any" - - trigger: "when approached unexpectedly" - behavior: "Flinches, then overcompensates with casual posture" - visible_to: "forward" - -skills: - combat_trained: false - skills: - observation: 6 - stealth: 4 - -trust_levels: - surface: > - Quiet young worker picking up shifts. "Just waiting for the next - roster slot. You know how it is." - real: > - Operational awareness — routes, timing, signal protocols. Won't - volunteer this without trust or pressure. - secret: > - Ring membership. Knows he is part of something larger but cannot - describe its shape. Catching Tav reveals a thread but not the tapestry. - -dual_lens: - smuggler: > - Trusted lookout. Known quantity. Tav's on watch — he doesn't miss anything. - detective: > - Loitering youth. Anomaly if context is right. Young worker with irregular - shifts, seen near freight corridors outside posted hours. Probably nothing. - -notes: > - Peripheral ring member at the lowest operational level. Knows routes and - timing, not names or structure. Most likely to be caught, least likely to - have useful information. Catching Tav reveals a thread but not the tapestry. - v0.2 potential: a young person trapped in a role he barely understands. diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/tev.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/tev.yaml deleted file mode 100644 index 0cd315a4b..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/tev.yaml +++ /dev/null @@ -1,58 +0,0 @@ -# NPC Profile: Tev Osel -# Tier 3 — NOBODY / CIVILIAN -# Flat NPC — noise floor. Stands like a lookout. Is waiting for his partner. -# No ring connection. The resemblance to surveillance posture is accidental. -# Ticket: #307 | Sprint: 12 - -canonical_id: "npc:tev" -display_name: "Tev Osel" -tier: 3 -pattern: "NOBODY" -motivation: "CIVILIAN" - -description: > - Cargo staging worker, late 20s. Has an unfortunate habit of positioning - himself exactly where someone running corridor surveillance would stand — - at junctions, in doorways, facing the approach. This is where he waits for - Kosse, his partner, who works the late freight bay and takes the same route - back through the maintenance corridors. Tev times his breaks to the late - route schedule. He has no idea how this looks to someone tracking corridor - traffic. No ring connection. No secrets. - -want: - primary: "Connection" - description: > - For Kosse to finish shift on time for once. It never happens on time. - -routine: - summary: > - Works cargo staging 06:00-14:00. During break windows, drifts to corridor - junction C-4 to wait for Kosse on the late freight route home. Returns to - staging when Kosse doesn't appear within the break window. After shift: - walks home with Kosse when schedules align, alone otherwise. The junction - positioning is consistent and timing-predictable. - -personality: - demeanor: "patient, unassuming, mildly distracted when waiting" - social_style: "polite if addressed, slightly confused why anyone is talking to him" - stress_response: "checks lattice. Waits longer." - -tells: [] - -skills: - combat_trained: false - skills: - cargo_staging: 6 - -trust_levels: - surface: > - Waiting for someone. "Kosse's running late again. You know how the freight - bay is." - -notes: > - NOBODY + CIVILIAN: pure noise floor. The "seems important but isn't" quality - is entirely positional — standing at corridor junctions, watching approach - traffic, checking the time, stationing himself in threshold positions. All - of this is to meet a partner after shift. One memorable observable trait: - weight always on the wrong foot, perpetually glancing the same direction. - Paula owns the trait design. Mellanie owns the lines (#307). diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/torek-lintar.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/torek-lintar.yaml deleted file mode 100644 index 8852103e3..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/torek-lintar.yaml +++ /dev/null @@ -1,139 +0,0 @@ -# NPC Profile: Torek Lintar -# Source: wiki/characters/torek-lintar.md -# Tier 2 | CATALYST + CIVILIAN | Dock worker, bar regular - -canonical_id: "npc:torek-lintar" -display_name: "Torek Lintar" -tier: 2 -pattern: "CATALYST" -motivation: "CIVILIAN" - -description: > - Dock worker on the day shift and bar regular at The Last Shift. Twenty-nine years - old, single, and for the first time in his life has money beyond rent and food. - The source of that money is deliberately ambiguous — ring income, side hustle, or - inheritance. Torek's visible spending is the tell; what it tells depends on a truth - the player never fully confirms. His generosity disrupts the district's equilibrium - without intent. - -want: - primary: "Wealth" - intensity: 5 - description: > - Enjoy the good life while it lasts. - Torek is young, single, and flush for the first time. He buys rounds, tips well, - has a new jacket and lattice accessories. He is performing generosity — and the - performance is the problem. In a district where everyone knows everyone's salary, - visible wealth is a signal that demands explanation. Secondary want: be seen, be - liked, be the generous one. - -secret: > - Spending beyond a standard dock worker's means. The source is deliberately - ambiguous — ring compensation for inspection negligence, legitimate freelance - freight brokering, or an inheritance spent unwisely. The investigation can reach - any conclusion depending on the evidence path. The ambiguity is load-bearing: - Torek himself may not have the answer the player wants. - -relationships: - - target: "npc:lera-sessik" - kind: "friend" - trust: 6 - notes: "Bar owner. One of her best customers. She appreciates the spending, worries about the attention it draws." - - target: "npc:olin" - kind: "friend" - trust: 4 - notes: "New arrival. Torek has been friendly — buys drinks, offers bar introductions. Genuine hospitality or cultivation." - - target: "npc:harek" - kind: "colleague" - trust: 3 - notes: "Card game partner at the bar. They play regularly. Torek usually wins, which is itself notable." - -tolerance: - threshold: 3 - description: > - Low. Torek is not built for pressure. He is enjoying a good time and has not - thought about consequences. If confronted about spending, he gets defensive then - nervous. If pressured by the ring to be less visible, he complies resentfully - but cannot actually change his habits. - -routine: - summary: > - 4 routine entries covering full day cycle: - 1. Day shift (06:00-14:00) — dock inspection and cargo handling at logistics hub. - 2. Shift transition (14:00-14:30) — walks to bar district. - 3. Bar hours (14:30-20:00, The Last Shift) — drinks, card games, socializing. - 4. Home or extended bar session (20:00+) on end-of-cycle days. - -information: - knows: - - "world.shift_schedule" - - "world.sova_district_layout" - access_tier: "public" - -contentment: - level: 6 - description: > - High — for now. Torek is living his best version of life on Sova. Money, - friends, status at the bar. This contentment is fragile because it depends on - income that may not be sustainable and visibility that is attracting the wrong - attention. - -personality: - demeanor: "generous, outgoing, conspicuously comfortable" - social_style: "buys rounds, tips well, shares freely — needs to be around people" - stress_response: "gets defensive, then nervous, then loud" - -tells: - - trigger: "after-shift bar arrival" - behavior: "Visible spending — buying rounds, new accessories, generous tips" - visible_to: "any" - - trigger: "three or more drinks consumed" - behavior: "Volume increases, stories get bigger, discretion decreases" - visible_to: "any" - - trigger: "anyone asks directly about income or spending" - behavior: "Gets defensive — posture stiffens, voice drops, deflects with 'overtime pays' or 'I work hard'" - visible_to: "forward" - -skills: - combat_trained: false - skills: - dock_inspection: 6 - cargo_handling: 6 - social: 5 - card_games: 4 - -triangle_membership: - - "bar-tensions" - -trust_levels: - surface: > - Friendly, generous bar regular. Buys rounds, makes introductions, tells stories. - "Next round's on me. No — don't argue. What's the point of working the docks if - you can't buy your friends a drink?" - real: > - Knows hub operations, dock procedures, inspection protocols, shift patterns. - Bar social dynamics insider. If ring-connected, knows which containers get less - careful inspection. - secret: > - The actual source of his money. Whether ring compensation, side hustle, or - inheritance — the answer Torek gives depends on the pressure applied, and may - not be the truth. - -dual_lens: - smuggler: > - Torek is a liability. His spending draws attention the operation cannot afford. - The smuggler reads Torek's generosity as a security risk. "Torek's buying rounds - again. He needs to calm down before someone starts asking questions." - detective: > - Torek is a financial tell. A dock worker buying rounds and wearing new - accessories flags immediately. The question is whether the money comes from - something illegal or mundane. "Lintar, T. — dock worker. Spending pattern - inconsistent with standard logistics salary. Worth a closer look." - -notes: > - CATALYST + CIVILIAN creates the accidental signal: "He doesn't know he's a - liability." Torek's disruption comes from innocence, not deliberate action. You - cannot negotiate with someone who does not know they are a problem. For the - smuggler, a financial tell that cannot be silenced without revealing why it - matters. For the detective, a spending pattern that could mean anything. The - ambiguity is load-bearing precisely because Torek himself does not have the answer. diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/voss.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/voss.yaml deleted file mode 100644 index 670849133..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/voss.yaml +++ /dev/null @@ -1,167 +0,0 @@ -# NPC Profile: Arvo Voss -# Source: wiki/characters/voss.md -# Tier 2 | SYSTEM + OPERATOR | Logistics Hub shift supervisor - -canonical_id: "npc:voss" -display_name: "Arvo Voss" -tier: 2 -pattern: "SYSTEM" -motivation: "OPERATOR" - -description: > - Shift supervisor at the Sova Transit District Logistics Hub. Eleven years on the - day shift. Competent, cautious, resentful. Takes a cut from the smuggling ring to - smooth inspections and create coverage windows in the schedule. Voss has positional - authority on the floor but operational authority belongs to Nils Davan, who gives - orders through intermediaries. The tension between institutional title and criminal - subordination defines him. If the detective follows the manifest trail, it leads to - Voss's schedule first. - -want: - primary: "Safety" - intensity: 6 - description: > - Operational stability. - Keep his shift running without incident. Clean handoffs, zero incident reports. - The smuggling operation introduces variables he cannot control, but the cut he - receives smooths the rough edges of a supervisor's salary. Secondary want: - maintain authority despite being undermined by Nils Davan, who gives ring orders - that override Voss's scheduling decisions. He complies because the money is good - and because refusing Nils has consequences he does not want to test. - -secret: > - Takes a cut from the ring to smooth inspections and create schedule coverage - windows. Most hub workers suspect this; nobody says it. Deeper: Voss is terrified - that escalating volume will get him caught. He has been shift supervisor long enough - that any investigation into hub operations starts with him. He has no exit strategy. - Institutional exposure is his core vulnerability — the most visible member of the - ring's logistics chain. - -relationships: - - target: "npc:kael-davan" - kind: "subordinate" - trust: 4 - notes: "Subordinate and ring colleague. Voss respects Kael's competence but resents taking orders (via Nils) from someone who technically works under him. Functional, tense." - - target: "npc:maret-korr" - kind: "colleague" - trust: 3 - notes: "Freight scheduler. Voss needs Maret functioning and quiet. He is aware she has noticed discrepancies. Manages her through professional attention — making sure she feels valued but never asked to look deeper." - - target: "npc:resha" - kind: "subordinate" - trust: 2 - notes: "New hire. Voss is professionally competent with Resha but wants her to stop asking about irregularities." - - target: "npc:drin" - kind: "subordinate" - trust: 3 - notes: "Dock inspector, compromised. Voss knows about Drin's gambling debt and needs Drin's inspections to stay clean." - - target: "npc:pc-smuggler" - kind: "subordinate" - trust: 3 - notes: "Dock worker, ring member. Professional respect, low warmth. Voss takes a cut and the smuggler knows it." - -tolerance: - threshold: 7 - description: > - Moderate-high. Has been doing this for years and can handle routine pressure. - Cannot handle escalation — higher volume, tighter windows, more risk. Nils - pushing for bigger shipments is what keeps Voss awake at night. If an - investigation reaches his desk, Voss will cooperate with whoever offers the - best deal. Pragmatic, not loyal. - -routine: - summary: > - 6 routine entries covering full day cycle: - 1. Morning arrival (05:45, Hub) — reviews shift manifest. - 2. Day shift supervision (06:00-14:00, dock floor) — schedules, manifests, - personnel management. Adjusts schedules as needed to create coverage windows - for ring operations (invisible unless you know what to look for). - 3. Break (10:30, break room) — coffee, reviews afternoon handoff notes. - 4. Shift transition (14:00-14:30) — handoff to swing supervisor. - 5. Occasional bar visit (14:30-16:00, The Last Shift) — not a regular, Voss - drinks at home. - 6. Ring scheduling — adjusts schedules during normal work to create coverage - windows. Done within regular workflow. - -information: - knows: - - "contraband.ring_exists" - - "investigation.manifest_discrepancy" - - "investigation.shift_mismatch" - - "relationship.ring_membership" - - "relationship.trust_network" - - "world.shift_schedule" - access_tier: "insider" - -contentment: - level: 2 - description: > - Moderate-low. Voss had a functional life before the ring escalated. The extra - money was welcome. The extra risk is not. A man who wanted a quiet career and - ended up as the load-bearing wall in a smuggling operation. - -personality: - demeanor: "cautious, professional, resentful beneath the surface" - social_style: "institutional, maintains authority through procedure and competence" - stress_response: "overthinks, plans contingencies, hates surprises" - humor: "minimal — dry when present, never at work" - -tells: - - trigger: "ring requests schedule change" - behavior: "Reprocesses manifests multiple times. Nervous schedule adjustments visible in revision frequency." - visible_to: "peripheral" - - trigger: "Nils has given orders Voss disagrees with" - behavior: "Clipped, short responses to Kael. Tone shifts from professional to curt." - visible_to: "any" - - trigger: "ring operations in progress (containers being rerouted)" - behavior: "Avoids break room. Does not want to be seen idle during active rerouting." - visible_to: "peripheral" - -skills: - combat_trained: false - skills: - shift_management: 8 - freight_logistics: 8 - manifest_processing: 7 - personnel_scheduling: 7 - -triangle_membership: - - "hub-power" - - "worried-knowledge" - -trust_levels: - surface: > - Professional shift supervisor. Runs a tight operation. Gives procedural answers - and defers to institutional authority. "Everyone's got their routine. No complaints - from that crew." - real: > - Ring-aware. Manages coverage windows, handles schedule manipulation, knows which - inspectors are compromised. Resents the Davan siblings but complies. - secret: > - Terrified of exposure. No exit strategy. Would cooperate with whoever offers the - best deal if cornered. Knows the escalating volume is unsustainable. - -dual_lens: - smuggler: > - Knows Voss is compromised and stressed. Reads Voss's schedule changes as - operational signals. Voss is management to navigate, not a friend. "Voss is tense - today. Nils must have changed the window again." - detective: > - Sees an experienced shift supervisor who is anxious about something. Schedule - irregularities are the first data point. Voss is the institutional face of the - hub — any investigation starts here. "The shift supervisor — Voss. Runs a tight - operation on paper. But he reworks manifests more than the workload justifies." - -notes: > - SYSTEM + OPERATOR: corrupted machinery. The system works — for the wrong people. - Voss IS the institutional process and he actively runs it, meaning the legitimate - logistics infrastructure and the criminal operation share the same human engine. - - Key authoring guidance: Voss is middle management, not a villain. His resentment - toward Nils is genuine. His competence is real. His fear of exposure drives - pragmatic compliance, not loyalty. Write him as a man trapped by his own - institutional visibility — the schedule is both his professional pride and his - criminal exposure. When stressed, he gets procedural, not aggressive. - - Triangle dynamics: In hub-power (Voss-Kael-Nils), Voss has the title but not the - power. In worried-knowledge (Maret-Drin-Voss), Voss needs everyone quiet without - revealing why. diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/pools.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/pools.yaml deleted file mode 100644 index 729963f03..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/pools.yaml +++ /dev/null @@ -1,78 +0,0 @@ -# Pool definitions for Sova Transit District -# Seed-time selection system. Architecture supports N candidates; v0.1 has 1 each. -# Format per seed-configuration-schema.md section 5.2 -# Referenced by: seed config generation (Sprint 5+), content loader (#408) - -pools: - - pool_id: "transit:friend_smuggler" - category: npc_role - description: > - Smuggler's FRIEND (D-034) — closest colleague, emotional anchor. - Production-level complex NPC exercising every content pipeline. - v0.1: Kael Davan (dock worker, ring member). v0.2+: expand to - multiple dock worker candidates with different contradiction arcs. - constraints: - - must_be_in_template: "logistics-hub" - - must_have_pattern: "FRIEND" - - bonded_character: "smuggler" - candidates: - - npc_id: "npc:kael-davan" - weight: 1 - - - pool_id: "transit:friend_detective" - category: npc_role - description: > - Detective's FRIEND (D-034) — social anchor, information holder. - Production-level complex NPC. Contradiction: sitting on unreported - evidence about Kael's manifest discrepancies, protecting Naia. - v0.1: Sera Venn (Commission field tech, bar regular). - constraints: - - must_have_pattern: "FRIEND" - - bonded_character: "detective" - candidates: - - npc_id: "npc:sera-venn" - weight: 1 - - - pool_id: "transit:bar_regulars" - category: npc_group - description: > - NPCs who frequent The Last Shift as regulars. Fills bar-regular - template slots. v0.1: fixed set (all selected). v0.2+: seeder - draws a subset from a larger candidate pool for variety. - Note: regulars include cross-template visitors (reference links) - who frequent the bar location but are owned by other templates. - constraints: - - frequents_location: "the-last-shift" - candidates: - - npc_id: "npc:sera-venn" - weight: 1 - - npc_id: "npc:resha" - weight: 1 - - npc_id: "npc:kael-davan" - weight: 1 - - npc_id: "npc:torek-lintar" - weight: 1 - - npc_id: "npc:drin" - weight: 1 - - - pool_id: "transit:compromised_inspector" - category: npc_role - description: > - The Commission inspector compromised by the ring. Access to authority - systems, gambling debt makes them vulnerable. v0.1: Torek Lintar. - constraints: - - must_have_access: "authority" - - must_have_faction: "Commission" - candidates: - - npc_id: "npc:torek-lintar" - weight: 1 - - - pool_id: "transit:primary_contraband" - category: contraband - description: > - What the ring is smuggling (D-037). v0.1: unlicensed lattice - components — aftermarket neural lattice modifications. Moral - ambiguity: the ring is smuggling access, not weapons. - candidates: - - id: "contraband:lattice-components" - weight: 1 diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/triangles/informant-question.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/triangles/informant-question.yaml deleted file mode 100644 index d5739506d..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/triangles/informant-question.yaml +++ /dev/null @@ -1,56 +0,0 @@ -# Triangle 5: Informant Question — mundane workplace gossip and suspicion -# Passive — runs on background simulation, provides investigation noise -canonical_id: informant-question -display_name: "The Informant Question" -description: > - Torek Lintar (dock inspector, compromised by gambling debt) is observed - by Drin (dock worker) and Olin (bystander/new arrival). Drin has noticed - Torek's inspection patterns are irregular. Olin overhears workplace gossip - and doesn't know what's significant. This triangle generates the kind - of low-level workplace suspicion that exists in any tight community — - people notice things, talk about them, and form theories. For the - detective, it's signal mixed with noise. - -members: - - npc: "npc:torek-lintar" - role: "inspector — compromised, inspection patterns irregular" - - npc: "npc:drin" - role: "worker — notices Torek's odd behavior, gossips about it" - - npc: "npc:olin" - role: "bystander — overhears gossip, forms theories, asks questions" - -forks: - - id: gossip-spreads - condition: > - Drin's observations about Torek's inspection patterns reach - enough people that the gossip becomes ambient social knowledge. - outcomes: - - id: dismissed-as-gossip - description: > - The community dismisses Drin's observations as workplace gossip. - Torek's reputation survives. The information exists but isn't - treated as significant — noise floor functioning as intended. - effects: - - "torek.position_integrity unchanged" - - "community treats observations as routine gossip" - - "detective must distinguish signal from noise" - - id: torek-noticed - description: > - Enough people notice Torek's patterns that his behavior becomes - a topic of casual conversation. Not accusatory — just curious. - The detective can pick up on ambient awareness. - effects: - - "torek.behavior_flags += noticed,defensive" - - "ambient dialogue includes references to inspection patterns" - - "detective gains investigation.inspection_anomaly (suspects level)" - -resolution_states: - - id: gossip-fades - description: > - The topic loses interest. Workplace gossip moves on. Torek's - irregularities are forgotten by everyone except potentially - the detective. - - id: ambient-suspicion - description: > - A low-level awareness persists in the community. Nothing actionable, - but Torek is slightly more careful and slightly more defensive. diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/triangles/worried-knowledge.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/triangles/worried-knowledge.yaml deleted file mode 100644 index 76a5d6034..000000000 --- a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/triangles/worried-knowledge.yaml +++ /dev/null @@ -1,64 +0,0 @@ -# Triangle 3: Worried Knowledge — unreported evidence and protective silence -# Passive tension (D-087) — background pressure, not a direct player decision point -canonical_id: worried-knowledge -display_name: "Worried Knowledge" -classification: passive_tension -description: > - Sera Venn (Commission field tech, detective's FRIEND) is sitting on - unreported evidence about Kael's manifest discrepancies. She's protecting - Naia Tamm (Kael's partner, who confided in her about Kael's late nights). - Torek Lintar (compromised inspector) is the subject — his gambling debt - makes him the institutional weak point, and Sera's evidence implicates - his inspection lapses. Sera's avoidance of Torek at the bar is the - observable tell. - -members: - - npc: "npc:sera-venn" - role: "holder — Commission tech sitting on unreported evidence" - - npc: "npc:torek-lintar" - role: "subject — compromised inspector whose lapses Sera has documented" - - npc: "npc:naia-tamm" - role: "protected — Kael's partner, confided worries to Sera" - -forks: - - id: evidence-disclosure - condition: > - Detective builds enough trust with Sera to trigger the disclosure - decision. Sera must choose between institutional duty, friendship - with Naia, and protecting the detective from a compromised colleague. - outcomes: - - id: sera-reports - description: > - Sera reports her evidence through official channels. Torek's - inspection lapses are flagged. The investigation gains institutional - data but Naia loses her protective buffer. - effects: - - "torek.position_integrity = cracking" - - "sera.trust_level (from naia) drops" - - "detective gains investigation.inspection_lapses fact" - - id: sera-protects - description: > - Sera stays silent to protect Naia. The evidence remains buried. - Detective must find the institutional thread through other means. - Sera's avoidance pattern intensifies as she manages the secret. - effects: - - "sera.behavior_flags += avoidance_pattern,evasive" - - "sera.position_integrity = thin" - - "naia remains protected" - - id: sera-confides - description: > - Sera tells the detective privately, off the record. The detective - gains the information but must decide what to do with it. Tests - the detective's institutional loyalty. - effects: - - "detective gains investigation.inspection_lapses fact (informal)" - - "sera.trust_level (toward detective) = trusted" - - "sera.risk_assessment = moderate (off-book disclosure)" - -resolution_states: - - id: torek-exposed - description: Torek's compromised status becomes known to the investigation. - - id: knowledge-buried - description: Sera's evidence stays unreported. Avoidance pattern is the only tell. - - id: informal-disclosure - description: Detective knows but has no official evidence. Must find formal proof. diff --git a/content/global/factions/lattice-commission.yaml b/content/global/factions/lattice-commission.yaml deleted file mode 100644 index b728e7282..000000000 --- a/content/global/factions/lattice-commission.yaml +++ /dev/null @@ -1 +0,0 @@ -# Faction: lattice-commission diff --git a/content/global/knowledge/investigation.yaml b/content/global/knowledge/investigation.yaml deleted file mode 100644 index d85c36a9b..000000000 --- a/content/global/knowledge/investigation.yaml +++ /dev/null @@ -1,127 +0,0 @@ -# Fact catalog: investigation -# Case-specific findings — events witnessed, evidence discovered, NPC behaviors confirmed -# Source: docs/design/knowledge-vocabulary-v01.md §4.1 (#368) - -facts: - - - fact_id: investigation.kael_corridor_meeting - description: Kael was seen in corridor B-7 off-shift, apparently meeting someone - typical_confidence: suspects - characters: [smuggler, detective] - notes: "Shared fact ID; smuggler perspective = operational security breach; detective perspective = initial observation" - - - fact_id: investigation.kael_corridor_sighting - description: Detective's initial B-7 observation — Kael spotted in maintenance corridors at unusual hour - typical_confidence: suspects - characters: [detective] - notes: "Detective-only initial ID; may upgrade to kael_corridor_meeting after corroboration" - - - fact_id: investigation.kael_unknown_contact - description: The person Kael met in B-7 is unknown — not from the regular rotation - typical_confidence: suspects - characters: [smuggler, detective] - - - fact_id: investigation.kael_ring_membership - description: Kael is a member of the smuggling ring - typical_confidence: suspects - characters: [smuggler, detective] - - - fact_id: investigation.kael_exit_attempt - description: Kael is actively trying to leave the ring - typical_confidence: knows_of - characters: [smuggler, detective] - - - fact_id: investigation.manifest_discrepancy - description: Cargo manifests show irregularities — containers, weights, routing anomalies - typical_confidence: suspects - characters: [smuggler, detective] - notes: "Detective starts with this at suspects (Background). Smuggler may encounter it during operational checks." - - - fact_id: investigation.cargo_anomaly - description: A specific cargo anomaly — wrong container, wrong weight, wrong route - typical_confidence: suspects - characters: [detective] - - - fact_id: investigation.shift_mismatch - description: Shift records don't match observed personnel — someone is covering for someone - typical_confidence: knows_of - characters: [smuggler, detective] - - - fact_id: investigation.voss_ring_involvement - description: Voss manages schedule changes to cover drops — involved in ring operations - typical_confidence: knows_of - characters: [smuggler, detective] - - - fact_id: investigation.torek_spending_pattern - description: Torek is spending beyond his dock-worker means — visible at bar - typical_confidence: knows_of - characters: [smuggler, detective] - - - fact_id: investigation.drin_inspection_pattern - description: Drin's inspections are conspicuously lax — clearing containers without real checking - typical_confidence: knows_of - characters: [detective] - - - fact_id: investigation.drin_gambling_debt - description: Drin has a gambling debt — leverage for whoever is running him - typical_confidence: knows_details - characters: [detective] - - - fact_id: investigation.oversight_gap_pattern - description: Inspection gaps are systematic, not accidental — someone designed the blind spots - typical_confidence: knows_of - characters: [detective] - - - fact_id: investigation.surveillance_gaps - description: Specific surveillance camera blind spots in the maintenance corridors - typical_confidence: knows_details - characters: [smuggler, detective] - notes: "Smuggler knows from Background (operational necessity). Detective discovers through investigation." - - - fact_id: investigation.smuggling_route - description: The specific smuggling route through the station - typical_confidence: knows_details - characters: [smuggler, detective] - - - fact_id: investigation.ring_existence - description: A smuggling ring is definitely operating through Sova Transit (detective's confirmation) - typical_confidence: suspects - characters: [detective] - notes: "Detective starts with suspects from manifest anomalies. Smuggler knows via Background (knows_details)." - - - fact_id: investigation.renn_courier_role - description: Renn operates as a courier in the ring — runs packages between drop sites - typical_confidence: knows_of - characters: [detective] - - - fact_id: investigation.corridor_regular_use - description: The maintenance corridors are regularly used for smuggling, not just incidentally - typical_confidence: knows_of - characters: [detective] - - - fact_id: investigation.container_delay - description: A specific container has been held in temporary storage longer than normal - typical_confidence: suspects - characters: [smuggler] - - - fact_id: investigation.sera_evidence_held - description: Sera has unreported evidence about manifest irregularities — sitting on it deliberately - typical_confidence: suspects - characters: [detective] - notes: "suspects from avoidance pattern; knows_details only if Sera discloses or evidence found independently" - - - fact_id: investigation.naia_lattice_condition - description: Naia's neural lattice is degrading — the medical components are for her - typical_confidence: knows_details - characters: [smuggler, detective] - notes: "Requires Kael disclosure or independent medical evidence" - - - fact_id: investigation.ring_leadership - description: Who directs ring operations — late-game discovery - typical_confidence: knows_details - characters: [smuggler, detective] - - - fact_id: investigation.drin_inspection_pattern - description: Drin's inspection patterns protect specific containers at specific shift windows - typical_confidence: knows_of - characters: [detective] diff --git a/content/npc-conversations/overheard.yaml b/content/npc-conversations/overheard.yaml index 4783ab010..634d4e999 100644 --- a/content/npc-conversations/overheard.yaml +++ b/content/npc-conversations/overheard.yaml @@ -249,7 +249,7 @@ pairs: location_hints: [the-terminal] access: [public] trust: surface - knowledge_payload: "Container 4471 is being deliberately held in temp storage. 'Routing says hold' — someone modified the routing instruction. Cross-reference: investigation.container_delay." + 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 @@ -329,7 +329,7 @@ pairs: location_hints: [the-terminal] access: [public] trust: surface - knowledge_payload: "Manifest weight discrepancy exists and dock workers are suspicious of the official explanation. Cross-reference: investigation.manifest_discrepancy." + 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 @@ -461,7 +461,7 @@ pairs: location_hints: [the-terminal, the-last-shift] access: [public] trust: surface - knowledge_payload: "Kael was in corridor B-7 off-shift. Eyewitness account. Cross-reference: investigation.kael_corridor_meeting." + 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 @@ -477,7 +477,7 @@ pairs: location_hints: [the-last-shift] access: [public] trust: surface - knowledge_payload: "Kael met with an unidentified person at corridor B-7 during off-hours. Cross-reference: investigation.kael_unknown_contact." + 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 @@ -493,7 +493,7 @@ pairs: location_hints: [the-last-shift] access: [public] trust: surface - knowledge_payload: "Torek is spending significantly above his salary at The Last Shift. Cross-reference: investigation.torek_spending_pattern." + knowledge_payload: "Torek is spending significantly above his salary at The Last Shift." tags: [torek, spending, lera, investigation-payload, ring-adjacent] - id: overheard_029 @@ -621,7 +621,7 @@ pairs: location_hints: [the-last-shift] access: [public] trust: surface - knowledge_payload: "Kael's behavior has changed at home. Sleepless, secretive, won't explain to Naia. Cross-reference: behavioral.kael_behavioral_change, investigation.kael_attempting_exit." + 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 @@ -653,7 +653,7 @@ pairs: location_hints: [the-last-shift] access: [public] trust: surface - knowledge_payload: "Kael is actively trying to leave 'something' — most likely the ring. He's researching options. Cross-reference: investigation.kael_attempting_exit." + 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 @@ -685,7 +685,7 @@ pairs: location_hints: [the-last-shift] access: [public] trust: surface - knowledge_payload: "Torek met with someone in the maintenance corridors late at night. Cross-reference: investigation.torek_ring_meeting." + knowledge_payload: "Torek met with someone in the maintenance corridors late at night." tags: [torek, maintenance, midnight, ring-adjacent, investigation-payload] # =================================================================== @@ -785,7 +785,7 @@ pairs: location_hints: [the-last-shift] access: [public] trust: surface - knowledge_payload: "Sera is documenting something privately — possibly her own investigation or evidence she's sitting on. Cross-reference: investigation.sera_unreported_evidence." + 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 diff --git a/docs/design/archetype-evidence-presentation.md b/docs/design/archetype-evidence-presentation.md deleted file mode 100644 index 2dbb1019c..000000000 --- a/docs/design/archetype-evidence-presentation.md +++ /dev/null @@ -1,1230 +0,0 @@ -# Archetype Evidence Presentation Spec - -**Ticket:** #443 | **Sprint:** 7 | **Decision:** D-065, D-034, D-033 -**Authors:** Mellanie (voice/copy), Paula (narrative structure), Gestalt (systems) -**Date:** 2026-02-15 -**Revised:** 2026-02-15 (Paula -- narrative depth pass: THE FRIEND arcs, contradiction timeline, authoring guidelines) -**Revised:** 2026-02-16 (Gestalt -- systems design pass: mechanical framework, data flow, systems interaction map, contradiction pipeline, fun factor analysis, implementation notes) -**Revised:** 2026-02-16 (Gestalt -- systems review: fix verb priority per interaction-verbs spec, fix confidence bar/label mismatch, use detective labels not raw enums, fix section numbering, flag Take/Place as v0.2+, resolve color semantic collision with insert-palette blues, clarify DSC-002 source types per D-041, add notebook curated-content design statement) -**Revised:** 2026-02-16 (Lead -- final pass: rename KnowsOf label from "Corroborated" to "Noted Facts", resolve strikethrough timing open question per Paula, add non-confrontation/resolution states to Section 6.3) - ---- - -## 1. Purpose - -Both archetypes share the same 3x3 inventory grid (D-065), the same knowledge graph, and the same underlying simulation. What differs is the **presentation layer** -- how evidence looks, reads, and feels to each character. - -The detective sees a case file. The smuggler sees a notebook. Same facts. Different frames. This spec defines the visual language, copy tone, labeling conventions, and contradiction presentation for each archetype. - -**This is a design specification.** No code, no sprites. It informs: -- Client inventory UI rendering (future item sprites and text styling) -- Copy authoring (item descriptions, tooltip text, monologue reactions) -- Visual design (aesthetic direction for Araminta's future sprite work) - ---- - -## 2. Design Principles - -### 2.1 Same Grid, Different Skin - -Both archetypes use the D-065 3x3 grid (bottom-right, 40x40px pocket icons, 1-9 hotkeys). The grid structure is identical. The difference is entirely in: -- **Item names** (what the character calls things) -- **Descriptions** (how the character describes what they're holding) -- **Tooltip text** (quick-reference when hovering) -- **Contradiction markers** (how conflicting information surfaces) -- **Visual styling** (sprite aesthetic, text treatment, color cues) - -### 2.2 Voice Rules Apply - -All inventory text follows the established voice patterns (`docs/design/voice-patterns.md`): -- **Smuggler text:** contractions, first names, fragments, concrete/physical language, no institutional vocabulary -- **Detective text:** mixed contractions (analytical = no, personal = yes), surnames, complete sentences, institutional labeling - -### 2.3 Diegetic Frame - -Inventory presentation is diegetic (D-013). The detective's case file is rendered through the neural insert -- it's Commission software running on institutional hardware. The smuggler's notebook is personal -- scratched notes on a private lattice partition, no Commission formatting, no analytical tools. - -### 2.4 Mechanical Framework: Evidence as Knowledge Graph Projection - -Evidence items are **not** separate data structures. They are presentation-layer projections of knowledge graph state ([D-041](../../decisions/architecture.md#d-041-knowledge-graph-data-model)). The server stores facts, observations, and relationship states in the KG. The client reads that data and renders it through the character's lens. - -``` -Knowledge Graph (server, per-entity Component, BTreeMap) - | - v -Observer Snapshot (per-character KG view, sent every tick) - | - v -Evidence Presentation Layer (client-side, archetype-specific) - | - +-- Detective: Case file format, structured fields, insert overlay - +-- Smuggler: Notebook format, personal voice, no overlay -``` - -**Critical rule:** The server sends identical `ObserverSnapshot` data regardless of archetype. All presentation differences are client-side rendering decisions. The server does not know or care whether it's serving a detective or smuggler -- it serves knowledge graph entries, and the client applies archetype-specific formatting. - -**Physical items are the exception.** The smuggler's 3 physical items (D-065: manifest copy, corridor access token, personal comm log) and the detective's 2 institutional tools exist as ECS `InventoryItem` components in addition to their KG entries. Physical items carry risk: they can be detected if scanned by security, confiscated, or lost. Pure KG knowledge carries no physical risk. This asymmetry is mechanically load-bearing -- the smuggler must manage objects, the detective manages information. - -### 2.5 D-033 Entity Color Integration - -Evidence entries that reference entities inherit [D-033](../../decisions/perception.md#d-033-entity-color--relationship-to-player) color associations. This creates a visual thread between the world view and the evidence view: - -| Context | Detective | Smuggler | -|---------|-----------|----------| -| **World view** | Entity sprite tinted with relationship color | Same | -| **Evidence entries** | D-033 color dot `[o]` next to entity surname | No color dot -- notebook is physical/analog, not digital | -| **Color shift propagation** | All case file entries referencing an entity update their color dots when `RelationshipState` changes | No notebook change -- color shift experienced through world view + monologue | - -**Why the smuggler doesn't see entity colors in the notebook:** - -1. **The notebook is analog.** Not rendered through the insert. The detective's case file IS the insert -- digital, connected, live. The smuggler's notes are personal, disconnected, static until she edits them. -2. **The smuggler reads relationships, not data.** She knows Kael is her friend because he's her friend, not because a color dot says so. D-033 color is visible on Kael's *sprite* in the world. The notebook doesn't have metadata. -3. **Player decision impact:** The detective can scan case file entries and see amber dots accumulating -- a visual pattern of suspicion forming. The smuggler has to remember. This creates different investigation rhythms and different cognitive load on the player. - -When an entity's `RelationshipState` changes (e.g., Kael: Friendly -> PersonOfInterest at contradiction discovery): -- **Detective case file:** Every entry mentioning "Davan, K." updates its color dot from teal `#4a9ebb` to amber `#e8c547` (0.5s fade matching D-033 transition). The accumulation of amber dots across multiple entries is itself information. -- **Smuggler notebook:** No visual change. The player re-reads Kael's entries and sees the old warm notes alongside the new doubt annotations. The contrast is textual, not chromatic. - -### 2.6 Verb System Integration - -Per [D-057](../../decisions/perception.md#d-057-entity-interaction--vertical-list-insert-styled), the two-phase verb computation produces different verb sets per archetype for the same objects: - -| Object | Detective Verb | Smuggler Verb | Mechanical Difference | -|--------|---------------|---------------|----------------------| -| Cargo manifest | `Scan` | `Grab a copy` | Detective: KG entry with `authority` source, no physical risk. Smuggler: physical item + KG entry, detectable. | -| Access token | `Flag` / `Confiscate` | `Pocket` | Detective: marks it in case file (KG-only). Smuggler: takes it (physical, carries risk). | -| Comm terminal | `Access logs` | `Check messages` | Detective: queries institutional records. Smuggler: reads personal messages. | -| Suspicious container | `Scan` / `Tag` | `Move` / `Stash` | Detective: creates evidence chain. Smuggler: manages physical contraband. | - -These verb differences are **Phase 2 observer filter rules** (D-057). The server computes the maximum verb set from `ObjectType` components (Phase 1), then applies archetype-specific filter rules (Phase 2). Same object, same server tick, different verb options. No separate verb systems per archetype -- one system, two filter configurations. - -### 2.7 Confidence Level Mapping - -The detective's case file displays confidence using [D-041](../../decisions/architecture.md#d-041-knowledge-graph-data-model) confidence tiers mapped to institutional language: - -| KG Confidence | Detective Label | Visual | Dialogue Gate (D-028) | -|---------------|----------------|--------|-----------------------| -| `Suspects` | Unconfirmed | `██░░░░░░` grey text, dashed border | `surface` access only | -| `KnowsOf` | Noted Facts | `████░░░░` white text, solid border | `real` access unlocked, topic-specific dialogue | -| `KnowsDetails` | Verified | `██████░░` bold text, highlight border | `secret` access unlocked, `Confront` verb available | -| `Direct` | Direct observation | `████████` blue-white text, no border | Live observation, maximum fidelity | - -The smuggler sees **no confidence indicators**. Items appear when she has the knowledge. The presence of the entry IS her confidence. Design rationale: - -1. **Voice consistency:** The smuggler doesn't think in evidence tiers. She knows what she saw. (Anti-pattern: "Confidence: Suspects") -2. **Decision framing:** Without confidence labels, the smuggler decides based on gut + relationships, not institutional metrics. This produces genuinely different player decisions. -3. **Asymmetric information about information:** The detective knows how strong their evidence is. The smuggler knows what she knows but not how it would hold up institutionally. The smuggler might confront Kael based on a gut feeling and a notebook scrawl. The detective would wait for corroboration. Different rhythms, different risk profiles. - ---- - -## 3. Detective: The Case File - -### 3.1 Aesthetic - -**Frame:** Commission Evidence Management System. Clean. Structured. The insert formats everything into institutional templates whether the detective asks it to or not. Fields, labels, timestamps. The training runs in the background. - -**Visual language:** -- Thin ruled lines, cool white-blue palette (insert aesthetic per D-048) -- Monospaced labels left-aligned, values right-aligned -- Geometric insert styling: thin borders, precise spacing, no ornamentation -- Confidence indicators as fill bars (not numbers) -- the insert quantifies certainty visually -- Cross-reference links rendered as subtle underlines (insert suggests connections) - -**Color cues (evidence confidence states — distinct from D-033 entity colors):** -- Default evidence: insert white-blue `#c8d0e0` -- Flagged discrepancy: amber `#e8c547` (shared with D-033 Person of Interest — intentional, discrepancy IS suspicion) -- Confirmed contradiction: muted red `#d45d5d` (shared with D-033 Hostile/Dangerous — intentional, contradiction IS threat) -- Noted Facts: cool blue-white `#a8c8e8` (insert-palette blue — NOT green `#6bc9a6`, which is D-033 Known/Friendly for entity dots) - -> **Visual design note for Araminta:** Evidence confidence colors must NOT collide with D-033 entity relationship colors. Entity dots in case file entries use D-033 colors (teal/green/amber/red) to show relationship state. Evidence confidence uses the insert's blue-white palette to show evidentiary strength. Two separate color vocabularies, two separate meanings. Formalize the insert confidence palette in the visual style guide. - -### 3.2 Item Presentation Template - -Every item in the detective's inventory renders in a standardized case-file entry: - -``` -[ITEM LABEL] -Category: [type classification] -Acquired: [location, time] -Source: [how obtained] -Confidence: [bar indicator] -Relevance: [case connection] ---- -[Description: 1-2 sentences, analytical voice] -``` - -### 3.3 Detective Inventory Items (v0.1) - -The detective's physical inventory is minimal (D-065: 2 slots). Knowledge is the primary evidence system. The two physical items are institutional tools, not contraband. - -#### Item: Commission Datapad - -**Display name:** `Commission Datapad` - -**Description:** -> Standard-issue field unit. Case file #STC-4471, manifest irregularity investigation. Access logs, shift records, and flagged discrepancies auto-synced from the district relay. - -**Tooltip:** `Field datapad. Case #STC-4471. Synced.` - -**Flavor text:** `Assigned equipment. The case file that brought me here.` - -**Monologue on examine:** -> *"Case file's current. Fourteen flagged entries. Let's see which ones hold up in person."* - -**Visual direction:** Slim rectangular device. Commission blue-grey housing. Small status indicator (green = synced). No personal marks. Institutional object. - -#### Item: Credential Badge - -**Display name:** `Commission Badge` - -**Description:** -> Lattice Commission field investigator credentials. Grants authority-tier access to station systems and personnel interviews. Visible display recommended per protocol. - -**Tooltip:** `Commission credentials. Authority access.` - -**Flavor text:** `Opens doors. Closes others.` - -**Monologue on examine:** -> *"Still gets a reaction when I flash it. That reaction tells me more than the interview will."* - -**Visual direction:** Small metallic badge. Commission insignia (geometric, clean). Subtle insert-reactive edge (glows faintly when scanned). Official object. The kind of thing you show, not hide. - -### 3.4 Knowledge Graph Presentation (Case File View) - -The detective's primary evidence is knowledge, not physical items. The insert renders the knowledge graph as case-file entries. - -#### Evidence Entry Format - -When the detective discovers a fact (via observation, dialogue, or examination), the insert files it: - -``` -EVIDENCE ENTRY — [auto-generated ID] -Subject: Davan, K. -Category: Behavioral anomaly -Observed: The Terminal, Shift 2, 14:22 -Source: Direct observation -Confidence: ████░░░░ Noted Facts ---- -Subject observed in Corridor B-7 outside scheduled shift window. -No registered maintenance assignment for this period. -Cross-ref: Manifest discrepancy #7 (container weight, same date). -``` - -#### Key Copy Conventions (Detective Evidence) - -| Element | Convention | Example | -|---------|-----------|---------| -| **Subject naming** | Surname, Initial | `Davan, K.` / `Venn, S.` / `Lintar, T.` | -| **Category labels** | Institutional classification | `Behavioral anomaly` / `Schedule deviation` / `Financial irregularity` | -| **Source types** | Formal evidence sourcing | `Direct observation` / `Overheard exchange` / `Terminal access log` / `Informant statement` | -| **Confidence display** | Fill bar + detective label | `████░░░░ Noted Facts` | -| **Description tone** | Clinical, third-person | "Subject observed in..." not "I saw him in..." | -| **Time references** | Shift-relative, precise | `Shift 2, 14:22` not `afternoon` | -| **Cross-references** | Insert-generated links | `Cross-ref: Manifest discrepancy #7` | - -#### Example Evidence Entries - -**Manifest discrepancy (from examining terminal):** -``` -EVIDENCE ENTRY — MFD-007 -Subject: Station logistics (Sova Transit) -Category: Documentation irregularity -Observed: The Terminal, Shift 1, 09:14 -Source: Terminal access log -Confidence: ██████░░ KnowsDetails ---- -Container 4471: logged weight 240kg, reconciled weight 283kg. -43kg discrepancy exceeds standard variance (±5kg). -Overnight hold in temp storage (standard turnaround: sub-8hr). -Cross-ref: Davan, K. — shift assignment overlap. -``` - -**Behavioral observation (from watching Sera):** -``` -EVIDENCE ENTRY — BEH-003 -Subject: Venn, S. -Category: Avoidance pattern -Observed: The Last Shift, Shift 3, 19:47 -Source: Direct observation (3rd occurrence) -Confidence: ██████░░ KnowsDetails ---- -Subject departed venue within 4 minutes of Lintar, T. arrival. -Third occurrence. Three distinct excuses provided. -Correlation: 1.00. Coincidence threshold exceeded. -Cross-ref: Lintar, T. — financial indicators (BEH-001). -``` - -### 3.5 Contradiction Presentation (Detective) - -When the knowledge graph contains conflicting entries, the insert flags a **DISCREPANCY**. - -#### Visual Treatment -- Amber highlight border around the conflicting entries -- `DISCREPANCY FLAGGED` header in amber `#e8c547` -- Both conflicting entries displayed side-by-side (or stacked) -- Insert auto-generates a confidence-weighted assessment - -#### Example Contradiction - -``` -══════════════════════════════════════ - DISCREPANCY FLAGGED — DSC-002 -══════════════════════════════════════ -Entry A: BEH-003 (Venn, S. — avoidance pattern) - Source: DirectObservation (3 occurrences) - "Subject avoids Lintar, T. Three recorded departures." - -Entry B: SOC-011 (Venn, S. — social profile) - Source: ToldBy (Venn, S. — direct conversation) - "Subject described as socially integrated. No recorded - conflicts or avoidance behaviors with district residents." ---- -Assessment: ToldBy statement contradicts DirectObservation -pattern re: Lintar, T. specifically. D-041 contradiction -detection: source type mismatch triggers Contradicted state. -Confidence in avoidance: KnowsDetails. Recommend direct -inquiry or extended surveillance. -══════════════════════════════════════ -``` - -#### Monologue on Contradiction Discovery - -> *"There it is. She says she's fine with everyone here. The data says otherwise. Three times, Sera. That is not social discomfort."* - -Note: contractions appear ("she's," "she's") because this is personal -- Sera is an ally. The uncontracted "That is not" is the institutional frame reasserting itself. Voice pattern checks out per `voice-patterns.md` Section 2.1. - ---- - -## 4. Smuggler: The Notebook - -### 4.1 Aesthetic - -**Frame:** Personal lattice partition. No institutional software. No templates. The smuggler's notes are organized the way a person organizes things -- by who, not by what. Handwritten feel. Margins full of second thoughts. The formatting is whatever made sense at the time. - -**Visual language:** -- Warm amber-cream palette (smuggler character tint `#f0e0c8` base) -- Irregular spacing, left-aligned, no grid structure -- Handwritten-style typeface (not monospaced -- variable, slightly uneven) -- Crossed-out text for revised information (strikethrough, not deletion) -- Question marks and underlines as emphasis (not color-coded flags) -- No auto-generated cross-references -- the smuggler makes connections manually or not at all - -**Color cues:** -- Default notes: warm cream `#f0e0c8` -- Personal emphasis: brighter amber `#e8c547` (underline, not highlight) -- Scratched out / wrong: muted grey strikethrough `#8b8ba0` -- Danger: no special color -- danger is expressed through word choice, not formatting - -### 4.2 Item Presentation Template - -The smuggler's items don't have templates. Each item reads like a personal note -- different lengths, different structures, whatever the smuggler would actually think when looking at the thing. - -``` -[ITEM NAME — what the smuggler calls it] - -[Description: 1-2 sentences, first person, concrete] - -[Flavor text: gut reaction, one line] -``` - -No category. No confidence bar. No cross-references. The smuggler doesn't file. The smuggler remembers. - -### 4.3 Smuggler Inventory Items (v0.1) - -The smuggler's three physical items are defined in `content/.../items/smuggler-inventory.yaml` (Sprint 6, #441). This spec adds the presentation-layer copy and visual direction. - -#### Item: Manifest Copy - -**Display name:** `Manifest Copy` - -**Description:** -> Cargo manifest from last cycle. Three containers that don't match the dock log. Kael's handwriting on the margins -- weight corrections that never got filed. - -**Tooltip:** `Last cycle's manifest. Kael's notes.` - -**Flavor text:** `Should've burned this weeks ago.` - -**Monologue on examine:** -> *"Kael's handwriting. Forty kilos over on three containers. He corrected the numbers but never filed the update. Sloppy? Or on purpose?"* - -**Visual direction:** Folded printout, slightly creased. Handwritten margin notes in different ink. The kind of thing you'd keep in a jacket pocket. Dog-eared corner. Not precious -- functional. - -#### Item: Access Token - -**Display name:** `Access Token` - -**Description:** -> Maintenance corridor keycard. Kael slipped it to me three weeks ago. Gets you past the service hatches into B-7. No legitimate reason to have this. - -**Tooltip:** `Corridor B-7. Kael's spare.` - -**Flavor text:** `Hope it still works.` - -**Monologue on examine:** -> *"Three weeks and it hasn't been revoked. Either nobody's checking, or Kael made sure they wouldn't."* - -**Visual direction:** Small physical card, slightly scuffed. Generic-looking -- could be any maintenance keycard. That's the point. No markings that say "smuggling ring credential." Unremarkable object that opens remarkable doors. - -#### Item: Comm Log - -**Display name:** `Comm Log` - -**Description:** -> Three months of messages. Times, names, drop schedules. Nils arranging volumes, Kael confirming routes, Renn reporting handoffs. Everything the ring said it never said. - -**Tooltip:** `Three months. All of it.` - -**Flavor text:** `Should've wiped these. Didn't.` - -**Monologue on examine:** -> *"Nils would kill me if he knew I kept these. Kael stopped answering three weeks ago. The silence is louder than the messages."* - -**Visual direction:** Not a physical object -- this renders as a lattice data icon (personal comm archive). Small, warm-toned, slightly pulsing (data is live, messages keep accumulating). The most dangerous thing the smuggler carries, and it looks like nothing. - -### 4.4 Knowledge Presentation (Notebook View) - -The smuggler's knowledge is organized by **person**, not by category. When the smuggler learns something, it's filed under who it's about. - -#### Notebook Entry Format - -``` -KAEL - -- Shift partner. Two years. Solid. -- Handles the dock-side routing. Knows the schedule - better than Voss. -- ~~Same old Kael~~ Something's off. Checking his - lattice too much. Won't say why. -- Corridor B-7. Late. Talking to someone I don't - know. Didn't tell me about a meeting. - Who was that? -``` - -No timestamps. No evidence IDs. No confidence bars. The smuggler writes like a person keeping track of a life that's getting complicated. - -#### Key Copy Conventions (Smuggler Notebook) - -| Element | Convention | Example | -|---------|-----------|---------| -| **Subject naming** | First name only | `Kael` / `Naia` / `Voss` / `Lera` | -| **Organization** | By person, not category | `KAEL` section, `VOSS` section | -| **Observations** | First-person, concrete | `Won't make eye contact` not `Avoidance behavior noted` | -| **Revisions** | Strikethrough, not deletion | `~~Same old Kael~~` | -| **Uncertainty** | Question marks, not confidence tiers | `Who was that?` not `Confidence: Suspects` | -| **Time references** | Relative, informal | `Last cycle` / `Three weeks ago` / `Late` | -| **Connections** | Manual, if present at all | The smuggler doesn't cross-reference -- she remembers, or she doesn't | - -#### Example Notebook Entries - -**About Voss (from observation + dialogue):** -``` -VOSS - -- Shift supervisor. Takes a cut. Gets nervous when - the volume goes up. -- Changed the rotation twice this cycle. Didn't - tell anyone why. -- Snapped at the new hire again. Third time today. - Something's eating him. -``` - -**About Naia (from conversation with Kael):** -``` -NAIA - -- Kael's partner. Worries about him -- can see it - in her face when she comes by the dock. -- Kael says she doesn't know. I don't think that's - true anymore. -- ~~She's fine, Kael takes care of it~~ She talked - to Sera. Commission field tech. Why Sera? -``` - -**About Sera (from observation at the bar):** -``` -SERA - -- Commission field tech. Stationed here a year. -- Drinks at Lera's. Keeps to herself mostly. -- One less Commission presence in the room when - she leaves. Fine by me. -- Naia talks to her. That's new. Or I just - never noticed. -``` - -### 4.5 Contradiction Presentation (Smuggler) - -The smuggler doesn't get contradiction flags. There's no system that says "DISCREPANCY DETECTED." Instead, the smuggler's notebook accumulates notes that contradict each other, and the **monologue** is what connects them. - -#### Visual Treatment -- No special formatting for contradictions -- Old information stays visible but struck through -- New information appears below with question marks -- The contradiction is visible to the player through the juxtaposition -- the system doesn't highlight it - -#### Example Contradiction - -``` -KAEL - -- Shift partner. Two years. Solid. -- ~~Tells me everything. That's how it works.~~ -- Corridor B-7. Someone I don't know. Kael didn't - mention a meeting. - He looked left when I asked. - He always looks left when he's lying. - Who is this person? What's Kael doing? -``` - -No amber border. No "DISCREPANCY FLAGGED." The smuggler notices contradictions the way a person notices them -- the old certainty and the new evidence sit next to each other, and the gap is obvious to anyone reading. The emotional weight does the work, not the formatting. - -#### Monologue on Contradiction Discovery - -> *"Two years. Two years and he's meeting people behind my back. Not ring. Not anyone I know. Who, Kael?"* - -Note: no institutional framing, no analytical distance. The hurt is the analysis. Fragments. First name. Dash for interruption. Voice checks out per smuggler patterns. - ---- - -## 5. Contradiction Presentation: Side-by-Side Comparison - -The same contradiction (Kael in Corridor B-7 with an unknown contact) presented through both lenses: - -### Detective Sees: - -``` -══════════════════════════════════════ - DISCREPANCY FLAGGED — DSC-004 -══════════════════════════════════════ -Entry A: RTN-008 (Davan, K. — routine profile) - "Subject's shift ends 14:00. No registered - maintenance assignments in Corridor B-7." - -Entry B: OBS-019 (Davan, K. — direct observation) - "Subject observed in Corridor B-7 at 22:15. - Unidentified contact present. Contact departed - before visual identification possible." ---- -Assessment: Off-schedule presence in restricted -corridor with unregistered contact. Consistent with -covert operational activity. Priority: elevated. -Cross-ref: Manifest discrepancy #7 (same subject). -══════════════════════════════════════ -``` - -**Monologue:** *"Davan in Corridor B-7. Off-schedule. Unregistered contact. That is not routine."* - -### Smuggler Sees: - -``` -KAEL - -- Corridor B-7. Late. Wasn't on the schedule. -- Talking to someone I don't recognize. They left - before I got close. -- ~~Kael tells me everything~~ - He didn't mention this meeting. He didn't mention - this person. - Who was that? -``` - -**Monologue:** *"That wasn't anyone from our rotation. And Kael didn't tell me about a meeting."* - -### What's Different - -| Dimension | Detective | Smuggler | -|-----------|-----------|----------| -| **Framing** | Evidence entry with ID, timestamp, classification | Personal note under a first name | -| **Subject** | `Davan, K.` | `Kael` | -| **Time** | `22:15` | `Late` | -| **Location** | `Corridor B-7 (restricted, no registered maintenance assignment)` | `Corridor B-7` (no explanation needed -- she knows it's restricted) | -| **Unknown contact** | `Unidentified contact. Contact departed before visual identification possible.` | `Someone I don't recognize. They left before I got close.` | -| **Contradiction source** | Routine profile vs. direct observation (auto-cross-referenced) | Struck-through trust vs. new evidence (manually juxtaposed) | -| **Marker** | `DISCREPANCY FLAGGED` in amber with assessment | Nothing. Question marks. Strikethrough. Silence. | -| **Emotional register** | Professional priority escalation | Personal betrayal crystallizing | -| **Insert involvement** | Full -- insert auto-generates cross-refs, confidence bars, assessment | None -- the smuggler's lattice doesn't do analysis | - ---- - -## 6. THE FRIEND Contradiction Arcs - -THE FRIEND's contradiction (D-034, wow moment #3 from D-039) is the single most important evidence presentation moment in v0.1. The side-by-side comparison in Section 5 shows the *format*. This section shows the *arc* -- how the notebook and case file evolve across the full session as THE FRIEND relationship moves through its phases. - -### 6.1 Smuggler -- Kael's Arc in the Notebook - -**Phase 1: Comfort (minutes 0-10)** - -The notebook is sparse and warm. The smuggler doesn't take many notes about Kael because there's nothing to note. Trust is the default. Absence of entries IS the trust. - -``` -KAEL - -- Shift partner. Two years. Solid. -- Already at the dock when I got here. Good. -``` - -Two entries. No questions. The notebook barely registers Kael because Kael is safe. This baseline matters -- the contrast with what comes later is the emotional payload. - -**Phase 2: First Crack (minutes 10-15)** - -New entries accumulate. The smuggler notices but dismisses. - -``` -KAEL - -- Shift partner. Two years. Solid. -- Already at the dock when I got here. Good. -- Keeps checking his lattice. Third time in five - minutes. Waiting for something? -- Left lunch early. Said he had to check a manifest. - ~~Probably nothing.~~ -``` - -The first strikethrough appears -- but it's the smuggler crossing out *her own dismissal*, not her trust. "Probably nothing" gets struck because the gut is already ahead of the conscious mind. The notebook records the smuggler starting to argue with herself. - -**Phase 3: Contradiction Discovery (minutes 15-20)** - -The notebook breaks open. - -``` -KAEL - -- Shift partner. Two years. ~~Solid.~~ -- Already at the dock when I got here. Good. -- ~~Keeps checking his lattice. Probably nothing.~~ - Not nothing. -- Corridor B-7. Off shift. Talking to someone I - don't recognize. They left before I got close. -- ??? -- Not ring. Not dock crew. Nobody from our rotation. -- He didn't tell me about a meeting. - He didn't tell me. -``` - -Two previous entries get strikethrough -- "Solid" and "Probably nothing." The smuggler's trust assessment is literally crossed out. New entries are shorter, more fragmented. The voice tightens. Question marks appear. The repeated "He didn't tell me" (once as observation, once as emotional statement) is the smuggler processing betrayal in real time. - -**D-033 color shift:** Green `#6bc9a6` fades to amber `#e8c547`. This should be the first entity color change in the entire session -- maximum impact per D-033 design notes. - -**Monologue fires with urgent chime:** *"That's Kael. But who's he talking to? I don't know that face."* - -**Phase 4: Confrontation Window (minutes 20-25)** - -If the smuggler confronts Kael, the notebook records the intention and result: - -``` -KAEL (continued) - -- *I saw you in B-7. Who was that?* -- He said "Just a thing. Don't worry about it." - He looked left. - He always looks left when he's making something up. - Two years I've known that tell. - Kael is lying to me. -``` - -The italicized entry is the confrontation line (D-063 format). What follows is the smuggler's observation of Kael's response. The tell system (D-034) surfaces here -- the "looks left" tell that the smuggler has known for two years is now weaponized against a friend. The final line is a flat declarative -- when the smuggler is hurt, fragments stop and sentences land whole (per voice card Anchor 4). - -**Phase 5: Contaminated Trust (minutes 25-30)** - -Every subsequent Kael entry carries a parenthetical shadow: - -``` -KAEL (continued) - -- Back at the dock. Same jokes, same routine. - (B-7. The face I didn't recognize.) -- Offered to cover my break. - (Too nice? Or just Kael being Kael?) -- Checked his lattice again. Once. Normal? - (What's normal anymore?) -``` - -The parenthetical voice is the contamination. Every warm observation now gets a cold follow-up in brackets. The notebook can't be trusted anymore because the person in it can't be trusted. The smuggler is maintaining two simultaneous readings of Kael -- the friend she wants to believe in and the liar she can't ignore. - -### 6.2 Detective -- Sera's Arc in the Case File - -**Phase 1: Trust (minutes 0-10)** - -The case file has a single entry for Sera, filed as "background resource." The detective doesn't investigate allies. - -``` -SUBJECT: Venn, S. -ROLE: Commission Field Technician -ASSESSMENT: Reliable institutional contact -STATUS: Active — background resource - - ENTRY 1: - OBSERVATION: District orientation briefing. Subject provided - social mapping of bar regulars and hub personnel. - SOURCE: Direct conversation - CONFIDENCE: ████████ Direct -``` - -Clean. Professional. Sera is cataloged as a tool, not a target. "Background resource" -- the detective's way of saying "friend" without saying "friend." - -**Phase 2: Background Data (minutes 10-15)** - -New entries accumulate. Sera mentions Naia. The detective files it. - -``` - ENTRY 2: - OBSERVATION: Subject identified Tamm, N. as personal acquaintance. - Introduced during bar visit. Rapport appears genuine. - SOURCE: Direct observation (in conversation) - CONFIDENCE: ████░░░░ Noted Facts - - ENTRY 3: - OBSERVATION: Departed Last Shift early. Stated reason: early shift. - TIMESTAMP: Cycle 12, 21:15 - SOURCE: Direct observation - CONFIDENCE: ████████ Direct -``` - -The departure is logged but not flagged. One data point is not a pattern. The insert files it without priority. This entry becomes retroactively significant after Phase 3 -- the insert will add CORRELATION fields when the pattern is detected. - -**Phase 3: Contradiction Discovery (minutes 15-20)** - -The case file transforms. - -``` -SUBJECT: Venn, S. -ASSESSMENT: !! UNDER REVIEW !! -STATUS: Active — person of interest - - !! DISCREPANCY FLAGGED — DSC-002 !! - - ENTRY 3 (amended): - OBSERVATION: Departed Last Shift. Reason: early shift. - TIMESTAMP: Cycle 12, 21:15 - CORRELATION: Lintar, T. arrived 21:12 [auto-detected] - - ENTRY 4: - OBSERVATION: Departed Last Shift. Reason: headache. - TIMESTAMP: Cycle 13, 20:40 - CORRELATION: Lintar, T. arrived 20:37 [auto-detected] - - ENTRY 5: - OBSERVATION: Departed Last Shift. Reason: kiosk check. - TIMESTAMP: Cycle 14, 21:05 - CORRELATION: Lintar, T. arrived 21:01 [auto-detected] - - CONFLICT: 3 departures correlated with arrival of Lintar, T. - 3 distinct stated reasons. Pattern inconsistent - with coincidence. - ACTION: Investigate relationship Venn-Lintar. - Cross-ref Lintar associations. -``` - -Key differences from the smuggler's experience: - -1. **ASSESSMENT changes** -- "Reliable institutional contact" becomes "!! UNDER REVIEW !!" The detective's institutional framework overwrites the personal assessment. The friend becomes a subject. -2. **CORRELATION fields auto-populate** -- The analytical lattice retroactively adds timing data to previous entries. Entry 3 gains "[auto-detected]" correlation. The insert is doing work the detective didn't ask for -- and that's a capability the smuggler doesn't have. -3. **Probability language** -- "Pattern inconsistent with coincidence." The detective processes a friend's avoidance pattern through statistical analysis. - -**D-033 color shift:** Green `#6bc9a6` fades to amber `#e8c547`. Same timing as the smuggler's FRIEND shift. - -**Monologue fires with urgent chime:** *"That's the third time. Sera leaves when Torek arrives. Three different excuses, same result. That's not coincidence."* - -**Phase 4: The Question (minutes 20-25)** - -The detective's confrontation option is institutional: - -``` - ACTION: Direct inquiry — Venn, S. - Topic: relationship to Lintar, T. - Approach: authority access (institutional leverage) -``` - -In the dialogue UI (D-063), the confrontation option is in the detective's internal voice: *"I've noticed a pattern, Sera. Three times Torek walks in, you walk out."* - -The gap between the case file's clinical "Direct inquiry" and the monologue's personal "Sera" is where the detective's internal conflict lives. The case file doesn't use first names. The monologue does. That shift IS the crack in the professional surface. - -**Phase 5: Contaminated Trust (minutes 25-30)** - -The case file continues with clinical precision, but NOTE fields start carrying analytical doubt: - -``` - ENTRY 6: - OBSERVATION: Subject offered extended district briefing. - Volunteered information on Korr, M. without prompt. - TIMESTAMP: Cycle 14, 22:10 - SOURCE: Direct conversation - CONFIDENCE: ████████ Direct - NOTE: Disclosure rate increased post-Cycle 14 encounter. - Possible compensation behavior. Pattern consistent - with concealment + overcorrection. -``` - -"Possible compensation behavior" -- the detective's analytical training turns Sera's friendliness into data. Every helpful gesture is now flagged as potential overcorrection. The case file remains clinical. But the NOTE field reveals a professional mind processing a personal hurt through the only framework it has. - -### 6.3 Non-Confrontation and Resolution States - -**If the player doesn't confront:** The notebook/case file stays frozen at Phase 3. The smuggler's question marks remain unanswered; the detective's `!! UNDER REVIEW !!` and `ACTION: Recommend direct inquiry` persist indefinitely. Phase 5 (contaminated trust) still applies — the parenthetical shadows (smuggler) and analytical doubt NOTEs (detective) accumulate regardless. Avoidance is a valid player choice, and the evidence presentation should reflect it as unresolved tension, not a failure state. - -**Post-confrontation resolution:** v0.1 ends at contamination. The 30-minute session is unlikely to reach clean resolution, and D-034 deliberately avoids providing one. Evidence presentation for resolution states (detective `RESOLVED` status, smuggler warm re-annotation) is a v0.2 consideration. - -### 6.4 The Monologue-Presentation Gap - -**This is the most important authoring principle in the evidence presentation spec.** - -The evidence presentation (case file / notebook) and the monologue (D-032) serve different narrative functions. The presentation is the *record*. The monologue is the *reaction*. The gap between them is where the character lives. - -- The detective's case file says "DISCREPANCY FLAGGED." The monologue says: *"Sera, what do you know?"* -- The smuggler's notebook says "???" The monologue says: *"Two years I've known that tell. Kael is lying to me."* - -Never duplicate the monologue's emotional content in the evidence presentation. Never duplicate the evidence presentation's factual content in the monologue. They are complementary layers, not redundant channels. - -The evidence presentation is what the character *documents*. -The monologue is what the character *feels*. -The player holds both simultaneously. That's the game. - -### 6.5 Asymmetric Storytelling: What Sustains the Difference - -The honest truth is that the presentation layer difference isn't cosmetic. It changes what story the player tells themselves across the full 30-minute session. - -**The detective's story:** "I'm building a case. Evidence accumulates. Patterns emerge. The insert helps me see connections. When the case file flags a discrepancy, my investigation advances. The challenge is: do I follow the evidence even when it points at my friend?" - -The detective's presentation *empowers*. The insert is a tool. Cross-references are assistance. Discrepancy flags are the system working as intended. The detective has an analytical partner -- and that partner doesn't care about friendship. - -**The smuggler's story:** "I'm watching my world crack. People I trust are doing things I don't understand. My notebook fills up with crossed-out certainties and unanswered questions. I don't have an insert telling me what's connected -- I have to figure it out myself. The challenge is: what do I do with what I know?" - -The smuggler's presentation *isolates*. No automated connections. No confidence labels. No flags. Just a notebook full of personal observations and the growing realization that the people you trusted are not who you thought they were. The cognitive load is the player's. That's the point. - -This asymmetry is load-bearing for D-027 success criterion #2: "both playthroughs feel like fundamentally different games." The evidence presentation is one of the primary mechanisms by which the same knowledge graph produces two fundamentally different emotional experiences. - ---- - -## 7. UI Copy Reference - -### 7.1 Grid Labels - -When the player hovers over a filled inventory slot: - -**Detective:** -> `[1] Commission Datapad` -> `[2] Commission Badge` - -**Smuggler:** -> `[1] Manifest Copy` -> `[2] Access Token` -> `[3] Comm Log` - -Labels are plain text, left-aligned below the slot icon. Detective labels are formal (full institutional name). Smuggler labels are practical (what the thing is, not what it's called on a form). - -### 7.2 Empty Grid Behavior - -Per D-065: no empty slots displayed. Icons appear only when items are carried. Hovering over empty space produces no tooltip. The grid doesn't announce its own capacity. - -### 7.3 Tooltip Format - -Tooltips appear on hover, persist for 2 seconds or until cursor moves. - -**Detective tooltips** are structured: -> `Field datapad. Case #STC-4471. Synced.` -> `Commission credentials. Authority access.` - -Complete information in compressed form. The insert summarizes. - -**Smuggler tooltips** are personal: -> `Last cycle's manifest. Kael's notes.` -> `Corridor B-7. Kael's spare.` -> `Three months. All of it.` - -Fragments. Context a stranger wouldn't understand. Because the smuggler isn't explaining things to a stranger. - -### 7.4 Examine Action Copy - -When the player examines an item (verb: Examine Object on inventory item): - -**Detective examines Commission Datapad:** -> *"Case file's current. Fourteen flagged entries. Let's see which ones hold up in person."* - -**Smuggler examines Manifest Copy:** -> *"Kael's handwriting. Forty kilos over on three containers. He corrected the numbers but never filed the update. Sloppy? Or on purpose?"* - -Both fire as monologue lines (character tint, same display constraints as D-016). Max 160 characters, 2 visual lines, 4-6 second display. - -### 7.5 Take/Place Verb Copy (v0.2+) - -> **Note:** Take/Place verbs are not in the v0.1 verb system (7 verbs: Move, Look, Examine Object, Examine NPC, Talk, Overhear, Monologue). This copy is forward-looking for when physical item interaction verbs are added. - -When the player takes or places a physical item: - -**Detective:** -> Take: `Evidence secured.` -> Place: `Evidence placed. Location logged.` - -**Smuggler:** -> Take: `Got it.` -> Place: `Should be safe here. Should be.` - -Detective's take/place text is procedural. Smuggler's is personal and hedged. - -### 7.6 Confrontation Labels - -When an inventory item can be used in confrontation (D-063), the dialogue option is written in character voice: - -**Detective using datapad evidence against Voss:** -> *"These manifests do not reconcile, Supervisor. Three containers, three discrepancies. Your shift window."* - -**Smuggler using manifest copy against Kael:** -> *"I've got the manifest, Kael. Your handwriting. Forty kilos you never filed."* - -Both are italicized, first-person (per D-063 confrontation styling). Detective: uncontracted, formal address ("Supervisor"), evidence-chain structure. Smuggler: contracted, first name, direct. - ---- - -## 8. Evidence Discovery Flow - -How evidence feels when the player first encounters it, per archetype. - -### 8.1 Detective Discovery - -1. **Observation triggers insert flag.** The insert does the initial work -- pattern recognition, anomaly detection, confidence thresholds. A soft amber pulse in the insert overlay signals new evidence. -2. **Case file entry auto-generates.** The evidence entry appears in the KG view, pre-formatted, with cross-references the insert has already computed. -3. **Monologue confirms.** The detective's internal voice contextualizes: *"That's data."* or *"Flag it."* or *"Worth a second look."* -4. **Contradiction, if present, is flagged explicitly.** `DISCREPANCY FLAGGED` appears immediately. The insert does not wait for the detective to notice -- it highlights. - -**Emotional arc of detective discovery:** Curiosity (new data) -> Classification (insert files it) -> Connection (cross-reference to existing case) -> Determination (next investigative step). - -The detective's evidence discovery is **assisted**. The insert is a partner. The cognitive load is managed. The detective's job is interpretation, not organization. - -### 8.2 Smuggler Discovery - -1. **Observation triggers gut reaction.** No insert flag. No pattern recognition software. The smuggler sees something wrong and feels it before naming it. -2. **No auto-filing. The notebook is curated, not auto-populated.** Entries appear in the notebook only when (a) a monologue fires for significant observations, or (b) the player actively examines something. The KG may contain facts the notebook doesn't show — the smuggler writes things down when they hit her, not when the system updates. This is a deliberate design choice: the notebook feels authored by the character, not generated by the engine. -3. **Monologue is the discovery.** The monologue line IS the moment of evidence discovery. *"That wasn't anyone from our rotation."* There's no separate system confirmation. -4. **Contradiction is not flagged.** Old notes stay. New notes accumulate. The player sees the gap. The smuggler's monologue might name it: *"He didn't tell me."* But the notebook itself doesn't highlight. - -**Emotional arc of smuggler discovery:** Unease (something's wrong) -> Observation (what exactly?) -> Personal cost (this involves someone I trust) -> Question (what do I do with this?). - -The smuggler's evidence discovery is **unassisted**. No analytical tools. No cross-references. The smuggler relies on memory, instinct, and the relationships that are now under strain. The cognitive load is the player's. That's the point. - ---- - -## 9. Visual Direction Summary (For Araminta) - -### Detective Case File - -- **Sprite style:** Clean, geometric, insert-aesthetic. Thin lines, precise spacing. -- **Palette:** Cool white-blue `#c8d0e0` primary, amber `#e8c547` for flags, red `#d45d5d` for confirmed contradictions, green `#6bc9a6` for corroborated. -- **Text treatment:** Monospaced labels. Structured fields. Fill bars for confidence. Auto-generated cross-reference links (subtle underlines). -- **Item sprites:** Institutional objects. Clean surfaces. Commission branding (geometric insignia). No personal marks, no wear. -- **Contradiction marker:** Double-line amber border. `DISCREPANCY FLAGGED` header. Side-by-side entry comparison. - -### Smuggler Notebook - -- **Sprite style:** Warm, personal, slightly rough. Variable spacing, handwritten feel. -- **Palette:** Warm amber-cream `#f0e0c8` primary, muted grey `#8b8ba0` for struck-through text. No color-coded flags. -- **Text treatment:** Variable-width typeface. Left-aligned, irregular. Strikethroughs visible. Question marks as emphasis. No structured fields. -- **Item sprites:** Worn objects. Creased paper. Scuffed surfaces. Things that live in pockets and get handled. Personal. -- **Contradiction marker:** None. Strikethrough on old certainty. New observations below. The gap speaks for itself. - ---- - -## 10. Cross-References - -| Decision | Relevance | -|----------|-----------| -| D-065 | Inventory mechanics: 3x3 grid, capacity per archetype, knowledge-primary, physical items as exception | -| D-034 | THE FRIEND: contradiction discovery is the emotional payload both presentations must serve | -| D-033 | Entity color as relationship: contradiction markers use the same color language | -| D-028 | Dialogue architecture: confrontation options use evidence as leverage | -| D-032 | Separate monologue pools: evidence discovery monologue is character-specific | -| D-016 | Monologue system: evidence monologue follows all display constraints | -| D-048 | Insert overlay: detective case file renders on insert layer (z-layer 6) | -| D-013 | Diegetic UI: both presentations are in-world, not game-UI | -| D-063 | Confrontation: inventory items usable as evidence, same dialogue box, different weight | - ---- - -## 11. Contradiction Detection Pipeline (Mechanical Detail) - -The narrative presentation in Sections 3.5, 4.5, and 5 defines *what the player sees*. This section defines *how that happens mechanically*, tracing the full pipeline from knowledge graph state change through to evidence presentation update. - -### 11.1 Pipeline Steps - -``` -Step 1: Server — Knowledge Graph Contradiction Detection (D-041) - Input: ToldBy entry ("Kael said he was at the dock during shift 2") - + DirectObservation entry ("Player sees Kael in Corridor B-7 during shift 2") - Output: Both entries receive KnowledgeState::Contradicted - Timing: Same tick the DirectObservation is created - -Step 2: Server — Event Emission - ContradictionDetected { - subject: StableId, // Kael's stable entity ID - entry_a: KnowledgeKey, // The ToldBy entry - entry_b: KnowledgeKey, // The DirectObservation entry - tick: u64 // When detected - } - Side effects: - - RelationshipState shift (Friendly -> PersonOfInterest) - - FriendArc phase advance (if applicable) - - Monologue event queued (observe_anomaly, priority 1) - -Step 3: Server — ObserverSnapshot Update - - KG entries marked Contradicted included in snapshot - - Entity RelationshipState updated -> D-033 color derivation changes - - Monologue event included in snapshot.monologue field - - Verb set updated: Confront becomes available at KnowsDetails+ - -Step 4: Client — Receives ObserverSnapshot - 4a: Entity color transitions (D-033, 0.5s fade, green -> amber) - 4b: Monologue fires (urgent chime, character-specific pool) - 4c: Evidence presentation updates on next inventory open -``` - -### 11.2 Six Atomic State Changes at THE FRIEND Contradiction - -When THE FRIEND contradiction fires (D-034, wow moment #3), six state changes happen in rapid succession. All are mechanically coupled: - -| # | State Change | Where | What Changes | -|---|-------------|-------|--------------| -| 1 | KG entries receive `Contradicted` state | Server (KG component) | Source of truth updated | -| 2 | `FriendArc` phase advances | Server (FriendArc component) | Trust/Doubt -> Conflict | -| 3 | `RelationshipState` shifts | Server (Relationship component) | Friendly -> PersonOfInterest | -| 4 | Monologue event queued | Server (MonologueQueue) | `observe_anomaly` trigger, priority 1 (highest), urgent chime | -| 5 | Entity color shifts | Client (sprite rendering) | Green `#6bc9a6` -> amber `#e8c547`, 0.5s fade | -| 6 | Evidence entry gains contradiction marker | Client (evidence panel) | Detective: `DISCREPANCY FLAGGED`. Smuggler: strikethrough + doubt annotation. | - -**Timing:** Changes 1-4 are server-side, same tick. Changes 5-6 are client-side, triggered by the next ObserverSnapshot. Change 5 (color shift) is visible immediately. Change 6 (evidence marker) is visible when the player next opens their inventory. The monologue chime (change 4) is the player's first signal -- before they see the color shift, before they check their evidence. - -### 11.3 Verb Unlocks at Contradiction - -| Pre-contradiction | Post-contradiction | -|-------------------|--------------------| -| **Detective on Kael:** `[E] Observe` (mid-range) / `[E] Talk` (close range) | `[E] Observe` (priority rises above Talk for PersonOfInterest per interaction-verbs spec Section 4). `Confront` available in dialogue if KnowsDetails+ reached. | -| **Smuggler on Kael:** `[E] Talk` (close range, insider/peer warmth) | `[E] Observe` (priority rises above Talk for PersonOfInterest per interaction-verbs spec Section 4 — smuggler shifts from trust to suspicion). `Confront` available in dialogue: *"I saw you in corridor B-7"* (D-063 confrontation format, italicized first-person). | - -Note the asymmetry: both archetypes shift from `[E] Talk` to `[E] Observe` post-contradiction (per interaction-verbs spec Section 4). But the *meaning* of Observe differs. The detective enters surveillance mode — clinical distance, gathering more data. The smuggler enters suspicion mode — watching a friend for signs of betrayal. Same verb, same priority shift, different emotional frame. The further asymmetry: the smuggler's insider/peer dialogue lines lock out (only public/surface remain), while the detective's authority access opens new lines. Same mechanical trigger, different access consequences. - ---- - -## 12. Systems Interaction Map - -Evidence presentation is not an isolated system. It connects to every major pillar. This map shows how evidence presentation reads from and writes to other systems: - -``` - +-------------------+ - | KNOWLEDGE GRAPH | - | (D-041) | - | Source of truth | - +--------+----------+ - | - +--------------+--------------+ - | | - +--------v---------+ +---------v--------+ - | CONTRADICTION | | CONFIDENCE | - | DETECTION | | LEVELS | - | ToldBy vs Direct | | Suspects -> | - | | | KnowsDetails | - +--------+---------+ +--------+---------+ - | | - +-------------+-------------+ - | - +--------v---------+ - | EVIDENCE | - | PRESENTATION | - | (this spec) | - +--------+---------+ - | - +------------------+------------------+ - | | | -+--------v------+ +--------v------+ +--------v------+ -| ENTITY COLOR | | MONOLOGUE | | DIALOGUE | -| (D-033) | | (D-032) | | (D-028) | -| Visual thread | | Emotional | | Confrontation | -| world <-> inv | | processing | | unlocks | -+--------+------+ +-------+-------+ +-------+-------+ - | | | - +-----------------+-------------------+ - | - +--------v---------+ - | VERB SYSTEM | - | (D-057) | - | Scan vs Grab | - | Flag vs Pocket | - | Confront unlock | - +------------------+ -``` - -### 12.1 Interaction Details - -| System | Reads From Evidence | Writes To Evidence | -|--------|--------------------|--------------------| -| **Knowledge Graph** (D-041) | -- | KG entries ARE evidence. Every fact, observation, and relationship state in the KG is potential evidence content. | -| **Contradiction Detection** (D-041) | -- | `Contradicted` state on KG entries triggers archetype-specific contradiction markers. | -| **Entity Color** (D-033) | Detective case file shows D-033 color dots for referenced entities. | -- | -| **Monologue** (D-032) | Monologue lines reference evidence content ("Kael's handwriting. Forty kilos over."). | Evidence discovery triggers `discover_evidence` monologue (priority 3). Contradiction triggers `observe_anomaly` (priority 1). | -| **Dialogue** (D-028) | Confrontation options cite evidence. Evidence at `KnowsDetails`+ unlocks `secret`-tier dialogue. | Dialogue can grant new KG entries (which become evidence). | -| **Verb System** (D-057) | `Confront` verb availability depends on evidence confidence level. | Acquisition verbs (Scan/Grab/Flag/Pocket) create new evidence entries. | -| **Fog of Perception** (D-011) | -- | Evidence can only be discovered through observation within LOS. Physical evidence objects must be in the vision cone. | -| **Insert Overlay** (D-048) | Detective case file renders on z-layer 6 (insert layer). | -- | - -### 12.2 Feedback Loops - -Two feedback loops make evidence presentation mechanically interesting: - -**Loop 1: Evidence -> Confrontation -> New Evidence** -``` -Observe anomaly -> Evidence entry created -> Confront verb unlocks -> -Confrontation dialogue reveals new information -> New evidence entry -> -NPC behavior changes -> New observations -> More evidence -``` -This loop drives the investigation forward. Each piece of evidence opens doors to more evidence. The rate of loop iteration differs per archetype: the detective's insert cross-references accelerate the loop; the smuggler's unassisted observation slows it but makes each discovery feel more personal. - -**Loop 2: Evidence -> Relationship Shift -> Dialogue Change -> Evidence Quality** -``` -Contradiction discovered -> RelationshipState shifts -> -Access tier changes (insider locks out OR authority unlocks) -> -Available dialogue lines change -> Information quality changes -> -Evidence entries reflect new relationship context -``` -This loop makes relationships mechanically load-bearing. Burning a relationship (confrontation) changes what information is available. The detective's `authority` tier can unlock new lines but NPC cooperation decreases. The smuggler's `insider` tier locks out entirely post-contradiction. Evidence quality is gated by social state. - ---- - -## 13. Fun Factor Analysis - -*Does this create interesting player decisions? Let me break down what this actually means mechanically.* - -### 13.1 Decision Points Created by Archetype Divergence - -| Decision | Detective Experience | Smuggler Experience | Why This Is Interesting | -|----------|---------------------|---------------------|-------------------------| -| **"Should I investigate this?"** | Confidence meter says "Unconfirmed." Wait for corroboration or act now? | Gut says something's wrong. No confidence meter. Trust the feeling or ignore it? | Different information about their own information. The detective knows the strength of their evidence. The smuggler doesn't. | -| **"Should I confront?"** | Case file has structured evidence + cross-references. Risk: burning an institutional source. | Notebook has a scrawled note and a crossed-out entry. Risk: losing a friend. | Same mechanical action (Confront verb), wildly different risk calculus. | -| **"Should I pick this up?"** | Scan/Flag = KG entry, no physical risk. Clean. Institutional. | Grab/Pocket = physical item, detectable by security. If caught, smuggler is implicated. | Physical evidence carries genuine mechanical risk (detection, confiscation). KG evidence does not. The smuggler's evidence loop has stakes the detective's doesn't. | -| **"What does this evidence mean?"** | Insert suggests cross-references. Patterns highlighted. The system helps. | No cross-references. The smuggler connects dots manually. The player IS the detective. | Different cognitive load on the player. Detective players are guided. Smuggler players are on their own. | - -### 13.2 Emergent Interactions - -The best moments will come from systems colliding. These are the interactions the design didn't explicitly plan but the mechanical rules produce: - -1. **Evidence accumulation as narrative.** The detective opens the case file and sees three amber dots where there used to be one. The investigation is widening. The *density* of evidence entries is itself a story -- this community is being documented, cataloged, reduced to data. The detective may feel the institutional weight of their own methodology. - -2. **Physical evidence + confrontation risk.** The smuggler confronts Kael while carrying the manifest copy. Showing it means admitting she took it. The *possession* of evidence is itself an incriminating act. The smuggler's evidence is double-edged in a way the detective's KG entries never are. - -3. **Notebook as emotional timeline.** The smuggler re-reads an early notebook entry about Kael -- warm, casual, trusting. Below it: the strikethrough and "??" annotation she wrote 10 minutes ago. The contrast between past-self and present-self is visible in her own handwriting. The *notebook remembers who she used to be.* - -4. **Entity color accumulation in case file.** As the detective investigates, amber dots accumulate across case file entries. Each individual entry is clinical and controlled. But the *pattern of amber* across the full case file tells a story the detective didn't write -- suspicion is spreading, and the evidence trail is converging on people who were initially neutral. - -### 13.3 Why This Isn't Just Cosmetic - -If both archetypes saw the same evidence presentation, players would make the same decisions. The presentation layer creates genuinely different decision contexts: - -- The detective is **guided by systems.** Cross-references, confidence levels, color-coded entity dots -- the institutional apparatus helps. The interesting decision: *do I trust the system, or trust the people it's flagging?* -- The smuggler is **guided by relationships.** First names, personal annotations, gut feelings -- the emotional connection provides context. The interesting decision: *do I trust my people, or trust what my eyes are telling me?* - -Same knowledge graph. Same facts. Different frames. Different decisions. Different games. That's not cosmetic -- that's a system creating divergent player behavior from identical underlying data. - ---- - -## 14. Implementation Notes - -### 14.1 Client-Side Rendering (No Server Logic Required) - -All presentation differences are client-side: - -| Responsibility | Server | Client | -|---------------|--------|--------| -| Knowledge graph storage | Yes | No | -| Contradiction detection | Yes | No | -| Confidence level tracking | Yes | No | -| ObserverSnapshot generation | Yes | No | -| Archetype-specific labels | No | Yes -- loads from YAML dictionary | -| Archetype-specific layout | No | Yes -- case file template vs notebook template | -| D-033 color dots in evidence | No | Yes -- reads color from snapshot, renders per archetype rules | -| Strikethrough/doubt annotations | No | Yes -- applies when contradicted entries detected | - -### 14.2 Content File Structure - -Evidence presentation copy lives in client data alongside UI strings (D-042 pattern: YAML via GDScript autoload): - -``` -client/data/ - evidence-labels-detective.yaml # Formal labels, tooltips - evidence-labels-smuggler.yaml # Informal labels, tooltips - evidence-descriptions-detective.yaml # Case file entry templates - evidence-descriptions-smuggler.yaml # Notebook entry text - evidence-verbs-detective.yaml # Archetype-specific verb labels (Scan, Flag, etc.) - evidence-verbs-smuggler.yaml # Archetype-specific verb labels (Grab, Pocket, etc.) -``` - -Each file is keyed by `item_id` and loaded at session start. The client reads the archetype from the player character's component and loads the appropriate dictionary set. - -### 14.3 Minimal Implementation Path (v0.1) - -For v0.1, evidence presentation can be implemented with: - -1. **Inventory icons:** 3-6 static sprites per archetype (40x40px per D-065). Total: ~12 sprites. -2. **Item inspection panel:** Reuse dialogue box space (bottom 20% per D-061). Switch layout template (case file vs notebook) based on archetype. One scene, two layout scripts. -3. **Contradiction markers:** Boolean flag from KG `Contradicted` state -> archetype-specific visual treatment (banner vs strikethrough). Trivial conditional rendering. -4. **Label/description text:** YAML lookup keyed by `item_id` + archetype. Same pattern as D-042 UI strings. -5. **D-033 color dots:** Detective only. Read D-033 color from ObserverSnapshot, render as small circle in case file entries. ~5 lines of GDScript per entry. -6. **Confidence bars:** Detective only. Map `ConfidenceLevel` enum to fill bar width. 4 values, 4 bar states. - -**No new server-side systems required.** The evidence presentation is entirely a client rendering concern over existing server data (KG entries, RelationshipState, ConfidenceLevel, Contradicted state). The verb differences (Scan vs Grab) are Phase 2 observer filter rules already designed in D-057. - -**Estimated effort:** 1-2 sprints for basic implementation. Icons and layout are the bulk. The data flow already exists. - ---- - -## 15. Authoring Guidelines - -### 15.1 Writing Item Descriptions - -**Smuggler items:** Write in first person. Use the smuggler voice card parameters (short fragments, sensory vocabulary, first names, feeling-first). The description should sound like the smuggler looking at the item and commenting to herself. - -- **Do:** "Kael's handwriting on the margins." -- **Don't:** "Manifest containing annotations by dock worker Davan." - -**Detective items:** Write in third person passive. Use institutional vocabulary. The description should sound like a field report entry. - -- **Do:** "Margin annotations in hand consistent with dock worker Davan, K." -- **Don't:** "Kael wrote on this." - -### 15.2 Writing Contradiction Markers - -**Smuggler contradictions:** Show the smuggler arguing with herself. Use strikethrough for revised beliefs. Use question marks for unresolved uncertainty. Keep fragments short -- the voice tightens under stress. - -- The struck-through text is what the smuggler *used to believe*. -- The new text is what the smuggler *can't deny*. -- The question marks are the gap between the two. - -**Detective contradictions:** Show the system flagging the discrepancy. Use institutional language. Let the clinical precision carry the emotional weight by contrast with the monologue. - -- The DISCREPANCY FLAGGED label is what the insert reports. -- The CONFLICT summary is what the analytical training concludes. -- The monologue is where the detective *feels* it. - -### 15.3 The Monologue-Presentation Rule - -Restated from Section 6.4 for emphasis -- this is the authoring rule that content writers must internalize: - -1. **Never duplicate the monologue's emotional content in the evidence presentation.** The case file says "DISCREPANCY FLAGGED." The monologue says *"Sera, what do you know?"* These are not the same information. -2. **Never duplicate the evidence presentation's factual content in the monologue.** The notebook says "Corridor B-7. Off shift." The monologue says *"That wasn't anyone from our rotation."* The notebook documents; the monologue interprets. -3. **The gap between the two layers IS the character.** The detective's case file is precise where her monologue is personal. The smuggler's notebook is uncertain where her monologue is certain. The contradiction between layers is how the player reads the character's psychology. - -### 15.4 Checklist Before Submitting Evidence Content - -1. **Voice check:** Does the detective text use surnames? Does the smuggler text use first names? -2. **Diegetic check:** Does the text sound like something the character would write/file, or does it sound like game UI? -3. **Dual-lens check:** If the other character could see this item, would the description still make sense? (It shouldn't -- that's the point.) -4. **Monologue gap check:** Does the evidence entry duplicate anything the monologue already says? If yes, cut one. -5. **Contradiction check:** If this entry contradicts a previous one, is the contradiction presented in the character's style (strikethrough for smuggler, DISCREPANCY FLAGGED for detective)? - ---- - -## 16. Open Questions - -- **Q: Detective evidence view -- separate screen or overlay?** The case file could render as a full-screen overlay (pause + review) or as insert data layered on the game view. Full-screen is easier to read; overlay maintains the diegetic frame. Recommend: start with full-screen, test overlay in playtesting. -- **Q: Smuggler notebook -- scrollable or paginated?** As the notebook accumulates entries, does the player scroll through a continuous page or flip between person-pages? Recommend: person-pages (tab per name), since the smuggler organizes by relationship. This also reinforces the person-first framing mechanically. -- **~~Q: Strikethrough timing~~ RESOLVED:** Strikethrough appears in real-time when the monologue fires, not on next notebook open. D-034's wow moment #3 requires everything hitting at once: D-033 color shift + monologue + evidence contamination. Delaying the strikethrough splits the impact. The Phase 3 examples in Section 6 are authoritative. -- **Q: Cross-reference density for detective case file?** The insert can auto-generate cross-references, but too many links could create information overload. Recommend: max 3 cross-references per entry, prioritized by confidence level. Playtest to calibrate. -- **Q: Evidence-based confrontation -- show the item?** When the detective confronts using datapad evidence, does the item icon appear in the dialogue? When the smuggler confronts with the manifest, does it show? Recommend: yes for smuggler (physical object, makes the risk visible), no for detective (KG reference, the knowledge IS the weapon). This reinforces the physical vs informational asymmetry. - ---- - -**End Archetype Evidence Presentation Spec** diff --git a/docs/design/character-build-detective.md b/docs/design/character-build-detective.md deleted file mode 100644 index 30799bb41..000000000 --- a/docs/design/character-build-detective.md +++ /dev/null @@ -1,461 +0,0 @@ -# Character Build: The Detective - -**Ticket:** #181 | **Priority:** Critical | **Sprint:** 12 -**Status:** v0.1 Draft -**Blocked by:** #179 (Character definition schema) -**Blocks:** #182 (Divergent starting knowledge), #183 (Divergent relationships) -**Decisions referenced:** D-005, D-016, D-027, D-028, D-032, D-034, D-035, D-037, D-041, D-053, D-065, D-075 - ---- - -## identity - -```yaml -identity: - canonical_id: "pc:detective" - display_name: "[Player-set name]" - archetype: "detective" - occupation: "Commission Liaison Officer, Manifest Irregularity Investigation" - posting_duration: "3 days (newly arrived)" - faction: "Commission" - lattice_tier: "professional" - description: > - Commission Liaison Officer posted to Sova Transit District three days ago. - Official mandate: routine compliance review. Actual mandate: investigate - manifest irregularities suggesting organized freight smuggling. The distinction - between "official" and "actual" is itself the first lesson about how - Sova works. - - Trained investigator. Professional analytical lattice. Institutional - authority that opens doors and closes conversations. An outsider in a - community that has learned, over forty years of prefab-modular life, - to handle outsiders with polite minimal disclosure. - - Stands to lose: professional credibility (if the case goes cold), Sera - (the investigation, if pressed too hard, could compromise the only - trusted relationship in the district), and the clean institutional - clarity that makes the job feel justified — which the community's - moral complexity is already beginning to erode. -``` - ---- - -## starting_knowledge - -```yaml -starting_knowledge: - confidence_floor: "KnowsOf" - - known_facts: - # Investigation data - - key: "investigation.manifest_discrepancies" - confidence: "KnowsDetails" - source: "institutional" - notes: > - Case file from Commission records. Containers logged but not reconciled - with incoming manifests. Pattern suggests systematic manipulation, not - clerical error. Three clusters of anomalies over the past six months. - - - key: "investigation.freight_pattern" - confidence: "KnowsDetails" - source: "institutional" - notes: > - Anomalies cluster around shift transition windows. Same container series - recurring across discrepant manifests. Pattern analysis flagged this - posting as warranting investigation. - - # Persons of interest (case file, not personal knowledge) - - key: "person.voss_poi" - confidence: "KnowsOf" - source: "institutional" - notes: > - Voss, shift supervisor. Scheduling authority. In position to create the - oversight gaps that explain the manifest anomalies. Name from case file. - Not met yet. - - - key: "person.maret_poi" - confidence: "KnowsOf" - source: "institutional" - notes: > - Maret Korr, freight scheduler. Access to manifest data. Could be source - of the falsification or could be covering for someone else. Name from - case file. - - - key: "person.drin_poi" - confidence: "KnowsOf" - source: "institutional" - notes: > - Drin Rosta, dock inspector. Responsible for container verification. - Failure to flag discrepancies suggests either incompetence or complicity. - Name from case file. - - # Institutional context - - key: "world.previous_liaison" - confidence: "KnowsDetails" - source: "institutional" - notes: > - The previous Commission liaison rotated out 3 months ago. Rotation - was described as routine. The detective's case file notes that the previous - liaison filed no irregularity reports despite the same pattern being - detectable in their tenure. This warrants investigation. - - - key: "world.commission_presence" - confidence: "KnowsDetails" - source: "institutional" - notes: > - Sera Venn, Commission field tech. Not an investigator. Has been on Sova - for 1 year. Pre-existing relationship — same institutional background, - different postings. Reliable. Social anchor in unfamiliar district. - - - key: "world.district_geography" - confidence: "KnowsOf" - source: "institutional" - notes: > - The Terminal (logistics hub), The Last Shift (bar, social nexus), - maintenance corridors (off-books access routes noted in district layout - documentation). Three days in — still orienting to physical space. - - - key: "world.torek_compliance_connection" - confidence: "KnowsOf" - source: "institutional" - notes: > - Torek Lintar is a Commission compliance officer on Sova. Known from - institutional channels. Not a friend, but a professional known name. - - # Sera knowledge - - key: "person.sera_background" - confidence: "KnowsDetails" - source: "direct" - notes: > - Sera Venn: same career path, different posting. Reliable under pressure. - Transferred to Sova after a stressful posting elsewhere. Has been the - district's Commission presence for a year. The detective's one genuinely - friendly face in Sova. - - unknown_facts: - - key: "contraband.ring_exists" - notes: > - Does not know a ring exists. Suspects organized smuggling from the manifest - pattern, but "ring" implies structure, membership, coordination — the - detective doesn't know that yet. - - - key: "contraband.ring_members" - notes: > - Does not know any ring members by their ring membership. Kael Davan - is not in the case file. The smuggler is not in the case file. - - - key: "contraband.cargo_type" - notes: > - Does not know what the cargo is. The manifests show discrepancies; - they don't reveal what's being moved. The "what" is a layer below - the "that something is wrong." - - - key: "person.kael_exit_attempt" - notes: > - Completely unknown. Kael's unauthorized contact and exit attempt are - not visible to any institutional data source. - - - key: "person.sera_unreported_evidence" - notes: > - CRITICAL unknown. Sera has run an unofficial compliance check on Kael's - work patterns and is sitting on unreported evidence. The detective - trusts Sera completely. This gap is the structural basis for THE FRIEND arc. - - - key: "person.naia_confided_in_sera" - notes: > - Naia Tamm's worry about Kael, confided to Sera, is the emotional engine - behind Sera's concealment. The detective doesn't know Naia exists as - anything except a district resident. - - - key: "relationship.ring_membership" - notes: > - Who is in the ring, who is complicit, who is protecting whom. The detective - has names (Voss, Maret, Drin) without understanding the social web that - holds them together. - - - key: "person.smuggler_identity" - notes: > - Does not know the smuggler is in the ring. If the smuggler is in the case - file at all, it's as a name on a shift roster — no significance attached. - - - key: "world.previous_liaison_arranged" - notes: > - The detective wonders whether the previous Commission liaison's rotation - was routine or arranged. This suspicion is in the case file as a note; - it remains unconfirmed. (Canonical answer: arranged. But the detective - doesn't know this yet.) -``` - ---- - -## starting_relationships - -```yaml -starting_relationships: - - target: "npc:sera-venn" - relationship_state: "Friendly" - access_tier: [peer] - trust_level: "trusted" - relationship_type: "friend" - known_attributes: - name: "Sera Venn" - role: "Commission field technician" - faction: "Commission" - notes: > - Pre-existing friend. Same institutional background, different posting. - Transferred to Sova a year ago. Social anchor. The detective's guide - to an unfamiliar place — Sera fills in background on the district, - introduces the detective to regulars. Completely trusted at session start. - - - target: "npc:voss" - relationship_state: "Known" - access_tier: [authority] - trust_level: "uncertain" - relationship_type: "contact" - known_attributes: - name: "Voss" - role: "shift supervisor" - faction: "civilian" - notes: > - Person of interest. Name from case file, scheduling authority. Has - met once for credentials review. Stiffens when the detective enters - the hub. Professional, terse. No warmth. Institutional interaction only. - - - target: "npc:maret-korr" - relationship_state: "Known" - access_tier: [authority] - trust_level: "uncertain" - relationship_type: "contact" - known_attributes: - name: "Maret Korr" - role: "freight scheduler" - faction: "civilian" - notes: > - Person of interest. Manifest access. Has cooperated professionally with - data requests — provided clean set of schedules. Slightly nervous. - Cooperation is compliance, not friendliness. - - - target: "npc:drin" - relationship_state: "Known" - access_tier: [authority] - trust_level: "uncertain" - relationship_type: "contact" - known_attributes: - name: "Drin Rosta" - role: "dock inspector" - faction: "civilian" - notes: > - Person of interest. Responsible for container verification. Has met - once. More evasive than Voss or Maret. The detective notes the evasion - without yet understanding the cause. - - - target: "npc:torek-lintar" - relationship_state: "Known" - access_tier: [public] - trust_level: "uncertain" - relationship_type: "colleague" - known_attributes: - name: "Torek Lintar" - role: "Commission compliance officer" - faction: "Commission" - notes: > - Commission compliance officer on Sova — professional known name, not a - friend. Has seen him at the bar with Sera. Slightly off in a way the - detective can't yet articulate. - - - target: "npc:lera-sessik" - relationship_state: "Unknown" - access_tier: [public] - trust_level: "uncertain" - relationship_type: null - known_attributes: - name: "Lera Sessik" - role: "bar owner" - faction: null - notes: > - Sera mentioned The Last Shift. The detective has visited once or twice. - Lera is polite, guarded, watching. Not hostile. Not warm. - - - target: "npc:kael-davan" - relationship_state: "Unknown" - access_tier: [public] - trust_level: "uncertain" - relationship_type: null - known_attributes: - name: null - role: "dock worker" - faction: null - notes: > - Unknown at session start. Name might appear on a shift roster without - significance. No personal knowledge. No case file entry. The detective - has no reason to flag Kael — yet. - - - target: "npc:naia-tamm" - relationship_state: "Unknown" - access_tier: [public] - trust_level: "uncertain" - relationship_type: null - known_attributes: - name: null - role: null - faction: null - notes: "No connection at session start. Exists as a district resident without individual identity." - - - target: "npc:pc-smuggler" - relationship_state: "Unknown" - access_tier: [public] - trust_level: "uncertain" - relationship_type: null - known_attributes: - name: null - role: "dock worker" - faction: null - notes: > - One of many dock workers. No individual significance at session start. - Knowledge accumulates through observation and tell accumulation. - May shift to PersonOfInterest if tells compound and manifest - discrepancy connection is made. -``` - ---- - -## access_permissions - -```yaml -access_permissions: - can_unlock: - - tier: "public" - condition: "Always available" - max_npcs: "unlimited" - - - tier: "authority" - condition: "RelationshipState is Unknown, Known, or PersonOfInterest — credential presentation" - max_npcs: "unlimited for institutional NPCs; does not work with hostile or fully closed NPCs" - - - tier: "peer" - condition: "RelationshipState reaches Friendly" - max_npcs: "limited — Sera at session start; others require sustained positive interaction" - - structurally_locked: - - tier: "insider" - reason: > - The detective can never access insider-tier ring dialogue. Not because - institutional authority is insufficient — authority and insider are - different axes. Insider requires social belonging within the ring network. - The ring recognizes the detective as Commission. The ring closes, not opens, - when institutional authority is applied. Pressing harder does not unlock - insider content; it triggers defensive behavior and hostile tone. This is - architecturally fundamental to the two-keyhole design. - - - tier: "authority (failed)" - reason: > - Authority access fails when RelationshipState is Hostile. Once an NPC - has turned against the detective's investigation, credential presentation - produces refusal or evasion, not compliance. The detective cannot - authority-tier their way through a hostile source. -``` - ---- - -## skills - -```yaml -skills: - lattice_tier: "professional" - movement_default: "walk" # D-053 MovementProfile - inventory_slots: 2 # D-065 - evidence_display: "case_file" - - capability_flags: - - "authority_credentials" # Badge/ID; unlocks authority tier with Unknown/Known NPCs - - "manifest_access" # Can formally request freight manifests from institutional NPCs - - "analytical_lattice" # Pattern recognition overlay; flags behavioral anomalies at Careful stance - - starting_items: - - item_id: "detective_case_file" - description: "Institutional case file: manifest discrepancy analysis, persons of interest, previous liaison notes." - leverage_type: "proof" - notes: > - The detective's starting information in physical form. Can be referenced - in dialogue to trigger authority-tier responses — "according to case file X." - Contains the manifest discrepancy data that links to Kael's work patterns, - though the detective doesn't know this yet. - - - item_id: "detective_commission_credentials" - description: "Commission identification and liaison officer authorization." - leverage_type: "access" - notes: > - Credential presentation triggers authority tier access with Unknown/Known NPCs. - Does not work with ring-network NPCs in insider mode — they recognize - Commission credentials as a threat, not an access grant. Carried on person; - visible as a status marker to any NPC with institutional awareness. -``` - ---- - -## presentation - -```yaml -presentation: - monologue_pool: "detective" - evidence_display: "case_file" - - voice_register: - sentence_length: "complete sentences, occasional fragments for emphasis" - vocabulary: "institutional layer over plain speech — investigative habit without jargon" - emotional_mode: "analysis-first, personal second" - relationship_mode: "surname-first for targets, first-name for trusted" - - emotional_baseline: - state: "professional-cautious" - description: > - Trained to observe, analyze, withhold judgment until evidence accumulates. - But also human — isolated in an unfamiliar community, reliant on Sera for - social grounding, aware that non-cooperation is the district default. - - The analytical habit runs in the background like an operating system. - Counts things. Tracks frequencies. Flags inconsistencies. Internal bookkeeping - is automatic: "filing it," "noted," "coincidence?" The institutional training - doesn't turn off; sometimes the human overrides it. When it does, the crack - in the professional surface IS the emotional payload. - - Believes in the work. Smuggling isn't victimless — unlicensed lattice - components can cause neural degradation, medical replacements diverted from - Syndic supply chains mean someone else doesn't get what they need. The - investigation is justified. But the moral clarity is starting to erode — - the community is beginning to read as more complex than "crime scene." - - opening_monologue: - lines: - - "Sova Transit District. Third day on station. The briefing said routine compliance review." - - "The briefing is always wrong about something." - - "Manifest discrepancies clustered around the freight hub. Start there. Watch the shift change." - - "Good to know Sera's here. At least someone in this district speaks my language." - emotional_payload: > - Isolation, professional caution, guarded optimism about Sera. The detective - is an outsider. The district doesn't want them here. The player should feel - the gap between institutional authority and social belonging. -``` - ---- - -## Authoring Notes - -**What makes the detective's experience distinct:** - -- The district is a CRIME SCENE. Every NPC is a potential witness, informant, or subject. The detective categorizes before connecting. Kael is "dock worker, Davan, K." before he's Kael. The shift to first names — if it happens — is itself a relationship marker. -- The monologue is ANALYTICAL and complete-sentence. Counts things. Notices deviations. The emotional register leaks through the analytical frame rather than leading it. -- The emotional journey of the vertical slice moves from professional isolation to specific, personal betrayal — but the betrayal is different: not "Kael lied to me," but "Sera, who I trusted completely, is compromised by something she did to protect someone I've never met." - -**What the detective's authority access buys:** Conversations happen faster. NPCs answer direct questions. But answers are framed for compliance, not candor. The detective gets facts from people who don't want to give them — which means incomplete facts, deflected facts, facts that look complete but aren't. Authority access is a key that opens the door. It doesn't make what's inside visible. - -**Voice anchors (mandatory reference for all detective monologue):** -1. *"Logistics hub. Standard prefab, heavy foot traffic. Let's see what the shift change tells me."* -2. *"That's the third time. Sera leaves when Torek arrives. Three different excuses, same result. That's not coincidence."* -3. *"Good to see Sera. She always was the reliable one. At least someone in this district speaks my language."* -4. *"Same booth. Same warm smile. Same offer to buy me a drink. ...Everything except whatever she's not saying."* -5. *"Grain spirit and low conversation. Only place in this district that doesn't smell like freight lubricant."* - ---- - -*Ticket #181 — Detective character build. v0.1 scope.* diff --git a/docs/design/detective-chain-of-command.md b/docs/design/detective-chain-of-command.md deleted file mode 100644 index 71b36d950..000000000 --- a/docs/design/detective-chain-of-command.md +++ /dev/null @@ -1,162 +0,0 @@ -# Detective: Institutional Chain of Command - -**Ticket:** #322 | **Priority:** High | **Sprint:** 12 -**Status:** v0.1 Draft -**Owners:** Paula (narrative arc), Miri (setting/institutional context) -**Decisions referenced:** D-005, D-027, D-037, D-041 - ---- - -## 1. Purpose - -The detective is not a freelance investigator. They are a Commission officer, which means someone assigned them here, someone defined their mandate, someone is waiting for reports, and someone may have an interest in how this investigation concludes — not all of them aligned. - -The institutional chain of command is not just background. It determines: -- **What the detective is officially permitted to do** (arrest authority, warrant scope, search powers) -- **What they're NOT supposed to do** (exceed mandate, go outside channels, use extra-institutional leverage) -- **Who benefits if the investigation succeeds** — and who doesn't -- **The political weight of the previous liaison's rotation** — which may not have been routine - -This document establishes the detective's institutional world. It does not need to be fully visible to the player in v0.1 — it lives in the detective's case file, in their monologue, in what institutional NPCs say when authority-tier access opens. But it must be consistent. - ---- - -## 2. The Commission — Brief Institutional Context - -The Commission (Intersolar Commission) is the primary regulatory body governing freight transit, customs enforcement, and neural lattice certification across the Settled Reach. It is not a police force. It operates through: -- **Compliance review** — routine audits of freight hubs, manifest reconciliation -- **Liaison officers** — semi-permanent postings to transit hubs; advisory and investigative authority -- **Field technicians** — technical support, equipment maintenance, passive monitoring (Sera Venn's role) -- **Enforcement officers** — arrest authority; called in from sector headquarters for formal investigations - -The detective's posting as "Commission Liaison Officer" sits between compliance and enforcement. They have investigative authority — enough to request manifests, interview persons of interest, and flag suspects — but formal arrest and search warrant authority requires escalation to sector headquarters. - -**This matters for the detective's v0.1 situation:** They can investigate. They cannot arrest without authorization from above. If they find evidence of a smuggling ring, they need to report it up the chain before taking action — and that creates a window of political exposure. - ---- - -## 3. The Formal Chain - -### Level 1: The Detective (On-Station) -**Title:** Commission Liaison Officer, Sova Transit District -**Mandate (official):** Routine compliance review — manifest reconciliation, scheduling compliance, standard freight hub audit. -**Mandate (actual):** Investigate manifest irregularities suggesting organized smuggling. Identify structure, membership, and supply chain. Report to Sector Oversight with arrest recommendations. -**Reporting to:** Sector Liaison Coordinator, Commission Sector 7 Headquarters (off-station, a span-gate transit away) - -### Level 2: Sector Liaison Coordinator — Renna Veth -**Title:** Liaison Coordinator, Commission Sector 7 -**Who she is:** Career Commission officer. Mid-level administrator with 20 years of routine compliance work and two serious investigations to her name. Professional, risk-averse. Not corrupt — but also not courageous. Wants the investigation to produce results without embarrassing the Commission or producing a political fight she didn't expect. -**Her interest in this investigation:** Wants it resolved cleanly. A successful arrest closes a compliance gap in her sector metrics. A failed investigation — especially one that implicates a Commission insider — would be a problem. -**Relationship with detective:** Assigned the detective to Sova because the detective has a clean record and a reputation for methodical work. Does not know the detective personally. - -### Level 3: Sector Deputy Commissioner — Halden Pres -**Title:** Deputy Commissioner, Sector 7 -**Who he is:** Political appointee. Has been in position for 6 years. Sector 7 covers the Krenn System transit hubs, which are economically significant — freight logistics for Velen's surface operations. Not personally corrupt. But his political relationships include figures who have interests in how freight regulation is managed in the sector. -**His knowledge of this investigation:** Was briefed at level of "routine compliance review at Sova." Does not know the actual investigative mandate. If the investigation escalates — if arrests are made, if Commission involvement in a smuggling ring is implied — he will be briefed, and his political relationships will activate. -**The political risk:** Deputy Commissioner Pres is not an enemy. But if the investigation implies that a previous Commission liaison was arranged to protect a smuggling ring, Pres may have indirect connections to whoever arranged it. He is not the villain. But he is a constraint. - ---- - -## 4. The Previous Liaison: Korrean Tsev - -**Title (former):** Commission Liaison Officer, Sova Transit District -**Rotation:** Posted to Sova for 18 months; rotated out 3 months before the detective arrived. -**Official reason for rotation:** Standard posting cycle. Liaison officers rotate every 18-24 months to prevent over-familiarity with local operations. - -**The detective's case file note:** The previous liaison, Korrean Tsev, was in position during the period when manifest discrepancies were already detectable in the freight data. No irregularity reports were filed. Three compliance audits during Tsev's tenure all came back clean. The anomalies that the detective's pattern analysis flagged from the data should have been visible to Tsev. - -**Was the rotation arranged?** - -The detective's case file flags this as unconfirmed but suspicious. The canonical answer (not available to the player in v0.1): **yes, it was arranged.** Tsev was not corrupt in the sense of taking ring money — but Tsev was compromised by personal loyalty. A relationship with someone at sector administration meant Tsev was quietly moved when the manifest anomalies became too persistent to ignore, rather than being required to file a report that would implicate people above Tsev's pay grade. - -**What the detective can learn in v0.1:** -- That Tsev filed no reports (case file, accessible from session start) -- That the anomalies were detectable during Tsev's tenure (manifest data analysis, takes investigation time) -- That Tsev was rotated on a compressed timeline (standard was 24 months; actual was 18 months) — this is discoverable through institutional records if the detective requests them - -**What the detective cannot learn in v0.1:** -- WHY the rotation was arranged -- Who in sector administration was involved -- Whether Deputy Commissioner Pres had knowledge - -This is a thread that extends beyond the v0.1 vertical slice. The detective can pull the thread enough to see it exists, but not enough to unravel what's at the other end. - ---- - -## 5. Torek Lintar: Commission Compliance Officer - -Torek Lintar is Commission compliance on Sova — not an investigator, not a liaison officer, but a permanent-fixture compliance monitoring role. Commission compliance officers are lower in the formal hierarchy than liaison officers, but they have one thing liaison officers don't: **local knowledge accumulated over years.** - -Torek has been on Sova for 4 years. He knows everyone. He knows the bar. He knows the shifts. He knows the social fabric in a way a three-day-old liaison officer cannot. - -**The detective's starting relationship with Torek:** Professional known name from institutional channels. Not a friend. Encountered at the bar (Torek is a bar regular). - -**What Torek knows that the detective doesn't:** -- The ring's social footprint, at least at the edges — conspicuous spending, familiar faces -- Sera Venn's unofficial compliance check (Torek suspects; he doesn't know for certain) -- The shape of the social web connecting Kael's group - -**Why Torek hasn't reported what he knows:** -Torek's tolerance threshold for confrontation is low. He is ring-adjacent (D-024 triangle 3: Bar Tensions), which means he is socially embedded with people who are embedded with the ring. His conspicuous spending suggests he may have accepted something from ring-peripheral sources — not enough to be a member, but enough to compromise his ability to report cleanly. He is not a villain. He is a compromised observer who has talked himself into believing the right moment to report will come later. - -**Torek as asset for the detective:** -If the detective builds enough trust (social + authority), Torek can become an information source — but carefully. The ring is aware of Torek's connection to Commission compliance. Torek going to the detective too visibly risks blowback on both of them. - -**Torek as the signal in Sera's FRIEND arc:** -Sera avoids Torek. Three times. Three different excuses. The detective's monologue reads this as a behavioral pattern. The reason: Sera ran an unofficial check on Kael's work patterns (using Commission technical access she wasn't supposed to use) and found the same manifest discrepancies the detective found. Torek, as Commission compliance, would be the person Sera should have reported this to. Sera's avoidance of Torek is the tell that she found something and didn't report it. The detective doesn't know this yet — but the behavioral signal points there. - ---- - -## 6. Political Pressures on the Investigation - -The detective's investigation operates under several simultaneous pressures: - -| Pressure | Source | Direction | Effect | -|----------|--------|-----------|--------| -| **Succeed cleanly** | Veth (Sector Coordinator) | Upward | Produce results without creating institutional embarrassment | -| **Don't exceed mandate** | Institutional | Inward | Formal arrests require escalation; the detective can't act unilaterally | -| **Previous liaison question** | Case file | Lateral | Pulling this thread risks finding Commission involvement; politically dangerous | -| **Sera's position** | Personal | Personal | Using what Sera knows against her would destroy the detective's only personal relationship in the district | -| **Community non-cooperation** | Social | Environmental | The district's default resistance to institutional authority; this is not malice, it's culture | - -The detective is not just investigating a smuggling ring. They are investigating within an institutional structure that has already failed to catch this ring once. The question of whether that failure was incompetence or arrangement is the shadow behind every manifest discrepancy. - ---- - -## 7. How This Appears in Monologue - -The detective's institutional context should surface in monologue lines as internal processing — the analytical framing through which they filter every observation. Not institutional jargon, but institutional habit. - -**Examples:** - -At session start, observing the hub: -*"Third day. Tsev was here for eighteen months and filed nothing. Either I'm better at this than Tsev, or there's something in the water. Let's find out."* - -When Voss deflects a question: -*"That answer was technically responsive. It gave me nothing. Voss knows exactly what I'm asking. Note it."* - -When considering what Torek knows: -*"Lintar's been on Sova for four years. He's seen whatever there is to see. Commission compliance doesn't file reports in a vacuum — something told him to stay quiet."* - -When the Sera contradiction emerges: -*"I could escalate this. Report what I suspect to Veth. But if I'm wrong about Sera, I've just burned my only ally on a hunch. And if I'm right — I need to know how far this goes before I put it in writing."* - ---- - -## 8. v0.1 Content Scope - -What needs to be authored for this to work: - -| Element | Content Requirement | -|---------|---------------------| -| Detective opening monologue (lines about Tsev's missing reports) | 1-2 lines from session start knowledge | -| Case file items (accessible via evidence display) | 3-5 readable entries: Tsev rotation note, manifest cluster data, POI summaries | -| Torek dialogue (authority tier) | 3-5 lines for institutional context questions | -| Veth (off-station, not interactive) | Referenced in case file and detective monologue only | -| Detective monologue about political constraints | 2-3 lines scattered across session | - -The chain of command does not require NPCs to appear — Veth and Pres are off-station and non-interactive in v0.1. Their presence is felt through the detective's case file entries and internal monologue about institutional constraints. Torek is the only chain-of-command-adjacent NPC who is interactive. - ---- - -*Ticket #322 — Detective institutional chain of command. v0.1 scope.* diff --git a/docs/design/divergent-starting-knowledge.md b/docs/design/divergent-starting-knowledge.md deleted file mode 100644 index 103c3dcac..000000000 --- a/docs/design/divergent-starting-knowledge.md +++ /dev/null @@ -1,171 +0,0 @@ -# Divergent Starting Knowledge - -**Ticket:** #182 | **Priority:** Critical | **Sprint:** 12 -**Status:** v0.1 Draft -**Blocked by:** #180 (Smuggler build), #181 (Detective build) -**Decisions referenced:** D-005 (asymmetric information), D-027 (vertical slice), D-041 (knowledge graph), D-065 (evidence display) - ---- - -## 1. Design Principle - -Asymmetric information is the master mechanic (D-005). The two characters know different things about the same world. Neither has the full picture. The game's central tension comes from each player discovering what the other already knew — but only on their second playthrough. - -The knowledge sets are not merely different. They are **inverted at the points that matter most.** The smuggler knows the conspiracy from inside it. The detective knows the investigation from outside it. The middle — the social web that connects them — is what neither fully understands at session start. - ---- - -## 2. Master Knowledge Comparison Table - -### 2a. Contraband and Ring - -| Fact | Smuggler | Detective | -|------|---------|-----------| -| Ring exists (organized smuggling operation) | **KnowsEverything** — member | Unknown — suspects "systematic manipulation" but no structural knowledge | -| Ring members (Nils, Kael, Voss, Renn, Devra, Resha) | **KnowsDetails** — works with them daily | Unknown — names absent from case file; only Voss, Maret, Drin as institutional POIs | -| Cargo type (unlicensed lattice components, medical replacements) | **KnowsDetails** — handles the containers | Unknown — case file has weight/size anomalies but not cargo type | -| Smuggling routes (corridor access, timing windows) | **KnowsEverything** — runs the routes | Unknown — knows maintenance corridors exist from district layout documents | -| Operation schedule (shift transition windows) | **KnowsEverything** — the 20-minute gaps are the job | **KnowsDetails** — case file shows anomaly clustering around shift transitions | -| Supply chain upstream (Sabel, Syndic connection) | **KnowsOf** (partial: knows Sabel, not the full chain) | Unknown | -| Voss's complicity (takes a cut, provides scheduling cover) | **KnowsEverything** — operational fact | Unknown — Voss is a POI because of scheduling authority, not proven complicity | -| Drin's complicity (looks the other way on inspections) | **KnowsDetails** — operational asset | Unknown — Drin is a POI because of inspection failures | -| Maret's awareness (scheduling access to cover for ring) | **KnowsDetails** — hub colleague | **KnowsOf** — person of interest from case file | - -### 2b. Investigation - -| Fact | Smuggler | Detective | -|------|---------|-----------| -| Detective's identity as investigator | Unknown — may know "new Commission presence" from ring warning | **KnowsEverything** — is the investigator | -| Detective's actual mandate (investigate freight irregularities) | Unknown — "routine compliance review" is the cover | **KnowsEverything** | -| Manifest discrepancies exist and are flagged | **KnowsOf** — operational awareness that paperwork is being managed | **KnowsDetails** — has the discrepancy data, cluster analysis, container series | -| Previous Commission liaison rotation (possibly arranged) | Unknown | **KnowsOf** — noted in case file as suspicious; unconfirmed | -| Commission's investigation timeline | Unknown | **KnowsDetails** — their own timeline | - -### 2c. Key People - -| Fact | Smuggler | Detective | -|------|---------|-----------| -| Kael's exit attempt (unauthorized external contact) | **Unknown** (CRITICAL gap — basis for FRIEND arc) | Unknown | -| Sera's unreported evidence (suppressed compliance check on Kael) | Unknown | **Unknown** (CRITICAL gap — basis for FRIEND arc) | -| Naia confided in Sera about Kael | Unknown | Unknown | -| Naia's worry about Kael's behavior | **KnowsOf** — has noticed Naia seems stressed at bar; doesn't know why | Unknown — Naia is not yet a known individual | -| Torek's spending (conspicuous, potential security risk) | **KnowsOf** — has noticed; worries about exposure | **KnowsOf** — "slightly off in a way I can't yet articulate" | -| Sera's background (pre-existing contact for detective) | Unknown — knows Sera only as "Commission, keep distance" | **KnowsDetails** — trusted pre-existing friend | -| Smuggler's role in the ring | **KnowsEverything** — is a member | Unknown — one of many dock workers | -| Kael's relationship with Nils (brother; ring coordinator) | **KnowsDetails** | Unknown | - -### 2d. Location and World - -| Fact | Smuggler | Detective | -|------|---------|-----------| -| Sova Transit District geography (full) | **KnowsEverything** — 3 years here | **KnowsOf** — 3 days; still orienting | -| Corridor B-7 (restricted, ring access) | **KnowsEverything** — knows the access token, uses the corridor | Unknown — maintenance corridors noted in district layout | -| Dead drop location (temp storage bay 4, container 4471) | **KnowsEverything** | Unknown — container 4471 appears in manifest discrepancy data but not mapped to a location | -| Shift schedule rhythms (social and operational) | **KnowsEverything** | **KnowsOf** — knows shifts exist, pattern from case file | -| Bar social structure (who sits where, who's a regular) | **KnowsDetails** — 2 years of evenings at Lera's | **KnowsOf** — has visited twice | - ---- - -## 3. Knowledge Asymmetry Map - -The gaps in each character's knowledge are not random — they cluster around the same events and people, approached from opposite directions: - -``` - THE SHARED WORLD - ↕ - ┌─────────────────────────────────────┐ - │ Triangle 4 │ - │ Naia ←→ Kael ←→ Sera │ - │ ↑ ↑ │ - │ (Kael's (suppressed │ - │ partner, evidence) │ - │ knows ↕ │ - │ something) Detective's │ - │ ↕ FRIEND │ - │ Smuggler's │ - │ FRIEND │ - └─────────────────────────────────────┘ - -Smuggler knows: Kael (trusted friend), ring details, routes, members -Smuggler doesn't know: Kael is exiting, Sera's evidence, Naia→Sera connection - -Detective knows: Investigation data, Sera (trusted friend), manifest anomalies -Detective doesn't know: Ring structure, Kael's role, Sera's evidence, Naia→Sera connection - -Neither knows: Triangle 4's full shape — the chain from Naia's worry to Sera's suppression to the investigation closing in -``` - -The dramatic irony of the second playthrough is that the player who's played as the smuggler watches the detective investigate from outside what the smuggler knows intimately. The player who's played as the detective watches the smuggler trust Kael — not knowing the thing the detective now knows (Kael is the link between the ring and Sera's evidence). - ---- - -## 4. Knowledge Acquisition Curves - -### Smuggler: What they can learn, and how - -| Unknown → Known | Method | Timing | -|----------------|--------|--------| -| Detective's identity | Ring warning (Kael/Voss mentions Commission presence) OR direct observation | Minutes 0-5 (if warned); later if not | -| Kael's exit attempt | THE FRIEND arc — spatial observation (Corridor B-7), then confrontation | Minutes 15-25 | -| Sera has unreported evidence | Cannot discover this through normal play. Would require Sera to confess or Naia to reveal — extreme late-game territory beyond v0.1 scope | Post-v0.1 | -| Torek's specific risk level | Observation of Torek's behavior over time | Minutes 10-20 | - -### Detective: What they can learn, and how - -| Unknown → Known | Method | Timing | -|----------------|--------|--------| -| Ring exists (structured) | Evidence accumulation — NPC behavioral tells, manifest patterns, corridor observation | Minutes 15-25 | -| Kael is ring member | Connecting manifest discrepancies to Kael's shift data; cargo attention tell | Minutes 20-30 | -| Sera's unreported evidence | THE FRIEND arc — behavioral pattern observation (Torek avoidance), then confrontation | Minutes 20-30 | -| Smuggler is in the ring | Tell accumulation (corridor check, social clustering with Kael/Renn), manifest connection | Minutes 15-30 | -| Kael's exit attempt | Would require Kael to confess or Naia to reveal — beyond normal investigation path | Post-confrontation branch | - ---- - -## 5. Evidence Display Difference - -Same underlying Knowledge Graph, different presentation layer (D-065): - -**Detective — Case File Format:** -``` -Entity: Kael Davan -Role: Dock worker, Sova Terminal -Confidence: KnowsOf -Source: observation -Attributes: - - routine_pattern: "morning shift 06:00-14:00" - - behavior_flags: [lattice_checking, shortened_interactions] - - risk_assessment: "moderate — behavioral anomalies suggest concealment" - - link: [manifest_discrepancy_cluster_A] -Insert suggests: "Check shift records against anomaly window" -``` - -**Smuggler — Personal Notebook Format:** -``` -Kael — closes colleague, ring. Two years. Trust: solid. -Lately: distracted. Lunch cut short twice this week. -Something's off. Not the operation — personal. -Watch for: the look-left tell. -``` - -Same underlying entity. Different framing. The detective files evidence. The smuggler worries about people. - ---- - -## 6. Design Implications for Content Authors - -**Rule 1: Don't explain what the character already knows.** -The smuggler doesn't need exposition about how the ring works. They know. Monologue lines about the ring should be operational, not explanatory. The detective doesn't need exposition about institutional procedures. They know. Monologue lines about the investigation should be observational, not procedural. - -**Rule 2: The unknown facts are load-bearing.** -When writing monologue lines, verify against the unknown_facts list. A smuggler monologue line that references Kael's exit attempt before Phase 3 is a continuity error. A detective monologue line that identifies Kael as a ring member before connecting manifest data to shift records is a continuity error. - -**Rule 3: Knowledge gaps produce monologue, not silence.** -What a character doesn't know generates JUST AS MUCH monologue content as what they know. The smuggler's worry about "is Torek a risk?" is monologue material. The detective's uncertainty about "previous liaison rotation — arranged or routine?" is monologue material. The unknown is active, not empty. - -**Rule 4: The same event produces inverted monologue.** -When the same NPC does the same thing in both playthroughs, the monologue responses should be detectably from different starting states. Kael checking his lattice → smuggler thinks "not like him to be jumpy" (personal familiarity) → detective thinks "lattice activity spiked, behavioral flag" (observational analysis). - ---- - -*Ticket #182 — Divergent starting knowledge. v0.1 scope.* diff --git a/docs/design/insert-hud-wireframe-v01.md b/docs/design/insert-hud-wireframe-v01.md index 6038ab876..f09a9bbcf 100644 --- a/docs/design/insert-hud-wireframe-v01.md +++ b/docs/design/insert-hud-wireframe-v01.md @@ -1,5 +1,4 @@ # Insert/HUD Wireframe and Visual Specification — v0.1 -## Dual Character Variants: Smuggler + Detective **Ticket:** #314 **Author:** Araminta (Visual Designer) @@ -7,6 +6,8 @@ **Status:** Active — feeds #263 (time display client implementation) and #151 (minimap rendering) **Visual grammar reference:** `docs/design/visual-grammar-v01.md` (§7 Neural Insert Overlay) +> **Sprint 26 / D-117:** Detective archetype removed. Detective-specific sections (§3.3, §4.2, §5.2, §10.2, §10.3) have been deleted. Remaining content reflects the base lattice profile (smuggler/observer). Smuggler variant retained as reference for the tycoon observer insert design. + --- ## 1. System Architecture @@ -16,20 +17,20 @@ The insert HUD is not a UI panel bolted onto the game. It is the player characte This has direct design consequences: - The insert does not appear/disappear — it activates and deactivates. The character's lattice is always there; they choose when to engage it. -- Labels use the character's vocabulary, not the game's. The smuggler's insert calls it "The Last Shift." The detective's insert calls it "Licensed Establishment, District 7." +- Labels use the character's vocabulary, not the game's. The smuggler's insert calls it "The Last Shift." - The same underlying `ObserverSnapshot` feeds both variants. One parameterized system: `lattice_profile` on the snapshot determines which visual mode renders. Stig builds one HUD framework, not two. The variants are rendering configurations, not separate systems. ### 1.1 Technical Parameters -| Parameter | Smuggler | Detective | -|-----------|----------|-----------| -| `lattice_profile` | `lattice_baseline` | `lattice_augmented` | -| Line weight | 1px | 1–2px | -| Annotation density | Sparse — essential markers only | Dense — more markers, connection lines | -| Passive opacity | 60% | 80% | -| Active opacity | 85% | 100% | -| Bloom | 2–3px gaussian at 40% blend | 2–3px gaussian at 40% blend | -| Chrome color | `#c8d0e0` | `#c8d0e0` | +| Parameter | Value | +|-----------|-------| +| `lattice_profile` | `lattice_baseline` | +| Line weight | 1px | +| Annotation density | Sparse — essential markers only | +| Passive opacity | 60% | +| Active opacity | 85% | +| Bloom | 2–3px gaussian at 40% blend | +| Chrome color | `#c8d0e0` | ### 1.2 Z-Layer Position @@ -104,39 +105,13 @@ Single line: the time. Informal, just the clock. No annotation. The smuggler's lattice gives them the time. That's it. -### 3.3 Detective Variant - -Two lines: clock on top, shift indicator below. The detective thinks in shifts. - -``` - 09:42 - SHIFT A · -``` - -| Element | Value | -|---------|-------| -| Time text | `{HH}:{MM}` — Michroma 20px, `#c8d0e0` at 80% passive, y: 26px in container | -| Phase label | `SHIFT {X}` — Michroma 11px, `#c8d0e0` at 60%, y: 50px in container | -| Phase dot | 4px circle, phase-color (see below), same y as phase label | - -**Day phase to shift mapping:** - -| Game time | Shift label | Dot color | -|-----------|-------------|-----------| -| 05:00–12:00 | `SHIFT A` | `#c8d0e0` (chrome, neutral) | -| 12:00–18:00 | `SHIFT B` | `#c8d0e0` (chrome, neutral) | -| 18:00–22:00 | `SHIFT C` | `#e8c547` (amber — social hours, higher risk of contacts) | -| 22:00–05:00 | `SHIFT OFF` | `#4a9ebb` (teal — night, lower routine activity) | - -The dot is a subtle visual cue, not a state machine icon. It gives the detective's lattice a slightly more annotated feel than the smuggler's plain clock. - -### 3.4 Insert-Off Behavior +### 3.3 Insert-Off Behavior When `insert_active == false`: - Time display dims to 50% of passive opacity - Background panel disappears entirely - Text remains — the character always knows what time it is, even without active lattice engagement. Time is ambient lattice output, not targeting output. -- Phase label (detective) also dims to 50% + The time display is the one persistent insert element. Everything else goes dark on insert deactivation. @@ -188,59 +163,6 @@ Named NPCs (Kael, Lera, Sera, etc.) always show a casual label. Generic NPCs sho The smuggler does not see "Person of Interest." To them, amber means "something's off about this person" — not a case file designation. -### 4.2 Detective Variant — Investigation Overlay - -The detective sees their world as a case map. Known individuals are flagged. Locations have institutional labels. The overlay is denser and more annotated. - -**Named NPC marker specification:** - -| NPC type | Shape | Size | Color | -|----------|-------|------|-------| -| Person of Interest | Diamond (rotated square) | 10px × 10px | `#e8c547` amber | -| Known/Friendly | Filled circle | 6px | `#6bc9a6` green | -| Unknown | Filled circle | 6px | `#4a9ebb` teal | -| Hostile / Suspect | Diamond | 10px × 10px | `#d45d5d` red | - -The diamond shape is the detective's POI designation — it communicates "flagged" without text. The smuggler's variant uses only circles because their lattice doesn't have case-file designation logic. - -**Label specification:** - -| Property | Value | -|----------|-------| -| Typeface | Michroma 11px | -| Color | `#c8d0e0` at 80% passive, 100% on hover | -| Position | 10px above the marker, right-aligned to marker center | -| NPC label format | `POI: K. Davan` (formal: last name initial + surname) | -| NPC label format | `K. Davan` for Known/non-POI | -| Location label | See §5 | - -**Evidence annotation:** - -When the detective has logged evidence associated with an entity, a small square appears adjacent to their marker: - -| Property | Value | -|----------|-------| -| Shape | Filled square | -| Size | 4px × 4px | -| Position | 4px right of the primary marker | -| Color | `#e8c547` amber | -| Opacity | 60% passive, 100% on hover | - -This is the insert's way of flagging "you have something on this person." It doesn't say what. - -**Commission grid overlay (Detective only):** - -The detective's augmented lattice renders a very faint reference grid across the viewport. This is the "commission-style" aesthetic — the world read as a site map. - -| Property | Value | -|----------|-------| -| Grid lines | Horizontal + vertical, every 5 visual tiles (~320px) | -| Line color | `#333340` at 20% opacity | -| Line weight | 1px | -| Behavior | Always visible when insert active, disappears on insert-off | - -The grid does not animate, pulse, or react. It is a passive reference overlay. Five lines across the width, five down the height, making a 5×5 grid of reference squares. It is barely visible — felt as structure, not seen as decoration. - --- ## 5. Location Labels @@ -265,25 +187,6 @@ Casual labels, written in the smuggler's vocabulary. These are their personal pi | Position | Centered on location anchor, 16px above entity-level (below any entity markers at that location) | | Visibility | Always visible for known locations, fades in on discovery | -### 5.2 Detective Variant - -Institutional labels, written in Commission case file format. - -| Location | Label text | -|----------|-----------| -| The Last Shift (bar) | `Licensed Establishment · District 7` | -| The Terminal (logistics hub) | `Freight Operations Hub · Level 2` | -| Maintenance corridor | `Restricted Access — Corridor B-7` | -| Kael's regular position | `K. Davan – Last Sighted` | - -| Property | Value | -|----------|-------| -| Typeface | Michroma 11px | -| Color | `#c8d0e0` at 70% — slightly more prominent than smuggler's labels | -| Position | Same as smuggler, centered on anchor | -| Secondary text | Dot separator `·` between primary name and category/district | -| Visibility | Always visible for known/case-file locations | - --- ## 6. Border Arrows (Off-Screen Navigation) @@ -307,10 +210,9 @@ When a known POI or tracked entity is outside the current viewport, a border arr **Decay:** If the character has only `Suspects` confidence about a location (not `KnowsOf`), the border arrow renders at 30% opacity with a dashed border (1px alternating 2px on / 2px off). "Something might be there." -### 6.2 Smuggler vs Detective +### 6.2 Arrow Behavior -- **Smuggler:** Border arrows appear for Known/Friendly NPCs and personal pins. The arrow color is the NPC's relationship color. The label is casual. Unknown NPCs do not generate border arrows. -- **Detective:** Border arrows appear for all case-file entries, POIs, and known locations regardless of relationship state. Evidence-flagged entities show the amber evidence square (4px) adjacent to the arrow. +Border arrows appear for Known/Friendly NPCs and personal pins. The arrow color is the NPC's relationship color. The label is casual. Unknown NPCs do not generate border arrows. --- @@ -334,8 +236,6 @@ Per D-065: the smuggler can carry up to 3–4 physical items. Icons appear in th Icons do not disappear when insert is off — they are physical items, not lattice annotations. The character still has pockets whether or not their insert is active. -**Detective inventory:** The detective has 2 inventory slots but they are knowledge-only in v0.1 (D-065). No inventory icons display for the detective in v0.1. - --- ## 8. Stance Indicator @@ -369,8 +269,6 @@ When `insert_active == false`: | Entity markers | Hidden | | Location labels | Hidden | | Border arrows | Hidden | -| Commission grid (detective) | Hidden | -| Evidence annotations | Hidden | | Bloom | Off — no gaussian pass | | Time display | Dims to 50% of passive opacity, background panel disappears | | Stance indicator | Remains — 30% opacity | @@ -459,60 +357,6 @@ The Last Shift = location label (Michroma 12px, 50% chrome) CAREFUL = stance (Michroma 11px, lower-left, 50%) ``` -### 10.2 Detective Variant — Same Location, Same Time - -The detective is outside the bar, watching the entrance. Kael is inside, behind a wall — the lattice shows his last known position as a dim marker. A POI is approaching from the corridor (off-screen right). - -``` -┌─────────────────────────────────────────────────────────────────────────┐ -│ WALK [ANALYT] 09:42 │ -│ SHIFT C · │ -│ +·····+·····+·····+·····+·····+·····+·····+·····+·····+·····+ │ -│ · ·│ -│ · ◆ [player] → ·│ -│ · K. Davan (blue-wh) [POI: arrow, amber, off-screen]·│ -│ · (amber diamond) ·│ -│ · ·│ -│ · Licensed Establishment · District 7 ·│ -│ +·····+·····+·····+·····+·····+·····+·····+·····+·····+·····+ │ -│ · ·│ -│ · ·│ -│ │ -│ WALK │ -├─────────────────────────────────────────────────────────────────────────┤ -│ [dialogue box — inactive] │ -└─────────────────────────────────────────────────────────────────────────┘ - -Legend: -◆ = POI diamond marker (10×10px) K. Davan = formal label (Michroma 11px) -+·····+ = commission grid overlay (Michroma thin, 20% opacity) -→ = border arrow (off-screen POI, amber — K. Davan connection) -Licensed Establishment · District 7 = institutional location label -09:42 / SHIFT C · = time display + shift with amber phase dot -[ANALYT] = perception mode indicator (placeholder position, upper-center-right) -``` - -### 10.3 Entity Hover State — Detective, POI Hover - -``` -┌─────────────────────────────────────────────────────────────────────────┐ -│ WALK [ANALYT] 09:42 │ -│ SHIFT C · │ -│ │ -│ Talk │ -│ Observe │ -│ ◆ Confront ←─ interaction verbs (amber, 13px) │ -│ K. Davan │ -│ [■]◆ (brightened, 100%, bloom 60%) │ -│ │ -│ all other markers at 40% opacity ─────────────────────────→ │ -│ ● │ -│ (40%) │ -└─────────────────────────────────────────────────────────────────────────┘ - -[■] = evidence annotation (4×4px amber square, adjacent to diamond) -``` - --- ## 11. Color Reference Summary @@ -526,8 +370,7 @@ All colors from `visual-grammar-v01.md` §1.5 and §3.2. Reproduced here for imp | Entity — Known/Friendly | `#6bc9a6` | Soft green. Trusted network. | | Entity — POI | `#e8c547` | Warm amber. Flagged. | | Entity — Hostile | `#d45d5d` | Muted red. Subjective danger. | -| Player — Detective | `#e0e8ff` | Cool blue-white. | -| Player — Smuggler | `#e8e0d0` | Warm cream. | +| Player | `#e8e0d0` | Warm cream. | | Unexplored wireframe | `#333340` | Not used in HUD chrome directly — world layer use | | Time panel background | `#0e1218` at 40% | Barely-there. Matches zone ambient palette. | @@ -541,11 +384,9 @@ All text is Michroma Regular 400 (Google Fonts). No exceptions (visual-grammar-v | Role | Size | Color | Opacity (passive / active) | Z-layer | |------|------|-------|---------------------------|---------| -| Time display | 24px (smuggler) / 20px (detective) | `#c8d0e0` | 80% / 100% | 6 | -| Phase label (detective) | 11px | `#c8d0e0` | 60% / 80% | 6 | +| Time display | 24px | `#c8d0e0` | 80% / 100% | 6 | | Entity label (hover) | 11px | `#c8d0e0` | 70% / 100% | 6 | -| Location label (smuggler) | 12px | `#c8d0e0` | 50% / 70% | 6 | -| Location label (detective) | 11px | `#c8d0e0` | 70% / 90% | 6 | +| Location label | 12px | `#c8d0e0` | 50% / 70% | 6 | | Interaction verb | 13px | D-033 target color | 95% (always active) | 6 | | Stance indicator | 11px | `#c8d0e0` | 50% / 60% | 6 | | Border arrow label (hover) | 10px | `#c8d0e0` | 0% / 100% (hover-only) | 6 | @@ -575,15 +416,12 @@ These are deliberately out of scope for #314. Separate tickets own them. 3. Time display text must be **right-aligned** within the container. Don't center it — it should feel like a readout in the upper-right corner. 4. The background panel (`#0e1218` at 40%) should be a simple NinePatchRect or ColorRect — minimal, no rounded corners. 5. When `insert_active == false`: set time display `modulate.a = 0.5 * passive_opacity` and hide the background panel. The text stays; the container chrome disappears. -6. For the detective's phase label: drive the shift string from a simple range lookup on the game hour (see §3.3 table above). The dot color is a color constant mapped from phase — not dynamic. -7. The phase label is visible only on `lattice_profile == lattice_augmented`. Single boolean check in the time display node. **For the entity marker system (future tickets):** -- One marker scene, parametrized by shape (circle vs diamond), size, color, bloom intensity -- The `lattice_profile` drives shape selection: baseline = circles always, augmented = diamonds for POI state, circles for other states -- Evidence annotation (`■`) is a separate child node, shown/hidden based on KnowledgeGraph query for evidence entries on this entity -- Commission grid is a separate CanvasLayer node, only visible when `lattice_profile == lattice_augmented` and `insert_active == true` +- One marker scene, parametrized by shape (circle), size, color, bloom intensity +- All entity markers use the baseline dot (circle) — no diamond/POI shapes in the base profile +- Bloom intensity driven by relationship color from D-033 --- diff --git a/docs/workshops/content-gap-analysis_v0_1/SUMMARY.md b/docs/workshops/content-gap-analysis_v0_1/SUMMARY.md deleted file mode 100644 index adc7fc006..000000000 --- a/docs/workshops/content-gap-analysis_v0_1/SUMMARY.md +++ /dev/null @@ -1,373 +0,0 @@ -# v0.1 Content Gap Analysis Workshop — Summary - -**Workshop dates:** 2026-02-11 -**Participants:** Mellanie, Paula, Araminta, Miri, Gestalt, Ozzie -**Facilitator:** Team Leader (Jeroen) -**Documenter:** Qatux - ---- - -## Executive Summary - -The v0.1 Content Gap Analysis Workshop examined 9 content layers across the vertical slice (D-027) to identify what content exists, what's missing, and what blocks production. Six agents delivered independent Round 1 analyses, then synthesized across all outputs in Round 2. The project lead made 9 directive decisions between rounds. - -**Key outcomes:** -- 9 new confirmed decisions (D-032 through D-040) -- THE FRIEND NPC pattern established as emotional centerpiece (one production-level NPC per character) -- Converged tag taxonomy for line pools (6 structural + 3 selection tags) -- Sova Transit District / Krenn System confirmed as first concrete setting -- Audio confirmed in v0.1 scope (8 files via Stable Audio Open) -- All 6 wow moments promoted to v0.1 scope -- Wiki taxonomy structure declared non-negotiable -- ~50 new tickets identified across all agents (deduplicated below) -- Full dependency chain mapped with critical path: Dual Lens Guide → Voice Kits → THE FRIEND → Validation → Scale - ---- - -## Workshop Structure - -**Round 1:** Each agent independently analyzed 9 content layers against the vertical slice spec (D-027). Layers: character voice, dialogue, monologue, environmental text, NPC profiles, spatial layout, audio, visual design, wiki/lore. - -**Between rounds:** Project lead reviewed all 6 outputs and issued 9 directive decisions. - -**Round 2:** Each agent read all 6 Round 1 outputs plus directives. Synthesis: convergences, disagreements, dependency chains, concrete next steps, missing tickets. - -**Workshop brief:** `docs/workshops/content-gap-analysis_v0_1/content-gap-analysis-workshop-brief.md` -**Round 1 outputs:** `round1-{agent}.md` (6 files) -**Round 2 outputs:** `round2-{agent}.md` (6 files) - ---- - -## Project Lead Decisions (Between Rounds) - -These 9 directives were issued by the project lead after reviewing Round 1 outputs. They are non-negotiable constraints for Round 2 and all downstream work. - -| # | Directive | Status | -|---|-----------|--------| -| 1 | Separate monologue pools per character | Confirmed, non-negotiable → D-032 | -| 2 | Color = relationship to player | Approved → D-033 | -| 3 | Audio included in v0.1 (6-8 files via Stable Audio Open, self-hosted) | Confirmed → D-038 | -| 4 | One NPC per character = THE FRIEND, production-level complex | Confirmed → D-034 | -| 5 | Wiki taxonomy structure: non-negotiable, must be established NOW | Confirmed → D-040 | -| 6 | Sova Transit District / Krenn System: first concrete star system | Confirmed (worldbuilding milestone) → D-036 | -| 7 | Detective's FRIEND: Sera Venn (Paula's design) | Confirmed → D-034 | -| 8 | All 6 wow moments in scope (Ozzie's 4 essential + 2 nice-to-have all promoted) | Confirmed → D-039 | -| 9 | Stable Audio Open licensing confirmed (free commercial under $1M revenue) | Confirmed → D-038 | - ---- - -## Decisions Produced (D-032 through D-040) - -Full decision text in `decisions/*.md`. Summary: - -| ID | Title | Domain | Source | -|----|-------|--------|--------| -| D-032 | Separate monologue pools per character | content.md | Project lead directive #1 | -| D-033 | Entity color = relationship to player | perception.md | Araminta R1 proposal, project lead directive #2 | -| D-034 | THE FRIEND production-level NPC pattern | content.md | Ozzie R1 concept, project lead directive #4, Paula R2 designs | -| D-035 | Converged tag taxonomy for line pools (6+3) | content.md | Gestalt R1/R2 + Mellanie convergence | -| D-036 | Sova Transit District / Krenn System as v0.1 setting | content.md | Miri R1, project lead directive #6 | -| D-037 | Contraband specification | content.md | Miri R1/R2 proposal, team validation | -| D-038 | Audio in v0.1 scope via Stable Audio Open | scope.md | Project lead directives #3, #9; Ozzie R2 spec | -| D-039 | v0.1 wow moment scope — all 6 moments | scope.md | Ozzie R1/R2, project lead directive #8 | -| D-040 | Wiki taxonomy structure | process.md | Miri R2 proposal, project lead directive #5 | - ---- - -## Key Convergences - -Areas where multiple agents independently reached the same conclusion: - -### Fully aligned (no further discussion needed) -- **Dual Lens Guide is the root dependency** — all 6 agents identified this -- **Monologue carries the game** — perception, tells, atmosphere, tutorial, character voice (Gestalt, Mellanie, Ozzie) -- **YAML for line pools** — Mellanie proposed, Gestalt refined, no disagreement -- **5 tell categories for v0.1** — text-via-monologue as renderer (Gestalt, Araminta, Mellanie) -- **30/50/20 entanglement ratio works** — validated against 15 NPCs (Paula, Gestalt) -- **Spatial layout is load-bearing** — sightlines are gameplay (Araminta, Paula, Ozzie) -- **Miri's setting is the substrate** — everyone builds on Sova Transit District - -### Converged during Round 2 -- **Tag taxonomy**: 6 structural + 3 selection tags per dialogue line; 3 additional for monologue (Gestalt R2 section 1) -- **Situation taxonomy**: 13 situations from Gestalt + Mellanie merge -- **THE FRIEND mechanical spec**: full pipeline depth test, ~70-100 authored lines per NPC -- **Audio architecture**: event-driven with asset registry + visual fallback (Gestalt R2 section 6) -- **Line previewer MVP**: Rust CLI sharing pipeline code, 7 must-have features (Gestalt R2 section 7) -- **NPC relationship web**: 15 NPCs, 5 triangles (Paula R2 reconciliation) -- **Dependency chain**: three parallel tracks converging at content packs (Paula R2 section 2) -- **Placeholder art pipeline**: four phases, zero image files for v0.1 (Araminta R2 section 3) - -### Minor divergences resolved -- **Paula proposed 7 triangles, Gestalt proposed 4** → Paula reconciled to 5 triangles -- **Mellanie proposed 8 per-line tags, Gestalt proposed more** → Converged to 6+3 (dropped location and type from per-line, made them directory-level) -- **Mellanie wanted to defer audio** → Project lead overruled; audio confirmed -- **Araminta wanted to defer audio entirely** → Project lead overruled; visual indicators complement audio -- **Detective's FRIEND candidate** → Mellanie proposed Lera (bar owner), Paula proposed Sera Venn (Commission tech) → Project lead confirmed Sera Venn - ---- - -## Open Questions - -### Updated existing questions -- **Q-003 (Art direction)**: Further resolved. Araminta's v0.1 Visual Grammar proposal covers color palette, entity rendering, fog states, zone palettes. Long-term art direction remains open. -- **Q-005 (Prototype scale)**: Further resolved. 15 NPCs, 3 social sites, 1 district (Sova Transit). Full game scale TBD. - -### New questions raised during workshop - -| ID | Question | Owner | Context | -|----|----------|-------|---------| -| Q-012 | How does the generation expansion pass work? LLM, template-based, or rule-based? | Gestalt, Mellanie | Affects how base lines are authored. LLM needs style-strong anchors; rules need substitution patterns. | -| Q-013 | How does the line previewer handle THE FRIEND's temporal progression? | Gestalt, Dudley | Previewer needs sequence mode to simulate multi-visit contradiction arcs. | -| Q-014 | Audio timing with monologue — when does the chime fire relative to text? | Gestalt, Ozzie | Affects monologue line writing rhythm (first word shouldn't be the important one if chime precedes). | -| Q-015 | Does 4x generation expansion apply to THE FRIEND's custom lines? | Mellanie, Gestalt | Ozzie recommends no expansion on FRIEND lines — every line hand-authored. | -| Q-016 | Knowledge hierarchy for monologue prerequisites | Gestalt, Paula | Need `suspects` < `knows_of` < `knows_details` hierarchy, not binary `knows: X`. | -| Q-017 | Triangle pressure threshold — what events trigger escalation? | Gestalt, Paula | Need numeric pressure model for `confrontation` situation activation. | - ---- - -## Ticket Inventory (Deduplicated) - -Tickets identified across all 6 agents, deduplicated and categorized. Cross-referenced against existing tickets where applicable. - -### THE FRIEND (Critical — pipeline depth test) - -| Ticket | Owner | Priority | Notes | -|--------|-------|----------|-------| -| THE FRIEND: Smuggler (Kael Davan) — full profile + contradiction arc | Paula (profile), Mellanie (voice) | Critical | ~75-100 authored lines | -| THE FRIEND: Detective (Sera Venn) — full profile + contradiction arc | Paula (profile), Mellanie (voice) | Critical | ~75-100 authored lines | -| Contradiction arc design document (reusable pattern) | Paula | High | Template for future complex NPCs | -| THE FRIEND visual treatment spec | Araminta | High | Color transition, earned visual detail | - -### Opening Experience (Critical — first impression) - -| Ticket | Owner | Priority | Notes | -|--------|-------|----------|-------| -| Opening hook content — smuggler (10-15 monologue lines) | Mellanie | Critical | Diegetic tutorial, sets voice | -| Opening hook content — detective (10-15 monologue lines) | Mellanie | Critical | Different emotional register | -| First monologue surprise moment (per character) | Mellanie, Paula, Gestalt | High | Core mechanic proof before minute 15 | - -### Character & Narrative Architecture (Critical path) - -| Ticket | Owner | Priority | Notes | -|--------|-------|----------|-------| -| Character voice speech patterns | Paula + Mellanie | High | Speech-level detail for voice kits | -| Access tier shift design document | Paula + Gestalt | High | How access changes during gameplay | -| Mirror moment design document | Paula + Mellanie | Medium | 10-12 paired observation triggers | -| Flat NPC "almost interesting" pass | Mellanie | High | Investigation noise floor | -| Diegetic insert flavor text (per character) | Mellanie | Medium | Character-specific HUD text | -| Diegetic tutorial monologue lines (8-10 per character) | Mellanie | Medium | Movement, fog, sound, NPC interaction | -| News ticker content — Sova (20-30 lines) | Mellanie + Miri | High | Cheap worldbuilding, high atmosphere | - -### Setting & Worldbuilding - -| Ticket | Owner | Priority | Notes | -|--------|-------|----------|-------| -| Sova Texture Appendix (slang, idioms, decoration, local complaint) | Miri | Critical | Blocks Mellanie's dialogue authoring | -| Krenn System wiki entry (first star system profile) | Miri | High | Sets template for all future systems | -| Sova Station Profile | Miri | High | Off-district references in dialogue | -| Detective institutional chain of command | Miri + Paula | High | Blocks detective character build | -| Meridian coverage map for Sova Transit | Miri | Medium | Investigation mechanics, ring ops | -| Off-station connections brief | Miri | Medium | Ring NPC dialogue consistency | -| Span gate transit schedule | Miri | Medium | NPC routine design, ring timing | -| Observation gallery / viewport description | Miri | Low | Ozzie's "something out the window" | - -### Wiki & Taxonomy - -| Ticket | Owner | Priority | Notes | -|--------|-------|----------|-------| -| Wiki taxonomy structure + first entries | Miri + Qatux | Critical | Project lead: non-negotiable, NOW | -| Tag taxonomy wiki page | Gestalt | High | Reference document for all content authors | -| Line pool format specification (standalone doc) | Gestalt | High | Formalize Round 1/2 YAML format | - -### Visual & Spatial Design - -| Ticket | Owner | Priority | Notes | -|--------|-------|----------|-------| -| v0.1 Visual Grammar document | Araminta | Critical | Root visual dependency | -| Entity color system spec | Araminta | Critical | Relationship-to-player color mapping | -| Spatial layout: Logistics Hub | Araminta | High | Floor plan, sightlines, NPC positions | -| Spatial layout: Bar (The Last Shift) | Araminta | High | Corner booth as key observation position | -| Spatial layout: Corridors + Smuggling spaces | Araminta | High | Hidden spaces, maintenance corridors | -| Insert/HUD wireframe + dual-character variants | Araminta | High | Smuggler social map vs detective case file | -| Monologue display system visual spec | Araminta | High | Typography, animation, stacking rules | -| Text display hierarchy spec | Araminta | High | 4 text pipelines, 4 visual treatments | -| Sound indicator visual design | Araminta | High | Fog-edge pulse, complementary to audio | -| Fog rendering visual spec | Araminta | Medium | 4-state visibility model | -| Span gate signature visual element | Araminta | Medium | Rhythmic glow, first-impression anchor | -| Visual asset taxonomy (wiki structure) | Araminta | Medium | Future-ready directory structure | -| Environmental text visual standards | Araminta | Medium | Bilingual signage, terminal screens | - -### Systems / Server (Content-Supporting) - -| Ticket | Owner | Priority | Notes | -|--------|-------|----------|-------| -| Dialogue selection pipeline (4-layer filter) | Dudley + Gestalt | Critical | Core runtime: access → situation → trust → weighted | -| Monologue trigger system | Dudley + Gestalt | Critical | 9 triggers, character-specific pools, prerequisite gates | -| YAML content loader (hot-reload for previewer) | Dudley | High | Parses YAML into indexed line pools | -| Sound event system architecture | Dudley + Gestalt | High | Event emitter with audio + visual fallback | -| NPC mood state machine | Dudley | High | Drives Layer 4 selection + tell system | -| Trust progression system | Dudley | High | Surface → real → secret per NPC pair | -| Interaction tracking component | Dudley | High | Per-NPC-pair counters drive Layer 2 | -| Knowledge state component | Dudley + Gestalt | High | Gates monologue prerequisites | -| Observation event generator | Dudley | Critical | Bridge between simulation and perception | -| Tell state derivation system | Dudley | Medium | Reads axes, outputs observable tells | -| Line variety tracker | Dudley | Medium | Prevents repeat lines per session | - -### Audio - -| Ticket | Owner | Priority | Notes | -|--------|-------|----------|-------| -| Audio asset set — 8 files via Stable Audio Open | TBD | High | See Ozzie R2 section 4 for full spec | - -### Existing Ticket Scope Updates - -| Ticket | Update Needed | -|--------|---------------| -| #90 (Tell system) | Scope to 5 categories; text-via-monologue as v0.1 renderer | -| #124 (Sound system) | Include sound event emitter architecture + visual fallback | -| #168 (Tag taxonomy) | Reference converged taxonomy (D-035) | -| #179 (NPC profiles) | THE FRIEND depth split: 2 production-level, 13 standard | -| #189 (Cultural generation guide) | Sova Transit District as first concrete instance | -| #190-192 (Template content packs) | Parallel spatial layouts as co-deliverables | -| #193 (Line previewer) | Concrete MVP: 7 must-have features, Rust CLI, sequence mode | -| #261 (Dual Lens Authoring Guide) | Add: emotional divergence, access tier shifts, authoring checklist, THE FRIEND section | - ---- - -## Dependency Chain (Converged) - -Three parallel tracks converge at content pack production. Critical path highlighted. - -``` -TRACK A: Narrative (Paula) TRACK B: Setting (Miri) TRACK C: Systems (Gestalt+Araminta) - -1. Dual Lens Guide (#261) ←─ 1. Sova Setting Brief (#189) 1. Line Pool Format Spec - **CRITICAL PATH** (Round 1 output = v0.1 draft) 2. Visual Grammar (Araminta) - | | 3. Spatial Layouts x3 (Araminta) -2. Character Voice Patterns 2. Wiki Taxonomy + Krenn Entry 4. Line Previewer (#193) - | | -3. THE FRIEND profiles (x2) 3. Sova Texture Appendix - **CRITICAL PATH** | - | 4. Contraband Spec -4. NPC Profiles (Tier 1-3) + Detective Chain of Command - | | - └────────────┬─────────────────┘ - | - v - 5. Character Voice Kits (Mellanie) ← **CRITICAL PATH** - | - 6. Opening Hooks (Mellanie) ← **CRITICAL PATH** - | - └──────────────────────────────────────────────────┘ - | - v - 7. THE FRIEND Content Packs (Mellanie) ← **CRITICAL PATH** - | - 8. VALIDATION: Previewer test - | - 9. Content Packs x3 (#190-192) (Mellanie) - | - 10. Polish: Tell lines, mirror moments, environmental text -``` - -**Critical path:** Dual Lens Guide → Voice Kits → THE FRIEND Content → Validation → Scale - -**Parallel work (no dependencies):** -- Miri: Wiki taxonomy, Krenn System entry, Sova Texture Appendix, contraband spec -- Araminta: Visual Grammar, spatial layouts, insert wireframe -- Gestalt: Line pool format spec (formalize), knowledge state vocabulary -- Mellanie: Tag taxonomy smoke test (20 lines), environmental text templates, news ticker draft -- Audio: Generate station ambient + monologue chime (the two most important files) - ---- - -## Content Volume Estimates (Mellanie R2) - -| Category | Authored Lines | After Expansion | -|----------|---------------|-----------------| -| THE FRIEND: Kael Davan (full pack) | 75-100 | Hand-authored only | -| THE FRIEND: Sera Venn (full pack) | 75-100 | Hand-authored only | -| Template dialogue (3 packs) | 400-500 | ~1,600-2,000 (4x) | -| NPC-specific lines (~13 remaining) | 80-140 | ~320-560 (4x) | -| Monologue — smuggler | 120-160 | ~240-320 (2x) | -| Monologue — detective | 120-160 | ~240-320 (2x) | -| Opening hooks (2 characters) | 20-30 | Hand-authored only | -| Environmental text | 50-60 | N/A | -| News ticker / Meridian feed | 20-30 | N/A | -| UI microcopy | 40-50 | N/A | -| Tell monologue lines | 30-50 | N/A | -| **Total** | **~1,030-1,380** | **~3,200-4,200** | - ---- - -## Per-Agent Next Steps - -### Paula (Critical path owner) -1. Dual Lens Authoring Guide — full draft (blocks everything) -2. THE FRIEND: Kael Davan — full production profile -3. THE FRIEND: Sera Venn — full production profile -4. Relationship web formalization (15 NPCs, 5 triangles with Krenn names) -5. NPC Profiles: Tier 1 (4 entangled), Tier 2 (7 mundane), Tier 3 (3 flat) - -### Mellanie (Content production) -1. Tag taxonomy smoke test (20 lines in YAML, immediate) -2. Environmental text templates + news ticker draft (unblocked) -3. Voice kits (3 options per character, needs Dual Lens Guide) -4. Opening hooks (needs voice kit validation) -5. THE FRIEND content packs (needs FRIEND profiles) - -### Miri (Setting foundation) -1. Contraband Specification (unblocked, immediate) -2. Sova Texture Appendix (slang, idioms — blocks Mellanie) -3. Wiki taxonomy structure + Krenn System entry -4. NPC name finalization (mapping to Paula's web) -5. Detective chain of command - -### Gestalt (Systems specification) -1. Lock tag taxonomy + line pool format (formalize as document) -2. Knowledge state vocabulary (blocks monologue prerequisites) -3. Dialogue selection pipeline specification -4. Sound event system architecture -5. Line previewer (#193) MVP scope - -### Araminta (Visual design) -1. v0.1 Visual Grammar document (unblocked, immediate) -2. Spatial layouts x3 (needs Visual Grammar + Miri's setting) -3. Insert/HUD wireframe (dual-character variants) -4. Monologue display system spec -5. Sound indicator visual design - -### Ozzie (Validation) -1. Review THE FRIEND contradiction arcs (gut check) -2. Audio asset specification finalization -3. Playtest readiness evaluation -4. Wow moment dependency tracking - ---- - -## Workshop Assessment - -**Strengths:** -- Remarkable convergence across 6 independent analyses -- THE FRIEND concept evolved from Ozzie's emotional instinct through Paula's structural design to Mellanie's authoring plan in a single workshop -- Miri's Sova Transit District gave the entire team a concrete foundation -- Tag taxonomy converged without coordination — Mellanie and Gestalt proposed nearly identical structures -- Dependency chain was independently identified by Mellanie, Paula, and Gestalt with compatible structures - -**Risks:** -- Dual Lens Guide is a single point of failure — everything downstream blocks on Paula's deliverable -- Content volume (~1,030-1,380 lines) is significant for one writer (Mellanie) -- 17 content-supporting systems identified, 0 built — server team has substantial work -- Generation expansion on monologue risks flattening character voice (Ozzie, Mellanie flag 2x max for monologue vs 4x for dialogue) - -**Flags for Qatux:** -- Mellanie proposed Lera Sessik as detective's FRIEND in Round 2; Paula proposed Sera Venn. Project lead confirmed Sera Venn. Lera remains the bar owner, not THE FRIEND. -- Paula reconciled from 7 triangles to 5 triangles in Round 2. The 5-triangle model is canonical. -- Miri proposed different NPC name assignments than Paula's Round 2 reconciliation. Paula's Round 2 assignments are canonical (verified by project lead's Sera Venn confirmation). -- Gestalt's "17 content needs, 0 built" assessment accurately describes the systems gap. - ---- - -*Compiled by Qatux. Workshop outputs archived at `docs/workshops/content-gap-analysis_v0_1/`.* -*Decisions recorded in `decisions/*.md` (D-032 through D-040).* -*Last updated: 2026-02-11* diff --git a/docs/workshops/content-gap-analysis_v0_1/TICKETS.md b/docs/workshops/content-gap-analysis_v0_1/TICKETS.md deleted file mode 100644 index adf6342f7..000000000 --- a/docs/workshops/content-gap-analysis_v0_1/TICKETS.md +++ /dev/null @@ -1,197 +0,0 @@ -# v0.1 Content Gap Analysis — Ticket Summary - -**Workshop:** Content Gap Analysis v0.1 -**Date:** 2026-02-11 -**Created by:** Si (Project Manager) -**Source:** 6 Round 2 synthesis outputs (Mellanie, Paula, Araminta, Miri, Gestalt, Ozzie) - ---- - -## Project Lead Decisions Incorporated - -1. Detective's FRIEND: **Sera Venn** (Paula's design) — confirmed -2. Smuggler's FRIEND: **Kael Davan** — confirmed -3. All 6 wow moments in scope (Ozzie's list) -4. Audio in v0.1 via **Stable Audio Open** (8 files) -5. Wiki taxonomy: **non-negotiable**, must be established now - ---- - -## Summary Statistics - -| Category | New Tickets | Updated Tickets | Total | -|----------|------------|----------------|-------| -| Critical | 9 | 1 | 10 | -| High | 23 | 3 | 26 | -| Medium | 10 | 2 | 12 | -| **Total** | **42** | **6** | **48** | - ---- - -## Existing Tickets Updated (6) - -| ID | Title | Change | Source | -|----|-------|--------|--------| -| #261 | Dual Lens Authoring Guide | Priority: high → **critical**. Expanded scope: voice signatures, access tier shift paths, authoring checklist, THE FRIEND section. | All 6 agents | -| #189 | Cultural generation guide — Miri | Sova Transit District is first concrete instance. Miri R1 output IS the v0.1 slice. | Mellanie, Miri | -| #168 | Tagged line pool structure | Converged 6+3 tag taxonomy from workshop. YAML format locked. | Gestalt, Mellanie, Paula | -| #124 | Sound event system — server | Expanded architecture: SoundEventEmitter with AudioAssetRegistry, visual fallback, AmbientManager. | Gestalt, Ozzie | -| #90 | Personality & tell system | 5 tell categories. v0.1 renderer = monologue text, not visual animation. | Gestalt, Araminta, Ozzie | -| #193 | Line previewer CLI | Concrete MVP: 8 features. Build AS dialogue pipeline first implementation. | Gestalt, Mellanie, Ozzie | - ---- - -## New Tickets — Critical (9) - -| ID | Title | Owner | Proposed By | -|----|-------|-------|-------------| -| #297 | THE FRIEND: Smuggler NPC — Kael Davan full profile + content pack | Paula + Mellanie | Mellanie, Paula, Gestalt, Ozzie | -| #298 | THE FRIEND: Detective NPC — Sera Venn full profile + content pack | Paula + Mellanie | Mellanie, Paula, Gestalt, Ozzie | -| #299 | Opening hook content — smuggler first 5 minutes | Mellanie | Mellanie, Paula, Ozzie | -| #300 | Opening hook content — detective first 5 minutes | Mellanie | Mellanie, Paula, Ozzie | -| #301 | Wiki taxonomy and structure — full future-ready schema | Miri + Qatux | Mellanie, Paula, Miri | -| #302 | Sova Texture Appendix — slang glossary, idioms, sensory details | Miri | Mellanie, Miri | -| #303 | v0.1 Visual Grammar Document | Araminta | Araminta, Ozzie | -| #304 | Entity Color System Spec — relationship-to-player mapping | Araminta | Araminta | -| #305 | Dialogue selection pipeline — 4-layer filtering engine | Dudley | Gestalt | - ---- - -## New Tickets — High (23) - -### Content / Narrative - -| ID | Title | Owner | Proposed By | -|----|-------|-------|-------------| -| #306 | News ticker / Meridian feed content — 20-30 lines | Mellanie + Miri | Mellanie, Paula, Ozzie | -| #307 | Flat NPC memorable trait pass — 3 flat NPCs | Paula + Mellanie | Ozzie | -| #310 | Character voice speech patterns — smuggler + detective | Paula + Mellanie | Mellanie, Paula | -| #328 | Access tier shift design document | Paula + Gestalt | Paula, Gestalt | - -### Visual / Spatial - -| ID | Title | Owner | Proposed By | -|----|-------|-------|-------------| -| #311 | Spatial layout: Logistics Hub (The Terminal) | Araminta | Paula, Araminta | -| #312 | Spatial layout: Bar (The Last Shift) | Araminta | Paula, Araminta | -| #313 | Spatial layout: Smuggling spaces and transition corridors | Araminta | Paula, Araminta | -| #314 | Insert/HUD wireframe and spec — dual character variants | Araminta | Araminta | -| #315 | Monologue display system visual spec | Araminta | Araminta, Paula | -| #316 | Text display hierarchy spec — 4 content pipelines | Araminta | Araminta | -| #317 | Sound indicator visual design — fog-edge pulse | Araminta | Araminta | -| #318 | THE FRIEND visual treatment spec | Araminta | Araminta | - -### Worldbuilding - -| ID | Title | Owner | Proposed By | -|----|-------|-------|-------------| -| #319 | Krenn System wiki entry — first star system | Miri | Paula, Miri | -| #320 | Sova Station Profile — station beyond Transit District | Miri | Miri | -| #321 | Contraband specification — lattice components + supply chain | Miri | Miri | -| #322 | Detective institutional chain of command | Miri + Paula | Miri, Paula | - -### Systems / Implementation - -| ID | Title | Owner | Proposed By | -|----|-------|-------|-------------| -| #308 | Line pool format specification — formal document | Gestalt | Mellanie, Gestalt | -| #309 | Knowledge state vocabulary for v0.1 | Gestalt + Dudley | Mellanie, Gestalt | -| #323 | NPC mood state machine | Dudley | Gestalt | -| #324 | Trust progression system | Dudley | Gestalt | -| #325 | Interaction tracking component | Dudley | Gestalt | -| #326 | YAML content loader — hot-reload for previewer | Dudley | Gestalt | -| #327 | Audio asset set — 8 minimum viable files via Stable Audio Open | TBD | Mellanie, Ozzie, Gestalt | - ---- - -## New Tickets — Medium (10) - -| ID | Title | Owner | Proposed By | -|----|-------|-------|-------------| -| #329 | Mirror moment design document — 10-15 paired observations | Paula + Mellanie | Mellanie, Paula | -| #330 | Diegetic tutorial monologue lines — per character | Mellanie | Paula, Gestalt | -| #331 | Diegetic insert flavor text — per character | Mellanie + Araminta | Ozzie | -| #332 | Contradiction arc design document — reusable FRIEND pattern | Paula | Paula | -| #333 | Fog rendering visual spec — 4 states | Araminta | Araminta | -| #334 | Environmental text visual standards | Araminta | Araminta | -| #335 | Meridian Coverage Map for Sova Transit | Miri | Miri | -| #336 | Span Gate Transit Schedule | Miri | Miri | -| #337 | Tell state derivation system | Dudley | Gestalt | -| #338 | Line variety tracker — prevent repeat dialogue | Dudley | Gestalt | - ---- - -## Owner Summary - -| Owner | Critical | High | Medium | Total | -|-------|----------|------|--------|-------| -| **Paula** (+ co-owners) | 2 | 4 | 2 | 8 | -| **Mellanie** (+ co-owners) | 2 | 2 | 2 | 6 | -| **Araminta** | 2 | 8 | 2 | 12 | -| **Miri** (+ co-owners) | 2 | 4 | 2 | 8 | -| **Gestalt** (+ co-owners) | 0 | 3 | 0 | 3 | -| **Dudley** | 1 | 3 | 2 | 6 | -| **TBD** | 0 | 1 | 0 | 1 | - ---- - -## Critical Path - -``` -Phase 0: FOUNDATIONS (no dependencies — can start immediately) - | - |-- [Miri #302] Sova Texture Appendix - |-- [Miri #301] Wiki taxonomy + Krenn entry (#319) - |-- [Miri #321] Contraband specification - |-- [Gestalt #308] Line pool format spec - |-- [Gestalt #309] Knowledge state vocabulary - |-- [Paula #261] Dual Lens Authoring Guide (CRITICAL PATH) - |-- [Araminta #303] v0.1 Visual Grammar Document - |-- [Araminta #304] Entity Color System Spec - | -Phase 1: CHARACTER ARCHITECTURE (needs Phase 0) - | - |-- [Paula+Mellanie #310] Character voice speech patterns - | | - | v - |-- [Mellanie] Smuggler voice kit (uses #180) - |-- [Mellanie] Detective voice kit (uses #181) - | -Phase 2: THE FRIEND (needs Phase 1) - | - |-- [Paula #297] Kael Davan full profile - |-- [Paula #298] Sera Venn full profile - | | - | v - |-- [Mellanie #297] THE FRIEND content packs - | -Phase 3: OPENING HOOKS (parallel with Phase 2) - | - |-- [Mellanie #299] Opening hook — smuggler - |-- [Mellanie #300] Opening hook — detective - | -Phase 4: CONTENT PACKS (needs Phase 2 validation) - | - |-- [Mellanie #190] Logistics Hub content pack - |-- [Mellanie #191] Bar content pack - |-- [Mellanie #192] Smuggling ring content pack - | -Phase 5: POLISH - | - |-- [Mellanie #306] News ticker - |-- [Paula+Mellanie #329] Mirror moments - |-- [Mellanie #330] Diegetic tutorial lines - |-- [Mellanie+Araminta #331] Insert flavor text -``` - -**Single highest-risk dependency:** #261 Dual Lens Authoring Guide. If delayed, everything downstream shifts. - ---- - -## Notes - -- Existing tickets #190, #191, #192 (content packs) now have parallel spatial layout co-deliverables (#311, #312, #313). Content and layout must be developed together. -- Existing ticket #179 (NPC profiles) now has a split: 2 NPCs (Kael, Sera) at production-level depth via #297/#298, remaining 13 at v0.1 tiers. -- #303 (Visual Grammar) supersedes #252 (Placeholder art spec) in scope. -- #305 (Dialogue pipeline) and #193 (Line previewer) share code — build previewer AS the pipeline. -- #327 (Audio assets) ownership TBD — needs someone to run Stable Audio Open generation pipeline. diff --git a/docs/workshops/content-gap-analysis_v0_1/content-gap-analysis-workshop-brief.md b/docs/workshops/content-gap-analysis_v0_1/content-gap-analysis-workshop-brief.md deleted file mode 100644 index 4ecc429a9..000000000 --- a/docs/workshops/content-gap-analysis_v0_1/content-gap-analysis-workshop-brief.md +++ /dev/null @@ -1,269 +0,0 @@ -# Workshop Brief: v0.1 Content Gap Analysis -## What Does the Vertical Slice Actually Need? - -**Project:** The Settled Reach (D-021) -**Date:** 2026-02-11 -**Called by:** Jeroen -**Participants:** MELLANIE, PAULA, ARAMINTA, MIRI, GESTALT, OZZIE - ---- - -## The Problem - -The server and client teams are building the IPC bridge (Sprint 1). The content team — Mellanie (copywriter), Paula (narrative), Araminta (visual design) — has no actionable work yet. We have strong *architectural* decisions about content (D-023 through D-029) and some critical tickets (#190-192 content packs), but we haven't mapped what content the v0.1 vertical slice actually needs, in what format, and in what order. - -This workshop moves from the most global decisions down to the most specific content needs. At each layer we identify what exists, what's missing, and what each team member needs to start working. - -**v0.1 scope reminder (D-027):** Smuggler + detective two-character proof. One station district. 3 social site templates (workplace logistics hub, social bar, smuggling ring). ~15 NPCs. 30-minute daily-life runway before conspiracy activation. Success = both playthroughs feel like fundamentally different games. - ---- - -## Layer 1: Art Direction & Visual Identity - -**The most global question: what does this game look like?** - -| What exists | Status | -|-------------|--------| -| Q-003 (art direction) | OPEN — no decision made | -| #20 Art direction ticket | medium priority, backlog | -| #252 Placeholder art spec | high priority, backlog | -| #133 Placeholder art pipeline | high priority, backlog | -| D-014 says "functional boxes with labels" | — | -| D-016 says "atmosphere carried by monologue" | — | - -**Gaps:** -- No color palette, no sprite style guide, no UI visual language -- No resolution/format standards beyond what #252 will define -- No guidance on whether v0.1 should look deliberately placeholder or aim for a mood - -**Questions for the team:** -1. **Araminta:** Can you define a v0.1 visual identity without resolving Q-003 fully? Or should we make Q-003 a decision now — even if it's "functional minimalism, atmosphere through text"? -2. **Araminta:** What's the minimum art direction document needed so that anyone producing visual assets stays consistent? -3. **Ozzie:** Does the vertical slice need visual mood, or is "readable placeholder" sufficient to prove the concept? - ---- - -## Layer 2: Narrative Framework & Character Design - -**Before writing a single line of dialogue: who are these two characters, and how do they see the world differently?** - -| What exists | Status | -|-------------|--------| -| D-027 Vertical slice: smuggler + detective | confirmed | -| Epic #57 Playable Characters | critical, 5 children | -| #179 Character definition schema | backlog | -| #180 Smuggler character build | backlog | -| #181 Detective character build | backlog | -| #182 Divergent starting knowledge | backlog, critical | -| #183 Divergent relationships | backlog, critical | -| #261 Dual Lens Authoring Guide | high priority, backlog | - -**Gaps:** -- #261 (Dual Lens Authoring Guide) **must precede ALL content packs** — it defines how the same NPCs, locations, and situations play differently for each character -- No character voice profiles (how does the smuggler's internal monologue sound vs. the detective's?) -- No access tier mapping (which NPCs treat the smuggler as insider vs. the detective?) - -**Questions for the team:** -1. **Paula:** What does the Dual Lens Guide need to contain? Is it a document you write solo, or should it be a workshop output? -2. **Paula:** How do you define "divergent starting knowledge" (#182)? Is it a list of facts each character knows, or something more structural? -3. **Mellanie:** What do you need from the character builds before you can write voice-consistent dialogue? -4. **Gestalt:** How do access tiers (D-028 Layer 1) interact with the two character builds mechanically? - ---- - -## Layer 3: Station District Setting - -**What does this place feel like? What's the vibe, the history, the texture?** - -| What exists | Status | -|-------------|--------| -| D-014 v0.1 map spec | confirmed | -| Epic #58 Station District Content | critical, 5 children | -| #184 Workplace template — logistics hub | backlog | -| #185 Social venue template — bar | backlog | -| #186 Smuggling ring template | backlog | -| #189 Cultural generation guide | critical, assigned to Miri | -| D-025 Social site structure (4-8 NPCs, 15-40 tiles) | confirmed | - -**Gaps:** -- No station district lore document — what is this place? Who built it? What's the economic engine? -- No environmental storytelling plan — what do signs say? What's on the news ticker? What's the graffiti? -- No location "feel" descriptions — is the workplace sterile or chaotic? Is the bar upscale or dive? - -**Questions for the team:** -1. **Miri:** Can you write a one-page station district setting document? Just enough for v0.1 — name, purpose, atmosphere, recent history, what makes it interesting. -2. **Paula:** How does the station's character feed into NPC motivations? (E.g., economic pressure → smuggling opportunity) -3. **Ozzie:** What environmental details make a player feel present in the first 30 seconds? - ---- - -## Layer 4: Content Pipeline & Authoring Format - -**Before Mellanie writes 500+ lines of dialogue: what format do they go in?** - -| What exists | Status | -|-------------|--------| -| D-028 Tagged line pool architecture | confirmed | -| Epic #55 Dialogue system architecture | high, 7 children | -| #168 Tagged line pool structure | backlog | -| #193 Line previewer CLI | critical, backlog | - -**Gaps:** -- No concrete authoring format defined — what does a line pool file actually look like? YAML? JSON? CSV with tags? -- No tag taxonomy — what tags exist? (role, trust_tier, mood, topic, situation, character_class) -- Line previewer (#193) doesn't exist yet — Mellanie can't test what she writes - -**Questions for the team:** -1. **Gestalt:** Propose a concrete line pool format. What metadata per line? What's the minimum viable tag set for v0.1? -2. **Mellanie:** Can you write content packs in a provisional format before the previewer exists, or does the format need to be locked first? -3. **Gestalt:** How do the 4 dialogue layers (access, history, trust, unprompted) map to line tags? One tag per layer, or more complex? - ---- - -## Layer 5: Template Content (3 Social Sites) - -**The core content deliverables for v0.1.** - -| What exists | Status | -|-------------|--------| -| #190 Workplace content pack | critical, backlog | -| #191 Bar content pack | critical, backlog | -| #192 Smuggling ring content pack | critical, backlog | -| D-025 Social site = 4-8 NPCs, 15-40 tiles | confirmed | -| D-028 ~165-210 authored lines per template | confirmed | -| D-029 Entanglement ratio: 30/50/20 | confirmed | - -**Gaps:** -- No NPC personality profiles — the 10-axis model (D-024) is an ECS schema, not character descriptions -- No relationship web — who knows whom, who's lying to whom, who's sleeping with whom -- No routine descriptions — where does each NPC go and when? -- No triangle definitions — D-029 requires mundane triangles, but none are designed - -**Questions for the team:** -1. **Mellanie:** What does a content pack deliverable look like? Break down #190 into what you'd actually write. -2. **Paula:** How do you design the relationship web for 3 overlapping social sites? Who are the "bridge" NPCs that connect them? -3. **Paula:** How many triangles per template? D-029 says 2 minimum per template + 1 cross-template. What do they look like concretely? -4. **Gestalt:** How does the entanglement ratio (30/50/20) play out across ~15 NPCs? That's ~4-5 flat, ~7-8 mundane-triangle, ~3 entangled? - ---- - -## Layer 6: NPC Profiles & Dialogue - -**Making ~15 NPCs feel like people, not database entries.** - -| What exists | Status | -|-------------|--------| -| D-024 NPC 10-axis model | confirmed | -| #86 Core NPC data model components | backlog | -| #87 Relationship tracking system | backlog | -| #88 Daily routine system | backlog | -| #168-174 Dialogue system tickets | backlog | -| #251 Tell visual/behavioral expression | high, backlog | - -**Gaps:** -- No tickets for writing actual NPC profiles (personality, backstory, voice) -- No tickets for voice kit authoring (15-25 lines per NPC role) -- No tickets for relationship history content (what happened between these people before the game starts?) -- No tell catalog (what observable behaviors map to what internal states?) - -**Questions for the team:** -1. **Paula + Mellanie:** How deep does each NPC profile need to be? Full backstory, or just the 10 axes plus a voice sample? -2. **Mellanie:** How many lines per NPC for v0.1? D-028 estimates 15-25 per role in a template. With ~15 NPCs, that's 225-375 lines of role dialogue alone. -3. **Gestalt:** What's the minimum viable tell system? One behavioral marker per axis, or fewer? -4. **Ozzie:** Which NPC should the player remember after 30 minutes? What makes them memorable — a line, a routine, a contradiction? - ---- - -## Layer 7: Monologue & Observation Text - -**The character's inner voice — the primary content delivery mechanism in v0.1.** - -| What exists | Status | -|-------------|--------| -| D-016 Internal monologue as perception bridge | confirmed | -| #119 Monologue event generation | backlog | -| #120 Monologue line pool system | backlog | -| #121 Character voice variation | high, backlog | -| #253 Monologue content architecture | high, backlog | -| #239 Observation event generator | critical, backlog | - -**Gaps:** -- No monologue line count estimates per location type -- No character voice variation specs (how does the smuggler interpret vs. the detective?) -- No observation trigger catalog (what events produce monologue?) -- No "mirror moment" content — lines that hint at the other character's perspective - -**Questions for the team:** -1. **Mellanie:** How many monologue lines make v0.1 feel alive? D-028 workshop estimated 200-300 across location types for atmosphere floor. Sound right? -2. **Mellanie:** Can the same observation event produce different monologue for smuggler vs. detective? Or do you need separate pools? -3. **Paula:** What are the "mirror moments" — places where the monologue hints that this situation looks different from another perspective? -4. **Ozzie:** When does the first monologue surprise the player? What's the moment where they think "wait, my character noticed something I didn't"? - ---- - -## Layer 8: UI Text & Environmental Content - -**Everything on screen that isn't dialogue or monologue.** - -| What exists | Status | -|-------------|--------| -| #262 Environmental text content | medium, backlog | -| #263 Time display on insert HUD | medium, backlog | -| #264 Knowledge/journal display | medium, backlog | -| #174 Dialogue UI | backlog | -| D-013 Diegetic insert (neural implant map) | confirmed | - -**Gaps:** -- No UI copy document (button labels, menu text, notification strings) -- No tutorial/onboarding text (how does the player learn the controls?) -- No diegetic content (signs, terminal screens, manifests, notices, news feeds) -- No insert/minimap text (POI labels, status indicators) - -**Questions for the team:** -1. **Mellanie + Araminta:** What text appears on screen that isn't dialogue or monologue? Make a list. -2. **Araminta:** How does the neural implant UI look? Is it a literal implant overlay, or abstracted? -3. **Gestalt:** Does v0.1 need onboarding text, or can the monologue system serve as the tutorial (D-016 "diegetic tutorial")? - ---- - -## Layer 9: Audio Direction - -**The most deferred question: what does the game sound like?** - -| What exists | Status | -|-------------|--------| -| D-018 Three-range sound model | confirmed | -| #124-128 Sound propagation tech tickets | backlog | -| #46 Sound Propagation Model epic | 5 children | - -**Gaps:** -- Zero audio content tickets — no ambient soundscapes, no foley, no music direction -- No decision on whether v0.1 uses placeholder audio or real audio -- No audio style guide - -**Questions for the team:** -1. **Ozzie:** Does placeholder audio kill the atmosphere, or is silence acceptable for a concept proof? -2. **Gestalt:** Does the three-range sound model need audio content to prove itself, or can it work with system beeps and text? -3. **Team:** Should we defer audio entirely to a later sprint, or establish direction now? - ---- - -## Workshop Format - -**2 rounds.** - -**Round 1 — Layer-by-layer gap identification.** Each participant responds to the questions in their domain. Propose concrete answers, not just "we need to figure this out." - -**Round 2 — Synthesis.** Review Round 1 answers. Produce: -1. Missing ticket list (new tickets to create) -2. Dependency chain (what must come before what) -3. Content team work order for Sprint 2 or a parallel content track - -## Expected Outputs - -- **Decision:** Art direction approach for v0.1 (resolve or scope Q-003) -- **Document:** Dual Lens Authoring Guide outline (Paula) -- **Document:** Station district setting brief (Miri) -- **Specification:** Line pool authoring format (Gestalt) -- **List:** New tickets filling content gaps (Si creates post-workshop) -- **Plan:** Dependency-ordered content work plan for Mellanie, Paula, Araminta diff --git a/docs/workshops/content-gap-analysis_v0_1/round1-araminta.md b/docs/workshops/content-gap-analysis_v0_1/round1-araminta.md deleted file mode 100644 index e7384eb16..000000000 --- a/docs/workshops/content-gap-analysis_v0_1/round1-araminta.md +++ /dev/null @@ -1,383 +0,0 @@ -# Round 1 Workshop Response: Araminta (Visual Design) - -**Agent:** Araminta (Visual Designer) -**Date:** 2026-02-11 -**Scope:** All 9 layers from visual design perspective - ---- - -## Layer 1: Art Direction & Visual Identity - -### Q1: Can I define a v0.1 visual identity without resolving Q-003 fully? - -**Yes. And we should do exactly that.** - -Q-003 asks about long-term art direction. That's a question about final fidelity, sprite style, animation approach, lighting systems. We don't need to answer any of that to build v0.1. What we need is a **v0.1 visual grammar** - a set of rules for how information is communicated visually, regardless of art fidelity. - -**Proposal: Resolve Q-003 partially with a scoped decision.** - -> **D-XXX: v0.1 visual approach - "readable information design, atmosphere through text and spatial composition."** -> -> - Entities are colored rectangles with text labels. No sprites in v0.1. -> - Color communicates RELATIONSHIP TO PLAYER, not object type. -> - Spatial layout communicates function - the bar FEELS different from the logistics hub through room shape, furniture density, corridor width. -> - Atmosphere is carried by monologue text, dialogue content, and sound indicators - NOT by art. -> - All visual rules must scale: a color that means "danger" in boxes-with-labels must still mean "danger" when we add sprites. - -This is not "we'll figure out art later." This is "v0.1's art IS information design." The boxes aren't placeholder art waiting for real art. The boxes ARE the visual language at this fidelity level. - -Long-term Q-003 (sprite style, animation, lighting) stays open. It doesn't block anything. - -### Q2: What's the minimum art direction document needed for consistency? - -A **one-page visual grammar** covering: - -1. **Color palette** (see below) -2. **Entity sizing rules** (NPCs, furniture, walls, doors - relative proportions) -3. **Label conventions** (what text shows on entities, when, at what zoom) -4. **UI layer separation** (game world vs. insert overlay vs. monologue text vs. dialogue) -5. **Fog/visibility rendering rules** (visible, fog-edge, hidden - how they look) - -That's it. No style guide for art we haven't made. No font selection for UI that doesn't exist yet. Just the rules for communicating game state visually. - -### Proposed v0.1 Color Palette - -The Settled Reach is sleek, advanced, subtle. Even at boxes-with-labels fidelity, we can communicate mood. - -**Background/Environment:** -- `#1a1a2e` - Deep navy. Base floor/ground. The station is dimly lit by default. -- `#2d2d44` - Slightly lighter. Walls, barriers, solid obstacles. -- `#0f0f1a` - Near-black. Fog/hidden areas. Darkness should feel HEAVY. - -**Entity Colors (relationship-to-player, NOT object type):** -- `#4a9ebb` - Cool teal. Neutral/unknown NPCs. Default state. -- `#6bc9a6` - Soft green. Friendly/trusted NPCs. People your character knows and likes. -- `#e8c547` - Warm amber. NPCs of interest. Your monologue has flagged something about them. -- `#d45d5d` - Muted red. Hostile/dangerous. ONLY when the character KNOWS there's danger. Not omniscient threat display. -- `#8b8ba0` - Grey. Furniture, static objects, environmental elements. - -**UI Overlay Colors:** -- `#3d7aaf` with 40% opacity - Insert/minimap overlay tint. The neural implant's "screen." -- `#ffffff` at 85% opacity - Primary UI text (labels, insert readouts). -- `#a0a0b8` at 70% opacity - Secondary UI text (non-critical info). - -**Monologue Text:** -- `#c8d0e0` - Internal monologue. Slightly cool, slightly ethereal. This is thought, not speech. -- Italicized. Positioned bottom-center or left panel. Fades in/out, doesn't snap. - -**Dialogue Text:** -- `#ffffff` - NPC speech. Clean white. Grounded, real. -- NPC name in their relationship color above the dialogue line. - -**Key principle:** Red means danger TO YOUR CHARACTER, not danger in the abstract. If the smuggler's friend is secretly an informant, that NPC is GREEN until the smuggler discovers the betrayal. The detective might see that same NPC as AMBER (person of interest) from the start. Same NPC, different color, because asymmetric information drives the palette. - -This is D-011 (fog of perception) applied to the color system. The player sees what the character knows. - -### Fog Rendering Specification - -Three visual states for tiles: - -| State | Appearance | When | -|-------|-----------|------| -| **Visible** | Full color, full detail, entities shown | Currently in LOS | -| **Fog-edge** | Desaturated 50%, entities hidden, sound indicators shown | Adjacent to LOS, within medium sound range | -| **Hidden** | Near-black (`#0f0f1a`), no entities, no indicators | Outside perception range | -| **Remembered** | Desaturated 70%, static snapshot of last-seen state, no entities | Previously visited, now outside LOS | - -The "remembered" state is important. D-011 says fog returns on departure, but the player should see a ghost of what they last saw - furniture stays, NPCs vanish. This communicates "I was here, but things may have changed." It costs almost nothing to implement and sells the information-decay concept visually. - ---- - -## Layer 2: Narrative Framework & Character Design - -### Visual implications of character divergence - -The two characters need **distinct visual treatments** even at boxes-with-labels fidelity: - -- **Smuggler's player entity:** Slightly different shade or shape indicator. Doesn't need to be dramatic - a subtle color difference in the player marker is enough. -- **Detective's player entity:** Same principle, different accent. - -More importantly: the **insert overlay** should feel different per character. The smuggler's insert is consumer-grade, maybe slightly less polished. The detective's is institutional - cleaner layout, more structured information display. This is a v0.2+ concern but worth noting now so the insert UI is designed with parameterization in mind. - -For v0.1: a small character icon or color accent on the HUD that says "you are the smuggler" vs "you are the detective." Minimal but present. - ---- - -## Layer 3: Station District Setting - -### Visual layout principles for the three social sites - -Even with boxes, spatial design communicates EVERYTHING about a location. Here's what each site should feel like through layout alone: - -**Workplace (Logistics Hub):** -- Regular grid layout. Rows of workstations. Wide corridors for cargo movement. -- A few enclosed offices (walls block LOS - management has privacy). -- One loading bay area (open, high visibility, the "public" face). -- One back area (restricted, fewer sightlines - where secrets live). -- **Visual feel:** Ordered, institutional, functional. The regularity IS the aesthetic. - -**Social Venue (Bar):** -- Irregular, organic layout. Booths create pockets of privacy. -- Central bar area with high visibility (everyone can see who's ordering). -- Corner tables with partial LOS blocks (intimate conversations). -- A back room or alley exit (the sketchy escape route). -- **Visual feel:** Warm-toned compared to the hub. Furniture density higher. More "walls" from booths and partitions creating complex sightlines. - -**Smuggling Ring (Hidden within/adjacent to other spaces):** -- NOT a labeled "smuggling HQ." It's a maintenance corridor, a storage room, a section of the cargo bay that's officially off-limits. -- Tight spaces, poor sightlines, few entrances/exits. -- Visually indistinguishable from other utility spaces unless you know what to look for. -- **Visual feel:** Cramped. The contrast with the open logistics hub IS the atmosphere. - -**Cross-site visual language:** -- Public spaces: wider corridors, more open tiles, lighter floor colors. -- Private spaces: narrower, enclosed, slightly darker floor tones. -- Transition zones: doorways, corridors between sites. These are where "wrong place, wrong time" moments happen. They need enough space for the player to see someone passing through. - -No art needed. Room shapes and tile colors do the work. A bar booth is a 3x2 rectangle with half-height wall blocks. An office is a 4x4 enclosed room with a door entity. The spatial relationships create the gameplay affordances. - ---- - -## Layer 4: Content Pipeline & Authoring Format - -### Visual implications of the authoring format - -Not my primary domain, but one critical visual note: - -**Every dialogue line needs a display context tag.** The renderer needs to know: -- Is this spoken dialogue? (Display in dialogue UI panel, NPC name header) -- Is this overheard conversation? (Display as fog-edge text snippet, lower opacity, partial) -- Is this a monologue reaction? (Display in monologue area, italic, character voice color) -- Is this environmental text? (Display as world-space label on the object/sign/terminal) - -These are four different rendering pipelines. The authoring format must tag which pipeline each line targets. Mellanie and Paula need this in the format spec so they don't write a line that falls between categories. - ---- - -## Layer 5: Template Content (3 Social Sites) - -### Visual deliverables per template - -Each social site template needs a **spatial layout document** alongside the content pack. This is my deliverable. For each template: - -1. **Floor plan** - tile-level layout showing walls, doors, furniture, sightlines -2. **Sightline diagram** - from key observation positions, what can you see? Where are the blind spots? -3. **Sound propagation notes** - which walls are thin (sound bleeds through), which are thick -4. **NPC position markers** - where do NPCs stand/sit during their routine phases? -5. **Player approach vectors** - how does the player enter? What do they see first? - -This is the spatial design that makes observation gameplay work. A bar where you can see everyone from the entrance is a different game than a bar where you have to walk past three booths before you see the back table. - -**Proposed ticket: spatial layout design per social site template (3 layouts, high priority).** This should be parallel with the content packs, not after them. Layout affects what content makes sense. - ---- - -## Layer 6: NPC Profiles & Dialogue - -### Visual expression of NPCs at boxes-with-labels fidelity - -At v0.1 fidelity, NPC differentiation is: -1. **Color** (relationship state, as defined in the palette above) -2. **Label text** (name when known, role when partially known, "?" when unknown) -3. **Position and movement** (are they at their expected location? Moving with purpose or loitering?) - -That's it. No character portraits. No sprite variation. No clothing differences. - -**But this is enough.** The detective walks into the logistics hub. They see: a cluster of teal rectangles labeled "Worker," "Worker," "Worker," one amber rectangle labeled "Jax (shift supervisor)." Amber because the detective's case file flagged Jax. The smuggler walks in and sees: green rectangles labeled "Tomas," "Kira," "Jax" (all known, all friendly). Same room, different visual state, different information. - -The color system IS the visual expression of asymmetric information. It doesn't need sprites to work. - -### Tell system visual language (#251) - -D-024 mentions a tell system - observable behaviors mapping to internal states. At boxes-with-labels fidelity, tells are NOT visual. They're: -- Monologue: "Jax is tapping his foot. He does that when he's nervous." -- Dialogue: NPC speech patterns change based on mood (Mellanie's domain) -- Behavioral: NPC is in an unexpected location or moving unusually - -The monologue is the tell renderer for v0.1. Visual tells (sweating, fidgeting, avoiding eye contact) are sprite-fidelity features. Text carries the load for now. - -When we get to sprites: each NPC should have 2-3 behavioral animation states (idle, nervous, angry) that map to mood axes. But that's later. - ---- - -## Layer 7: Monologue & Observation Text - -### Monologue presentation design - -This is one of my key deliverables. The monologue is the player's primary information channel in v0.1. - -**Presentation rules:** - -| Property | Specification | Rationale | -|----------|--------------|-----------| -| **Position** | Bottom of screen, left-aligned, 60% width max | Doesn't obscure the game world. Left-align because we read left-to-right; it's the natural "start reading" position. | -| **Font** | Monospace or clean sans-serif. Slightly smaller than dialogue. | Monologue is internal thought - quieter than spoken words. Monospace gives a "data overlay" feel consistent with the insert aesthetic. | -| **Color** | `#c8d0e0` (cool off-white) | Distinct from dialogue (#ffffff) and UI text. Slightly ethereal. | -| **Style** | Italic | Universal convention for internal thought. Instantly readable as "this isn't spoken." | -| **Animation** | Fade in over 0.3s, hold for read-time + 1s, fade out over 0.5s | Not jarring. Doesn't demand attention like a popup. Respects the player's pace. | -| **Stacking** | Max 3 lines visible. New lines push old lines up and fade them. | Prevents monologue flooding during high-event moments. | -| **Priority** | Observation > atmosphere > tutorial hint | If multiple monologue triggers fire simultaneously, observation wins. The player needs to know "that NPC is acting weird" more than "nice evening." | - -**Character voice differentiation (visual):** - -The smuggler and detective should have subtly different monologue presentation: -- **Smuggler:** Slightly warmer text color (`#d0d0c0`), slightly more casual phrasing (Mellanie's domain, but the visual warmth supports it). -- **Detective:** Slightly cooler text color (`#c0c8e0`), more structured phrasing. - -This is a minor touch that compounds over 30 minutes. The player's subconscious registers "this character thinks differently" through the text color before they consciously parse the words. - -### Observation text vs. monologue vs. dialogue - visual hierarchy - -The player needs to instantly distinguish these three information channels: - -| Channel | Position | Style | Color | Example | -|---------|----------|-------|-------|---------| -| **Dialogue** | Center-bottom panel, NPC name header | Regular weight | `#ffffff` on dark panel | **Kira:** "Quiet night at the hub." | -| **Monologue** | Bottom-left, no panel/frame | Italic | `#c8d0e0` | *She says that, but she won't look at me.* | -| **Observation** | Same as monologue but with icon marker | Italic + small eye icon | `#c8d0e0` | [eye] *Jax just walked past the restricted door.* | -| **Environmental** | World-space, attached to object | Small caps, subtle | `#8b8ba0` | CARGO BAY 7 - AUTHORIZED PERSONNEL ONLY | - -The observation marker (small eye icon) is important. It tells the player "your character noticed something." It's the visual cue for the detective mechanic. Over time, players learn: eye icon = pay attention. - ---- - -## Layer 8: UI Text & Environmental Content - -### Q1: What text appears on screen that isn't dialogue or monologue? - -Complete inventory: - -**Insert/HUD Layer (diegetic - it's the neural implant):** -- Time display (D-031: game clock, day phase indicator) -- Minimap with POI dots and directional arrows (D-013) -- POI labels when close enough -- Alert notifications ("Message from [contact name]") -- Insert-mode indicators if perception modes are active (v0.1: just natural vision, but the slot should exist) - -**World-Space Labels:** -- Location names (room/area labels: "Logistics Hub - Bay 7") -- Door labels ("Office," "Storage," "Restricted") -- Sign text (business names, warnings, directions) -- Terminal screens (if examine mechanic exists: cargo manifests, schedules, case files) -- NPC name/role labels (floating above entity rectangle) - -**System UI (non-diegetic, minimal):** -- Pause indicator -- Character name/role reminder (top corner, very subtle) -- Save indicator (if save/load exists) -- Interaction prompt (when near an interactable: "E: Examine" or similar) - -**NOT on screen (deliberately):** -- Health bars, stamina bars, XP indicators - none of these exist in v0.1 and may never exist in traditional form -- Quest log/objective marker - the monologue IS the quest hint system -- Mini-tutorial popups - monologue handles this diegetically (D-016) - -### Q2: How does the neural implant UI look? - -**It's a literal implant overlay, not an abstracted game UI.** This is non-negotiable given D-013. - -The insert is what the character sees when they activate their neural implant's navigation overlay. In v0.1, this means: - -**Visual treatment:** -- Semi-transparent overlay with a subtle blue-tinted border or vignette (`#3d7aaf` at 15-20% opacity) -- The minimap is NOT a separate UI window. It's an overlay that tints the top-right (or bottom-right) corner of the game view. -- POI markers are simple geometric shapes: circles for locations, diamonds for contacts, squares for objectives. -- Text on the insert uses a slightly different font weight or a monospace font - it's DIGITAL text rendered by the implant, distinct from the player's natural perception. - -**Behavioral rules:** -- The insert is always "on" in v0.1 (the character always has their implant active). Toggle is a v0.2+ feature. -- Insert information updates based on character knowledge (D-013: POIs only appear when learned). -- The overlay should feel like looking at a heads-up display, not a game map. Subtle scan lines or a very light grid pattern would reinforce this. Even at v0.1, a 1-pixel grid at 5% opacity costs nothing and communicates "technology." - -**What the insert does NOT do:** -- Show NPC positions beyond what the character can sense (no omniscient radar) -- Show information the character hasn't learned -- Provide objective markers for things the character doesn't know about - -The insert is BOUNDED by the same information rules as everything else (D-010 principle 2). It's a tool the character uses, not a game abstraction. - -### Q3 (Gestalt asked this, but visual input): Onboarding through monologue - -The monologue IS the tutorial. But the insert could display a brief "new overlay detected" or "insert calibrating" sequence on first load to teach the player that the blue-tinted area is their implant. One line of insert text: "Neural insert active. Navigation overlay online." Then the monologue takes over: *"Let's see what's on the schedule today."* Diegetic from the first second. - ---- - -## Layer 9: Audio Direction - -### Visual design implications of sound - -Since v0.1 may have limited or no audio, sound information needs VISUAL representation: - -**Sound indicators at fog edge (D-018 medium range):** -- Small animated ripple or pulse icon at the fog boundary, in the direction of the sound. -- Color-coded by sound type: - - `#c8d0e0` (neutral) - footsteps, movement, ambient activity - - `#e8c547` (amber) - conversation, voices (something to investigate) - - `#d45d5d` (red) - aggressive sounds, alarm, conflict -- Size/intensity pulses with sound volume. -- The monologue fires simultaneously to interpret: *"Voices. Coming from the back office."* - -**Close-range sound (within LOS):** -- No special visual indicator needed. You can SEE the source. -- Dialogue or conversation text renders normally. - -**Long-range insert alerts:** -- Display on the insert overlay as a notification blip. -- Text: "[Contact name] sent a location pin" or "Disturbance reported in [area]." -- These are spoofable (D-018) - the visual design should NOT distinguish real from fake alerts. The player has to figure that out. - -Even if we have zero audio files in v0.1, the sound model works through these visual indicators plus monologue text. Sound-as-information doesn't require sound-as-audio. The three-range model can be proven with visual indicators and text alone. - -**Audio direction for later:** -I'd defer actual audio content entirely from v0.1. The visual indicator system proves the sound model mechanically. Adding audio is additive polish, not structural. When we do add audio: -- Ambient: low drone, station hum, ventilation. The Settled Reach is a machine. It breathes. -- Close range: footsteps on metal, door mechanisms, muffled conversation bleed. -- No music in gameplay. Music in menus/loading only. The station's ambient sound IS the soundtrack. - ---- - -## Summary: Visual Design Deliverables for v0.1 - -### Documents to produce - -| Document | Priority | Description | -|----------|----------|-------------| -| **v0.1 Visual Grammar** (1 page) | Critical | Color palette, entity sizing, label rules, UI layer separation, fog rendering spec. Everything above in Layer 1, codified. | -| **Spatial Layout: Logistics Hub** | High | Floor plan, sightlines, NPC positions, approach vectors | -| **Spatial Layout: Bar** | High | Floor plan, sightlines, NPC positions, approach vectors | -| **Spatial Layout: Smuggling spaces** | High | Floor plan, sightlines, NPC positions, approach vectors | -| **Insert/HUD Wireframe** | High | Minimap position, text areas, notification zones, monologue display area | -| **Monologue Presentation Spec** | High | Typography, animation, stacking, priority rules | -| **Sound Indicator Visual Spec** | Medium | Fog-edge indicators, color coding, pulse behavior | - -### Proposed new tickets - -| Title | Priority | Rationale | -|-------|----------|-----------| -| v0.1 Visual Grammar document | Critical | Everything visual depends on this. Must exist before any renderer work begins. | -| Spatial layout design - 3 social site templates | High | Sightlines and room layout are the physical foundation of the observation mechanic. Parallel with content packs. | -| Insert/HUD wireframe and spec | High | The insert is the player's primary UI. Needs to be designed before implemented. | -| Monologue display system spec | High | Monologue is the primary content delivery mechanism. Its rendering rules affect every other visual element. | -| Sound indicator visual design | Medium | Required for the three-range model to function without audio files. | -| Entity color system implementation | High | The relationship-to-player color mapping is the primary visual expression of asymmetric information. | - -### Dependencies - -``` -Visual Grammar ──> Spatial Layouts ──> Content Packs (layout affects what content makes sense) -Visual Grammar ──> Insert/HUD Wireframe ──> Insert implementation -Visual Grammar ──> Entity Color System ──> Fog rendering, NPC rendering -Visual Grammar ──> Monologue Display Spec ──> Monologue system UI -``` - -The Visual Grammar document is the root dependency for all visual work. I can produce it quickly once this workshop concludes and we have consensus on the color-as-relationship-state approach. - -### One strong opinion - -**The entity color system (color = relationship to player, not object type) is the single most important visual decision for v0.1.** It's how asymmetric information becomes visible. It's how two characters in the same room see different things. It's the visual proof of concept. If we get nothing else right visually, get this right. A teal rectangle labeled "Worker" for the detective and a green rectangle labeled "Jax" for the smuggler - that IS the game, rendered at minimum fidelity. - -Everything else is refinement. This is the foundation. - ---- - -*Written by Araminta. Keep it clean, we can layer detail later.* diff --git a/docs/workshops/content-gap-analysis_v0_1/round1-gestalt.md b/docs/workshops/content-gap-analysis_v0_1/round1-gestalt.md deleted file mode 100644 index f139b3fac..000000000 --- a/docs/workshops/content-gap-analysis_v0_1/round1-gestalt.md +++ /dev/null @@ -1,591 +0,0 @@ -# Round 1: Gestalt (Systems Design & Fun Factor) - -**Workshop:** v0.1 Content Gap Analysis -**Date:** 2026-02-11 -**Scope:** All 9 layers — systems design questions - ---- - -## Layer 1: Art Direction & Visual Identity - -No direct questions for Gestalt here, but one mechanical observation: - -**Art direction is downstream of information design.** The visual system's primary job in The Settled Reach is communicating *what the player can and cannot perceive*. Fog edges, vision cone boundaries, sound indicators at fog-edge, NPC state tells — these are all visual elements that serve information mechanics first, aesthetics second. - -Whatever Araminta proposes, the art direction must prioritize **perceptual legibility**: can the player instantly distinguish "I can see this" from "I cannot see this" from "I heard something here"? If that's clear, the aesthetics can be anything from pixel art to abstract minimalism. If it's unclear, no amount of beauty fixes the game. - -**Recommendation for Q-003:** "Functional minimalism with perceptual clarity" is the v0.1 art direction. Atmosphere is carried by monologue (D-016). Visual mood is a polish layer, not a proof-of-concept requirement. - ---- - -## Layer 2: Access Tiers and Character Builds - -**Question:** How do access tiers (D-028 Layer 1) interact with the two character builds mechanically? - -Let me break down what this actually means mechanically. - -Access tiers are the first filter on every line of dialogue. They answer: "Given who the player character IS, what version of this NPC do they see?" This isn't a binary insider/outsider — it's a multi-axis classification that determines which lines from the pool are eligible for selection. - -### Access Tier Model for v0.1 - -| Access Tier | Description | Smuggler sees | Detective sees | -|-------------|-------------|---------------|----------------| -| `public` | Available to everyone. Greetings, small talk, general observations. | Yes | Yes | -| `insider` | Available to people embedded in the social group. Shop talk, complaints, gossip about colleagues. | Logistics hub: Yes. Bar: Regular status. Ring: Yes. | Logistics hub: Outsider. Bar: Regular. Ring: No. | -| `authority` | Available to people with institutional power. Deference, compliance, formal responses. | No (except through cover) | Yes | -| `peer` | Available to people of equal social standing within a group. Casual, unguarded. | With ring members, coworkers | With other investigators, institutional contacts | -| `hostile` | Guarded, deflecting, minimal. Shown to people perceived as a threat. | From detective-allied NPCs (if blown) | From ring-connected NPCs | - -### How This Maps to the Two Characters - -**Smuggler access profile:** - -| Social Site | Default Access | Why | -|-------------|---------------|-----| -| Logistics Hub | `insider` + `peer` | Works there. Coworkers. | -| Bar | `public` or `insider` (regular) | Social regular, not staff | -| Smuggling Ring | `insider` + `peer` | Member | - -**Detective access profile:** - -| Social Site | Default Access | Why | -|-------------|---------------|-----| -| Logistics Hub | `authority` | Investigating. Workers defer/comply. | -| Bar | `public` | No special status | -| Smuggling Ring | `hostile` (if known) or `public` (if not) | Target of investigation | - -### The Interesting Decision Space - -Here's where this creates gameplay. Access tiers are the player's **starting hand**, not their final state. The systems must allow tier SHIFTS during play: - -| Shift | Mechanism | Example | -|-------|-----------|---------| -| `public` -> `insider` | Repeated positive interactions, time spent | Detective becomes a bar regular after visiting 3-4 times | -| `insider` -> `hostile` | Cover blown, secret discovered | Smuggler is seen talking to the detective | -| `authority` -> `peer` | Trust built through fairness, personal disclosure | Detective earns a worker's trust by keeping a minor infraction quiet | -| `peer` -> `hostile` | Betrayal, information leak | Smuggler discovers a ring member is informing | - -**These tier shifts ARE the social gameplay.** The player isn't just receiving different dialogue — they're actively managing their social position by choosing who to talk to, what to reveal, and who to be seen with. Every conversation is a potential tier shift event. - -**What Paula needs for the Dual Lens Guide:** A matrix per social site showing starting access for each character, plus the 2-3 most likely tier shift paths. Not every combination — just the ones the content packs need to support. - ---- - -## Layer 3: Station District Setting - -No direct questions for Gestalt here, but a mechanical note for Miri: - -The station district setting needs to produce **spatial information asymmetry**. Concretely: -- At least one area that's publicly accessible but has a hidden back room / private area -- At least one area where the smuggler has natural access but the detective would need a reason to enter -- At least one chokepoint where NPCs from different social sites cross paths (this is where cross-template contamination becomes observable) - -These are spatial requirements that emerge from the information design, not just atmosphere choices. - ---- - -## Layer 4: Content Pipeline & Authoring Format - -*Cracks knuckles.* This is the big one. Let me propose the concrete line pool format. - -### Line Pool Authoring Format: YAML - -YAML is the right choice for human-authored content. It's readable, supports comments (authors can annotate their intent), handles multiline strings naturally, and has mature tooling. JSON is too noisy for 500+ authored lines. CSV loses structure. TOML gets awkward for nested data. - -### Concrete Line Pool File Structure - -Each template gets one YAML file per content category. The file structure: - -``` -content/ - templates/ - logistics-hub/ - dialogue.yaml # NPC role dialogue lines - monologue.yaml # Player character reactions to this location - environmental.yaml # Signs, terminals, ambient text - trait-guide.yaml # How personality traits modify base lines - bar/ - dialogue.yaml - monologue.yaml - environmental.yaml - trait-guide.yaml - smuggling-ring/ - dialogue.yaml - monologue.yaml - environmental.yaml - trait-guide.yaml - characters/ - smuggler/ - voice-kit.yaml # Character-specific monologue voice - opening-hook.yaml # First 5 minutes content - detective/ - voice-kit.yaml - opening-hook.yaml - shared/ - greetings.yaml # Cross-template greeting pools - farewells.yaml # Cross-template farewell pools - generic-ambient.yaml # Non-location-specific monologue -``` - -### Line Entry Schema - -Here's what a single line looks like in `dialogue.yaml`: - -```yaml -# logistics-hub/dialogue.yaml -# Template: Logistics Hub (Workplace) -# Author: Mellanie -# Last updated: YYYY-MM-DD - -meta: - template: logistics_hub - version: 1 - line_count: 70 # target: 55-70 authored lines for this template - -lines: - - id: lh_d_001 - text: "Another shipment from Taliesin. Third one this week. Must be nice to have that kind of credit flow." - role: dock_worker # which NPC role speaks this - access: [insider, peer] # who hears this (D-028 Layer 1) - trust: surface # disclosure tier: surface | real | secret - topic: [work, cargo, money] # what the line is about - mood: [neutral, tired] # NPC mood states that select this line - situation: [routine, morning] # when this line is eligible - tags: [gossip, observation] # freeform classification - dual_lens: # how this line hits differently per character - smuggler: "Routine shop talk. But Taliesin shipments are your cover run." - detective: "Cargo volume anomaly. Worth checking manifests." - notes: "Sets up Taliesin as a location name. Smuggler knows this is cover cargo." - - - id: lh_d_002 - text: "You're new around here? Or just... visiting?" - role: dock_worker - access: [public] - trust: surface - topic: [social, identity] - mood: [cautious, neutral] - situation: [first_meeting] - tags: [greeting, probe] - dual_lens: - smuggler: "Never triggered — smuggler is known here." - detective: "First contact. Worker is sizing you up." - - - id: lh_d_003 - text: "Look, I mind my own business. You should try it." - role: dock_worker - access: [authority, hostile] - trust: surface - topic: [deflection] - mood: [annoyed, defensive] - situation: [interrogation, repeated_visit] - tags: [resistance, wall] - dual_lens: - smuggler: "Only if your cover is blown and they see you as authority now." - detective: "Standard resistance. Either genuinely uninvolved or protecting someone." -``` - -### Minimum Viable Tag Set for v0.1 - -Here's the taxonomy — the minimum set of tags that makes the four dialogue layers functional: - -#### Structural Tags (required on every line) - -| Tag | Type | Values | Purpose | -|-----|------|--------|---------| -| `id` | string | `{template}_{type}_{###}` | Unique identifier | -| `text` | string | The authored line | What the NPC says | -| `role` | enum | Template-defined roles (e.g., `dock_worker`, `bartender`, `ring_courier`) | Which NPC role speaks this | -| `access` | list\ | `public`, `insider`, `authority`, `peer`, `hostile` | D-028 Layer 1: who hears this | -| `trust` | enum | `surface`, `real`, `secret` | D-028 Layer 3: disclosure tier | -| `situation` | list\ | See situation taxonomy below | When this line is eligible | - -#### Content Tags (recommended, can be empty) - -| Tag | Type | Values | Purpose | -|-----|------|--------|---------| -| `topic` | list\ | `work`, `social`, `cargo`, `money`, `relationships`, `rumors`, `identity`, `deflection`, `weather`, `complaint` | What the line is about — enables topic-based conversation steering | -| `mood` | list\ | `neutral`, `happy`, `tired`, `annoyed`, `nervous`, `defensive`, `friendly`, `cautious` | NPC mood states that select this line | -| `tags` | list\ | Freeform | Author classification for search and grouping | - -#### Authoring-Only Tags (not consumed by engine, used by previewer and authors) - -| Tag | Type | Values | Purpose | -|-----|------|--------|---------| -| `dual_lens` | map | Per-character notes | How this line reads differently per character | -| `notes` | string | Author comments | Design intent, context, dependencies | - -#### Situation Taxonomy for v0.1 - -Situations are the context triggers that make lines eligible. Minimum set: - -| Situation | Description | -|-----------|-------------| -| `greeting` | First interaction this game-day | -| `first_meeting` | Characters have never met | -| `routine` | Normal daily activity | -| `morning` / `afternoon` / `evening` / `night` | Day phase (D-031) | -| `repeated_visit` | Player has visited this NPC 3+ times | -| `interrogation` | Player is asking pointed questions | -| `witnessed_secret` | Player has seen something they shouldn't | -| `idle` | NPC is between activities | -| `working` | NPC is performing their job | -| `social` | NPC is socializing (bar, break, etc.) | -| `confrontation` | Triangle tension has boiled over | -| `post_event` | Responding to a recent simulation event | - -### How the Four Dialogue Layers Map to Tags - -**Question:** How do the 4 dialogue layers map to line tags? One tag per layer, or more complex? - -Let me map it out: - -| Dialogue Layer | Tag(s) Used | Selection Logic | -|----------------|-------------|-----------------| -| **Layer 1: Access tier** | `access` | Hard filter. If the player character's current access tier for this NPC's social site is not in the line's `access` list, the line is **invisible**. No fallthrough. | -| **Layer 2: Relationship history** | `situation` + engine state | The engine tracks interaction count, last interaction time, and notable events. This modifies which `situation` values are active. E.g., `first_meeting` is only true once; `repeated_visit` activates after threshold. **Not a single tag — it's engine state mapped to situation eligibility.** | -| **Layer 3: Trust-gated gossip** | `trust` | Progressive filter. NPCs start at `surface`. As relationship improves, `real` lines become available. `secret` lines only after significant trust threshold. **One tag, three values, engine controls the threshold.** | -| **Layer 4: Unprompted disclosure** | `topic` + `mood` + engine state | The NPC has things they WANT to say (driven by mood, recent events, triangle pressure). The engine picks from eligible lines weighted by NPC mood and topic relevance. **No single tag — it's a weighted selection across mood + topic from the eligible pool.** | - -#### Selection Pipeline (simplified) - -``` -All lines for this NPC's role - | - ├── Filter by access tier (Layer 1) → removes ~40-60% of lines - | - ├── Filter by situation (Layer 2) → narrows to context-appropriate lines - | - ├── Filter by trust level (Layer 3) → caps disclosure depth - | - └── Weight by mood + topic relevance (Layer 4) → ranks remaining lines - | - └── Select top-weighted line (with variety tracking to avoid repeats) -``` - -**Key insight:** Layers 1 and 3 are HARD FILTERS (binary: eligible or not). Layers 2 and 4 are SOFT SELECTORS (weighting and context). This means: -- Authors must ensure every access/trust combination has enough lines to avoid dead conversations -- Authors can be more flexible with mood/topic — the engine can fall back to `neutral` mood lines - -### Monologue Line Format - -Monologue uses a similar but distinct schema. Key difference: monologue is triggered by observation EVENTS, not conversation initiation. - -```yaml -# logistics-hub/monologue.yaml - -lines: - - id: lh_m_001 - text: "Busy morning. The usual controlled chaos." - character: smuggler - trigger: enter_location # what observation event fires this - location: logistics_hub - situation: [morning, routine] - mood: [neutral, relaxed] # character mood, not NPC mood - prerequisite: null # knowledge state required (null = always eligible) - tags: [atmosphere, establishing] - - - id: lh_m_002 - text: "Same faces, same cargo, same lies. Comfortable." - character: smuggler - trigger: enter_location - location: logistics_hub - situation: [morning, routine] - mood: [neutral, content] - prerequisite: { knows: smuggling_operation } - tags: [atmosphere, character_voice, irony] - - - id: lh_m_003 - text: "Standard logistics operation. On paper. The throughput numbers don't add up, though." - character: detective - trigger: enter_location - location: logistics_hub - situation: [morning, routine] - mood: [neutral, analytical] - prerequisite: { knows: cargo_anomaly } - tags: [investigation, observation, clue] -``` - -#### Monologue Trigger Taxonomy for v0.1 - -| Trigger | Description | Example | -|---------|-------------|---------| -| `enter_location` | Player enters a new area | "The bar's quieter than usual." | -| `observe_npc` | Player sees an NPC doing something | "They're checking the manifest again." | -| `hear_sound` | Sound event from fog edge | "Footsteps. Two people, moving fast." | -| `observe_anomaly` | NPC deviates from routine | "That's not where they usually go at this hour." | -| `post_conversation` | After dialogue ends | "They were lying. The pause before 'I don't know' — classic tell." | -| `discover_evidence` | Player examines an object with information | "This doesn't match the official log." | -| `witness_interaction` | Player sees two NPCs interacting | "Those two don't normally talk." | -| `time_idle` | Player hasn't done anything for a while | "Should probably get moving." | -| `return_visit` | Player returns to a previously visited area | "Different shift. Different faces." | - ---- - -## Layer 5: Template Content & Entanglement - -**Question:** How does the entanglement ratio (30/50/20) play out across ~15 NPCs? - -Let me do the math and map it concretely. - -### NPC Distribution (D-029 applied to v0.1) - -With ~15 NPCs across 3 social sites: - -| Entanglement Level | Count | Description | Template Distribution | -|-------------------|-------|-------------|----------------------| -| **Flat** (~30%) | 4-5 NPCs | Routine + greeting only. Social wallpaper. | 1-2 per template | -| **Mundane Triangle** (~50%) | 7-8 NPCs | Involved in non-conspiracy social drama. Neighbor disputes, workplace rivalries, relationship tensions. | 2-3 per template | -| **Entangled** (~20%) | 3 NPCs | Connected to smuggling operation. Their secrets are the investigation targets. | Primarily in ring template, with 1 bridge NPC in another | - -### Concrete NPC Skeleton (proposal) - -Here's how I'd distribute them: - -**Logistics Hub (5 NPCs):** - -| Role | Name (placeholder) | Entanglement | Triangle Role | -|------|--------------------|-------------|---------------| -| Shift Supervisor | [TBD] | Mundane | Triangle A: workplace authority tension | -| Dock Worker 1 | [TBD] | Flat | Wallpaper — reliable, boring, friendly | -| Dock Worker 2 | [TBD] | Mundane | Triangle A: chafes under supervisor | -| Cargo Handler | [TBD] | **Entangled** | Ring member. Uses job to move product. Bridge NPC to ring template. | -| Admin Clerk | [TBD] | Mundane | Triangle B: knows more than they should about cargo discrepancies | - -**Bar (5 NPCs):** - -| Role | Name (placeholder) | Entanglement | Triangle Role | -|------|--------------------|-------------|---------------| -| Bartender | [TBD] | Mundane | Triangle C: social hub, hears everything, discreet | -| Regular 1 | [TBD] | Flat | Wallpaper — always there, colorful but uninvolved | -| Regular 2 | [TBD] | Mundane | Triangle C: has a thing for the bartender, jealous of attention | -| Off-duty Worker | [TBD] | Mundane | Triangle B (cross-template): same person from logistics hub, different behavior here. Bridge NPC. | -| Stranger | [TBD] | Flat | Wallpaper — different face each playthrough. Procedural filler. | - -**Smuggling Ring (5 NPCs):** - -| Role | Name (placeholder) | Entanglement | Triangle Role | -|------|--------------------|-------------|---------------| -| Ring Leader | [TBD] | **Entangled** | Runs the operation. Triangle D: power/loyalty tension | -| Ring Courier | [TBD] | **Entangled** | Moves product between ring and hub. Triangle D: pressured by leader, considering turning | -| Ring Lookout | [TBD] | Mundane | Triangle D: doesn't know the full scope of operation, thinks it's minor smuggling | -| Ring Contact (bar) | [TBD] | Mundane | Triangle C (cross-template): the ring's eyes and ears at the bar | -| Ring Fixer | [TBD] | Flat | Wallpaper for the ring — handles logistics, no drama | - -### Triangle Map - -| Triangle | NPCs | Tension | Type | -|----------|------|---------|------| -| **A** (Logistics Hub) | Supervisor, Dock Worker 2, Cargo Handler | Authority vs autonomy. Worker resents supervisor. Handler stays quiet to protect cover. | Mundane + one entangled leg | -| **B** (Cross-template) | Admin Clerk (Hub), Off-duty Worker (Bar), Cargo Handler (Ring) | The clerk noticed discrepancies. The off-duty worker drinks too much and talks. The handler needs to keep both quiet. | Cross-template, entangled | -| **C** (Bar) | Bartender, Regular 2, Ring Contact | Social drama. Regular is jealous. Ring Contact uses bar as intel gathering. Bartender sees all, says nothing. | Mundane + one entangled leg | -| **D** (Ring) | Ring Leader, Ring Courier, Ring Lookout | Power and loyalty. Leader pushes for more volume. Courier is cracking under pressure. Lookout thinks it's small-time. | Entangled | - -**Note for Paula:** Triangle B is the critical cross-template triangle. It's the mechanism by which the smuggling operation contaminates the mundane social world. The clerk's curiosity + the worker's loose lips + the handler's need for silence is a pressure cooker that the player can observe, manipulate, or accidentally trigger. - -### Does This Create Interesting Decisions? - -For the **smuggler**: You KNOW the handler, the courier, the leader. Your daily life is managing these relationships. Triangle B is your biggest risk — the clerk is asking questions, the worker talks too much at the bar. Do you befriend the clerk to deflect? Warn the worker to shut up? Or trust the handler to manage it? Every choice has relationship consequences. - -For the **detective**: You don't know any of this at first. You see a normal workplace, a normal bar. But the clerk seems nervous. The worker mentions "weird cargo hours" after their third drink. The handler is suspiciously friendly with the detective — trying to assess the threat. The detective's game is connecting these dots through observation and conversation. - -**This is the fun.** Same 15 people, completely different games. - ---- - -## Layer 6: Minimum Viable Tell System - -**Question:** What's the minimum viable tell system? One behavioral marker per axis, or fewer? - -Let me break down what "tells" actually need to DO mechanically before deciding volume. - -### What Tells Are For - -A "tell" is an observable behavior that reveals internal NPC state without the NPC explicitly saying anything. Tells are the bridge between the simulation (NPC has mood=nervous, secret=smuggling) and the perception system (player sees NPC fidgeting, looking over their shoulder). - -Tells serve two functions: -1. **Reward observation** — the player who watches carefully learns more than the player who just talks -2. **Create investigation breadcrumbs** — "they seem nervous" prompts the player to dig deeper - -### Minimum Viable Tell System for v0.1 - -**Not one per axis. That's 10 tells per NPC x 15 NPCs = 150 behavioral markers. Way too many for v0.1.** - -Instead: tells should map to the PLAYER-FACING question, not the simulation axis. The player doesn't think in axes — they think in "what's wrong with this person?" - -| Tell Category | Maps to Axes | Observable Behavior | Implementation | -|---------------|-------------|---------------------|----------------| -| **Nervous/hiding something** | Secret, Tolerance threshold | Fidgeting sprite variation, checking over shoulder, breaking eye contact (monologue describes) | 2-3 text descriptions in monologue pool | -| **Angry/frustrated** | Contentment (low), Tolerance (near threshold) | Terse dialogue, aggressive movement pattern (faster walk), monologue notes "they look tense" | Mood affects dialogue selection + 1 movement modifier | -| **Friendly/warm** | Relationships (positive), Personality (sociable) | Longer conversations, approaches player proactively, monologue notes openness | Unprompted disclosure weighting increase | -| **Guarded/cold** | Relationships (negative), Access (hostile) | Short responses, avoids player, monologue notes resistance | Access tier filtering does this naturally | -| **Routine deviation** | Secret (active), Want (pursuing something) | NPC goes somewhere they normally don't, at an unusual time | Routine system deviation flag + monologue trigger | - -**That's 5 tell categories for v0.1.** Each is expressed through a combination of: -- Monologue lines (character interprets the tell) — cheapest, most expressive -- Dialogue weighting (mood shifts what lines are selected) — already in the pipeline -- Movement behavior (1 modifier: speed/path deviation) — lightweight - -**Most tells in v0.1 will be TEXT, not visual.** The monologue system IS the tell renderer. "They're checking the corridor before entering the back room" is a tell delivered through monologue, not through a complex animation system. This is consistent with D-016 (monologue as perception bridge) and D-014 (functional boxes with labels). - -### What Mellanie Needs - -For each of the 5 tell categories, 3-5 monologue lines per character. That's 30-50 monologue lines dedicated to tells, split between smuggler and detective voice. - -**Smuggler tell monologue** reads differently from detective tell monologue: -- Smuggler noticing nervousness: "They're spooked. Wonder who's been asking questions." -- Detective noticing nervousness: "Nervous. Either guilty or scared of someone who is." - -Same observation, different interpretation. This is where the dual-lens system shines brightest. - ---- - -## Layer 7: Monologue & Observation Text - -No direct questions for Gestalt here, but a systems note: - -**Monologue content volume is the highest content risk in the entire project** (I flagged this in the previous gap analysis workshop). The monologue system carries perception, atmosphere, tutorial, tells, investigation clues, and character voice — simultaneously. If it feels thin or repetitive, the entire game suffers. - -The trigger taxonomy I defined in Layer 4 above (9 trigger types) maps directly to content authoring work. Mellanie needs to write lines for each trigger type x each location x each character. That's approximately: - -| Trigger | Lines per location | x3 locations | x2 characters | Total | -|---------|-------------------|-------------|----------------|-------| -| `enter_location` | 3-5 | 9-15 | 18-30 | 18-30 | -| `observe_npc` | 5-8 | 15-24 | 30-48 | 30-48 | -| `hear_sound` | 3-4 | 9-12 | 18-24 | 18-24 | -| `observe_anomaly` | 3-5 | 9-15 | 18-30 | 18-30 | -| `post_conversation` | 5-8 | 15-24 | 30-48 | 30-48 | -| `discover_evidence` | 2-3 | 6-9 | 12-18 | 12-18 | -| `witness_interaction` | 3-5 | 9-15 | 18-30 | 18-30 | -| `time_idle` | 2-3 | — (shared) | 4-6 | 4-6 | -| `return_visit` | 2-3 | 6-9 | 12-18 | 12-18 | - -**Estimated monologue line count: 160-250 authored lines.** Plus the 30-50 tell lines. Call it **200-300 monologue lines total** — consistent with the D-028 workshop estimate. - -These are authored lines. The 4x generation expansion applies here too, giving ~800-1200 total monologue lines in the game. That should prevent repetition across a 30-minute session. - ---- - -## Layer 8: UI Text & Onboarding - -**Question:** Does v0.1 need onboarding text, or can the monologue system serve as the tutorial (D-016 "diegetic tutorial")? - -**Answer: Monologue IS the tutorial. No separate onboarding text needed for v0.1.** - -Here's how it works mechanically: - -### Diegetic Tutorial Through Monologue - -The player's first 2-3 minutes produce a sequence of monologue lines that teach by narrating: - -| Player Action | Monologue Tutorial | What It Teaches | -|---------------|-------------------|-----------------| -| Game starts | "Another day at [station]. Better check the schedule." (Smuggler) / "Precinct forwarded the case file. Time to start." (Detective) | You have a purpose. You're a person. | -| Player moves | "Quiet corridor. Nobody around." | Vision cone — you can see what's in front of you. | -| Player approaches fog edge | "Something around the corner. Can't see from here." | Fog = limited perception. Move to see more. | -| Player hears sound through wall | "Voices. Can't make out what they're saying from here." | Sound carries through walls. Get closer. | -| Player sees first NPC | "That's [Name]. [Brief relationship context]." (Smuggler) / "Unknown civilian. Standard profile." (Detective) | You know (or don't know) people. Character relationships matter. | -| Player talks to NPC | (Dialogue system handles this) | Conversation exists. Different people tell you different things. | -| Player checks insert | "Let's see... [location info]." | The minimap/insert exists and is diegetic. | - -**No "Press WASD to move" text.** No tooltip overlays. The character's thoughts teach the player by reacting to what the player does naturally. - -**What this requires from Mellanie:** A special `opening-hook.yaml` per character with 10-15 tightly sequenced monologue lines that fire in response to the player's first actions. These are the most important lines in the entire game — they set voice, teach mechanics, and establish motivation simultaneously. - -### UI Text That IS Needed - -Even with diegetic tutorial, some UI text is unavoidable: - -| UI Element | Text Needed | Volume | -|------------|-------------|--------| -| Main menu | New Game, Continue, Settings, Quit | 4-6 strings | -| Character select | Smuggler description, Detective description | 2 paragraphs | -| Pause menu | Resume, Save, Load, Settings, Quit | 5-6 strings | -| Insert/minimap labels | POI names, distance indicators | ~10-15 strings | -| Dialogue UI | "Talk", "Leave", topic selection labels | ~5-10 strings | -| Time display | Day phase indicator, clock format | 4-5 strings | - -**Total UI text: ~40-50 strings.** Trivial volume. Can be authored in an afternoon. - ---- - -## Layer 9: Audio Direction - -**Question:** Does the three-range sound model need audio content to prove itself, or can it work with system beeps and text? - -**Answer: Text-only sound is mechanically sufficient for v0.1. Audio content is a wow multiplier, not a proof requirement.** - -Here's why: - -### How Sound Works Without Audio Files - -The three-range model (D-018) is fundamentally an INFORMATION system, not an audio system. What matters is: - -| Range | What the player needs to know | Text-only delivery | -|-------|------------------------------|-------------------| -| Close | "I can hear this clearly" | Monologue: "Footsteps behind me. Two people." | -| Medium | "Something's happening nearby but I can't see it" | Visual indicator at fog edge + monologue: "Voices from the next room." | -| Long | "Information arrived through my insert" | Insert notification text: "Alert: disturbance reported in Sector 7" | - -All three ranges work through text + visual indicators. The SYSTEM is provable without a single audio file. - -### What Audio WOULD Add - -Audio adds emotional texture that text can't match: -- Close range: actual footstep sounds create spatial awareness and tension -- Medium range: muffled voices through walls create curiosity and dread -- Fog edge: ambient hum vs silence communicates "something's there" vs "empty" - -**Recommendation:** Defer ALL authored/designed audio to a later sprint. For v0.1, use at most: -- 1 ambient drone per location type (3 total — can be freely licensed or generated) -- 1 footstep sound for close-range feedback -- 1 "notification chime" for insert alerts - -That's 5 sound files. The rest is text + visual indicators. If even this is too much, zero audio is acceptable. The monologue system can carry the entire perceptual load. - -**But the system architecture must still support audio.** The sound event system (#124) should emit events regardless of whether audio content exists. The client receives "sound event at coordinates X,Y with type FOOTSTEPS" — whether it plays a wav file or shows a visual indicator is a client rendering decision. Don't build the system around text; build it around events and render text as the v0.1 fallback. - ---- - -## Cross-Layer Synthesis: What Gestalt Thinks the Content Team Needs - -### Priority-Ordered Content Work - -| Priority | Deliverable | Owner | Depends On | Lines/Volume | -|----------|-------------|-------|------------|-------------| -| 1 | Line pool format specification (this document) | Gestalt (done) | Nothing | Spec only | -| 2 | Dual Lens Authoring Guide | Paula | Layer 2 access tier model (above) | ~10 pages | -| 3 | Station district setting brief | Miri | Nothing | ~2-3 pages | -| 4 | Character voice kits (smuggler + detective) | Mellanie | Dual Lens Guide | 20-30 sample lines per character | -| 5 | Opening hook content (per character) | Mellanie | Voice kits | 10-15 lines per character | -| 6 | NPC profiles (15 NPCs) | Paula + Mellanie | Setting brief, character builds | 1 page per NPC | -| 7 | Logistics Hub content pack (#190) | Mellanie | NPC profiles, line pool format | ~55-70 dialogue + ~30-40 monologue lines | -| 8 | Bar content pack (#191) | Mellanie | NPC profiles, line pool format | ~55-70 dialogue + ~30-40 monologue lines | -| 9 | Smuggling Ring content pack (#192) | Mellanie | NPC profiles, line pool format | ~55-70 dialogue + ~30-40 monologue lines | -| 10 | Tell monologue lines | Mellanie | NPC profiles, tell categories | 30-50 lines | -| 11 | Environmental text | Mellanie + Araminta | Setting brief | ~30-50 strings | -| 12 | UI text | Mellanie | Character descriptions | ~40-50 strings | - -### The Critical Path - -``` -Dual Lens Guide (Paula) - + Station Setting (Miri) - + Line Pool Format (Gestalt - this document) - → Character Voice Kits (Mellanie) - → Opening Hooks (Mellanie) - → NPC Profiles (Paula + Mellanie) - → Content Packs x3 (Mellanie) - → Tell Lines + Environmental (Mellanie) -``` - -**Nothing blocks the line pool format — it's spec work.** The Dual Lens Guide and Station Setting can proceed in parallel. Once those two exist, Mellanie can start writing. The content packs are the bulk of the work and should start as soon as the voice kits feel right. - -### One Last Mechanical Note - -**The line previewer (#193) is critical.** Mellanie cannot efficiently author 500+ tagged lines without a tool that shows "given this NPC, this access tier, this mood, this situation — what line would fire?" The previewer doesn't need to be pretty. It needs to load a YAML file, accept filter parameters, and show the selected line. A CLI tool. Tyre can build this as a Rust binary that reads the YAML and applies the selection pipeline. - -Without the previewer, Mellanie is writing blind. Tag errors won't surface until integration. That's a recipe for rework. - ---- - -*Gestalt out. The format is proposed, the tags are defined, the pipeline is mapped. Now we need Paula's lens guide, Miri's setting, and Mellanie's voice. The systems are ready for content.* diff --git a/docs/workshops/content-gap-analysis_v0_1/round1-mellanie.md b/docs/workshops/content-gap-analysis_v0_1/round1-mellanie.md deleted file mode 100644 index be615e330..000000000 --- a/docs/workshops/content-gap-analysis_v0_1/round1-mellanie.md +++ /dev/null @@ -1,438 +0,0 @@ -# Round 1 — Mellanie's Content Gap Analysis - -**Agent:** Mellanie (Copywriter) -**Date:** 2026-02-11 -**Scope:** All 9 layers, copywriting perspective - ---- - -## Layer 1: Art Direction & Visual Identity - -Not my lane directly, but I'll flag the intersection: **visual style determines how much weight text carries.** D-014 says "functional boxes with labels" and D-016 says "atmosphere carried by monologue." If the art stays minimal, my text is doing 80% of the atmosphere work. If the art gets moody, the text can be sparser. - -**My ask for Araminta:** Tell me the visual fidelity target so I can calibrate density. Minimal art = more monologue lines per location. Moody art = fewer, sharper lines. I need to know which world I'm writing for. - ---- - -## Layer 2: Narrative Framework & Character Design - -### Q3: What do I need from the character builds before I can write voice-consistent dialogue? - -Five things. Non-negotiable. - -**1. Voice signature.** Not personality traits — *speech patterns.* Short sentences or long? Profanity or clean? Technical vocabulary or street? Internal monologue style: does the smuggler think in observations or feelings? Does the detective think in hypotheses or facts? - -Here's what I mean concretely: - -> **Smuggler sees a cargo container out of place:** -> *Option A (cautious, observational):* "That container's been moved. Wasn't there this morning." -> *Option B (anxious, relational):* "Kael moved the container again. He's going to get us all caught." -> *Option C (sardonic, detached):* "Someone rearranged the furniture. How creative." - -Each of those is a different character. I need to know which one before I write 500 lines. - -**2. What they notice.** The smuggler and detective look at the same room and see different things. Not just because of information boundaries — because of *attention.* The smuggler notices exits, security cameras, who's watching. The detective notices inconsistencies, nervousness, things out of place. This shapes every monologue line and every dialogue choice. - -**3. Relationship to authority.** How do they talk to people with power over them? How do they talk to people they have power over? The smuggler with their ring boss vs. the detective with their precinct captain — those power dynamics shape every interaction. - -**4. What they lie about.** Both characters have things they conceal or misrepresent. The smuggler hides their criminal activity. The detective might hide their investigation from suspects. Knowing what they lie about tells me what their "public voice" sounds like vs. their "internal voice." - -**5. Emotional baseline.** Not mood — *posture.* Is the smuggler generally anxious, comfortable, or resigned? Is the detective generally confident, frustrated, or obsessive? This is the default register that all their lines return to between dramatic moments. - -**Proposal:** I'll write a **Voice Kit** for each character — a 1-page document with these five elements plus 10 sample monologue lines covering common situations (entering a room, greeting an acquaintance, noticing something wrong, being lied to, being alone). Paula defines the narrative identity; I translate it into voice. The Voice Kit becomes the reference that keeps all dialogue on-character. - -**Dependency:** Paula's character arc outlines (#180, #181) must come before my Voice Kits. I need to know who these people *are* before I can figure out how they *sound.* - ---- - -## Layer 3: Station District Setting - -Not my primary deliverable, but I write text that lives in this space. My ask for Miri: - -**Give me the texture, not just the lore.** I don't need a history essay. I need: -- What does this place *smell* like? (Monologue uses all senses.) -- What's the slang? Do people say "shift" or "rotation"? "Credits" or "sols"? -- What's on the walls — corporate signage? Safety warnings? Union notices? Graffiti? -- What's the ambient sound the monologue might reference — machinery hum? Ventilation? Crowd noise? -- What's the local complaint? Every community has one. Bad water. Late transports. Overpriced food. - -These details are what make monologue and environmental text feel *placed* instead of generic sci-fi. - ---- - -## Layer 4: Content Pipeline & Authoring Format - -### Q2: Can I write content packs in a provisional format before the previewer exists? - -**Yes, with conditions.** - -I can write in any structured text format — YAML, Markdown with frontmatter, even a spreadsheet — as long as we agree on the tag taxonomy first. The actual file format matters less than the metadata structure. I can adapt format later; I can't retag 500 lines. - -**What I need locked before I write:** - -1. **Tag taxonomy.** The minimum set of tags per line. My proposal for v0.1: - -| Tag | Values | Purpose | -|-----|--------|---------| -| `character` | smuggler, detective, any | Who can trigger this line | -| `access` | insider, outsider, authority, peer | D-028 Layer 1 filter | -| `trust` | surface, real, secret | D-028 Layer 3 disclosure tier | -| `location` | workplace, bar, ring, corridor, any | Where this line fires | -| `situation` | greeting, idle, gossip, confrontation, observed_anomaly, absence, routine | What's happening | -| `mood` | neutral, tense, relaxed, suspicious, friendly | NPC emotional state | -| `topic` | work, personal, crime, rumor, weather, complaint | What the line is about | -| `type` | dialogue, monologue, environmental, ticker | Content category | - -That's 8 tags. Enough to filter meaningfully, few enough to author quickly. Gestalt can add more if the system needs them, but I can start writing with these. - -2. **Line format.** My proposed provisional format (Markdown-friendly, convertible to YAML/JSON later): - -``` ---- -id: wp-dock-greeting-01 -character: any -access: insider -trust: surface -location: workplace -situation: greeting -mood: neutral -topic: work -type: dialogue -speaker: dock_supervisor ---- -Another day, another manifest. You know the drill. -``` - -If the actual format changes, I can batch-convert. The content and tags are what matter. - -3. **One example template fully tagged.** Before I write 165 lines for the workplace, I want to write 20, tag them, and have Gestalt validate that the tags produce the right filtering behavior. Call it a "tag smoke test." This catches taxonomy problems before they compound. - -**What I do NOT need before starting:** -- The previewer CLI (#193). Nice to have, not a blocker. I'll write blind and validate later. -- Final file format. Provisional is fine. -- Generation pass specs (#194). I write the authored core; expansion is a separate step. - ---- - -## Layer 5: Template Content (3 Social Sites) - -### Q1: What does a content pack deliverable look like? Break down #190. - -Here's what the **Workplace Content Pack** (#190) contains, broken into concrete writing tasks: - -#### A. Role Voice Kits (4-6 roles, ~5 lines each = 20-30 lines) - -Each role in the workplace template gets a voice kit: a set of sample lines that establish how this *type* of person talks. Not a specific NPC — a role that gets filled by a generated NPC. - -Proposed workplace roles: -- **Dock Supervisor** — authority figure, stressed, deadline-driven -- **Cargo Handler** — physical worker, pragmatic, gossip-prone -- **Logistics Clerk** — desk worker, detail-oriented, nervous or bored -- **Maintenance Tech** — gruff, observant, knows every corner of the facility -- **Security Guard** — bored or paranoid, depending on personality axis -- **Shift Manager** — middle management, caught between workers and bosses - -Each kit: 5 lines covering greeting, idle chatter, reaction to anomaly, reaction to authority, and one line that hints at their secret/vulnerability axis. - -#### B. Situation Scripts (tagged line pools — the bulk, ~80-100 lines) - -These are the lines that fire during gameplay, filtered by tags. Organized by situation: - -| Situation | Lines | Description | -|-----------|-------|-------------| -| Greetings | 15-20 | First contact lines, filtered by access tier and relationship | -| Idle/ambient | 15-20 | Background chatter, complaints, observations. The "daily life" texture | -| Work talk | 10-15 | Job-related conversation. Manifests, schedules, problems | -| Gossip | 10-15 | Trust-gated. Surface: weather, sports. Real: who's sleeping with whom. Secret: who's smuggling what | -| Confrontation | 5-10 | When triangle tensions surface. Accusations, denials, pleas | -| Observed anomaly | 5-10 | NPC reacts to something unusual. Feeds the observation chain | -| Authority interaction | 5-10 | How NPCs talk to/about the boss. Power dynamics | - -#### C. Monologue Hooks (per character, ~30-40 lines) - -Lines that fire as the player character's internal monologue in this location: - -| Category | Smuggler | Detective | -|----------|----------|-----------| -| Entering workplace | 8-10 lines: routine, familiar, noting who's in/out | 8-10 lines: scanning, assessing, noting what seems off | -| Observing NPC behavior | 5-8 lines: protective, concerned about exposure | 5-8 lines: analytical, building hypotheses | -| Noticing anomaly | 3-5 lines: alarm, calculating risk | 3-5 lines: interest, cataloguing evidence | -| Absence/deviation | 3-5 lines: "Where's Kael?" worry-flavored | 3-5 lines: "Subject deviated from pattern" analytical | - -#### D. Environmental Text (~15-20 items) - -Diegetic text that exists in the space: -- Shift schedule board (readable, updates with game time) -- Safety notices ("Report unauthorized cargo to Security — Management") -- Cargo manifest fragments (readable if you examine them — information source) -- Employee notice board (upcoming events, complaints, lost items) -- Terminal login screen text -- Door labels, section markers, warning signs - -#### E. Trait Transformation Guide (~1 page) - -How personality axes modify the base lines. Not per-trait scripts — guidelines: - -| Trait axis | Low | High | Effect on dialogue | -|------------|-----|------|--------------------| -| Tolerance | Snaps fast, short answers | Patient, elaborate | Shorter/longer responses, more/fewer warnings before confrontation | -| Contentment | Bitter, complaining | Satisfied, dismissive | Tone of idle chatter. Discontented NPCs gossip more | -| Want (ambition) | Passive, accepting | Driven, scheming | Proactive vs reactive dialogue. High-want NPCs steer conversations | - -**Total for one template: ~165-200 authored lines + environmental text + trait guide.** - -Three templates = ~500-600 authored lines of dialogue/monologue + ~50-60 environmental text items + 3 trait guides. - -That's achievable. It's a focused sprint of writing, not a marathon. The quality bar is what takes time, not the volume. - ---- - -## Layer 6: NPC Profiles & Dialogue - -### Q1 (with Paula): How deep does each NPC profile need to be? - -**Two tiers of depth, matching the 30/50/20 split.** - -**Flat NPCs (30%, ~4-5 NPCs):** The 10 axes plus one distinguishing line. That's it. These people are wallpaper with a pulse. They greet you, they make small talk, they go about their routine. They exist so the station feels populated. - -What I need per flat NPC: -- Name -- Role (which role voice kit to draw from) -- One distinguishing trait or habit (the dock worker who always eats during shift, the clerk who hums) -- 3-5 custom lines that make them *slightly* memorable (beyond the generic role pool) - -**Triangle NPCs (50%, ~7-8 NPCs) and Entangled NPCs (20%, ~3 NPCs):** The 10 axes plus a **voice paragraph.** Not a full backstory — a paragraph that captures how this specific person *talks* and *thinks,* enough for me to write lines that feel specific to them. - -What I need per triangle/entangled NPC: -- Name -- Role + which social sites they appear in -- 10-axis values (especially Want, Secret, Relationships, Contentment) -- One paragraph: "Kael talks like [X], thinks about [Y], is hiding [Z]. When stressed, he [behavior]. When comfortable, he [behavior]." -- Their triangle position: who they're in conflict with, what they want from the triangle -- 8-15 custom lines (beyond role pool) that express their specific voice and situation - -**Who writes these profiles?** Paula defines the narrative identity and triangle dynamics. Miri provides cultural/setting flavor. I write the voice paragraph and sample lines. It's a collaboration, not a solo task. - -### Q2: How many lines per NPC for v0.1? - -Let me do the real math. - -**Flat NPCs (~5):** 3-5 custom lines each = 15-25 lines. Plus they draw from the role voice pool, so they have maybe 20-30 lines available total (role pool + custom). - -**Triangle NPCs (~8):** 8-15 custom lines each = 64-120 lines. Plus role pool. Total available per NPC: 30-45 lines. - -**Entangled NPCs (~3):** 12-20 custom lines each = 36-60 lines. These need the most specific, plot-relevant dialogue. Total available per NPC: 40-55 lines. - -**Custom NPC lines total: 115-205 lines.** - -These sit ON TOP of the template content packs (~500-600 lines of role-based dialogue). The role pools provide the substrate; NPC-specific lines provide the personality. - -**Grand total authored lines for v0.1:** -| Category | Lines | -|----------|-------| -| Template dialogue (3 packs) | 500-600 | -| NPC-specific lines (~15 NPCs) | 115-205 | -| Monologue — smuggler | 100-150 | -| Monologue — detective | 100-150 | -| Environmental text | 50-60 | -| UI/insert text | 20-30 | -| News ticker / unisphere | 15-20 | -| **Total authored** | **~900-1,215** | - -After 4x generation expansion on the template dialogue: **~3,000-3,600 total lines available to the system.** - -That's a solid content floor. It won't feel infinite, but it won't feel empty during a 30-minute session. The player will encounter maybe 150-200 lines per playthrough. Repetition becomes a problem only on the 3rd or 4th play of the same character. - ---- - -## Layer 7: Monologue & Observation Text - -### Q1: How many monologue lines make v0.1 feel alive? - -The 200-300 estimate is the *floor.* Let me break it down by function: - -| Function | Smuggler | Detective | Total | -|----------|----------|-----------|-------| -| **Location atmosphere** (entering/being in a place) | 25-30 | 25-30 | 50-60 | -| **NPC observation** (noticing behavior, tells) | 20-25 | 20-25 | 40-50 | -| **Absence/deviation** (expected NPC not present, routine broken) | 10-15 | 10-15 | 20-30 | -| **Sound interpretation** (hearing through fog) | 8-10 | 8-10 | 16-20 | -| **Investigation/deduction** (connecting dots) | 10-15 | 15-20 | 25-35 | -| **Emotional/reflective** (quiet moments, character depth) | 10-15 | 10-15 | 20-30 | -| **Diegetic tutorial** (hinting at available actions) | 8-10 | 8-10 | 16-20 | -| **Mirror moments** (hinting at the other perspective) | 5-8 | 5-8 | 10-16 | -| **Total** | **~96-128** | **~101-133** | **~197-261** | - -Call it **250 monologue lines** as the authoring target. Some will overlap (same observation, different character voice), but most need to be distinct because the two characters *think differently* about what they see. - -The generation pass doesn't work as well for monologue as for dialogue. Dialogue can be expanded with variations on the same sentiment. Monologue needs to feel *specific* — it's the character's private thoughts. Generic expansion will sound hollow. I'd estimate a 2x generation pass on monologue at best, giving us ~500 monologue lines total. That's enough for 2-3 playthroughs per character before noticeable repetition. - -### Q2: Same observation event, different monologue — separate pools or shared? - -**Separate pools. No question.** - -The smuggler and detective don't just say different words about the same thing — they *see* different things. The whole game is built on this. Shared pools with character filters would tempt us toward "same observation, different adjective." That's death for the core mechanic. - -Here's the concrete difference: - -> **Event: NPC enters the back room during off-hours.** -> -> Smuggler pool: -> - "There goes Kael. Right on schedule." -> - "Back room again. He better not be skimming." -> - "Hope he remembered to lock the side door this time." -> -> Detective pool: -> - "Unauthorized access to restricted area. Noted." -> - "That's the second time today. What's in the back room?" -> - "He looked around before going in. People who belong somewhere don't check if they're watched." - -Same event trigger. Completely different interpretation. The smuggler's lines reveal *familiarity* with the criminal activity. The detective's lines reveal *analytical distance.* You cannot get this from a shared pool with a character tag — the entire framing, vocabulary, and emotional register are different. - -**Structure:** Two parallel monologue pools, one per character, keyed to the same observation event triggers. The observation event generator (#239) fires a trigger; the monologue system selects from the appropriate character pool. Tags on each line handle further filtering (location, mood, trust level, prior knowledge). - -**This doubles the monologue writing work, but it IS the game.** If the monologue sounds the same from both characters, we've failed D-027's core success criterion. There is no shortcut here. - -### Mirror Moments - -Paula asked about these in the brief. Here's what they look like from a writing perspective: - -A mirror moment is when the monologue *almost* acknowledges the other character's viewpoint without breaking the fourth wall. The character glimpses the moral complexity of their position. - -> **Smuggler mirror moment** (watching the detective interview a colleague): -> "She's just doing her job. ...Aren't we all." -> -> **Detective mirror moment** (learning that a suspect supports their family through smuggling): -> "Twelve dependents on a cargo handler's salary. The math doesn't work. But the math never does for these people." - -These are rare — 5-8 per character across the whole session. They're the moments where the writing does the thematic heavy lifting. They plant the seed of "what would this look like from the other side?" without ever saying it explicitly. On a second playthrough as the other character, the player remembers these lines and they hit differently. - ---- - -## Layer 8: UI Text & Environmental Content - -### Q1 (with Araminta): What text appears on screen besides dialogue and monologue? - -Here's the full inventory: - -#### Insert/HUD Text -- Time display (diegetic — the character's neural insert showing time) -- POI labels on minimap ("Logistics Hub," "The Rusty Valve," "Sector 7 Maintenance") -- Status indicators ("Signal weak," "Insert interference detected") -- Notification text ("New contact added," "Location discovered") - -#### Environmental Text (diegetic — exists in the game world) -- Door labels and room signs -- Corporate signage (company names, slogans) -- Safety/regulatory notices -- Employee notice boards -- Cargo manifest fragments (readable as investigation tools) -- Terminal screens (login prompts, error messages, data readouts) -- News ticker / unisphere feed headlines -- Graffiti (if the station has a rougher district area) -- Menu/price board at the bar -- Wanted notices or institutional postings - -#### UI Chrome (non-diegetic — game interface) -- Dialogue choice labels (if we have explicit choices, not just proximity-triggered lines) -- Journal/knowledge entries (if #264 makes it into v0.1) -- Tooltip text on interactive objects ("Examine," "Talk," "Read") -- Save/load screen text -- Settings menu labels -- Pause screen text -- Character selection screen text (if any) - -#### Diegetic Tutorial Text (via monologue — D-016) -This isn't separate UI text — it's monologue lines that teach mechanics: -- "I could check my insert for the area layout." (teaches minimap) -- "Better keep my distance if I'm going to follow him." (teaches follow mechanic) -- "That terminal might have shipping records." (teaches examine) -- "Sounds like an argument in the next room. I could get closer to hear." (teaches eavesdrop) - -**Volume estimate for non-dialogue/non-monologue text:** - -| Category | Items | Lines | -|----------|-------|-------| -| Insert/HUD | 10-15 unique strings | 10-15 | -| Environmental — workplace | 15-20 items | 20-30 | -| Environmental — bar | 10-15 items | 15-25 | -| Environmental — ring | 5-10 items | 10-15 | -| Environmental — corridors/shared | 5-10 items | 8-12 | -| UI chrome | 15-20 unique strings | 15-20 | -| News ticker headlines | 10-15 items | 10-15 | -| **Total** | | **~88-132** | - -This is quick writing — short strings, functional language, world-flavored. I can produce the full set in a focused session once I have Miri's setting document for terminology and Araminta's UI spec for constraints (character limits, display format). - ---- - -## Layer 9: Audio Direction - -From a copywriting perspective: **silence is fine for v0.1, but it shifts burden to me.** - -If there's no ambient audio, every sense except sight goes through monologue. The character has to *narrate* the soundscape: - -> "The ventilation system hums. Always that same frequency. I've stopped noticing it." - -> "Footsteps behind me. Two people. Unhurried." - -> "The bar's loud tonight. Good. Harder for anyone to overhear." - -These sound-interpretation monologue lines are already in my budget (the "sound interpretation" category in Layer 7: 16-20 lines). If we add actual audio, some of those lines become redundant — the player *hears* the bar is loud instead of being told. But for v0.1, I'll write as if the monologue is doing all the sensory work. Audio can reduce the monologue load later. - -**My recommendation:** Defer audio content. Let me carry the atmosphere through text. It's cheaper, faster, and we can always add audio on top. What we can't do is add text *quality* retroactively — so invest in the writing now, add sound later. - ---- - -## Cross-Layer Summary: What I Need to Start Writing - -Here's my dependency chain, in order: - -| Step | What I need | Who provides it | Ticket | -|------|-------------|-----------------|--------| -| 1 | Station district setting brief | Miri | #189 | -| 2 | Character arc outlines (smuggler + detective) | Paula | #180, #181 | -| 3 | Dual Lens Authoring Guide | Paula | #261 | -| 4 | Tag taxonomy agreement | Gestalt (confirm or modify my proposal) | #168 | -| 5 | NPC profiles (10-axis + triangle positions) | Paula + Miri | #179, #184-186 | - -**What I can start NOW, before any dependencies resolve:** - -1. **Voice Kit drafts** for smuggler and detective — provisional, based on D-027 descriptions. I'll write three voice options per character and let Paula pick or blend. Gets us moving. -2. **Environmental text templates** — generic diegetic text (safety notices, terminal screens, door labels) that work in any station district. Setting-specific text waits for Miri. -3. **Tag taxonomy proposal** — the table in Layer 4 above. Gestalt validates, we iterate. -4. **Monologue starter set** — 20-30 monologue lines per character covering universal situations (entering a room, being alone, hearing something in fog). These don't depend on specific NPC profiles. - -**What I cannot start without dependencies:** -- Template content packs (#190-192) — need NPC profiles and Dual Lens Guide -- NPC-specific dialogue — need NPC profiles -- Setting-specific environmental text — need Miri's district brief - ---- - -## Proposed New Tickets - -| Title | Priority | Type | Rationale | -|-------|----------|------|-----------| -| Smuggler voice kit | High | Story | Character voice reference for all smuggler dialogue/monologue. Blocks #190-192 content packs. | -| Detective voice kit | High | Story | Character voice reference for all detective dialogue/monologue. Blocks #190-192 content packs. | -| Monologue starter set (universal) | High | Story | 50-60 monologue lines (both characters) for common situations. Unblocked — can begin immediately. | -| Tag taxonomy specification | High | Story | Define the metadata structure for all authored lines. Must precede content packs. Gestalt validates. | -| Environmental text templates (generic) | Medium | Story | Diegetic text items (signs, terminals, notices) that work across location types. | -| News ticker / unisphere content | Medium | Story | 10-15 headline items for ambient world-building. Needs Miri's setting brief. | -| UI microcopy document | Medium | Story | All non-diegetic interface strings. Needs Araminta's UI spec. | -| NPC voice paragraphs (~15 NPCs) | High | Story | Per-NPC voice guides for triangle and entangled NPCs. Needs Paula's profiles. | - ---- - -## One Honest Concern - -The workshop brief says I'm "blocked, waiting on Miri's cultural generation guide." That's true for the *final* content packs. But I've been staring at these decision documents long enough to start building the scaffolding. Voice kits, tag taxonomy, monologue starters, environmental templates — these are all concrete deliverables that move us forward without waiting for the full dependency chain. - -The risk isn't that I'll have nothing to do. The risk is that I'll write 200 lines in a voice that doesn't match the character Paula envisions, or a setting that doesn't match the world Miri builds. That's why the Voice Kit approach works — I write provisional options, we converge, then I scale. Write 20 lines right, throw away 10, then write 500 in the validated voice. - -Three words for the content plan: **scaffold, validate, scale.** - ---- - -*Mellanie out. Give me the voice, and I'll give you the words.* diff --git a/docs/workshops/content-gap-analysis_v0_1/round1-miri.md b/docs/workshops/content-gap-analysis_v0_1/round1-miri.md deleted file mode 100644 index f8b365dc0..000000000 --- a/docs/workshops/content-gap-analysis_v0_1/round1-miri.md +++ /dev/null @@ -1,443 +0,0 @@ -# Round 1 — Miri's Worldbuilding Gap Analysis - -**Agent:** Miri (Worldbuilder & Setting Designer) -**Date:** 2026-02-11 -**Workshop:** v0.1 Content Gap Analysis - ---- - -## Approach - -I'm going through all nine layers of the workshop brief from a worldbuilding perspective. My primary deliverable is the station district setting document (Layer 3), but I have contributions across most layers. I'm checking every proposal against what we've established in Round 14 (setting foundation), Round 16 (factions), and the confirmed decisions. - -Let me be direct about my role here: the content team needs setting context before they can write a single line. Mellanie can't write a bartender's greeting without knowing what the bar looks like and what the bartender's world is like. Paula can't design a relationship web without knowing the social pressures of the district. Araminta can't set a visual tone without knowing the setting's mood. This document fills those gaps. - ---- - -## Layer 1: Art Direction & Visual Identity - -### Setting Context for Visual Identity - -I won't wade into Araminta's territory on style guides and palettes, but the setting has strong visual identity implications that should inform Q-003. - -**What stations look like in the Settled Reach:** - -The Reach's built environments are not uniform. They reflect who built them, when, and for what purpose. - -- **Core system stations:** High institutional presence. Clean lines, managed surfaces. Lattice Commission insignia on regulatory kiosks. Meridian access points glowing in alcoves. The aesthetic is "functional prosperity" -- not gleaming chrome utopia, but competent civic infrastructure that works well enough that nobody thinks about it. Think a well-maintained European transit hub, not a cyberpunk dystopia. - -- **Mid-Reach stations:** Mixed use, mixed age. Older sections built during early settlement with exposed structural elements and retrofit Meridian hookups. Newer sections with institutional standard finishes. The seams between eras are visible -- different wall materials, different ceiling heights, cable runs added after construction. These stations have character because they have *history*. - -- **Frontier stations:** Sparse, improvised, practical. Meridian coverage is spotty. Span gate connections are limited. Structures prioritize function. There's a frontier aesthetic -- things are built to work, repaired rather than replaced, and personalized because there's no institutional standard to enforce. - -**v0.1 implication:** Our station district should read as mid-Reach or transitional core -- established enough to have institutions (the detective needs jurisdictional authority), rough enough to have shadows (the smuggler needs operational space). This gives Araminta a visual framework: not pristine, not derelict. Lived-in. Functional but imperfect. The kind of place where a logistics hub, a bar, and a smuggling ring can all exist in the same district without it feeling implausible. - -**IP note:** Avoid any visual language that reads as "Blade Runner" (rain, neon, noir) or "Star Trek" (antiseptic corridors, uniforms). The Settled Reach's visual identity should be closer to "working infrastructure" -- think the mundane parts of Alien's Nostromo or the lived-in spaces of The Expanse's Ceres. Ordinary. Functional. The extraordinary is in the technology people carry, not the walls around them. - ---- - -## Layer 2: Narrative Framework & Character Design - -### Setting Context for Character Builds - -**Smuggler (Logistics Worker)** - -Setting note -- a smuggler in the Settled Reach is not a Han Solo archetype. The gate network makes interstellar smuggling a matter of *infrastructure manipulation*, not daring piloting. Smuggling means getting contraband past Lattice Commission checkpoints at gate hubs, through freight scanning at span gate terminals, and past Meridian-logged inventory systems. - -A logistics worker is the *perfect* cover because they already have legitimate access to freight handling systems. They know the manifest protocols. They know which cargo containers get scanned and which get waved through. They know the dock schedules. Smuggling in the Reach is a social and bureaucratic crime, not a physical one -- you beat the system by understanding the system better than the people enforcing it. - -**What the smuggler's daily life looks like:** -- Morning: Clock in at the logistics hub. Review the day's manifests. Standard freight processing. -- Shift work: Move containers, verify shipments, coordinate with dock crews. Mundane, physical, routine. -- Cracks in the routine: A contact pings on an off-Meridian channel. A container is flagged for special handling. A dock worker who knows the score gives a particular greeting that means "tonight's load is ready." -- After shift: The bar. Decompress. Maintain social ties. Read the room for who's being watched. - -The smuggler's lattice is standard-issue Baseline. They avoid enhanced lattice precisely because enhanced lattice means enhanced monitoring. Their perception is limited but their *knowledge* is deep -- they know the dock, the people, the rhythms. They navigate by social intelligence, not technological advantage. - -**Detective (Institutional Investigator)** - -Setting note -- "detective" in the Settled Reach means a Lattice Commission field investigator or a Concord Assembly-licensed security operative. This matters: the detective has *institutional backing* but also *institutional constraints*. They can request lattice reads (with cause). They can access Meridian security logs (within jurisdiction). They can query Commission databases (subject to classification). - -But they can't just kick down doors. The Reach's legal framework is real. Jurisdictional boundaries matter. Evidence gathered illegally is inadmissible and gets investigators sanctioned. The detective's daily frustration is the gap between what they suspect and what they can prove within the rules. - -**What the detective's daily life looks like:** -- Morning: Review case file updates on insert. Check for overnight Meridian flags in the district. -- Investigation: Walk the district. Observe. Talk to contacts and informants. Request specific data pulls from Commission systems. -- Institutional overhead: File progress reports. Justify resource expenditures. Navigate the priorities of superiors who care about clearance rates, not justice. -- After shift: The bar -- a different role. Not a colleague unwinding, but an investigator maintaining a social presence, building rapport, looking for tells. Or reviewing notes alone, trying to see the pattern. - -The detective's lattice is Augmented -- institutional issue. Enhanced sensory processing, audio analysis capability, pattern recognition support. The insert overlay shows more data: flagged persons of interest, anomalous manifests, case file annotations pinned to locations. The detective sees the same district through an institutional lens that the smuggler's simpler lattice can't provide. - -**Divergent starting knowledge (#182) -- setting-grounded specifics:** - -| Knowledge domain | Smuggler knows | Detective knows | -|---|---|---| -| Dock operations | Full insider knowledge -- schedules, protocols, which bays are used for what, who works which shift | Official manifests and scheduled arrivals. What's on paper. | -| Criminal network | Names, roles, hierarchy within the ring. Who's reliable, who's sloppy, who's getting nervous. | A case file: "suspected smuggling activity in logistics sector." Sparse intel. | -| Institutional structure | Who the inspectors are, when they visit, which ones are thorough. Practical, defensive knowledge. | Chain of command, jurisdictional authority, access protocols. Operational knowledge. | -| Bar regulars | Drinking buddies, social ties, who to trust. The bar as social haven. | Faces, observed patterns, potential witnesses or informants. The bar as intelligence gathering site. | -| District rhythms | Lived experience -- knows when streets are quiet, which corridors are unmonitored, where the blind spots are. | Patrol schedules, monitored zones, officially mapped infrastructure. | -| Technology | Standard logistics systems, off-Meridian communication (basic Severance techniques), freight handling equipment. | Commission investigative tools, lattice read protocols, Meridian query syntax, surveillance analysis. | - -**Divergent relationships (#183) -- access tier implications:** - -The same NPC responds differently based on who's asking: - -- **Dock workers (smuggling ring):** The smuggler gets insider greetings, warnings, coded updates. The detective gets polite compliance and careful answers. -- **Bar regulars:** The smuggler gets camaraderie, gossip, the real atmosphere. The detective gets friendly-but-guarded small talk from people who've noticed the institutional lattice signature. -- **Station administration:** The smuggler gets bureaucratic indifference. The detective gets professional cooperation and data access. -- **Informants:** The smuggler has contacts in the ring who warn them about pressure. The detective has informants who trade information for favors or immunity. - ---- - -## Layer 3: Station District Setting Document - -### Sova Transit District -- v0.1 Setting Brief - -**Name:** Sova Transit District (Station Sova, Krenn System) - -**Classification:** Mid-Reach logistics hub. Gate-adjacent commercial district. - -**Physical Description:** - -Sova Transit District occupies a wedge of Station Sova between the primary freight span gate terminal and the residential blocks. It's a working district -- cargo handling, warehousing, customs processing, maintenance, and the service economy that grows up around people who work physical jobs: bars, food vendors, repair shops, a small medical clinic. - -The district is roughly 40 years old. The original structure was prefab modular -- standard mid-Reach construction. Since then, it's been modified, extended, patched, and partitioned by successive occupants. The result is a space with layers: clean institutional corridors near the gate terminal transitioning to older, more improvised spaces as you move toward the residential boundary. Ceiling heights vary. Lighting shifts from institutional white near the terminal to warmer, cheaper, more irregular fixtures in the older sections. - -The span gate at the district's edge connects to a planetary freight depot. Most of what flows through Sova Transit is bulk cargo -- agricultural products, manufactured goods, machine parts, biological supplies. Nothing glamorous. The kind of freight that keeps a system running. - -**Economic Engine:** - -Sova's economy is freight. The span gate processes dozens of container transits per day. The logistics hub -- the district's largest employer -- manages scheduling, manifests, container handling, and customs verification. Supporting businesses serve the workforce: the bar, food vendors, a general supply outlet, maintenance services. - -The district is not poor, but it's not prosperous either. Workers earn steady wages. Housing is adequate. The infrastructure works. There's a pervasive sense of economic stability that sits just above the line where people start complaining -- comfortable enough to be complacent, tight enough that an extra income source is tempting. - -This is the economic pressure that feeds smuggling. A logistics worker makes a decent living. A logistics worker who moves a flagged container to the wrong scanner bay makes a *good* living. The risk calculus is tilted by the fact that the Commission's presence here is intermittent -- Sova is mid-priority. Enough oversight to maintain order. Not enough to catch everything. - -**Atmosphere:** - -Sova Transit feels like a place where people *work*. Not dramatically. Not glamorously. The way a port town works -- shifts rotate, cargo moves, people know each other because they've been seeing each other every day for years. There are regulars at the bar. There are shift handoff rituals. There are petty grievances that have been simmering for months. There's gossip. - -The mood is **quotidian-with-undertow**. Surface level: ordinary life proceeding normally. Underneath: the smuggling ring has been operating for long enough that it's become part of the district's unofficial economy. People know, or suspect, or deliberately don't ask. The ring isn't violent. It isn't chaotic. It's a business that runs alongside the legitimate one, and most people have decided that's fine. - -This is the tension the detective walks into: a district that looks normal because the abnormal has been normalized. - -**Recent History:** - -- **3 months ago:** The district's previous Commission liaison was reassigned (routine rotation, nothing suspicious). The replacement is less experienced and less connected to the district's social network. This created a window -- the ring's operations have expanded during the gap in institutional familiarity. -- **6 weeks ago:** A new freight contract brought increased cargo volume through the span gate. More containers means more opportunity to hide contraband. The ring has been busier. -- **2 weeks ago:** The detective was assigned. Their cover story (or open mandate, depending on build) places them in the district to review logistics compliance. Standard operational audit. Nothing exciting. Except the detective's actual brief includes intelligence suggesting smuggling activity. -- **Present:** The district is in an equilibrium that's about to be disrupted. The ring is comfortable but not complacent. The detective is observing but not yet acting. Ordinary life continues. The contamination (D-027) is the storyteller's disruption of this equilibrium. - -**What Makes Sova Interesting:** - -1. **Everyone knows everyone.** The district is small enough that faces are familiar. A stranger stands out. The detective's arrival is noticed. Their institutional lattice signature (detectable by anyone paying attention) marks them as *not from here*. - -2. **The freight rhythm structures daily life.** Span gate transit schedules create predictable waves of activity -- busy periods when cargo moves, quiet periods between. This rhythm is the skeleton of NPC routines and the smuggler's operational calendar. - -3. **The bar is the social heart.** Off-shift, the bar is where information flows. Who's talking to whom, who's drinking alone, who left early -- these are the social signals the player reads. - -4. **Institutional presence is real but thin.** There's a Commission terminal, but it's a kiosk, not a station. Security checks happen at the span gate. Surveillance exists but isn't comprehensive. This gives both the smuggler and the detective room to operate -- the smuggler because oversight has gaps, the detective because they can observe without the infrastructure making it obvious. - -5. **The architecture has secrets.** Forty years of modifications have created spaces that aren't on official layouts -- maintenance corridors repurposed as storage, sealed sections reopened, gaps between wall layers. The smuggling ring uses these. The detective, if observant, can discover them. - -**Environmental Details for Content Teams:** - -- **Signage:** Bilingual in Concordat Standard (institutional) and local script (Krenn System vernacular). Official signs are clean, regulation-formatted. Unofficial signs are hand-lettered, idiosyncratic. -- **News ticker:** A Meridian feed display in the bar and logistics hub lobby. Concord Assembly proceedings (boring), freight market prices (relevant), weather alerts for planetary operations (practical), and occasionally a Commission public notice about regulatory compliance (pointed). -- **Ambient sounds:** Cargo handling machinery. Span gate transit hum (a deep, subsonic vibration felt as much as heard). Ventilation. Foot traffic. The clink of a bar in the evening. -- **Smells (monologue material):** Industrial lubricant near the docks. Recycled air everywhere. Cooking from the food vendors. The particular ozone-and-metal scent that lingers near span gate terminals -- the Interstitium leaving its trace on everything that passes through. -- **Temperature:** Slightly warm near the cargo bays (machinery heat), cooler in the corridors (ventilation), comfortable in the bar (climate-controlled, a small luxury). - -**Cultural Notes:** - -Station Sova is Krenn System -- a mid-Reach system settled roughly 180 years ago. It's old enough to have a distinct local identity but young enough that most residents still think of themselves as part of the broader Reach rather than frontier separatists. The local culture is working-class pragmatic. People value reliability, competence, and minding your own business. They're not hostile to institutions, but they're not deferential either. The Concord Assembly is a distant government. The Commission is a practical reality. The Syndics are the entities you actually deal with -- Sova's freight operations run through a Syndic logistics consortium. - -Religion and philosophy are private matters. The Unbound are a known quantity -- a few district residents are Unbound by choice, mostly older workers who came from frontier backgrounds. Nobody makes a fuss about it. The Guardians (Severance) are rumored to operate in the system but are not a visible presence in the district. - -**Naming conventions (Krenn System):** - -Names in the Krenn System tend toward compact, consonant-heavy constructions. First names: Kael, Voss, Drin, Lera, Torek, Maret. Family names (used formally): Davan, Korr, Sessik, Lintar. Workers often go by first name or nickname on shift. The detective will be addressed by title or full name until trust is established. - -*IP note: These names are constructed to feel plausibly human-future without mapping to any existing franchise's naming conventions. They are NOT Commonwealth names (Ozzie, Nigel, Mellanie -- those are conspicuously contemporary English names, which is Hamilton's trademark). Our names suggest cultural drift over centuries of interstellar settlement.* - ---- - -## Layer 4: Content Pipeline & Authoring Format - -### Setting-Relevant Tag Taxonomy - -Gestalt is the lead on the authoring format, but I can contribute the setting-relevant tag dimensions that should exist in the tag taxonomy: - -**Setting-grounded tags for line pools:** - -| Tag dimension | Values for v0.1 | Setting justification | -|---|---|---| -| `lattice_tier` | baseline, augmented | Determines what the character can perceive and access. Smuggler = baseline, detective = augmented. | -| `shift_phase` | on_shift, off_shift, transition | Freight rhythm structures social norms. On-shift dialogue is professional; off-shift is personal. | -| `district_familiarity` | local, newcomer | The detective is new. NPCs respond to that. "Haven't seen you around" vs "the usual?" | -| `institutional_context` | civilian, commission, syndic | NPCs adjust register based on perceived institutional affiliation. | - -These tags complement the access tiers (D-028 Layer 1) by grounding them in setting logic. An NPC doesn't filter dialogue because of an abstract "trust level" -- they filter because they've noticed the institutional lattice signature, or because they've never seen this person on a shift rotation, or because the district's social code says you don't talk about certain things when Commission personnel are around. - ---- - -## Layer 5: Template Content (3 Social Sites) - -### Setting Context for Templates - -**Workplace -- Logistics Hub ("The Terminal")** - -The logistics hub is the district's economic center. A large open space partitioned into operational zones: manifest processing, container staging, span gate prep, administrative offices, crew locker area. - -Setting details: -- **Manifest processing:** Terminals where workers verify cargo contents against Meridian-logged manifests. This is where the smuggling happens -- mismatched containers, doctored manifests, containers routed to the wrong scanner. -- **Container staging:** The physical workspace. Heavy containers moved by small grav-lifts. Noisy, active during shift hours. Workers communicate in a mix of voice and short Meridian pings. -- **Administrative offices:** The supervisor's domain. Official records, shift schedules, performance reviews. The smuggling ring's vulnerability -- if the supervisor is compromised, the ring has institutional cover. If the supervisor is clean, the ring has to work around them. -- **Break room / lockers:** The social space within the workplace. Where off-the-record conversations happen. Where shifts overlap and gossip flows. - -Triangle opportunities: -- Supervisor vs. senior worker (authority tension, possible complicity) -- Two workers competing for a promotion (mundane triangle, personal stakes) -- Worker who suspects the ring vs. worker who's in the ring (knowledge asymmetry within the NPC population) - -**Social Venue -- Bar ("The Last Shift")** - -A mid-grade bar in the district's older section. Not upscale, not a dive. The kind of place where working people go after shift. Good enough that regulars are loyal, plain enough that nobody puts on airs. - -Setting details: -- **Interior:** A long bar, scattered tables, a corner booth that's semi-private (key location for discreet conversations -- the player can observe who uses it). Background Meridian music feed. A news ticker display that nobody watches except when something local comes up. -- **Bartender:** A fixture. Knows everyone. Listens more than talks. Observes. The bartender is a potential information source for both characters, but for different reasons -- the smuggler trusts them as a social contact; the detective recognizes them as someone who sees everything. -- **Clientele:** Logistics workers (the largest group), a few station maintenance crew, occasional visitors from other districts, the detective (who becomes a regular by design or necessity). -- **Rhythms:** Quiet during day shifts. Filling up as evening shift ends. Peak in the evening. Late-night regulars are a different crowd -- the ones who don't want to go home, or who are waiting for something. - -Triangle opportunities: -- Two regulars with a personal dispute that predates the game (mundane, rich for player observation) -- Bartender caught between regulars they like and a regular they suspect (loyalty vs. honesty) -- Cross-template: a bar regular who also works at the logistics hub, carrying social dynamics between both spaces - -**Criminal Template -- Smuggling Ring ("The Arrangement")** - -Not a cartel. Not organized crime in the dramatic sense. The Arrangement is an informal network of logistics workers who use their freight access to move contraband -- restricted biologicals, unlicensed lattice components, Severance tech, off-Meridian communication devices, occasionally items with no clear origin (Gyre salvage? Institute-classified materials? Nobody asks). - -Setting details: -- **Structure:** Flat hierarchy. One coordinator (off-station, communicates through dead drops and off-Meridian channels). A handful of dock workers who handle the physical cargo. One or two contacts outside the district who arrange receiving. The smuggler player character is mid-level -- experienced enough to be trusted with operations, not senior enough to know the full network. -- **Operations:** Contraband arrives in standard freight containers with doctored manifests. Workers route these containers to scanning bays with known blind spots, or to storage areas where they can be opened and repacked. Timing is critical -- operations happen during specific shift transitions when oversight is thinnest. -- **Security:** The ring's primary defense is normalcy. Nobody does anything dramatic. No late-night break-ins. No suspicious meetings in dark corridors. Everything happens within the flow of legitimate work. If a container is flagged, it's rescheduled. If someone is watched, they go quiet. Patience is the ring's greatest asset. -- **Vulnerability:** The ring has been operating for about two years -- long enough that some participants have become careless. A few workers have been spending beyond their visible income. Social ties within the ring are strong enough that personal conflicts (romantic entanglement, debt, jealousy) could compromise operational security. - -Triangle opportunities: -- Ring member whose loyalty is wavering vs. ring member who's all-in (pressure under investigation) -- Ring coordinator (remote) whose demands are escalating vs. local workers who want to keep things small (ambition vs. safety) -- Cross-template: ring member who's a bar regular, whose off-shift behavior is observable by the detective - ---- - -## Layer 6: NPC Profiles & Dialogue - -### Setting-Grounded NPC Context - -The 10-axis model (D-024) is an ECS schema. What it needs from worldbuilding is the *cultural substrate* that makes those axes feel grounded in Sova Transit District rather than generic. - -**What "ordinary life" feels like for an NPC in Sova:** - -- You have a job. It pays. It's not exciting. You've been doing some version of it for years. -- You have a lattice (unless you're Unbound). It connects you to the Meridian. You use it the way people use phones -- constantly, casually, unreflectively. You check freight schedules, message friends, look up recipes, watch entertainment feeds, read news you mostly don't care about. -- You know your neighbors. You know the regulars at the bar. You have opinions about the supervisor. You have a thing with someone, or you had a thing with someone, or you're trying to have a thing with someone. -- You are aware of the Commission the way people are aware of the tax authority -- it exists, it has power, you'd prefer not to attract its attention, but you're not living in fear. -- You don't think about the Founders or the Builders or the Interstitium. Gate transit is a commute. The span gate hum is background noise. The existential questions of the Reach are academic. Your questions are: will I make rent, is Kael seeing someone, why did the supervisor change the shift rotation. - -This is the substrate that D-029's 30% flat NPCs embody. They are *genuinely ordinary*. Their ordinariness is not a disguise. It is the reality that makes the smuggling ring's deception meaningful and the detective's investigation consequential. - -**Cultural tells that NPCs exhibit:** - -These are setting-specific behavioral markers that can feed into the tell system (#90): - -| Cultural tell | What it signals | Setting basis | -|---|---|---| -| Checking their lattice overlay frequently | Nervous, expecting a message, monitoring something | Meridian-connected behavior, universal | -| Avoiding eye contact with Commission-tagged individuals | Awareness of institutional surveillance, possibly hiding something | Social response to authority, especially in districts with thin Commission presence | -| Using off-Meridian communication (physical notes, verbal codes, dead-drop patterns) | Connected to Severance networks, smuggling operations, or extremely private | Severance counter-surveillance culture filtering into criminal methodology | -| Spending patterns visible through lifestyle | Income doesn't match visible employment | Observable consequences of illicit income | -| Shift timing irregularities | Arriving early, staying late, taking breaks at non-standard times | Freight-rhythm deviation -- meaningful in a schedule-driven workplace | -| Social avoidance of specific individuals | Relationship tension, secret, fear of exposure | Triangle dynamics manifesting as observable behavior | - -**NPC naming for v0.1 -- a starter set:** - -For Mellanie and Paula to begin writing, they need names. These are setting-consistent for Krenn System: - -| Name | Role suggestion | Notes | -|---|---|---| -| Kael Davan | Dock worker, smuggling ring member | The smuggler's closest colleague and the detective's early person of interest | -| Voss | Logistics hub supervisor | Clean or compromised? Either works for v0.1 | -| Lera Sessik | Bartender at The Last Shift | Social hub, observes everything, talks carefully | -| Torek Lintar | Senior dock worker, ring member, getting sloppy | Visible spending, behavioral tells, vulnerability | -| Drin | Station maintenance, bar regular, not ring-connected | Mundane triangle participant, salt-of-the-earth | -| Maret Korr | Freight scheduler, ring-adjacent (knows but isn't active) | The moral gray zone -- aware, complicit by silence, conflicted | - -These are suggestions, not mandates. Paula and Mellanie should adapt freely. The naming convention (compact, consonant-heavy, first-name-primary in social contexts) is the consistency requirement. - ---- - -## Layer 7: Monologue & Observation Text - -### Setting Context for Character Voice - -The monologue is the most important content system for proving the setting works in gameplay. It's where the player *hears* the setting through their character's perspective. - -**Smuggler voice -- setting notes:** - -The smuggler's monologue should reflect someone embedded in Sova's social fabric. They think in terms of relationships, routines, and risk management. Their observations are practical and socially attuned. - -- **Register:** Colloquial, direct, occasionally sardonic. They don't use institutional vocabulary. They don't think in Commission categories. When they see a cargo container, they think about who shipped it and what might be in it, not about regulatory compliance. -- **Knowledge flavor:** The smuggler notices things a logistics worker would notice. Manifest inconsistencies. Dock schedule changes. Which scanner bays are running and which are down for maintenance. These are mundane observations that carry hidden significance. -- **Emotional baseline:** Watchful comfort. This is the smuggler's territory. They're at ease here, but never fully relaxed -- the awareness that one mistake could unravel everything is always present, like a low hum. - -Example monologue seeds (not final lines, but tone/content direction for Mellanie): -- Seeing a colleague arrive late: *observation + social reading + implicit risk assessment* -- Noticing the detective in the district: *wariness + social evaluation + threat assessment without acknowledging why they're a threat* -- Routine cargo handling: *competence + casual familiarity + the practiced not-looking at flagged containers* - -**Detective voice -- setting notes:** - -The detective's monologue should reflect trained analytical habits filtered through institutional perspective. They think in terms of evidence, patterns, and procedure. Their observations are systematic but tinged with the frustration of working within constraints. - -- **Register:** More formal internally than the smuggler. Professional vocabulary. Commission frameworks for categorizing observations. But not robotic -- the detective is a person, not an institution, and their private thoughts include doubt, irritation, and occasional dark humor. -- **Knowledge flavor:** The detective notices things an investigator would notice. Behavioral patterns. Access anomalies. Infrastructure gaps. When they see a cargo container, they think about chain of custody, scanning records, and whether the manifest matches the shipping code. -- **Emotional baseline:** Alert curiosity with institutional weariness. They're doing a job. They believe in the job. But they've been doing it long enough to know that the job doesn't always produce justice, and that their institution is imperfect. - -**Setting-specific monologue triggers Mellanie should consider:** - -| Trigger | Smuggler response flavor | Detective response flavor | -|---|---|---| -| Span gate transit hum changes pitch | "Gate's busy today. Good cover." | "Increased freight volume. Worth checking manifests." | -| Unfamiliar person in the district | "Who's that? Not from any shift I know." | "New face. No district resident tag on file. Note for follow-up." | -| News ticker mentions Commission activity elsewhere | "Good. They're busy somewhere else." | "Regional enforcement stretched thin. Explains the understaffing here." | -| NPC seems nervous | "Something's wrong with Torek. He's been jumpy all week." | "Subject displays stress indicators. Possible concealment behavior." | -| Bar is unusually quiet | "Where is everyone? Something happen on late shift?" | "Reduced foot traffic. Correlated with any scheduled operations?" | - ---- - -## Layer 8: UI Text & Environmental Content - -### Setting-Grounded Diegetic Content - -The neural lattice overlay (the insert, per D-013) is the player's interface. Everything the player sees on their HUD exists within the fiction as lattice-projected information. This constrains and enriches what appears on screen. - -**What the lattice displays (both characters):** - -- **Time:** Krenn System standard time. The lattice displays it in the corner of visual awareness -- the way you see a clock on a phone without looking directly at it. -- **Navigation:** Known locations appear as waypoints in the overlay. Fuzzy for general areas, precise for visited locations. -- **Notifications:** Meridian messages, institutional alerts, personal pings. The smuggler gets fewer institutional notifications; the detective gets more. -- **Identity tags:** When looking at a person, the lattice can display publicly available data -- name (if in your contact list or public record), employer (if publicly listed), lattice tier (detectable by proximity scan). The *absence* of this data is itself information -- someone with a masked or spoofed lattice signature stands out. - -**What the detective's augmented lattice adds:** - -- Case file annotations pinned to locations and persons of interest -- Commission database query results displayed in overlay -- Enhanced audio analysis readouts (sound direction, voice pattern matching) -- Surveillance zone boundaries (where Commission monitoring is active) - -**Environmental text for Mellanie and Araminta:** - -| Text type | Examples | Setting notes | -|---|---|---| -| Official signage | "Span Gate Terminal C -- Authorized Freight Only," "Lattice Commission -- Report Irregularities," "Emergency Re-embodiment: Deck 7 Med Center" | Institutional, bilingual (Concordat Standard + Krenn vernacular), regulation-formatted | -| Informal signage | "Lera's -- Cold Drinks, Hot Food, No Questions" (the bar), shift schedule boards, hand-lettered notices about lost items or shift swaps | Personality-rich, district-specific, the human layer over institutional structure | -| Terminal screens | Freight manifest summaries, Meridian news feeds, Commission public notices | Functional, data-dense, the kind of information that's everywhere and mostly ignored | -| Meridian news ticker | "Concord Assembly approves Krenn System infrastructure allocation," "Span gate maintenance: Terminal B offline 0200-0400," "Commission advisory: verify lattice firmware before next imprint cycle" | Background texture, occasionally plot-relevant (the detective might notice a news item the smuggler ignores) | - -**Onboarding through monologue (D-016 diegetic tutorial):** - -Setting note -- the lattice IS the tutorial system. The character's lattice overlay highlights interactive elements naturally. The character's internal monologue provides context naturally. "That terminal might have access logs" is the detective's trained instinct, not a tutorial prompt. "Better check in with Kael before shift" is the smuggler's social awareness, not a quest marker. - -The setting makes diegetic onboarding not just possible but *inevitable*. These characters live in this world. They think about it. Their thoughts are the tutorial. - ---- - -## Layer 9: Audio Direction - -### Setting-Grounded Sound Identity - -I won't prescribe audio design, but the setting has sonic character that should inform whatever direction we take: - -**Sova Transit District soundscape:** - -- **The span gate hum:** A persistent, low-frequency vibration that defines the district's acoustic identity. Everyone who lives here has learned to ignore it. But it's *always there*. When it stops (maintenance, emergency shutdown), the silence is unsettling. This is the district's heartbeat. - -- **Freight operations:** Grav-lift motors, container locks engaging, manifest scanners pinging, dock crew calling to each other. Industrial but not deafening -- modern equipment is efficient. The sound of work happening. - -- **Social spaces:** The bar has its own acoustic character -- conversation, glass on surfaces, a Meridian music feed that nobody chose and nobody changes. The logistics hub break room is quieter -- murmured conversations, locker doors. - -- **Lattice sounds:** A lattice notification is a sound only the recipient hears -- it's internally generated. For gameplay, this means the player hears their own notifications (monologue, messages, alerts) but NPC lattice sounds are silent to the player. An NPC checking their lattice is a *visual* tell, not an auditory one. - -**v0.1 audio recommendation from setting perspective:** - -The span gate hum alone would do more for atmosphere than any amount of generic ambient music. If we implement one sound for v0.1, it should be this -- a constant, low rumble that the player eventually stops noticing, until it changes, and then the *absence* or *change* in that sound becomes information. This supports the three-range model (D-018) naturally: the hum is the acoustic baseline that other sounds are measured against. - ---- - -## Setting Gaps & Risks - -### What's Still Missing from the Setting for v0.1 - -1. **Contraband specifics.** What is the ring actually smuggling? This matters for narrative weight. Suggestions: - - **Unlicensed lattice components** -- aftermarket mods that bypass Commission regulation. Not dangerous, but illegal. The moral question: people want better lattice access than they can afford through official channels. Is that wrong? - - **Severance tech** -- counter-surveillance tools. The ring doesn't care about ideology; they move product. But the product has political implications. - - **Off-manifest biologicals** -- medical supplies, growth cultures, possibly re-embodiment materials diverted from Syndic supply chains. The gray market exists because Syndic pricing makes legitimate access prohibitive for working-class citizens. - - Recommend: a mix, with unlicensed lattice components as the primary cargo. This creates moral ambiguity -- the smuggler isn't moving weapons or drugs. They're moving *access*. The detective's investigation targets an operation that, from a certain angle, is a public service. - -2. **The detective's institutional chain of command.** Who assigned them? What's the stated mandate? What are the political pressures on the investigation? This needs to be defined before Paula designs the detective's narrative arc. - -3. **Off-station connections.** The smuggling ring has contacts outside Sova Transit District. Who are they? We don't need to build them for v0.1, but we need enough detail that NPC dialogue can reference them consistently. Suggestion: the ring's coordinator is on-station but in a different district, communicating through dead drops and off-Meridian channels. External contacts are Syndic-adjacent freight handlers at the other end of the span gate route. - -4. **The Meridian's local flavor.** What does the Meridian "feel like" in this district? Fast, reliable connection? Intermittent coverage with dead spots? The level of Meridian infrastructure affects everything from NPC behavior to the detective's investigative capability. Suggestion: solid coverage in the logistics hub and bar (institutional areas), degraded coverage in the older district sections (natural dead spots that the ring exploits, that Severance may have expanded). - -### IP Originality Checklist - -Let me check the v0.1 content against our guardrails: - -| Element | Risk assessment | -|---|---| -| Station district setting | **Clear.** Generic enough to be original. No specific franchise owns "space station logistics district." | -| Smuggling ring premise | **Clear.** Smuggling as logistics manipulation rather than daring raids is original enough. Distinct from Star Wars (romantic), The Expanse (violent), or Hamilton (political). | -| Detective as institutional investigator | **Clear.** Commission investigator is setting-specific. Not a cop, not a Blade Runner, not a bounty hunter. | -| Span gate as infrastructure | **Clear.** Our dual-tier gate system is established as original (Round 14 audit). | -| Lattice/Meridian as daily technology | **Clear.** Original terminology, distinct from Hamilton's inserts/unisphere. | -| "The Last Shift" as bar name | **Clear.** Evocative of working-class setting, not franchise-specific. | -| Krenn System naming conventions | **Clear.** Constructed specifically to avoid franchise mapping. | - -No IP concerns flagged for the v0.1 station district content. - ---- - -## Summary: What Content Teams Need from Worldbuilding - -| Recipient | What I've provided | What's still needed | -|---|---|---| -| **Mellanie** | District atmosphere, NPC naming conventions, character voice notes, monologue trigger examples, environmental text examples | Full NPC cultural profiles once Paula defines the relationship web | -| **Paula** | Smuggler and detective daily life descriptions, institutional context, triangle opportunities per template, setting-grounded access tier logic | Review of whether the detective's institutional framework supports the narrative arc she's designing | -| **Araminta** | Visual identity notes (mid-Reach, lived-in, functional), environmental detail descriptions, signage language | Confirmation that the visual tone aligns with what she's proposing for Q-003 | -| **Gestalt** | Setting-grounded tag taxonomy additions, cultural tell catalog for tell system | Validation that the setting tags integrate cleanly with the line pool format | -| **Ozzie** | The span gate hum as signature atmospheric element, the "stranger stands out" social dynamic | Feedback on whether the district atmosphere creates the "first 30 seconds of presence" he's looking for | - ---- - -## Recommendation for Cultural Generation Guide (#189) - -This workshop output should feed directly into the cultural generation guide I'm assigned to write. The Sova Transit District brief above is the first instance -- a concrete example of what the guide will generalize. The guide needs to cover: - -1. How to adapt the setting's general principles to specific district types -2. Naming conventions by system origin -3. Daily life rhythms by economic base (freight, service, institutional, frontier) -4. Cultural attitudes toward lattice, Commission, and institutional authority by district character -5. Environmental detail templates (sounds, signs, smells, architectural character) - -The Sova brief is the v0.1 slice. The cultural generation guide is the tool for scaling beyond v0.1. - ---- - -*Setting note -- I'm satisfied that the v0.1 district is grounded in our established worldbuilding, original in its surface details, and rich enough to support the content teams' work. The Settled Reach's ordinary life needs to feel genuinely lived-in before the conspiracies have any weight. Sova Transit District is designed to be exactly that: ordinary enough to be real, textured enough to be interesting, and structured enough that the smuggler and detective experience it as fundamentally different places.* - -*Miri out.* diff --git a/docs/workshops/content-gap-analysis_v0_1/round1-ozzie.md b/docs/workshops/content-gap-analysis_v0_1/round1-ozzie.md deleted file mode 100644 index e2ad1bc5e..000000000 --- a/docs/workshops/content-gap-analysis_v0_1/round1-ozzie.md +++ /dev/null @@ -1,267 +0,0 @@ -# Round 1: Ozzie — Player Experience & Wow Factor -## v0.1 Content Gap Analysis Workshop - ---- - -## My Approach - -Same as last time. I'm reading each layer and asking: **does this make someone FEEL something?** Content isn't lines in a file. Content is the moment a player stops thinking about the game and starts thinking about the WORLD. I'm going through all 9 layers and answering the questions directed at me, but I'm also flagging anything that smells emotionally flat. - ---- - -## Layer 1: Art Direction & Visual Identity - -### Q: Does the vertical slice need visual mood, or is "readable placeholder" sufficient to prove the concept? - -**It needs mood. Not polish — MOOD.** - -Here's the thing. D-016 says "atmosphere carried by monologue." That's true. The monologue is our primary atmosphere engine. But the monologue doesn't fire until the player is ALREADY in the world. There's a gap — however small — between "I see the screen" and "the first monologue line plays." In that gap, the player forms their first impression from VISUALS ALONE. - -If that first impression is "this looks like a spreadsheet," the monologue has to fight upstream. It has to OVERCOME a first impression instead of REINFORCING one. - -So here's what I'm asking for — and it's not much: - -1. **A constrained color palette that says "space station."** Not beautiful — FUNCTIONAL but atmospheric. Think: muted blues and grays for corridors, warm amber for the bar, cold fluorescent white for the logistics hub. Three palettes, three moods. Even with box-art placeholders, color does 80% of the atmosphere work. - -2. **Lighting variation between locations.** The bar is dim. The workplace is bright. The smuggling ring meeting spot is dark except for one harsh light. This isn't art — it's tinting. It can be done with placeholder boxes if the boxes are the RIGHT COLOR. - -3. **One signature visual element.** Something the player sees in the first 5 seconds that says "this is a space station, not a warehouse." A viewport showing stars. A holographic sign. A wormhole gate visible in the distance. ONE thing. That's the visual hook while the monologue spools up. - -**My answer: "readable placeholder" is NOT sufficient. "Readable placeholder WITH a color palette and one signature element" IS sufficient.** The gap between those two is maybe 2-3 days of Araminta's time and it's the difference between "this is a prototype" and "this is a WORLD I'm stepping into." - -D-014 says "functional boxes with labels." Fine. But those boxes should be tinted correctly and that one signature element should exist. That's my line. - ---- - -## Layer 2: Narrative Framework & Character Design - -No questions directly at me, but I'm weighing in anyway because this is where the emotional foundation gets laid. - -The Dual Lens Guide (#261) is the most important pre-content document in the entire project. I said this in the last workshop and I'll say it again: **the smuggler and detective must have fundamentally different EMOTIONAL RELATIONSHIPS to the same world.** Not just different access tiers. Different FEELINGS. - -The smuggler walks into the logistics hub and feels... what? Boredom? Comfort? Low-level anxiety about their side gig? The detective walks in and feels... suspicion? Professional focus? The excitement of being undercover in a new environment? - -The Dual Lens Guide needs to define these emotional registers. Not just "who knows what" — "who FEELS what, about the same things." - -**One specific ask for Paula:** The guide should include 3-5 "emotional divergence moments" — specific situations where the two characters would have opposite emotional reactions. Examples: -- Seeing a cargo manifest (smuggler: routine / detective: evidence) -- An NPC being friendly (smuggler: genuine warmth / detective: "is this person a target or an asset?") -- A door that's usually locked being open (smuggler: "huh, that's weird" / detective: "THAT'S MY IN") - -These divergence moments are what Mellanie needs to write voice-consistent monologue. They're the emotional atoms of the dual-lens system. - ---- - -## Layer 3: Station District Setting - -### Q: What environmental details make a player feel present in the first 30 seconds? - -**Five things. That's all you need. Five things and you're THERE.** - -1. **Sound first.** Before you even process the visuals, you should hear the station. A low hum. Distant chatter. The hiss of an airlock cycling somewhere. I know audio is Layer 9 and deferred — I'll fight about that there. But if we HAVE audio, it should land before the first monologue line. - -2. **Movement.** NPCs should already be moving when the game starts. Not standing in their spawn positions waiting for the player. You walk out of your hab unit and there's someone walking past. Going somewhere. Living their life. The world was here BEFORE you pressed play. That's the single most important presence signal. - -3. **The news ticker.** Miri, Paula — put a news ticker or announcement board in the player's starting location. Not a lore dump. Three lines. "Dock 7 maintenance: scheduled closure 14:00-18:00." "Community social: bar district, Thursday evening." "Security reminder: report unregistered cargo to station management." Those three lines tell you: there are docks, there's a community, there's security, and someone's worried about unregistered cargo. THAT'S worldbuilding in 30 words. And for the smuggler, that last line hits DIFFERENT. - -4. **Something out the window.** I said it in Layer 1 and I'll say it again. The player needs to see that they're IN SPACE. On a STATION. A viewport, a transparent section of floor over a docking bay, a holographic display showing the local system. One visual anchor that says "you are very far from home and this metal tube is keeping you alive." Scale creates awe. Awe creates presence. - -5. **A named NPC within 10 seconds.** Not a tutorial guide. Just someone your character KNOWS. They walk past, and your monologue says their name. "There goes Tomas. Early shift again." Suddenly you're a person who KNOWS PEOPLE. You're not a camera floating through a level. You're someone with a LIFE here. - -**That's the recipe: sound + movement + environmental text + spatial context + a named face.** If Miri's station district document establishes these five elements, the setting will feel present regardless of art quality. - ---- - -## Layer 4: Content Pipeline & Authoring Format - -No questions directed at me, but I care about one thing here: **the line previewer (#193).** - -The line previewer isn't just a QA tool. It's how we test whether content FEELS right. Can the smuggler's monologue play in sequence and sound like a person thinking? Does the detective's voice feel distinct? Do the NPC voice kits sound like different people? - -I can't gut-check content I can't experience. Nobody can. The previewer needs to exist before the content packs are "done," or we'll ship content that reads well in a YAML file and sounds dead in the game. - -**My ask to Gestalt:** When you define the line pool format, include a "preview sequence" tag or mechanism. Something that lets you say "play these 5 lines in order as if the character just walked into the bar." That's how Mellanie tests her work, and it's how I evaluate the emotional delivery. - ---- - -## Layer 5: Template Content (3 Social Sites) - -No questions directly at me but I'm going to SCREAM about something. - -D-029 says 30/50/20 entanglement split. ~15 NPCs. That means: -- ~4-5 truly flat NPCs (routine + greeting only) -- ~7-8 mundane triangle NPCs (social drama, no conspiracy) -- ~3 entangled with intrigue - -Here's what keeps me up at night: **those 4-5 flat NPCs need to NOT feel flat.** The player doesn't know who's entangled. The moment a player can look at an NPC and think "oh, that one's just background decoration" — the investigation collapses. Every NPC needs to SEEM like they could matter. The flat ones just... turn out not to. - -What makes a flat NPC feel non-flat: -- A name and a visible routine (they go PLACES) -- One memorable trait (always eating, always late, always complaining about the same thing) -- One line that SOUNDS like it could be important but isn't ("I swear the cargo schedules are getting weirder" — nope, they're just bad at their job) - -Mellanie — those flat NPC voice kits are LOAD-BEARING for the investigation mechanic. They're the noise floor. If the noise is obviously noise, the signal is too easy to find. - ---- - -## Layer 6: NPC Profiles & Dialogue - -### Q: Which NPC should the player remember after 30 minutes? What makes them memorable — a line, a routine, a contradiction? - -**A contradiction. Every time, it's the contradiction.** - -Here's the NPC I want the player to remember. Let's call them THE FRIEND. - -THE FRIEND is the NPC your character has the strongest pre-existing relationship with. For the smuggler, it's a work buddy — someone you share shifts with, someone you eat lunch with, someone who covers for you when you're late. For the detective, it's a contact — someone who feeds you information, someone you trust, someone who stuck their neck out for you once. - -THE FRIEND is memorable because of a CONTRADICTION the player discovers through observation: - -- The smuggler's work buddy is kind, reliable, always has your back. But you catch them one evening in a part of the station they have no reason to be in. Your monologue: "What's Jax doing near the restricted docks?" You can ask them about it. They deflect. THEY LIE TO YOU. And now every warm interaction is CONTAMINATED with doubt. - -- The detective's contact gives you solid intel. Reliable. Professional. But you notice they always have an excuse to leave when a certain other NPC shows up. Your monologue: "That's the third time Ana's left when Riks walked in." What's the connection? Is your contact avoiding someone? WHY? - -**What makes THE FRIEND memorable is not a great line or an interesting routine — it's the SHIFT.** They start as background comfort. Then ONE observation changes everything. Now they're a mystery wrapped in a relationship. The player can't stop thinking about them because the player LIKED them and now doesn't know if they should. - -**This is why D-027's success criterion #3 is genius: "player names an NPC they felt conflicted about."** THE FRIEND is the NPC designed to deliver that criterion. One per character. Authored specifically for this purpose. - -**My recommendations for Paula and Mellanie:** -1. Each character needs ONE clear "friend" NPC designed for emotional contradiction -2. THE FRIEND must be present in the first 10 minutes — relationship established EARLY -3. THE FRIEND's contradiction must be discoverable through OBSERVATION, not told through dialogue -4. The contradiction should activate during or shortly after contamination — it's the emotional bridge between daily-life and investigation - -For the remaining NPCs: one memorable thing each is enough. The bartender who remembers everyone's order. The security guard who's always reading something on their insert. The maintenance worker who hums. Small, human details. Not every NPC needs to be a mystery. Most should be PEOPLE. That's what makes the mysteries stand out. - ---- - -## Layer 7: Monologue & Observation Text - -### Q: When does the first monologue surprise the player? What's the moment where they think "wait, my character noticed something I didn't"? - -**It happens the first time the character has an OPINION the player doesn't share yet.** - -Here's the sequence: - -1. The player walks into the bar. They see NPCs sitting around. Some talking, some alone. It's just... a bar. - -2. The monologue fires: "Riks is at his usual table. But he's not drinking. He's watching the door." - -3. The player thinks: "I didn't notice that. My character KNOWS this person well enough to know that not-drinking-and-watching-the-door is unusual." - -4. NOW the player looks at Riks differently. They didn't decide to investigate Riks. The CHARACTER flagged Riks. The monologue created attention. - -THAT'S the surprise. The character is a better observer than the player. The character has context the player doesn't. The monologue bridges that gap — and in doing so, it makes the player feel like they're WEARING someone else's eyes. - -For the **smuggler**, the first surprise should be social instinct: "Kira's being extra friendly to the new dock supervisor. She wants something." The smuggler reads social dynamics like a trader reads prices. The player didn't see manipulation — the CHARACTER did. - -For the **detective**, the first surprise should be professional pattern-matching: "Three people at adjacent tables, none of them talking to each other, all arrived within two minutes. That's not a coincidence." The detective sees formations. Tactical arrangements. The player saw people sitting at a bar. - -**When should this happen?** Within the first 15 minutes. Before contamination. During the DAILY LIFE phase. Because the surprise isn't about the conspiracy — it's about discovering that your character is a PERSON with perceptions and biases and skills the player doesn't have. The conspiracy amplifies this. The daily life INTRODUCES it. - -**Content implications for Mellanie:** -- Each character needs 10-15 "observational insight" monologue lines for the pre-contamination phase -- These lines should reference SPECIFIC NPCs and their known patterns -- The insights should be CORRECT — the character's observations should check out if the player investigates -- Occasionally, the character should be WRONG — confident assessment, incorrect conclusion. "She's probably just tired." (She wasn't tired.) - -**The monologue surprise is the game's SIGNATURE MECHANIC in content form.** It's not infrastructure. It's not a pipeline question. It's Mellanie writing lines that make the player feel like someone else is thinking through their eyes. If we get this right, it doesn't matter that the art is placeholder. If we get this wrong, no amount of polish saves us. - ---- - -## Layer 8: UI Text & Environmental Content - -No questions directly at me, but I want to reinforce something from my Layer 3 response. - -**The news ticker / announcement board is the cheapest wow-per-word content in the entire game.** - -A news ticker running in the bar or the workplace that updates throughout the day is: -- Worldbuilding (what's happening on this station?) -- Atmosphere (is this a happy place? A tense place?) -- Foreshadowing (a headline that seems mundane but connects to the conspiracy) -- Character divergence (the smuggler reads "increased cargo inspections" and sweats; the detective reads it and thinks "about time") - -For v0.1, we need maybe 20-30 ticker lines. Rotating. Some mundane ("Stellar weather: nominal"), some social ("Community garden expansion approved"), some loaded ("Security advisory: unscheduled vessel departures under review"). That's an afternoon of Mellanie's time and it makes the station feel ALIVE every second it's on screen. - -**The diegetic insert (D-013) needs flavor text too.** When you check your neural implant map, the POI labels shouldn't just say "Bar" and "Workplace." They should say what your CHARACTER would label them. The smuggler's insert says "The Rusty Airlock" (the bar's name, they're a regular). The detective's insert says "Licensed establishment — district 7" (official designation, they just transferred here). SAME PLACE. Different label. Different character. That's asymmetric information in the UI layer and it costs NOTHING. - ---- - -## Layer 9: Audio Direction - -### Q: Does placeholder audio kill the atmosphere, or is silence acceptable for a concept proof? - -**Silence is DEATH.** - -I know that sounds dramatic. Hear me out — no pun intended. - -Top-down view. Placeholder art. Small sprites moving around a tiled map. Without audio, this is a BOARDGAME. A pretty one, maybe. But a boardgame. The monologue is TEXT. The dialogue is TEXT. The fog of perception is a visual effect. Everything the player experiences through their ears is... nothing. - -And the thing about silence is — you HEAR it. Not consciously, but your brain notices. Silence says "this isn't a place." Sound says "this is a place." The difference is primal. - -**BUT — I'm not asking for a full audio suite.** Here's my minimum viable audio for v0.1: - -1. **Station ambient loop.** One track. Low hum, distant machinery, occasional muffled announcements. This runs ALWAYS. It's the "you're on a space station" signal. Think: the Nostromo ambience from Alien. It can be royalty-free or generated. One file. Huge impact. - -2. **Location variation.** Three variants of the ambient: workplace (louder machinery, cargo sounds), bar (muted music, glass clinks, conversation murmur), corridors (echoing footsteps, that lonely hum). These can be the same base track with different overlay layers. Three files. - -3. **Footsteps.** Your character's footsteps. Metal floor. Consistent. This alone makes you feel PRESENT in the space. One sound, two variations (walk/run). The single highest bang-for-buck audio asset in any game. - -4. **One UI sound.** The monologue appearance. A soft chime, a subtle click, something that says "your character is thinking." This trains the player to notice monologue, which is our primary content delivery mechanism. Without it, text just appears and might be missed. - -That's 6-8 audio files total. Maybe a day of work for someone with access to a sound library. Maybe two days if we're generating them. And the difference between those 6 files and silence is the difference between "interesting tech demo" and "I want to keep playing." - -**So my answer: silence is NOT acceptable for a concept proof. But we don't need much.** A station hum, three location variants, footsteps, and a monologue chime. That's the audio floor. Below that, the atmosphere collapses regardless of how good the monologue writing is. - -**Should we defer audio entirely?** NO. We should defer SOPHISTICATED audio (the three-range model, directional sound, sound-through-walls). Those are milestone features. But ambient atmosphere and basic feedback sounds should be in Sprint 2 or early Sprint 3 at the latest. Before the first content playtest. Because if we playtest in silence, we'll get feedback about the writing and systems, but we won't learn whether the ATMOSPHERE works. And atmosphere is what turns systems into experiences. - ---- - -## Cross-Layer: The Emotional Content Map - -Stepping back from individual layers. Here's how I see the content gaps mapping to PLAYER EMOTIONS: - -### The Emotional Journey (30-minute session) - -| Minute | Emotion | Content That Delivers It | Status | -|--------|---------|-------------------------|--------| -| 0-1 | Curiosity / Awe | Visual mood + ambient audio + signature visual element | GAP | -| 1-3 | Grounding | Opening monologue + named NPC + news ticker | GAP | -| 3-10 | Comfort / Routine | Daily task + workplace/bar dialogue + flat NPCs being human | GAP (content packs not started) | -| 10-20 | Attachment | Repeated interactions + THE FRIEND + gossip + small social dramas | GAP (dialogue layers 3-4) | -| 20-25 | Unease | First observational surprise + monologue flagging deviations | GAP (no observation content) | -| 25-30 | Dread | Routine breaks + THE FRIEND's contradiction + things going wrong | GAP (contamination content) | -| 30+ | Investigation | Full conspiracy activation | GAP (storyteller activation) | - -**Every single emotional beat is a content gap.** The SYSTEMS to deliver them exist or are planned. The CONTENT to fill them does not. - -That's what this workshop is about. And that table is the priority order for content creation. - ---- - -## My Top 5 Content Priorities (Ordered) - -1. **Character emotional profiles** (for Dual Lens Guide) — Before anyone writes a LINE, we need to know how each character FEELS about their world. This is Paula's document but I want Mellanie in the room. No voice kit can be written without it. - -2. **THE FRIEND NPC design** (one per character) — The single NPC designed to deliver D-027 success criterion #3. Full profile, full voice kit, full contradiction arc. This is the emotional centerpiece of v0.1. - -3. **Opening monologue + first 5 minutes content** — The first 20 lines each character thinks. The diegetic first objective. The emotional register of "another day" before everything goes wrong. This is what the player's first impression is made of. - -4. **News ticker / environmental text** — 20-30 lines of station life. Cheapest content, highest presence-per-word ratio. Worldbuilds while the player walks around. - -5. **Flat NPC voice kits** — The noise floor. The 4-5 NPCs who AREN'T important but need to FEEL like they might be. One memorable trait each. 10-15 lines each. These make or break the investigation mechanic. - ---- - -## The Bottom Line (Again) - -Last workshop I said: "We need to design the moments, not just the systems." - -This workshop I'm saying: **"We need to write the moments, not just design them."** - -The systems are being built. The architecture is solid. The decisions are right. But somewhere between D-028 (tagged line pools with four relational layers) and an actual player sitting at their desk going "oh shit, did Jax just lie to my face?" — there's a canyon. And that canyon is filled with unwritten monologue lines, undefined character voices, and content packs that are tickets with no words in them yet. - -This workshop fills the canyon. Let's go. - ---- - -*Written by Ozzie. Still from the gut.* diff --git a/docs/workshops/content-gap-analysis_v0_1/round1-paula.md b/docs/workshops/content-gap-analysis_v0_1/round1-paula.md deleted file mode 100644 index 2ed8ffa2c..000000000 --- a/docs/workshops/content-gap-analysis_v0_1/round1-paula.md +++ /dev/null @@ -1,500 +0,0 @@ -# Round 1 — Paula's Content Gap Analysis - -**Agent:** Paula (Narrative & Political Depth) -**Workshop:** v0.1 Content Gap Analysis -**Date:** 2026-02-11 - ---- - -## My Approach - -The workshop asks nine layers of questions, moving from the most global (art direction) down to the most specific (audio). I'm addressed directly in Layers 2, 3, 5, 6, and 7. But let me complicate this structure: content gaps don't exist in layers — they exist in *relationships between layers*. A character voice profile (Layer 2) only means something if it connects to a dialogue format (Layer 4) that connects to a content pack (Layer 5) that connects to monologue lines (Layer 7). The gaps I'm most concerned about aren't within any single layer — they're at the seams. - -I'll address each question directed at me with concrete proposals, then identify the cross-layer dependencies that the workshop structure might obscure. - ---- - -## Layer 1: Art Direction & Visual Identity - -Not my primary domain, but I have a narrative stake here. - -**Narrative implication of the visual identity question:** The two characters should *feel* different before a single line of monologue plays. If the art direction is "functional minimalism, atmosphere through text" (which I support for v0.1), then the visual differentiation between smuggler and detective must come from the insert/HUD layer, not from the world itself. The detective might see the district through an analytical overlay — case file annotations on locations, routine deviation markers. The smuggler might see it through a social map — who's friendly, who's dangerous, where the exits are. - -This means the "visual identity" for v0.1 is partially a question for me: **what does each character's neural insert show them?** Even with placeholder art, the insert overlay can carry character-specific visual language. I'd defer to Araminta on execution, but the *information design* of what each character's HUD reveals is a narrative question. - ---- - -## Layer 2: Narrative Framework & Character Design - -### Question 1: What does the Dual Lens Authoring Guide (#261) need to contain? - -This is the single most important pre-production document for content creation. Without it, Mellanie writes dialogue that works for one character but not the other. Miri designs a station that reveals itself the same way to everyone. Every content creator needs to understand the dual-lens principle before writing a single line. - -**Proposed contents of the Dual Lens Authoring Guide:** - -**Part 1: The Two Characters** - -| Dimension | Smuggler | Detective | -|-----------|----------|-----------| -| **Core identity** | Logistics worker at the hub. Criminal activity is their day job disguised as normal work. | Institutional investigator. Assigned to the district on a routine case — or so it seems. | -| **Emotional starting state** | Comfortable but wary. This is home, these are friends, and the operation runs smoothly. | Professional and detached. This is an assignment, these are subjects. | -| **Relationship to the district** | Insider. Knows the rhythms, the shortcuts, who to avoid, who to trust. | Outsider. Reads the district through case files and institutional briefings. | -| **What they notice first** | People out of place. Routine disruptions. New faces. Things that threaten the operation. | Patterns. Inconsistencies. Things that don't match the official record. | -| **What they miss** | The institutional perspective — how this district looks from the outside, how exposed the operation actually is. | The human perspective — why people do what they do, what desperation drives the smuggling. | -| **Internal monologue voice** | Casual, sardonic, street-smart. Uses nicknames. Thinks in terms of loyalty and risk. *"Kael's late again. Third time this week. That's how people get noticed."* | Precise, observational, controlled. Uses titles and descriptions. Thinks in terms of evidence and procedure. *"Dock worker, second shift. Arrived 12 minutes late. Noted."* | -| **Relationship default** | Trust is earned through shared risk. New people are threats until proven otherwise. | Trust is institutional. Credentials open doors. Personal trust is a vulnerability. | - -**Part 2: The Dual-Lens Rule** - -Every piece of content must pass this test: **Does it read differently through each lens?** - -This doesn't mean every line needs two versions. It means every *situation* must have two interpretations. The same NPC behavior, the same location detail, the same overheard conversation should mean something different to each character. - -**Example — An NPC arriving late to work:** -- **Smuggler sees:** A colleague whose reliability is slipping. Threat assessment — are they getting sloppy? Are they being watched? Should I cover for them? -- **Detective sees:** A data point. Late arrivals correlate with... what? Worth monitoring. File it. - -**Example — A locked room in the logistics hub:** -- **Smuggler knows:** That's where the high-value cargo gets repackaged. Stay out unless it's your shift. -- **Detective wonders:** Restricted area, no manifest entries matching this space. What's in there? - -**Part 3: Access Tier Mapping** - -For each NPC role in each template, define the access tier per character: - -| NPC Role | Smuggler Access | Detective Access | -|----------|----------------|-----------------| -| Hub shift supervisor | Insider (colleague) | Authority (subject of inquiry) | -| Bar owner | Peer (regular customer) | Outsider (new face, no rapport) | -| Smuggling ring leader | Insider (direct report) | Unknown (doesn't know this person exists yet) | -| Dockworker (flat NPC) | Insider (coworker) | Outsider (background figure) | -| Off-duty security officer | Peer (bar acquaintance) | Peer (professional courtesy) | - -This table drives Layer 1 of the dialogue system (D-028): which lines each NPC will say to each character from minute one. - -**Part 4: Divergence Escalation Curve** - -The two experiences should start slightly different and diverge over time: - -| Phase | Time Window | Smuggler Experience | Detective Experience | Divergence Level | -|-------|-------------|--------------------|--------------------|-----------------| -| **Arrival** | 0-5 min | Routine start. Greetings from colleagues. Comfortable. | Orientation. Reading the space. Nobody knows you. | Low — both just walking around | -| **Daily life** | 5-15 min | Work shifts, bar visits, social rhythms. The operation hums in the background. | Observation, casual conversations, building a mental map. Small inconsistencies accumulate. | Medium — same NPCs, different relationships | -| **Tension** | 15-25 min | Something is off. A colleague is nervous. New faces at the hub. The detective is asking questions. | Patterns emerge. Someone is lying. The district's rhythms have a hidden frequency. | High — both noticing the same disruption from opposite sides | -| **Crisis point** | 25-30 min | The operation is at risk. Loyalty demands action. | Evidence points somewhere specific. The case demands action. | Maximum — both heading toward the same event from opposite directions | - -**Part 5: Authoring Checklist** - -For every content piece (NPC profile, dialogue line, location description, monologue trigger), the author must answer: - -1. Does the smuggler interpret this differently than the detective? -2. If yes, is the difference in *access* (they know different things), *interpretation* (they read the same thing differently), or *emotional weight* (the same information means more to one)? -3. If no, why not? (Some things are character-neutral — the bar serves drinks regardless. That's fine. But be deliberate about it.) - -**Is this a solo document or workshop output?** - -I should write the first draft. It's a narrative architecture document — the structure of how two perspectives coexist. But it needs input from: -- **Mellanie** — to validate that the voice profiles are writable and the checklist is usable -- **Gestalt** — to validate that the access tier mapping aligns with the dialogue system mechanics -- **Miri** — to validate that the station setting supports the divergence curve - -Proposed workflow: I write a full draft, the team reviews in Round 2, Mellanie and I iterate until she can use it as her authoring bible. - ---- - -### Question 2: How do you define "divergent starting knowledge" (#182)? - -Not a list of facts. A list of facts is inert — it doesn't generate gameplay. Divergent starting knowledge is a **structural asymmetry in how the character understands the world.** - -**Three dimensions of starting knowledge:** - -**1. Factual knowledge — what you know is true** - -| Category | Smuggler Knows | Detective Knows | -|----------|---------------|-----------------| -| **People** | Names, nicknames, personal details of all logistics hub workers + smuggling ring members. Bar regulars by face/habit. | Names and roles of institutional contacts. Case file subjects (partial, possibly outdated). District demographics from briefings. | -| **Places** | Layout of the hub including restricted areas. Hidden routes. Dead drops. Safe meeting spots. | Official district map. Registered businesses. Known gathering points from case history. | -| **Routines** | Shift schedules, break patterns, who drinks where, who avoids whom. The operation's timing. | Patrol routes. Shift change windows. Official facility hours. | -| **Relationships** | Who's sleeping with whom. Who owes whom. Who's reliable, who's cracking. The ring's hierarchy. | Chain of command. Informant network (if any). Known associates from prior cases. | - -**2. Interpretive frameworks — how you read ambiguous information** - -This is more important than facts. The smuggler and detective don't just know different things — they *think differently*. - -- **Smuggler's framework:** "Is this a threat to the operation?" Every new person, every unusual event, every authority figure is evaluated through this lens. The smuggler's paranoia is functional — it's kept them alive. -- **Detective's framework:** "Does this fit the pattern?" Every behavior, every routine deviation, every nervous glance is evaluated against a mental model of normal-vs-suspicious. The detective's analytical distance is professional — it's how they build cases. - -These frameworks should be encoded as **monologue biases**. When the smuggler sees an ambiguous situation, the monologue leans toward threat assessment. When the detective sees the same situation, the monologue leans toward pattern analysis. Same stimulus, different interpretation, different suggested actions. - -**3. Emotional knowledge — what you feel about what you know** - -The smuggler doesn't just know the ring leader — they have feelings about them. Loyalty, fear, respect, resentment. These emotional weights on relationships determine which NPCs the smuggler protects, which they resent, which they'd sacrifice. - -The detective doesn't just know the case file — they have feelings about the assignment. Ambition, boredom, duty, skepticism. These emotional weights on the investigation determine how aggressively they pursue leads, whether they bend rules, whether they start to sympathize with the people they're investigating. - -**Implementation proposal for #182:** - -Divergent starting knowledge is delivered through three ECS components per character: - -1. **KnowledgeInventory** — list of known facts, tagged by source (personal experience, case file, rumor). Each fact has a confidence level and emotional weight. -2. **InterpretiveFramework** — set of biases that weight monologue generation. The smuggler's framework flags authority-related observations; the detective's flags pattern-related observations. -3. **RelationshipMap** — starting relationships with all known NPCs, including emotional valence (trust, fear, loyalty, professional respect, suspicion) not just access tier. - -These three components together produce the starting divergence. Facts make you know different things. Frameworks make you interpret the same things differently. Emotional weights make you care about different things. - ---- - -## Layer 3: Station District Setting - -### Question 2: How does the station's character feed into NPC motivations? - -The honest truth is that a station district's economic and social pressures are the *engine* that generates NPC motivations. NPCs don't exist in isolation — they exist in an economic ecosystem that creates the conditions for both ordinary life and criminal enterprise. - -**The motivational chain:** - -``` -Station Economics → Employment Pressure → Individual Desperation → Criminal Opportunity → Social Complicity -``` - -Let me make this concrete with a proposal for how the v0.1 station district generates NPC motivations: - -**The district's economic reality:** This is a logistics hub — goods flow through. The legitimate economy provides steady but modest work. The cost of living on the station is slightly too high for comfort on a single logistics salary. This creates a permanent mild financial pressure on the working population. - -**How this generates motivations:** - -| NPC Type | Economic Pressure | Resulting Motivation | Smuggling Connection | -|----------|------------------|---------------------|---------------------| -| **Logistics worker (flat)** | Paycheck covers rent but not much else | Contentment axis: moderate-low. Wants stability, not risk. | Aware something happens at the hub after hours. Doesn't ask questions. | -| **Logistics worker (triangle)** | Partner's medical debt, child's school fees | Want: financial relief. Secret: knows about the smuggling, tempted to participate. | The smuggling ring is a lifeline they haven't taken yet. The triangle: should they? Their partner suspects something. | -| **Bar owner (triangle)** | Business is marginal. The after-hours crowd is what keeps the lights on. | Want: keep the bar viable. Secret: knows the bar is a meeting point for the ring. | Complicit through inaction. Doesn't ask what the back room is used for. The triangle: the bar owner's employee is getting curious. | -| **Ring member (entangled)** | Started as a logistics worker who said yes. Now in too deep. | Want: get out without getting caught. Secret: considering cooperation with authorities. | The detective's potential informant. The smuggler's potential betrayer. The cross-template triangle. | -| **Security officer (triangle)** | Underpaid. Sees things. Faces a choice every shift. | Want: do the right thing, or at least not the wrong thing. Tolerance: how much can they ignore? | The mundane triangle: the security officer, the logistics supervisor who schedules the off-hour shifts, and the bar owner who provides the alibi drinks. | - -**The key insight:** Economic pressure doesn't just explain why smuggling exists — it explains why the *community* tolerates it. The bar owner looks the other way because the smugglers keep the bar profitable. The flat NPCs don't ask questions because they benefit from the economic activity without getting their hands dirty. The detective enters a community where everyone has a reason to not cooperate — not because they're villains, but because the smuggling economy is the district's immune system against poverty. - -This is what makes the detective's job hard and the smuggler's moral position sympathetic. The station's economic character turns smuggling from a crime into a *community survival strategy*. That's the narrative engine. - -**What Miri's setting document needs from this perspective:** -1. The economic squeeze — what makes legitimate life just hard enough to justify risk -2. The interdependencies — who benefits from the grey economy even without participating -3. The recent pressure point — what changed recently that's making the situation unstable (this becomes the storyteller's activation trigger) - ---- - -## Layer 4: Content Pipeline & Authoring Format - -Not directly asked, but I have a critical dependency on this layer. - -**My concern:** The four dialogue layers (D-028) need to be expressible in whatever format Gestalt proposes. Specifically: - -- **Access tier** must be a per-line tag, because the same NPC says different things to insiders vs. outsiders vs. authority figures. This is Layer 1 of dialogue and the primary dual-lens mechanism. -- **Relationship history** needs a way to reference prior interaction states. A line tagged `greeted_before:true` reads differently than `greeted_before:false`. This is Layer 2 and drives the feeling of continuity. -- **Trust tier** must gate disclosure content. The same NPC has surface/real/secret versions of the same topic. This is Layer 3 and the mechanism for progressive revelation. -- **Unprompted** lines need mood and situational context tags. An NPC who volunteers information is driven by their current emotional state + the current situation. This is Layer 4 and the mechanism for NPC initiative. - -Whatever format Gestalt proposes, I need to verify that all four layers can be expressed as line-level metadata. If they can't, the content packs will be flat — just access-filtered greeting pools with no depth. - ---- - -## Layer 5: Template Content (3 Social Sites) - -### Question 2: How do you design the relationship web for 3 overlapping social sites? - -The relationship web is the narrative infrastructure of the vertical slice. Without it, 15 NPCs are 15 independent actors. With it, they're a community — interconnected, mutually dependent, full of tensions that the player can discover and exploit. - -**Design principles:** - -1. **Every NPC has at least 2 relationships that matter** — one within their home template, one that connects to another template. No NPC is an island. -2. **Bridge NPCs connect templates** — some NPCs have roles in multiple social sites. These are the most important characters because they carry information (and tension) between worlds. -3. **The relationship web has layers** — surface (visible to everyone), working (visible to insiders), and hidden (visible only through investigation or trust). - -**Proposed relationship web for v0.1 (15 NPCs across 3 templates):** - -**Template 1: Logistics Hub (Workplace) — 5 NPCs** - -| Role | Name Placeholder | Key Relationships | -|------|-----------------|-------------------| -| **Shift Supervisor** | NPC-A | Manages hub workers. Knows about the smuggling (looks away). Secret: taking a cut. | -| **Logistics Worker 1** | NPC-B | Smuggler's close colleague. Reliable ring member. The smuggler's anchor. | -| **Logistics Worker 2** | NPC-C | New hire. Curious. Asks questions they shouldn't. Triangle: B protects them, A wants them gone. | -| **Dock Inspector** | NPC-D | Legitimate authority. Bridge NPC: drinks at the bar after shifts. Secret: gambling debt makes them compromisable. | -| **Maintenance Tech** | NPC-E | Flat NPC. Fixes things, notices things, says nothing. Background presence that establishes normalcy. | - -**Template 2: Bar (Social Venue) — 5 NPCs** - -| Role | Name Placeholder | Key Relationships | -|------|-----------------|-------------------| -| **Bar Owner** | NPC-F | Knows everyone. Bridge NPC: supplies from the logistics hub. Complicit through willful ignorance. | -| **Regular (off-duty security)** | NPC-G | Bridge NPC: patrols the hub district during shifts, drinks at the bar after. Mundane triangle: F and G and D play cards — D owes G money, G pressures D, D considers compromising an inspection. | -| **Regular (teacher/family person)** | NPC-H | The most normal person in the district. Mundane triangle: H's partner works at the hub (NPC-B). H doesn't know what B does after hours. H represents what's at stake — ordinary life that smuggling protects and endangers. | -| **Bartender** | NPC-I | Flat NPC. Observant but discreet. Serves drinks, overhears everything, tells nothing. Source of ambient gossip if trust is built. | -| **Drifter/New Arrival** | NPC-J | Flat NPC but narratively loaded: new in the district, asking around for work. Could be innocent. Could be a rival operation's scout. Could be an undercover agent. The ambiguity is the point — the smuggler and detective read this person differently. | - -**Template 3: Smuggling Ring (Criminal) — 5 NPCs** - -| Role | Name Placeholder | Key Relationships | -|------|-----------------|-------------------| -| **Ring Leader** | NPC-K | The person the detective is ultimately looking for (without knowing it). Bridge NPC: legitimate business front at the bar. Public face is respectable. | -| **Courier** | NPC-L | Moves product. Bridge NPC: uses the logistics hub's infrastructure. Triangle with B and K: B arranges access, K gives orders, L takes the physical risk. | -| **Fence/Buyer** | NPC-M | External contact. Not from this district. Appears occasionally. The smuggler knows them; the detective has never seen them. | -| **Ring Member (wavering)** | NPC-N | The potential informant. Triangle with K and A: K demands loyalty, A applies pressure, N is cracking under the tolerance threshold. The detective's unknowing target. The smuggler's biggest worry. | -| **Lookout/Runner** | NPC-O | Flat NPC. Young, nervous, stationed at strategic positions. Visible to both characters — the smuggler knows why they're there, the detective reads them as loitering youths. | - -**Bridge NPCs (connecting templates):** - -| NPC | Home Template | Connected To | Bridge Function | -|-----|--------------|-------------|-----------------| -| **NPC-D** (Dock Inspector) | Hub | Bar | Professional life at hub, social life at bar. Information flows between worlds. | -| **NPC-G** (Security Officer) | Bar | Hub | Social at bar, authority at hub. Sees things in both contexts. | -| **NPC-K** (Ring Leader) | Ring | Bar | Criminal at ring, legitimate at bar. Public face conceals operation. | -| **NPC-L** (Courier) | Ring | Hub | Criminal at ring, logistics at hub. Physical movement connects sites. | -| **NPC-B** (Logistics Worker) | Hub | Ring | Day job at hub, ring member after hours. The smuggler's closest colleague. | -| **NPC-H's partner** | Bar | Hub | (Not a separate NPC — NPC-H references NPC-B's hub role.) | - -The web has **6 bridge connections** across 3 templates, meaning information, tension, and consequences can propagate in multiple directions. - ---- - -### Question 3: How many triangles per template? What do they look like concretely? - -D-029 requires 2 per template minimum + 1 cross-template. For v0.1, I propose **7 triangles total**: 2 per template (6) + 1 cross-template. - -**Intra-template triangles (6):** - -**Hub Triangle 1 — The New Hire Problem (B-C-A)** -- **B** (loyal ring member) wants to protect **C** (curious new hire) from learning too much -- **A** (shift supervisor taking a cut) wants **C** removed before they see something -- **C** just wants to do their job but keeps noticing locked rooms and irregular schedules -- **Player relevance:** The smuggler has to choose between B's protective instinct and A's pragmatism. The detective notices C asking questions and wonders why B is so protective. - -**Hub Triangle 2 — The Inspection Squeeze (A-D-K)** -- **A** (supervisor) needs inspections to go smoothly -- **D** (dock inspector) has a gambling debt and is being pressured -- **K** (ring leader, acting through intermediaries) is the source of the pressure -- **Player relevance:** The smuggler knows the inspection schedule is managed. The detective sees D's nervousness and smells corruption. - -**Bar Triangle 1 — The Card Game Debt (D-G-F)** -- **D** (dock inspector) owes money from the weekly card game -- **G** (security officer) holds the debt and pushes for favors in return -- **F** (bar owner) facilitates the card games and profits from the arrangement -- **Player relevance:** Mundane triangle. No conspiracy connection. But the debt creates leverage that the smuggling ring exploits, and the detective might misread as conspiracy when it's just gambling. Red herring potential. - -**Bar Triangle 2 — The Worried Partner (H-B-F)** -- **H** knows their partner **B** has been working late and spending more -- **H** confides in **F** (bar owner), who knows exactly why B is busy but won't say -- **F** reassures **H** while protecting the operation's secrecy -- **Player relevance:** The most emotionally loaded mundane triangle. H's worry is genuine. F's reassurance is a lie of omission. B is oblivious to the anxiety they're causing. The detective who earns H's trust might hear the first honest account of B's behavioral changes. - -**Ring Triangle 1 — The Wavering Member (K-N-L)** -- **K** (ring leader) demands total loyalty from **N** (wavering member) -- **N** is considering cooperation with authorities — terrified of both sides -- **L** (courier) suspects N is unreliable and has told K as much -- **Player relevance:** The highest-stakes triangle. The smuggler knows N is shaky and must decide whether to support them or report them to K. The detective doesn't know N exists yet but will find them through investigation. - -**Ring Triangle 2 — The Power Dynamic (K-A-B)** -- **K** (ring leader) gives orders through **A** (supervisor, the legitimate front) -- **A** resents taking orders but needs the money -- **B** (loyal to the smuggler/the team, not to K personally) would side against K if pushed -- **Player relevance:** Internal ring politics. The smuggler navigates this hierarchy daily. The detective, if they crack the ring, would exploit these fissures. - -**Cross-template triangle (1):** - -**The Big One — The Informant Question (N-D-G)** -- **N** (wavering ring member) is considering talking -- **D** (dock inspector) is compromised but might flip if pressured correctly -- **G** (security officer) has the institutional authority to act but doesn't know what they'd act on -- These three people, across all three templates, represent the three ways the ring could unravel: from inside (N betrays), from institutional corruption (D breaks), or from legitimate authority (G stumbles onto something) -- **Player relevance:** The smuggler wants to prevent all three. The detective, unknowingly, is pushing toward all three. The convergence of this triangle IS the crisis point of the vertical slice. - -**Triangle distribution by entanglement:** - -| Category | Triangles | D-029 Split | -|----------|-----------|-------------| -| Flat NPCs (no triangle involvement) | — | E, I, O = 3 NPCs (20%) | -| Mundane triangles (no conspiracy) | Card Game Debt, Worried Partner | 7 NPCs in mundane-only roles (~47%) | -| Entangled triangles (conspiracy-connected) | New Hire, Inspection, Wavering Member, Power Dynamic, Cross-template | 5 NPCs with conspiracy connection (~33%) | - -This skews slightly higher on entanglement than the 30/50/20 target (D-029), but the v0.1 district is small and needs to prove the concept. In a full game, the ratio would normalize with many more flat and mundane NPCs. For the vertical slice, we need enough entanglement to create discoverable conspiracy threads. - ---- - -## Layer 6: NPC Profiles & Dialogue - -### Question 1: How deep does each NPC profile need to be? - -Let me complicate this by separating what the *system* needs from what the *authors* need. - -**What the system needs (ECS data):** -All 10 axes per D-024, populated as numeric values or enums. The system doesn't read backstory — it reads component data. This is the minimum: a fully populated NPC generation output. - -**What the authors need (creative brief):** -The 10 axes are a skeleton. Mellanie can't write voice-consistent dialogue from a skeleton. She needs flesh. - -**Proposed three-tier NPC profile depth:** - -**Tier 1: Full profile (entangled NPCs — 5 NPCs: A, B, K, L, N)** - -| Section | Contents | Length | -|---------|----------|--------| -| 10-axis data | All axes populated with values and brief justification | ~20 lines | -| Backstory paragraph | How they got here, what shaped them, what they're hiding | 3-5 sentences | -| Voice sample | 3-5 example lines in their voice, covering different moods | 3-5 lines | -| Dual-lens notes | How the smuggler sees them vs. how the detective sees them | 2-3 sentences per lens | -| Triangle role notes | Their function in each triangle they participate in, what pressures they face | 2-3 sentences per triangle | -| Secret | What they're hiding, from whom, and what would happen if it came out | 2-3 sentences | - -Total per NPC: ~1 page. For 5 entangled NPCs: ~5 pages. - -**Tier 2: Working profile (triangle NPCs, non-entangled — 7 NPCs: C, D, F, G, H, M, O)** - -Wait — let me reconsider. O is flat. M is external. Let me re-sort. - -Triangle-involved but not conspiracy-entangled: C, D, F, G, H = 5 NPCs. - -| Section | Contents | Length | -|---------|----------|--------| -| 10-axis data | All axes populated | ~15 lines | -| Voice sample | 2-3 example lines | 2-3 lines | -| Dual-lens notes | Brief note on each character's perspective | 1-2 sentences per lens | -| Triangle role notes | Their function in their triangle(s) | 1-2 sentences | - -Total per NPC: ~half page. For 5 triangle NPCs: ~2.5 pages. - -**Tier 3: Sketch profile (flat NPCs — 5 NPCs: E, I, J, M, O)** - -| Section | Contents | Length | -|---------|----------|--------| -| 10-axis data | Essential axes only (Want, Routine, Personality) | ~8 lines | -| Voice hint | 1 line that captures their energy | 1 line | -| Function note | Why they exist in the world, what role they serve for atmosphere | 1-2 sentences | - -Total per NPC: ~quarter page. For 5 flat NPCs: ~1.25 pages. - -**Grand total: ~8.75 pages of NPC profiles** for the entire v0.1 cast. This is a manageable authoring load. I'd write Tier 1 profiles (the narrative architecture). Mellanie takes them and writes the voice kits and dialogue. Miri validates cultural/setting consistency. - ---- - -## Layer 7: Monologue & Observation Text - -### Question 3: What are the "mirror moments"? - -Mirror moments are the places where the monologue hints — without breaking character — that this situation looks completely different from another perspective. They're not fourth-wall breaks. They're moments where the character's *own thoughts* inadvertently reveal the existence of an alternate interpretation. - -**The principle:** A mirror moment occurs when the character's certainty about something is, from the other character's perspective, obviously wrong — and the monologue's confidence IS the tell. - -**Concrete mirror moments for v0.1:** - -**Mirror 1: The Smuggler's Comfort** -- **Smuggler monologue:** *"Same shift, same faces. At least I know where I stand here."* -- **What the detective would see:** A logistics hub where "same faces" means a closed social network resistant to outside inquiry. The comfort IS the suspicion. -- **Design note:** This plays in the first 5 minutes. It establishes the smuggler's world as normal and inviting. Only on the detective's playthrough does the player realize that "knowing where you stand" is exactly what makes the smuggling possible. - -**Mirror 2: The Detective's Read** -- **Detective monologue:** *"The dock inspector keeps glancing at the supervisor's office. Anxiety? Guilt? Worth noting."* -- **What the smuggler would know:** D owes money from the card game and A has been riding them about inspection schedules. It's not guilt — it's stress about completely mundane workplace pressure. Or is it? The smuggler knows the mundane explanation but the detective's suspicion isn't *wrong* — D IS compromised, just not in the way the detective thinks. -- **Design note:** This plays mid-session. It shows the detective building a theory from observation — a theory that's simultaneously correct and incorrect. - -**Mirror 3: The Worried Partner** -- **Smuggler monologue (at the bar):** *"H looks tired. I should probably not mention seeing B at the hub so late — that's B's business."* -- **Detective monologue (at the bar):** *"Spouse of a hub worker. Looks stressed. Might know something about after-hours activity."* -- **Design note:** Same person, same moment. The smuggler sees a friend they're protecting from the truth. The detective sees a potential source. The player who's played both characters recognizes the tragic irony — H is caught between two people who both think they're acting in H's interest. - -**Mirror 4: The Empty Corridor** -- **Smuggler monologue (passing a corridor late at night):** *"Quiet tonight. Good. Nobody using the south access."* -- **Detective monologue (same corridor, same time):** *"This corridor should see foot traffic — logistics staff use it for the night shift changeover. Why is it empty?"* -- **Design note:** The smuggler's relief IS the detective's clue. The corridor is empty because the smuggling operation rerouted traffic. The smuggler knows this and is grateful. The detective doesn't know but senses something is wrong. - -**Mirror 5: The New Face** -- **Smuggler monologue (seeing NPC-J the drifter):** *"New face at the bar. Don't recognize them. Probably nothing, but... keep an eye out."* -- **Detective monologue (seeing NPC-J):** *"New arrival in the district. Looking for work, they say. Could be useful — fresh perspective, no local loyalties yet."* -- **Design note:** The smuggler sees a potential threat. The detective sees a potential asset. Both are evaluating the same stranger through opposing frameworks. On replay, the player recognizes the irony — neither is wrong, and both reactions reveal their character. - -**How mirror moments are authored:** - -Mirror moments are NOT scripted paired events. They're **monologue lines tagged to the same observation trigger** but filtered through different character frameworks. The system requirements: - -1. An observation trigger (NPC behavior, environmental state, routine deviation) -2. Two monologue line variants tagged to the same trigger, one per character -3. The lines must be independently coherent — each works on its own without the other -4. The mirror quality only emerges on replay, when the player remembers the other character's reaction - -**Authoring volume estimate:** I'd target **10-15 mirror moments** for the v0.1 vertical slice. Not every observation needs a mirror — that would feel forced. But 10-15 well-placed mirrors across 30 minutes means the replay playthrough produces a revelation roughly every 2-3 minutes. That's the rhythm of "oh, THAT'S what that was about" that makes the second playthrough compelling. - ---- - -## Layer 8: UI Text & Environmental Content - -Not directly asked, but I have a narrative-critical input. - -**The neural insert must reflect character identity.** If both characters see the same HUD, the diegetic fiction breaks. The smuggler's insert might show: -- Known associate locations (social map) -- Delivery schedules and routes -- Informal warnings ("avoid sector 7 — patrol activity") - -The detective's insert might show: -- Case file markers (suspect locations, evidence flags) -- Institutional alerts -- Formal status reports ("Subject B: routine deviation detected") - -This is a **dual-lens question** — the insert IS the character's window into the world. Even in v0.1 with minimal HUD, the insert text should feel different per character. - ---- - -## Layer 9: Audio Direction - -Not my domain, but one narrative note: **silence is a monologue trigger.** The three-range sound model (D-018) means that close range provides rich audio. But when the player is alone in a quiet space, the *absence* of sound should trigger monologue. The character thinks when the world is quiet. This means the monologue system and the sound system need to coordinate — monologue fires more frequently when the audio environment is sparse, and less frequently when it's rich. - -This has a dual-lens application: the smuggler alone in a quiet corridor thinks *"Too quiet. Something's off."* The detective alone in the same corridor thinks *"Good. Time to think."* Same silence, different interpretation. - ---- - -## Cross-Layer Dependencies: The Seams That Matter - -The workshop's layer structure is useful for organizing work, but the content gaps I'm most worried about live between layers: - -| Dependency | From Layer | To Layer | Why It Matters | -|-----------|-----------|---------|---------------| -| Dual Lens Guide must precede all content | 2 | 4, 5, 6, 7 | Every content author needs the guide before writing. Without it, content will be single-perspective and need rewriting. | -| Access tier mapping drives dialogue format | 2 | 4 | The authoring format must support per-character access tiers on every line. If the format can't express "this line is for insiders only," the dual-lens system collapses. | -| Station economics drive NPC motivations | 3 | 5, 6 | NPC profiles can't be written without understanding the economic pressures that shape their choices. Miri's setting document feeds Paula's relationship web feeds Mellanie's dialogue. | -| Relationship web drives content packs | 5 | 5 (internal) | Content packs for each template can't be written independently — the bridge NPCs and cross-template triangles create dependencies between all three packs. | -| Mirror moments require authoring format | 7 | 4 | The format must support tagging the same observation trigger with character-specific monologue variants. If it can't, mirror moments are impossible to author systematically. | -| NPC profiles drive voice kits | 6 | 5 | Mellanie writes voice kits from NPC profiles. Profiles must exist before dialogue. | - -**Proposed dependency chain for content work:** - -``` -1. Station setting document (Miri) — Layer 3 - ↓ -2. Dual Lens Authoring Guide (Paula) — Layer 2 - ↓ -3. Relationship web + triangles (Paula) — Layer 5 - ↓ -4. NPC profiles: Tier 1 entangled (Paula) + Tier 2/3 (Paula+Mellanie) — Layer 6 - ↓ -5. Authoring format locked (Gestalt) — Layer 4 - ↓ -6. Content packs: voice kits, situation scripts, monologue lines (Mellanie) — Layer 5 + 7 - ↓ -7. Mirror moment pass (Paula reviews Mellanie's monologue for mirror opportunities) — Layer 7 -``` - -Steps 1-4 are narrative architecture. Steps 5-7 are content production. The architecture must be done before production starts, or we'll be rewriting content to fit a structure that didn't exist when it was written. - ---- - -## Summary: What I Need To Deliver - -| Deliverable | Layer | Depends On | Estimated Effort | -|-------------|-------|-----------|-----------------| -| Dual Lens Authoring Guide (full draft) | 2 | Nothing — can start now | 2-3 days | -| Divergent starting knowledge specification | 2 | Setting document (Miri) | 1-2 days | -| Relationship web for 15 NPCs | 5 | Setting document (Miri) | 1-2 days | -| Triangle definitions (7 triangles) | 5 | Relationship web | 1 day | -| NPC profiles: Tier 1 (5 entangled) | 6 | Relationship web + triangles | 2-3 days | -| NPC profiles: Tier 2 (5 triangle) | 6 | Tier 1 profiles | 1-2 days | -| NPC profiles: Tier 3 (5 flat) | 6 | Setting document | 1 day | -| Mirror moment design (10-15 moments) | 7 | All NPC profiles + Dual Lens Guide | 1-2 days | -| Review pass on Mellanie's content packs | 5+7 | Mellanie's draft packs | Ongoing | - -The Dual Lens Guide is my first and most critical deliverable. Everything downstream depends on it. diff --git a/docs/workshops/content-gap-analysis_v0_1/round2-araminta.md b/docs/workshops/content-gap-analysis_v0_1/round2-araminta.md deleted file mode 100644 index 44fff6ff1..000000000 --- a/docs/workshops/content-gap-analysis_v0_1/round2-araminta.md +++ /dev/null @@ -1,568 +0,0 @@ -# Round 2 Workshop Response: Araminta (Visual Design Synthesis) - -**Agent:** Araminta (Visual Designer) -**Date:** 2026-02-11 -**Round:** 2 (Synthesis) -**Inputs:** All 6 Round 1 outputs + project lead direction - ---- - -## Project Lead Directives Acknowledged - -1. **Color = relationship to player: APPROVED.** This is now the confirmed v0.1 color model. No more hedging. -2. **Audio in v0.1 scope (6-8 files).** Visual sound indicators are complementary, not the sole mechanism. My indicator design can be subtler now -- it confirms audio, not replaces it. -3. **THE FRIEND -- one per character, production-level complex.** Visual implications addressed in section 6. -4. **Wiki structure with full taxonomy -- non-negotiable.** Visual asset taxonomy included in section 7. -5. **Sova Transit District / Krenn System is concrete.** All visual proposals now grounded in Miri's Sova setting. - ---- - -## What I Learned from Round 1 (All Six Responses) - -Three things crystallized: - -1. **Text carries the game.** Mellanie, Paula, and Miri all confirmed what D-014 and D-016 implied: at v0.1 fidelity, written content does 80%+ of atmosphere and information delivery. My visual design must *support* text, not compete with it. Every pixel I spec is either making text more readable, making game state more scannable, or getting out of the way. - -2. **The insert is character-specific.** Paula proposed that the smuggler's and detective's inserts show different information categories -- social map vs. analytical overlay. Miri confirmed this with setting logic: the smuggler has a baseline lattice (less data), the detective has an augmented lattice (more data, institutional feeds). This changes my insert wireframe from "one HUD, two characters" to "one HUD framework, two information profiles." - -3. **Spatial design is load-bearing.** Paula's relationship web (15 NPCs, 7 triangles, 6 bridge connections) and Gestalt's spatial requirements (chokepoints, public/private gradients, observation positions) make spatial layouts the most important visual deliverable. Room shapes serve sightline gameplay. Triangle dynamics need specific observation positions. These inputs make my spatial layouts functional, not decorative. - ---- - -## 1. Missing Tickets for Visual/Art Direction Work - -After reading all Round 1 outputs and cross-referencing the ticket system, here are the visual tickets that should exist: - -### Critical (blocks other work) - -| Ticket Title | Priority | Depends On | Blocks | Rationale | -|---|---|---|---|---| -| **v0.1 Visual Grammar Document** | Critical | Workshop conclusion | All visual implementation, spatial layouts, entity rendering | Root dependency. Codifies color palette, entity sizing, label rules, UI layers, fog rendering. One page. Everything visual hangs off this. | -| **Entity Color System Spec -- Relationship-to-Player Mapping** | Critical | Visual Grammar | NPC rendering, fog rendering, client renderer | The approved color model needs a formal spec: which relationship states map to which colors, how transitions animate, edge cases (NPC relationship changes mid-observation). | - -### High Priority - -| Ticket Title | Priority | Depends On | Blocks | Rationale | -|---|---|---|---|---| -| **Spatial Layout: Sova Logistics Hub ("The Terminal")** | High | Visual Grammar, Miri's setting | Content pack #190, sightline implementation | Tile-level floor plan with sightline analysis. Miri's Round 1 gives me the zones. I can now design concretely. | -| **Spatial Layout: Sova Bar ("The Last Shift")** | High | Visual Grammar, Miri's setting | Content pack #191, sightline implementation | Irregular layout with privacy pockets, corner booth as key location. | -| **Spatial Layout: Sova Transition Corridors + Smuggling Spaces** | High | Visual Grammar, Miri's setting | Content pack #192, sightline implementation | Maintenance corridors, repurposed storage, hidden spaces within the 40-year-old station structure. | -| **Insert/HUD Wireframe and Spec** | High | Visual Grammar | Insert implementation, UI rendering | The lattice overlay design. Includes dual-character variants (smuggler's social map vs. detective's case file overlay). | -| **Monologue Display System Visual Spec** | High | Visual Grammar | Monologue renderer, text system | Typography, positioning, fade animation, stacking rules, character voice differentiation. Mellanie's 900+ lines need a rendering pipeline. | -| **Text Display Hierarchy Spec** | High | Visual Grammar | All text rendering | How dialogue, monologue, observation, overheard conversation, and environmental text each render distinctly. Four pipelines, four visual treatments. | -| **Sound Indicator Visual Design** | High | Visual Grammar, audio scope | Medium-range sound system | Fog-edge pulse indicators. Complementary to audio, not replacement. | -| **THE FRIEND -- Visual Treatment Spec** | High | NPC profiles (Paula), Visual Grammar | THE FRIEND NPC rendering | Production-level visual differentiation for one NPC per character. See section 6. | - -### Medium Priority - -| Ticket Title | Priority | Depends On | Blocks | Rationale | -|---|---|---|---|---| -| **Visual Asset Taxonomy (Wiki Structure)** | Medium | Visual Grammar | Future asset pipeline, wiki | Directory structure, naming conventions, category definitions. Future-ready per project lead directive. | -| **Fog Rendering Visual Spec** | Medium | Visual Grammar | Fog system implementation | Four-state rendering (visible, fog-edge, hidden, remembered). | -| **Environmental Text Visual Standards** | Medium | Visual Grammar, Miri's setting | Environmental text rendering | How signage, terminals, news tickers render in-world. Bilingual treatment per Miri. | -| **Signature Visual Element -- Span Gate Glow** | Medium | Miri's setting | First-impression visual | Ozzie's "one thing that says space station." See section 2. | - -**Total new tickets proposed: 13.** 2 critical, 8 high, 4 medium. This is the complete visual work scope for v0.1. - ---- - -## 2. Refined v0.1 Art Direction Proposal - -Round 1 proposed "readable information design, atmosphere through text and spatial composition." Round 2 refines this with Miri's Sova setting and Ozzie's mood requirements. - -### The Visual Identity of Sova Transit District - -Miri's setting brief tells me exactly what this place looks like: mid-Reach, 40 years old, prefab modular construction modified over decades. Institutional corridors near the gate terminal transitioning to older, warmer spaces toward the residential boundary. "Functional prosperity" -- not dystopian, not utopian. A working port. - -**This translates to three visual zones with distinct palettes:** - -#### Zone 1: Gate Terminal / Logistics Hub ("The Terminal") - -The institutional face of Sova. Clean, regulated, functional. - -| Element | Color | Hex | Rationale | -|---|---|---|---| -| Floor | Cool grey-navy | `#1e1e32` | Institutional flooring. Blue-tinted. | -| Walls | Cool slate | `#2e2e48` | Clean, maintained surfaces. | -| Lighting tint | Cool white | `#d8e0f0` at 15% overlay | Fluorescent institutional lighting. Bright, slightly harsh. | -| Equipment/furniture | Darker grey | `#222233` | Grav-lifts, terminals, workstations. Functional. | -| Restricted areas | Slightly darker floor | `#1a1a2e` | Subtle but perceptible. Private spaces are darker. | - -#### Zone 2: Bar District / "The Last Shift" - -The social heart. Warmer, older construction, personality. - -| Element | Color | Hex | Rationale | -|---|---|---|---| -| Floor | Warm dark | `#221e28` | Older materials. Warmer tones. | -| Walls | Warm grey | `#342e38` | Aged, repaired, character. | -| Lighting tint | Amber-warm | `#e8c070` at 10% overlay | Cheaper, warmer fixtures. Inviting. | -| Bar counter/furniture | Dark warm tone | `#2a2018` | Solid, well-worn. | -| Corner booth | Slightly darker | `#1e1a18` | The semi-private space. Visually recessed. | - -#### Zone 3: Corridors / Maintenance / Smuggling Spaces - -The in-between. Older construction, poorer lighting, architectural secrets. - -| Element | Color | Hex | Rationale | -|---|---|---|---| -| Floor | Neutral dark | `#18161e` | Transitional. Neither warm nor cool. | -| Walls | Varied | Mixed old/new sections | 40 years of modifications visible. Different wall tones = different construction eras. | -| Lighting tint | Dim, irregular | `#a0a0b0` at 8% overlay | Maintenance-level lighting. Gaps and shadows. | -| Hidden spaces | Near-black | `#12121a` | Sealed sections reopened, gaps between walls. Barely lit. | - -**Transition gradient:** Walking from the logistics hub to the bar, the palette warms. Walking into a maintenance corridor, it goes flat and dark. No art needed -- just tile color variation. The player may not consciously notice but will *feel* the shift. - -### Confirmed Entity Color Palette (Relationship-to-Player) - -Project lead approved. Locked. - -| Relationship State | Color | Hex | When | -|---|---|---|---| -| **Unknown/Neutral** | Cool teal | `#4a9ebb` | Default for NPCs the character hasn't assessed. | -| **Known/Friendly** | Soft green | `#6bc9a6` | People the character knows and trusts. | -| **Person of Interest** | Warm amber | `#e8c547` | Monologue or case file has flagged something. | -| **Hostile/Dangerous** | Muted red | `#d45d5d` | Character KNOWS there's danger. Subjective, not omniscient. | -| **Static objects** | Muted grey | `#8b8ba0` | Furniture, equipment, environmental elements. | -| **Player character** | Bright marker | `#e0e8ff` (detective) / `#e8e0d0` (smuggler) | Subtle warmth/coolness difference per character. | - -**Key principle unchanged:** Red means danger TO YOUR CHARACTER, not danger in the abstract. The detective might see that same NPC as amber (flagged in case file) while the smuggler sees green (trusted colleague). Same NPC, different color, because asymmetric information drives the palette. - -### Ozzie's Signature Element: The Span Gate Glow - -Ozzie asked for "one thing that says space station." Miri's setting gives the answer: the span gate. - -The span gate terminal sits at the district's edge. Its effects should be visible from the player's starting position. - -**Proposal: The span gate glow.** A subtle, rhythmic light source visible through a viewport or structural gap near the starting area. Not dramatic sci-fi blue-plasma. A warm, deep amber-orange luminance that pulses with transit cycles. Miri says the span gate produces "a deep, subsonic vibration" -- visually, this translates to a gentle, rhythmic luminance shift. When the confirmed audio system plays the span gate hum, the visual pulse synchronizes. - -Implementation cost: one animated light source with a viewport tile. It grounds the player in "space station near an active gate" within the first 5 seconds. It's also mechanically useful later -- changes in glow pattern (maintenance shutdown, increased traffic) become visual information. - -### Character-Specific Insert Overlays - -Paula and Miri both established the narrative logic: the smuggler has a baseline lattice, the detective has augmented. Ozzie wants the insert labels to reflect character perspective. - -| Insert Element | Smuggler | Detective | -|---|---|---| -| **Tint** | `#3d7aaf` at 30% (consumer-grade) | `#3d7aaf` at 40% (institutional-grade, slightly denser) | -| **POI markers** | Social contacts as dots (color = relationship state), favorite spots as circles | Persons of interest as amber diamonds, evidence locations as squares, surveillance zones as faint boundary lines | -| **Labels** | Casual: "The Last Shift", "Kael's usual spot" | Institutional: "Licensed establishment - District 7", "POI: K. Davan" | -| **Notifications** | Informal: "Msg from Kael", "Drop point updated" | Commission format: "Case file update: Subject Davan", "Commission advisory" | -| **Grid overlay** | None (consumer-grade, no extras) | Faint 1-pixel grid at 3% opacity (analytical feel) | - -**Implementation:** One insert system with a `lattice_profile` parameter. Stig builds one framework, not two. Character selection loads the appropriate profile. - ---- - -## 3. Placeholder Art Pipeline Priorities - -The question isn't "what art do we need" -- it's "in what order do we build the visual layers so each step is playable?" - -### Four Phases - -**Phase 1: Structural (blocks gameplay testing)** -- Tile-level floor plans for all three social sites -- Wall/door/furniture rectangles with correct proportions -- Fog rendering (visible/fog-edge/hidden/remembered) -- Entity rectangles with relationship colors -- Basic labels (NPC names, room names) - -**Phase 2: Information (blocks content testing)** -- Insert/HUD overlay (minimap, POI markers, time display) -- Monologue text display (positioned, styled, animated) -- Dialogue panel (NPC name header, text area) -- Sound indicators at fog edge (pulse icons, complementary to audio) -- Environmental text (signs, terminals) -- News ticker display - -**Phase 3: Atmosphere (blocks experience testing)** -- Zone-specific color palettes applied (three zones above) -- Lighting variation between locations -- Span gate signature visual element -- Character-specific insert variants -- Remembered-state fog (desaturated ghost) -- THE FRIEND visual treatment (color transition) - -**Phase 4: Polish (pre-release quality)** -- Sprite replacements for entity rectangles (if v0.1 scope allows) -- Animated transitions (door opening, NPC movement smoothing) -- Particle effects (span gate glow, fog-edge shimmer) -- Visual tells for NPC behavioral states -- Full environmental detail (wall texture variation, construction-era differences) - -**For v0.1 vertical slice: Phases 1-3 are required. Phase 4 is stretch.** - -### Total Art Asset Count for v0.1 - -Approximately **zero image files.** Everything is procedural: colored rectangles, styled text, shader overlays. The "art pipeline" is a color configuration file plus spatial layout data. - -This is deliberate. Zero image files means no asset loading latency, no sprite inconsistency, and no art-replacement migration when we move to real sprites. Stig and Dudley can build the full renderer without waiting on visual assets from me. My primary output is **documented specifications**, not image files. - ---- - -## 4. Dependencies Between Visual Work and Content Work - -### Content Teams Need from Me: - -| Content Team | What They Need | My Deliverable | Urgency | -|---|---|---|---| -| **Mellanie** | Display constraints -- character limits per text type, line count, wrap rules | Text Display Hierarchy Spec + Monologue Spec | High -- she's writing to unknown constraints | -| **Mellanie** | Environmental text visual format | Environmental Text Visual Standards | Medium -- can write provisionally | -| **Paula** | Spatial layouts to validate sightline assumptions | Spatial Layouts (3 sites) | High -- her NPC positions must work spatially | -| **Miri** | Visual tone confirmation | Visual Grammar | Medium -- confirmation, not blocker | - -### I Need from Content Teams: - -| From | What I Need | Status | -|---|---|---| -| **Miri** | Station district setting brief | **DONE** (Round 1 Sova brief) | -| **Paula** | NPC relationship web | **DONE** (Round 1, 15 NPCs, 7 triangles) | -| **Paula** | NPC routine phases (who is where by time of day) | Pending -- needed for spatial layout NPC anchors | -| **Gestalt** | Display context tag confirmation | Pending -- Mellanie proposed, Gestalt validates | - -**Key finding: I'm mostly unblocked.** The Visual Grammar has no upstream dependencies. Spatial layouts can begin with Miri's zones + Paula's relationship web. Insert wireframe has all its inputs. - -### The Critical Circular Dependency - -Spatial layouts need Paula's relationship web -> Content packs need spatial layouts -> Paula's relationship web needs content understanding. - -**Resolution: Parallel drafting with one sync pass.** -1. I draft spatial layouts from Miri's zones + Gestalt's spatial requirements -2. Paula reviews layouts against her relationship web -- flags adjustments -3. I adjust. One round. Layouts lock for content authoring. - ---- - -## 5. How Spatial Layout Serves Paula's Relationship Web and Gestalt's Access Tier Model - -This is the most important synthesis. Paula's triangles and Gestalt's access tiers are abstract. My spatial layouts make them concrete. - -### Principle: Space Creates Social Information - -Physical arrangement determines: -- Who can observe whom (sightlines = observation opportunities) -- Who can talk privately (enclosed spaces = trust-gated conversations) -- Who crosses paths (chokepoints = accidental encounters) -- Who can be followed (corridors = approach vectors) - -### Logistics Hub -- Serving the Relationship Web - -Paula's hub NPCs: Shift Supervisor (A), Workers (B, C), Dock Inspector (D), Maintenance Tech (E). -Paula's hub triangles: New Hire Problem (B-C-A), Inspection Squeeze (A-D-K). -Gestalt's requirements: publicly accessible area with hidden back section, restricted-access area, chokepoint. - -``` -+------------------------------------------------------------------+ -| SPAN GATE TERMINAL (visible glow) | -+------------------------------------------------------------------+ -| | -| [Scanner Bay 1] [Scanner Bay 2] [Scanner Bay 3] | -| | -| +---------+ +---------+ +---------+ | -| | staging | | staging | | staging | | -| +---------+ +---------+ +---------+ | -| | -| === MAIN CORRIDOR (chokepoint - everyone passes through) ====== | -| | -| +----------------+ +----------+ +-----+ +--------+ | -| | Manifest | | Break | | WC | | Lockers| | -| | Processing | | Room | | | | | | -| | (terminals) | | (social) | +-----+ +--------+ | -| +----------------+ +----------+ | -| | -| +-------------+ +-------------------+ | -| | Supervisor | | Restricted Storage| <-- smuggling ops | -| | Office | | (key access) | | -| | (window) | | | | -| +-------------+ +-------------------+ | -+------------------------------------------------------------------+ -``` - -**How this serves the triangles:** - -- **New Hire Problem (B-C-A):** C works in manifest processing (open, visible). B observes C from staging. A watches from the office window (sightline into main floor, sound blocked). C's curiosity about restricted storage is observable -- other NPCs see C lingering near the locked door. - -- **Inspection Squeeze (A-D-K):** D visits scanner bays. A watches from office window. The main corridor is the chokepoint -- D must pass through it, and the break room has a sightline to corridor traffic. - -**How this serves access tiers:** - -- **Public areas** (scanner bays, main corridor, manifest processing): Wide, well-lit, high visibility. Detective observes freely. `public` + `authority` dialogue. -- **Semi-private areas** (break room, lockers): Partially enclosed. Smuggler gets `insider` dialogue. Detective draws attention if lingering. -- **Private areas** (supervisor office, restricted storage): Enclosed, door access, blocked sightlines. The smuggler knows what's behind the restricted door. The detective can only observe from outside. - -### Bar -- Serving the Relationship Web - -Paula's bar NPCs: Bar Owner (F), Security Officer (G), Teacher/Family Person (H), Bartender (I), Drifter (J). -Paula's bar triangles: Card Game Debt (D-G-F), Worried Partner (H-B-F). - -``` -+----------------------------------------------------+ -| | -| +---+ +---+ +---+ +-----------+ | -| | T | | T | | T | | Corner | | -| +---+ +---+ +---+ | Booth | <-- key | -| | (semi- | observation -| +==========================| private) | position | -| | BAR COUNTER +-----------+ | -| | (high visibility) | -| +========================== | -| | -| +---+ +---+ +---+ | -| | T | | T | | T | | -| +---+ +---+ +---+ | -| | -| +------------------+ +---------+ | -| | News Ticker | | Back | <-- alley exit | -| | Display | | Room | | -| +------------------+ +---------+ | -| | -| [ENTRANCE] | -+----------------------------------------------------+ -``` - -**How this serves the triangles:** - -- **Card Game Debt (D-G-F):** D and G at a table visible from the bar counter. F observes from behind the bar. The corner booth covers the card table -- observation position for both characters. - -- **Worried Partner (H-B-F):** H sits at the bar counter (visible). Where B sits signals relationship state -- with H (normal) or at a separate table (avoidance, noteworthy). F observes from behind the bar. - -- **The corner booth** is the most loaded piece of furniture in the game. From here: the bar counter (H, regulars), the card table area (D, G), the entrance (who comes and goes), and the back room door are all visible. For the smuggler: where ring contacts meet. For the detective: the surveillance perch. Same seat, different purpose. - -### Smuggling Spaces -- Serving the Access Tier Model - -NOT a separate building. The ring operates in: restricted storage (hub), maintenance corridors, dead-drop locations in transition areas. - -**Design principle: The ring is invisible.** Meeting points have legitimate mundane purposes. Their ring function is only apparent if you know what to look for. The smuggler navigates naturally. The detective must DISCOVER these spaces -- following an NPC, finding corridors not on official maps, noticing recently-used maintenance hatches. - -**The spatial layout encodes information asymmetry in the map itself.** Same physical space, different player understanding of it. - ---- - -## 6. Visual Treatment of THE FRIEND - -Ozzie's Round 1 makes the case: THE FRIEND is designed to deliver D-027 success criterion #3 ("player names an NPC they felt conflicted about"). Project lead confirms: one per character, production-level complex. - -### Should THE FRIEND Look Different? - -**Yes, but through EARNED visual detail, not special status marking.** - -### The Visual Progression - -**Phase 1: Before Contradiction (minutes 1-15)** - -THE FRIEND is visually identical to other friendly NPCs. Same green rectangle, same label format. What makes them distinct is NOT rendering: -- **Label detail:** Their name shows from the start (not "Worker" or "?"). The character KNOWS this person. -- **Monologue frequency:** The character's thoughts reference THE FRIEND more often. Text creates attachment, not visuals. -- **Spatial proximity:** THE FRIEND's routine keeps them near the player. They're visually present more often. - -This matters: THE FRIEND should NOT look special at first. If they look different, the player knows to pay attention. The point is natural attachment, then the contradiction hits. - -**Phase 2: After Contradiction Discovery (mid-session)** - -When the player observes THE FRIEND's contradictory behavior: -1. **Color shift:** Entity color transitions from green (`#6bc9a6`) to amber (`#e8c547`). Smooth 0.5s fade. The relationship-to-player color system working as designed -- the character now has QUESTIONS. -2. **Observation marker:** The eye icon appears alongside the monologue about the contradiction. Same icon used for all observations, but applied to someone the player trusted. - -**The moment the rectangle shifts from green to amber IS THE FRIEND's visual moment.** It should be the first relationship color change in the session. If it's the FIRST color shift the player sees, they'll feel it -- because until now, colors have been static. The system proving it's dynamic ON a character the player cares about is the visual punch. - -**Phase 3: Production-Level Treatment (planned, partially v0.1)** - -When we move beyond boxes-with-labels: -- **Unique sprite.** Not dramatically different -- recognizably distinct. Where flat NPCs share sprite templates, THE FRIEND gets unique proportions, posture, one identifying accessory. -- **Behavioral animation states.** Minimum two: their "normal" state and their "hiding something" state. -- **Memory echo.** In the "remembered" fog state, THE FRIEND's ghost lingers longer. Their desaturated outline fades last. Subliminal signal that the character can't stop thinking about them. - -### v0.1 Production Budget for THE FRIEND - -- **Entity rendering:** Identical to other NPCs (colored rectangle, name label). No special rendering. -- **Color behavior:** Standard relationship color system, but designed so this NPC is MORE LIKELY to transition mid-session. The color spec must handle smooth transitions. -- **Writing investment:** The visual spec for THE FRIEND is actually a writing spec -- ensure Mellanie has enough monologue lines to create attachment before the contradiction. - -**The visual treatment of THE FRIEND is mostly about what we DON'T do.** We don't mark them as special. We let writing and routines create attachment. Then the standard color-shift delivers the punch. - ---- - -## 7. Visual Asset Taxonomy (Wiki Structure) - -Project lead: full taxonomy, future-ready, non-negotiable. - -``` -assets/ - visual/ - style-guide/ - v0.1-visual-grammar.md # Root document - color-palette.md # All color definitions + usage rules - entity-rendering-rules.md # Sizing, labels, color mapping - fog-rendering-spec.md # Four-state visibility - typography.md # Font choices, text hierarchy - ui/ - insert/ - hud-wireframe.md # Insert overlay layout - smuggler-variant.md # Smuggler lattice profile - detective-variant.md # Detective lattice profile - poi-markers.md # POI icon definitions - monologue/ - display-spec.md # Typography, animation, stacking - character-variants.md # Per-character text style - dialogue/ - panel-spec.md # Dialogue UI layout - name-header-rules.md # NPC name + relationship color - environmental-text/ - signage-styles.md # In-world text rendering - terminal-screens.md # Interactive screen format - news-ticker.md # Ticker display format - sound-indicators/ - fog-edge-pulse.md # Visual sound indicator spec - close-range.md # LOS sound indicators - insert-alerts.md # Long-range notification style - spatial/ - sova-logistics-hub/ - floor-plan.md # Tile-level layout - sightline-analysis.md # Observation positions, blind spots - sound-propagation.md # Thin/thick walls, bleed zones - npc-positions.md # Routine phase positions - approach-vectors.md # Player entry + first impressions - sova-bar/ - floor-plan.md - sightline-analysis.md - sound-propagation.md - npc-positions.md - approach-vectors.md - sova-smuggling-spaces/ - floor-plan.md - sightline-analysis.md - sound-propagation.md - npc-positions.md - approach-vectors.md - corridors-transitions/ - district-connectivity.md # How zones connect - chokepoint-analysis.md # Cross-template encounter points - entities/ - npc/ - relationship-color-spec.md # Color mapping + transitions - label-rules.md # Name/role/unknown display rules - the-friend-treatment.md # Production-level NPC visual spec - flat-npc-templates.md # Shared visual templates - objects/ - furniture.md # Sizing, color, interaction markers - doors.md # Open/closed/locked states - terminals.md # Interactive object visual - environment/ - span-gate-glow.md # Signature visual element - lighting-zones.md # Per-zone lighting spec - construction-eras.md # Wall/floor variation by age - sprites/ # FUTURE: when we move beyond boxes - characters/ - objects/ - tiles/ - effects/ -``` - -Every folder exists even if files are stubs. New locations slot into `spatial/` with the same structure. Sprites slot into `sprites/` following entity definitions already established. This scales to full game without reorganization. - ---- - -## 8. Complete Dependency Chain (All Teams) - -``` -PHASE 0: WORKSHOP OUTPUT (we are here) - | - v -PHASE 1: FOUNDATION (parallel, no cross-dependencies) - | - |-- [Araminta] v0.1 Visual Grammar Document - |-- [Miri] Finalize Sova Setting Brief (Round 1 is nearly complete) - |-- [Paula] Dual Lens Authoring Guide (draft) - | - v -PHASE 2: SPATIAL + CHARACTER (mostly parallel, one sync point) - | - |-- [Araminta] Spatial layouts (3 sites) - | depends on: Visual Grammar + Miri's setting - | | - | +--- SYNC POINT: Paula reviews against relationship web - | | (one feedback round, then layouts lock) - | - |-- [Araminta] Insert/HUD wireframe (parallel) - |-- [Araminta] Monologue display spec (parallel) - |-- [Araminta] Sound indicator design (parallel) - |-- [Paula] Relationship web + NPC profiles - |-- [Mellanie] Voice kits + monologue starters - | - v -PHASE 3: CONTENT PRODUCTION - | - |-- [Mellanie] Content packs (#190-192) - | depends on: Spatial layouts (locked), NPC profiles, format - |-- [Araminta] Environmental text visual placement - |-- [Araminta] THE FRIEND visual spec (needs Paula's NPC profiles) - | - v -PHASE 4: INTEGRATION - | - |-- Specs handed to Stig (UI) + Dudley (server) - |-- Araminta reviews implementation against specs -``` - -**The Visual Grammar Document is my Phase 1 deliverable. Zero dependencies. I can start today.** - ---- - -## 9. Answering Specific Round 1 Asks - -### For Mellanie: "Tell me the visual fidelity target" - -**Maximum text density.** The colored rectangles communicate game state (who's friendly, where's the fog). They don't communicate mood, personality, or social dynamics. All that burden falls on text. - -Concrete display constraints (pending full spec): -- Monologue: max ~80 characters per line (60% screen width at default font), max 3 visible lines -- Dialogue: max ~100 characters per line in dialogue panel -- Environmental text: 8-40 characters for labels, up to 200 for terminal screens -- News ticker: single scrolling line, ~60 character visible window - -### For Paula: "Should the insert carry character-specific visual language?" - -**Yes. One parameterized system, two profiles.** See insert section above. The `lattice_profile` loads POI categories, notification format, data density, and annotation style per character. No extra development cost -- just data. - -### For Ozzie: "Does it need mood?" - -**It needs three things: a color palette, lighting variation, and one signature element.** That's the span gate glow, the zone palettes, and the three-zone lighting model. Not polish -- MOOD through restraint. The gap between "readable prototype" and "world I'm stepping into" is these three things. - -### For Gestalt: Spatial requirements - -**Confirmed.** Each spatial layout includes: one publicly accessible area with hidden back section, one area with smuggler-natural access, one chokepoint where cross-template encounters happen. The main corridor in the logistics hub is the primary chokepoint. The bar entrance + counter serve as social observation chokepoint. - ---- - -## 10. Immediate Next Steps - -1. **Write v0.1 Visual Grammar Document.** One page. Color palette (locked), entity sizing, label conventions, UI layers, fog spec. No dependencies. Can start today. - -2. **Draft spatial layouts for Sova's three social sites.** Based on Miri's zones + Paula's relationship web + Gestalt's spatial requirements. Submit to Paula for review. - -3. **Design insert/HUD wireframe.** Two variants. Based on Paula's access tier model + Miri's lattice descriptions. - -4. **Write monologue display spec.** Typography, positioning, animation, stacking. Gives Mellanie her display constraints. - -5. **Design sound indicators.** Fog-edge pulse icons complementary to 6-8 audio files. - -6. **Spec THE FRIEND's visual treatment.** After Paula's NPC profiles exist. - ---- - -## Summary Position - -Round 1: "The entity color system is the single most important visual DECISION." -Round 2: **"The spatial layouts are the single most important visual DELIVERABLE."** - -The color system is confirmed and locked. Good. Now: does the physical space support the relationship web, the access tier model, the observation gameplay, and the dual-lens experience? If sightlines are wrong, no dialogue tagging saves the investigation. If chokepoints don't exist, cross-template encounters don't happen. If the bar doesn't have that corner booth, Paula's card game triangle has nowhere to play out. - -The spatial layouts are where abstract systems become concrete games. Where Paula's 7 triangles become observable social dynamics. Where Gestalt's access tiers become physical spaces. Where Mellanie's 900 lines have rooms to live in. - -I can start the Visual Grammar today. Spatial layouts begin as soon as the workshop concludes. - -Keep it clean, we can layer detail later. - ---- - -*Written by Araminta. Round 2 synthesis complete.* diff --git a/docs/workshops/content-gap-analysis_v0_1/round2-gestalt.md b/docs/workshops/content-gap-analysis_v0_1/round2-gestalt.md deleted file mode 100644 index da0e9083f..000000000 --- a/docs/workshops/content-gap-analysis_v0_1/round2-gestalt.md +++ /dev/null @@ -1,591 +0,0 @@ -# Round 2: Gestalt (Systems Design) - Synthesis - -**Workshop:** v0.1 Content Gap Analysis -**Date:** 2026-02-11 -**Scope:** Mechanical convergence across all Round 1 outputs + Jeroen's Round 2 directives - ---- - -## 0. Directives Acknowledged - -Before I get into synthesis, let me confirm the constraints from Jeroen's Round 2 direction. These are locked. No further debate: - -| Directive | Status | Mechanical Implication | -|-----------|--------|----------------------| -| Separate monologue pools per character | **Confirmed, non-negotiable** | Two parallel content trees. `character` is a hard partition tag, not a filter. | -| Color = relationship to player | **Approved** | Entity color is a client-side derivation from `RelationshipState` component + knowledge state. Not an NPC property. | -| Audio included in v0.1 | **Confirmed** | 6-8 AI-generated files. Sound event system architecture must support this. Visual fallback for everything beyond those files. | -| One NPC per character = THE FRIEND | **Confirmed** | Two production-level NPCs. Full pipeline depth test. All systems exercised on these two. | -| Wiki structure for taxonomy | **Non-negotiable** | Miri handling. Tag taxonomy I define here must integrate with wiki structure. | -| Line pool format (YAML) | **Needs validation** | Mellanie and Paula must sign off. That's what this section does. | - ---- - -## 1. Converged Line Pool Format - -*Let me break down what this actually means mechanically.* Three people proposed tag schemas in Round 1. Let me reconcile them. - -### Schema Comparison - -| Tag | Gestalt R1 | Mellanie R1 | Paula R1 (implied) | Converged | -|-----|-----------|-------------|-------------------|-----------| -| `id` | `{template}_{type}_{###}` | `{template}-{role}-{situation}-{##}` | Not specified | **Keep Gestalt format** — machine-parseable, stable | -| `text` | string | string | string | **Keep** | -| `role` / `speaker` | `role` (enum per template) | `speaker` (enum per template) | Implied by NPC profile | **`role`** — the template role, not the NPC name. NPC assignment is runtime. | -| `character` | N/A (on monologue only) | `character` (smuggler/detective/any) | Implied | **`character`** — but ONLY on monologue lines. Dialogue lines are character-agnostic; the access tier handles filtering. | -| `access` | list\ | single enum | Per-line, hard filter | **list\** — a line can be eligible for multiple access tiers | -| `trust` | enum (surface/real/secret) | enum (same) | Three disclosure tiers, progressive | **Aligned. No change.** | -| `situation` | list\ | list\ | Relationship history + context | **list\** — see converged situation taxonomy below | -| `topic` | list\ | single enum | Mood + topic for Layer 4 | **list\** — lines can cover multiple topics | -| `mood` | list\ | single enum | Mood for weighted selection | **list\** | -| `location` | N/A (implicit from file) | enum | N/A | **Drop from line-level.** Location is implicit from the file's directory. Adding it per-line is redundant and an error source. | -| `type` | N/A (implicit from file) | `type` (dialogue/monologue/env/ticker) | N/A | **Drop from line-level.** Content type is implicit from file name (dialogue.yaml vs monologue.yaml). | -| `tags` | list\ freeform | N/A | N/A | **Keep** — escape hatch for author intent that doesn't fit taxonomy | -| `dual_lens` | map (per-character notes) | N/A | Critical for authoring | **Keep** — authoring-only, not consumed by engine | -| `notes` | string | N/A | N/A | **Keep** — authoring-only | -| `trigger` | On monologue only | N/A | N/A | **Keep for monologue** — the observation event that fires the line | -| `prerequisite` | On monologue only | N/A | N/A | **Keep for monologue** — knowledge state gate | - -### Converged Tag Taxonomy — FINAL (pending Mellanie/Paula sign-off) - -**Structural tags (required on every dialogue line):** - -| Tag | Type | Values | Maps to D-028 Layer | -|-----|------|--------|---------------------| -| `id` | string | `{template}_{d\|m\|e}_{###}` | N/A (indexing) | -| `text` | string | The authored line | N/A (content) | -| `role` | enum | Template-defined roles | N/A (speaker assignment) | -| `access` | list\ | `public`, `insider`, `authority`, `peer`, `hostile` | **Layer 1** (hard filter) | -| `trust` | enum | `surface`, `real`, `secret` | **Layer 3** (hard filter) | -| `situation` | list\ | See taxonomy below | **Layer 2** (context filter) | - -**Selection tags (recommended, fallback to defaults if empty):** - -| Tag | Type | Values | Maps to D-028 Layer | Default | -|-----|------|--------|---------------------|---------| -| `topic` | list\ | See taxonomy below | **Layer 4** (weighted selection) | `[general]` | -| `mood` | list\ | See taxonomy below | **Layer 4** (weighted selection) | `[neutral]` | -| `tags` | list\ | Freeform | N/A (author use) | `[]` | - -**Authoring-only tags (not consumed by engine):** - -| Tag | Type | Purpose | -|-----|------|---------| -| `dual_lens` | map | Per-character interpretation notes | -| `notes` | string | Author intent, dependencies, context | - -**Monologue-specific tags (in addition to above):** - -| Tag | Type | Values | Purpose | -|-----|------|--------|---------| -| `character` | enum | `smuggler`, `detective` | **Hard partition.** Separate pools per Jeroen's directive. | -| `trigger` | enum | See trigger taxonomy below | Observation event that fires this line | -| `prerequisite` | map or null | Knowledge state conditions | Gate: line only eligible if character knows X | - -### Alignment with Paula's Four Layers - -This is the critical validation. Does the converged schema express all four D-028 layers? - -| D-028 Layer | How It's Expressed | Tag(s) | Filter Type | -|-------------|-------------------|--------|-------------| -| **Layer 1: Access tier** | `access` tag on every line. Engine checks player character's current access tier at the NPC's social site. | `access` | **Hard filter.** Line invisible if access doesn't match. | -| **Layer 2: Relationship history** | `situation` tag + engine-tracked interaction state. Engine maintains per-NPC counters (interaction_count, last_interaction_time, notable_events). These counters activate/deactivate situation eligibility. `first_meeting` is true once. `repeated_visit` activates after 3+ visits. `greeted_before` is tracked by engine, not tagged per-line. | `situation` + engine state | **Context filter.** Narrows eligible pool based on relationship progression. | -| **Layer 3: Trust-gated gossip** | `trust` tag on every line. Engine tracks trust progression per NPC (starts at surface, can reach real/secret through repeated positive interactions). | `trust` | **Hard filter.** Line invisible if current trust level is below line's trust tier. | -| **Layer 4: Unprompted disclosure** | `topic` + `mood` tags. Engine selects from eligible lines (post-Layer 1/2/3 filtering) weighted by match between NPC's current mood state and line's mood tag, and between NPC's current concern topics and line's topic tag. | `topic` + `mood` + engine state | **Weighted selection.** Soft ranking, not hard filter. Neutral mood always available as fallback. | - -**Verdict: The converged schema fully expresses all four layers.** Layers 1 and 3 are hard filters (binary tag match). Layer 2 is engine-state-to-situation mapping. Layer 4 is weighted selection across two tag dimensions. - -Paula's concern about `greeted_before:true` — this is NOT a per-line tag. It's engine state. The engine tracks whether these characters have met before and activates the `first_meeting` or `repeated_visit` situation accordingly. The content author doesn't tag individual lines with interaction history — they tag situations, and the engine decides which situations are active. - -### Key Changes from My Round 1 Proposal - -1. **Dropped `location` from line-level tags** — location is directory-level. This removes a redundancy Mellanie flagged. -2. **Dropped `type` from line-level tags** — content type is file-level. This reduces Mellanie's 8 tags to 6 structural + 2 selection = 8 total, but 2 fewer per-line. -3. **Added `character` as monologue-only hard partition** — confirms Jeroen's directive mechanically. -4. **Clarified that `access` is list, not single** — a line can be eligible for both `insider` and `peer`. -5. **Made `topic` and `mood` list types** — a line can cover multiple topics and be appropriate for multiple moods. - -### Situation Taxonomy v0.1 (Converged) - -Merged from my Round 1 list + Mellanie's proposal: - -| Situation | Description | Activation | -|-----------|-------------|------------| -| `greeting` | First interaction this game-day | Engine: no interaction logged today | -| `first_meeting` | Characters have never interacted | Engine: interaction_count == 0 | -| `routine` | Normal daily activity | Engine: NPC in scheduled routine state | -| `morning` / `afternoon` / `evening` / `night` | Day phase (D-031) | Engine: current SimulationTime phase | -| `repeated_visit` | Player has visited this NPC 3+ times | Engine: interaction_count >= 3 | -| `interrogation` | Player is asking pointed questions | Engine: dialogue topic escalation detected | -| `witnessed_secret` | Player has observed something they shouldn't | Engine: KnowledgeInventory contains secret-tagged fact about this NPC | -| `idle` | NPC is between scheduled activities | Engine: NPC routine state = idle | -| `working` | NPC is performing job routine | Engine: NPC routine state = job | -| `social` | NPC is in social activity (bar, break) | Engine: NPC routine state = social | -| `confrontation` | Triangle tension has escalated | Engine: triangle pressure threshold exceeded | -| `post_event` | Responding to a recent simulation event | Engine: event log contains recent entry for this NPC | -| `absence_noticed` | An expected NPC is missing | Engine: NPC not in expected location during expected time | - -**13 situations for v0.1.** Mellanie's `gossip` and `observed_anomaly` situations are covered by `social` + topic filtering and `post_event` respectively. I'm not adding them as separate situations because they're better expressed as topic + mood combinations. - -### Topic Taxonomy v0.1 - -| Topic | Description | -|-------|-------------| -| `work` | Job-related: tasks, schedules, complaints | -| `social` | Relationships, personal life, family | -| `cargo` | Freight, manifests, shipments — setting-specific | -| `money` | Finances, costs, spending | -| `rumors` | Gossip, hearsay, speculation | -| `identity` | Who someone is, where they're from, what they do | -| `deflection` | Avoiding a topic, changing subject | -| `complaint` | Grievances, frustrations | -| `general` | Weather, food, neutral small talk | - -**9 topics for v0.1.** Mellanie's `crime` topic is deliberately excluded — NPCs don't think of what they do as "crime." It's `cargo` or `money` from their perspective. The dual-lens interpretation is what makes those topics crime-adjacent for the detective. - -### Mood Taxonomy v0.1 - -| Mood | Description | -|------|-------------| -| `neutral` | Default state. Calm, unremarkable. | -| `happy` | Positive, upbeat, satisfied | -| `tired` | Low energy, going through motions | -| `annoyed` | Irritated, short-tempered | -| `nervous` | Anxious, fidgety, checking surroundings | -| `defensive` | Guarded, deflecting, walls up | -| `friendly` | Warm, open, welcoming | -| `cautious` | Careful, measuring words | - -**8 moods for v0.1.** Mellanie's `tense`, `relaxed`, and `suspicious` map to `nervous`, `happy`/`neutral`, and `cautious` respectively. I'm consolidating to prevent near-duplicate moods that make authoring harder without adding selection granularity. - -### Monologue Trigger Taxonomy v0.1 - -Unchanged from Round 1. 9 triggers: - -| Trigger | Description | -|---------|-------------| -| `enter_location` | Player enters a new area | -| `observe_npc` | Player sees NPC doing something notable | -| `hear_sound` | Sound event from fog edge | -| `observe_anomaly` | NPC deviates from known routine | -| `post_conversation` | After dialogue ends | -| `discover_evidence` | Player examines an informational object | -| `witness_interaction` | Player sees two NPCs interacting | -| `time_idle` | Player hasn't acted for a while | -| `return_visit` | Player returns to a previously visited area | - ---- - -## 2. Mellanie's Tag Proposal vs. Mine — Convergence - -Mellanie proposed 8 tags. I proposed a more granular set. Here's where we landed: - -| Mellanie's Tag | My Tag | Resolution | -|---------------|--------|------------| -| `character` | `character` (monologue only) | **Aligned.** Monologue-only, hard partition. Not on dialogue lines. | -| `access` | `access` | **Aligned.** I upgraded to list\; she had single. List is correct. | -| `trust` | `trust` | **Aligned.** Identical. | -| `location` | (directory-level) | **Dropped from per-line.** Directory structure handles this. Mellanie agreed provisional format is fine. | -| `situation` | `situation` | **Aligned.** Her values are a subset of mine. Using the full 13-situation taxonomy. | -| `mood` | `mood` | **Aligned.** Consolidated to 8 moods. | -| `topic` | `topic` | **Aligned.** Expanded to 9 topics. | -| `type` | (file-level) | **Dropped from per-line.** File naming convention handles this. | - -**Net result: 6 per-line structural tags + 3 per-line selection/freeform tags = 9 tags per dialogue line.** For monologue lines: +3 monologue-specific tags = 12 tags per monologue line. - -**Mellanie's "tag smoke test" request is smart.** Before she writes 165 lines for the workplace, she writes 20, tags them, and I validate the filtering behavior. This should happen as the first line previewer test case. - ---- - -## 3. THE FRIEND: Production-Level NPC Specification - -*Okay, let me map this to mechanics.* Jeroen says THE FRIEND is a production-level complex NPC — one per character, full pipeline depth test. Ozzie defined the emotional design in Round 1. Let me define what "production-level" means for the ECS and content pipeline. - -### What "Production-Level" Means Mechanically - -THE FRIEND exercises every system we're building. It's the NPC that proves the pipeline works end-to-end: - -| System | What THE FRIEND Tests | Minimum Requirement | -|--------|----------------------|---------------------| -| **10-axis model (D-024)** | All 10 axes populated with meaningful values that change during play | Axes must shift in response to simulation events | -| **Access tiers (D-028 L1)** | THE FRIEND has different access tiers per character | Smuggler: `insider`+`peer`. Detective: varies (starts `public`, can reach `peer`) | -| **Relationship history (D-028 L2)** | Interaction count tracked, situation progression works | `first_meeting` -> `greeting` -> `repeated_visit` must trigger different lines | -| **Trust progression (D-028 L3)** | Trust level advances through positive interactions | Surface -> Real progression visible in dialogue depth change | -| **Unprompted disclosure (D-028 L4)** | THE FRIEND volunteers information when mood + topic align | At least 3 unprompted lines that fire based on NPC mood state | -| **Tell system** | Observable behavioral markers for internal state | All 5 tell categories must be demonstrable on THE FRIEND | -| **Routine system** | Predictable daily schedule with deviations | Morning/afternoon/evening locations defined. At least 1 deviation event | -| **Triangle membership** | Belongs to at least 1 triangle | Triangle pressure must affect THE FRIEND's behavior observably | -| **Contradiction arc (Ozzie)** | Discoverable through observation, not dialogue | The contradiction must emerge from routine deviation + tell, then be confirmed/complicated by dialogue | -| **Monologue integration** | Player character comments on THE FRIEND specifically | Named monologue lines referencing THE FRIEND's behavior, not generic role observations | -| **Dual-lens divergence** | Same NPC, fundamentally different relationship per character | THE FRIEND is a different person emotionally to the smuggler vs. detective | - -### THE FRIEND: ECS Component Profile - -Each FRIEND NPC needs these components at minimum: - -``` -Entity: THE_FRIEND_smuggler / THE_FRIEND_detective - -Components: - - NpcIdentity { name, role, home_template, reference_templates[] } - - Want { current_want, intensity, blocked_by } - - Secret { content, known_by[], exposure_risk } - - Relationships[3] { target_entity, valence, trust_level, interaction_count, last_interaction } - - ToleranceThreshold { current_value, max_value, triggers[] } - - DailyRoutine { schedule: Map, deviations[] } - - InformationInventory { known_facts[], rumors[], secrets_held[] } - - Contentment { value, trend, causes[] } - - PersonalityTraits { trait_a, trait_b, trait_c } - - TellState { active_tells: Map } - - SkillSet { skills[], combat_trained: bool } - - AccessTierMap { Map } // per-observer access - - TriangleMembership { triangle_ids[], role_in_triangle: Map } - - MoodState { current_mood, trend, causes[] } -``` - -### THE FRIEND: Content Requirements - -**Per FRIEND NPC, Mellanie needs to author:** - -| Content Type | Volume | Notes | -|-------------|--------|-------| -| Dialogue lines (all access tiers) | 25-35 lines | Must cover public, insider, peer, hostile. More lines than any other NPC. | -| Trust-gated dialogue (surface/real/secret) | 15-20 lines | Including at least 3 `secret`-tier lines that reveal the contradiction | -| Unprompted disclosure lines | 5-8 lines | Mood-triggered, topic-relevant. THE FRIEND initiates conversation. | -| Monologue lines (smuggler reacting to FRIEND) | 10-15 lines | Named references. "There goes Kael." Not "That dock worker." | -| Monologue lines (detective reacting to FRIEND) | 10-15 lines | Different framing. Analytical, not personal. | -| Tell observation monologue | 5-8 lines per character | "Kael's tapping his foot again." / "Subject displays stress indicators." | -| Contradiction discovery monologue | 3-5 lines per character | The moment the player realizes THE FRIEND isn't what they seemed | - -**Total per FRIEND: ~70-100 authored lines** (including both character perspectives). This is roughly half the content budget of an entire template's dialogue pool — for one NPC. That's the cost of production-level. It's worth it because this NPC carries D-027 success criterion #3. - -### THE FRIEND: Mapping to Paula's NPCs - -Looking at Paula's Round 1 relationship web: - -| Character | THE FRIEND candidate | Why | -|-----------|---------------------|-----| -| **Smuggler** | **NPC-B** (Logistics Worker 1 / Kael Davan) | Smuggler's closest colleague. Ring member. Works together daily. Trust + shared risk = deepest pre-existing bond. Contradiction: Kael is reliable to the smuggler, but is cracking under pressure / making mistakes / possibly considering turning. | -| **Detective** | **NPC-D** (Dock Inspector) or **NPC-G** (Security Officer) | The detective needs a contact who becomes a relationship. NPC-D has the gambling debt (exploitable, sympathetic). NPC-G has institutional proximity (a peer the detective trusts professionally). **Recommendation: NPC-D** — the gambling debt creates the contradiction (seems corrupt, might just be desperate) and connects to Triangle B (Card Game Debt). | - -Paula should confirm these assignments in her Round 2. The FRIEND NPCs are the first profiles she should write at Tier 1 depth. - ---- - -## 4. Missing Tickets for Systems/Mechanical Work - -I've cross-referenced all Round 1 outputs against the existing ticket pool. Here are the systems tickets that should exist but don't (or need upgrading): - -### New Tickets Needed - -| Title | Type | Priority | Rationale | Depends On | -|-------|------|----------|-----------|------------| -| **Dialogue selection pipeline implementation** | Feature | Critical | The 4-layer filtering engine: access -> situation -> trust -> weighted(mood, topic). This is the core runtime system that makes content playable. Nothing in the existing tickets covers the actual selection algorithm. | Line pool format (this document), NPC component architecture | -| **Monologue trigger system** | Feature | Critical | Engine component that fires monologue events based on observation triggers (enter_location, observe_npc, etc.). Must select from character-specific pool, apply prerequisite gates, track variety (no repeats). | Perception system (#124), Character knowledge state | -| **NPC mood state machine** | Feature | High | NPCs need a mood component that changes based on simulation events (triangle pressure, time of day, recent interactions). Mood drives Layer 4 selection + tell system. | 10-axis NPC components | -| **Trust progression system** | Feature | High | Engine tracks trust level per player-NPC pair. Progresses through surface -> real -> secret based on interaction quality and frequency. Must be observable (player can sense trust improving). | Relationship tracking, dialogue system | -| **Interaction tracking component** | Feature | High | Per-NPC-pair counter: interaction_count, last_interaction_time, notable_events log. Drives Layer 2 situation activation. | NPC component architecture | -| **Tell state derivation system** | Feature | Medium | System that reads NPC axis values (Secret + Tolerance = nervous, Contentment low = frustrated, etc.) and outputs observable tell states consumed by monologue trigger system. | 10-axis NPC components, monologue trigger system | -| **Sound event system architecture** | Feature | High | Event emitter for sound occurrences. Emits typed events (footsteps, voices, machinery, alarm) with position, intensity, and range. Client renders as audio file OR visual indicator + monologue, depending on available assets. | Perception system (#124) | -| **YAML content loader** | Feature | High | Rust system that parses content YAML files into indexed, queryable line pools at startup. Must support hot-reload for previewer/authoring workflow. | Line pool format (this document) | -| **Line variety tracker** | Feature | Medium | Prevents the same line from firing repeatedly. Tracks recently-used line IDs per NPC per session. Selects from eligible pool excluding recent history. | Dialogue selection pipeline | -| **Knowledge state component** | Feature | High | Per-character component tracking known facts, tagged by source, confidence, and emotional weight. Gates monologue prerequisites and informs situation activation. Paula's `KnowledgeInventory` proposal. | NPC component architecture | -| **Observation event generator** | Feature | Critical | System that detects observable NPC behaviors (routine deviation, interaction between NPCs, absence from expected location) and generates events consumed by monologue trigger system. This is the bridge between simulation and player perception. | NPC routine system, perception system | -| **Tag taxonomy wiki page** | Documentation | High | The converged taxonomy from this document, formatted for the wiki structure Miri is building. Reference document for all content authors. | This document, Miri's wiki structure | -| **THE FRIEND: Smuggler's NPC profile** | Story | Critical | Full Tier 1 profile for the smuggler's FRIEND (NPC-B / Kael Davan). All 10 axes, voice paragraph, triangle positions, contradiction arc. | Dual Lens Guide (#261) | -| **THE FRIEND: Detective's NPC profile** | Story | Critical | Full Tier 1 profile for the detective's FRIEND (NPC-D / Dock Inspector). Same depth. | Dual Lens Guide (#261) | - -### Existing Tickets That Need Scope Updates - -| Ticket | Current Scope | Needed Addition | -|--------|--------------|-----------------| -| #90 (Tell system) | Unclear | Scope to 5 tell categories (nervous, angry, friendly, guarded, routine deviation). Text-via-monologue as v0.1 renderer, not visual animation. | -| #124 (Sound system) | Unclear | Must include sound event emitter architecture supporting both audio playback AND visual indicator fallback. See Section 6 below. | -| #193 (Line previewer) | "Authoring tool" | Concrete MVP scope defined. See Section 7 below. | -| #168 (Tag taxonomy) | "Agreement needed" | This document IS the agreement. Ticket should be updated to reference this converged taxonomy. | - ---- - -## 5. How Mechanical Systems Support Content Needs - -*Let me map every content need from Round 1 to a mechanical system.* This is the crosswalk that ensures nothing falls through the cracks. - -### Content Need -> System Mapping - -| Content Need (from Round 1) | Required System | Status | Gap? | -|-----------------------------|----------------|--------|------| -| Dialogue lines filtered by access tier | Dialogue selection pipeline (Layer 1) | **Not built** | YES - needs ticket | -| Dialogue changes based on relationship history | Interaction tracking + situation activation (Layer 2) | **Not built** | YES - needs ticket | -| Trust-gated disclosure | Trust progression system (Layer 3) | **Not built** | YES - needs ticket | -| NPCs volunteer information based on mood | NPC mood state machine + weighted selection (Layer 4) | **Not built** | YES - needs ticket | -| Monologue fires on observation events | Observation event generator + monologue trigger system | **Not built** | YES - needs ticket | -| Separate monologue per character | Character-partitioned content pools | **Not built** | Covered by YAML loader + `character` tag | -| Tells observable through monologue | Tell state derivation + monologue integration | **Not built** | YES - needs ticket | -| NPC routine creates observable patterns | NPC routine system (D-024 Daily routine axis) | **Partially ticketed** | Needs scope for deviations and absence detection | -| Dual-lens interpretation of same event | Per-character monologue pools + knowledge prerequisites | **Not built** | Covered by monologue trigger system + `prerequisite` field | -| Mirror moments on replay | Same trigger, different character pool | **Architectural** | Covered by design — separate pools keyed to same triggers | -| Flat NPCs don't feel flat | Routine system + 1 memorable trait + role voice pool | **Not built** | Personality trait modifier in dialogue selection | -| THE FRIEND contradiction arc | Triangle pressure + tell escalation + routine deviation | **Not built** | Composition of several systems (triangle, tell, routine) | -| Environmental text readable in world | Environmental text rendering in Godot client | **Not built** | Needs client-side ticket | -| News ticker / Meridian feed | Ticker content system + time-based rotation | **Not built** | Needs ticket for both content + rendering | -| Audio atmosphere (6-8 files) | Sound event system + audio playback | **Not built** | YES - see Section 6 | -| Diegetic tutorial via monologue | Opening hook monologue + trigger on first-time events | **Not built** | Covered by monologue trigger system + `first_meeting` / first-visit gates | - -**Summary: 17 content needs, 0 fully built, 12 need new tickets, 5 covered by existing ticket scope updates.** - -The critical path for systems is: - -``` -NPC Component Architecture (10 axes) - | - +-> NPC Routine System - | | - | +-> Observation Event Generator - | | - | +-> Monologue Trigger System - | - +-> NPC Mood State Machine - | | - | +-> Tell State Derivation - | - +-> Interaction Tracking - | | - | +-> Trust Progression - | - +-> YAML Content Loader - | - +-> Dialogue Selection Pipeline (4 layers) - | - +-> Line Variety Tracker -``` - -Everything fans out from the NPC component architecture. That's Sprint 1 server work. The YAML loader and dialogue pipeline can be developed in parallel once the component schema is stable. - ---- - -## 6. Audio Event System: Minimal Architecture - -Jeroen confirmed audio in v0.1: 6-8 AI-generated files. Ozzie's minimum viable list from Round 1: - -1. Station ambient loop (1 file) -2. Location variants: workplace, bar, corridors (3 files) -3. Footsteps — walk/run (2 files) -4. Monologue appearance chime (1 file) -5. (Optional) UI interaction sound (1 file) - -**That's 7-8 files.** Here's the minimal architecture that supports them while remaining extensible: - -### Sound Event System Architecture - -``` -[Simulation Server] - SoundEventEmitter - - emits: SoundEvent { type, position, intensity, range_category } - - types: Footstep, Voice, Machinery, Alert, Ambient - - range_category: Close, Medium, Long (D-018) - | - v -[ObserverSnapshot] - sound_events: Vec // only events within perception range - | - v -[Godot Client] - SoundRenderer - - receives SoundEvents from snapshot - - looks up audio asset for event type - - if asset exists: play audio (with distance attenuation + stereo panning) - - if asset missing: render visual indicator + fire monologue trigger - | - +-> AudioAssetRegistry - | Maps SoundEvent.type -> audio file path (or null) - | v0.1 registry: - | Footstep -> footstep_walk.ogg, footstep_run.ogg - | Ambient(workplace) -> ambient_workplace.ogg - | Ambient(bar) -> ambient_bar.ogg - | Ambient(corridor) -> ambient_corridor.ogg - | Alert(monologue) -> monologue_chime.ogg - | * -> null (visual fallback) - | - +-> VisualSoundIndicator - | Renders fog-edge ripple/pulse for events without audio - | Color-coded per Araminta's spec: - | neutral (#c8d0e0), voices (#e8c547), danger (#d45d5d) - | - +-> AmbientManager - Manages location-based ambient loops - Crossfades between ambient tracks on location transition - The span gate hum (Miri's suggestion) is the base layer -``` - -### Key Design Principles - -1. **Events first, assets second.** The simulation always emits sound events. The client decides how to render them. Zero audio files = everything renders as visual + monologue. 8 files = partial audio with visual fallback for the rest. Full audio suite = rich soundscape. The architecture doesn't change. - -2. **The ambient manager is separate from event-driven sounds.** Ambient loops play continuously based on location. Sound events are discrete occurrences (footsteps, voices, alerts). These are two different subsystems that share the audio output. - -3. **Monologue chime is a UI sound, not a simulation sound.** It's triggered by the client when monologue text appears, not by the simulation. It doesn't go through the SoundEvent system. - -4. **Distance attenuation is simple for v0.1.** Close range = full volume. Medium range = 50% volume + slight muffle. Long range = no direct audio (insert notification only). Three tiers, not continuous falloff. - -### What This Requires from Implementation - -- **Server side:** `SoundEventEmitter` system that checks entity actions each tick and emits typed events. Perception filter includes events within hearing range in `ObserverSnapshot.sound_events`. -- **Client side:** `SoundRenderer` node in Godot that processes snapshot sound events. `AudioAssetRegistry` as a simple dictionary. `VisualSoundIndicator` for fog-edge rendering. `AmbientManager` for location loops. -- **Asset pipeline:** 7-8 .ogg files, generated or sourced. Integrated into Godot project's audio resources. - -This is a small architecture for a large capability surface. It handles v0.1's 8 files and scales to hundreds without structural changes. - ---- - -## 7. Line Previewer (#193): Concrete MVP Scope - -The line previewer was flagged by me, Mellanie, and Ozzie in Round 1 as critical. Let me scope the MVP concretely. - -### What the Previewer Does - -The previewer answers one question: **"Given this NPC state and this player state, what line fires?"** - -It's the authoring equivalent of a compiler — it tells the content author whether their tags produce the intended behavior before the line is integrated into the game. - -### MVP Feature Set - -| Feature | Description | Priority | -|---------|-------------|----------| -| **Load YAML** | Parse a content YAML file (dialogue or monologue) into indexed pool | Must have | -| **Set filter context** | CLI arguments or interactive prompts for: access tier, trust level, active situations, NPC mood, topic filter, character (for monologue) | Must have | -| **Show matching lines** | Display all lines that pass the 4-layer filter with the given context | Must have | -| **Show selected line** | Apply weighted selection to show which single line would fire | Must have | -| **Explain selection** | Show WHY each line was included/excluded (which filter passed/failed) | Must have | -| **Sequence mode** | Play N lines in order simulating a walk-through (Ozzie's "preview sequence" request) | Should have | -| **Coverage report** | Show which access/trust/situation combinations have zero eligible lines (dead conversation detection) | Should have | -| **Hot reload** | Watch YAML file for changes, re-run filter on save | Nice to have | -| **Batch validation** | Run all YAML files through a consistency checker (missing required tags, invalid enum values, duplicate IDs) | Should have | - -### Implementation - -**Language: Rust.** The previewer should use the same YAML parser and selection logic that the game server will use. This means the previewer IS a test harness for the dialogue pipeline — if the previewer selects correctly, the game will select correctly. - -**Interface: CLI.** No GUI needed. Terminal output with color-coded pass/fail on filters. - -``` -# Show what the detective hears from a dock_worker at insider access, surface trust, -# morning routine, neutral mood -$ cargo run --bin previewer -- \ - --file content/templates/logistics-hub/dialogue.yaml \ - --role dock_worker \ - --access authority \ - --trust surface \ - --situation greeting,morning,routine \ - --mood neutral \ - --verbose - -[PASS] access=authority [PASS] trust=surface [PASS] situation=greeting - -> lh_d_002: "You're new around here? Or just... visiting?" - topic=[social, identity] mood=[cautious, neutral] weight=0.85 - -[PASS] access=authority [PASS] trust=surface [FAIL] situation=first_meeting (requires interaction_count==0) - -> lh_d_005: "Morning. Can I help you with something?" - (excluded: situation mismatch) - -Selected: lh_d_002 (weight: 0.85, variety_penalty: 0.0) -``` - -### Sequence Mode (Ozzie's Request) - -``` -$ cargo run --bin previewer -- \ - --file content/templates/bar/monologue.yaml \ - --character smuggler \ - --sequence enter_bar \ - --mood neutral - -[Sequence: enter_bar — smuggler] -1. (enter_location) "The Last Shift. Lera's already got my usual poured." -2. (observe_npc) "Kael's at the corner booth. He looks rough tonight." -3. (observe_npc) "Drin's telling the same story again. Third time this week." -4. (time_idle) "Should probably check in with Kael. He doesn't usually drink alone." -``` - -This gives Mellanie and Ozzie a way to "feel" the content flow without running the full game. It's the emotional smoke test. - -### Effort Estimate - -The previewer shares 80% of its code with the dialogue pipeline implementation. Building it first means the pipeline is already tested when it's integrated into the server. The unique work is the CLI interface, the verbose explain mode, and the sequence playback — maybe 2-3 days of Dudley/Tyre's time on top of the pipeline work they'd do anyway. - -**Recommendation: Build the previewer AS the first implementation of the dialogue pipeline.** Don't build them separately. The previewer is the pipeline running in standalone mode with verbose output. - ---- - -## 8. Cross-Agent Synthesis: Convergence Map - -Here's where every Round 1 contributor's proposals landed after synthesis: - -### Fully Aligned (no further discussion needed) - -| Topic | Status | Contributors Aligned | -|-------|--------|---------------------| -| Separate monologue pools per character | **Locked** (Jeroen directive) | All | -| Color = relationship to player | **Locked** (Jeroen directive) | Araminta (proposed), Gestalt (endorsed) | -| YAML as authoring format | **Aligned** | Gestalt (proposed), Mellanie (accepted with conditions) | -| 5 tell categories for v0.1 | **Aligned** | Gestalt (proposed), Araminta (visual notes), Ozzie (emotional validation) | -| Diegetic tutorial via monologue | **Aligned** | Gestalt (mechanical), Mellanie (content), Paula (narrative) | -| 30/50/20 entanglement ratio | **Aligned** (D-029 confirmed) | All | -| Monologue is v0.1 tell renderer | **Aligned** | Gestalt, Araminta, Mellanie | - -### Converged in This Document - -| Topic | Resolution | Key Decision | -|-------|-----------|--------------| -| Tag taxonomy | Converged 8-tag system (6 structural + 2 selection + freeform) | See Section 1 | -| Situation taxonomy | 13 situations from Gestalt + Mellanie merge | See Section 1 | -| Access tier model | list\ with 5 values | Gestalt's model, Paula's content, aligned | -| Line pool file structure | Directory = template/location, file = content type | Dropped per-line location and type tags | -| THE FRIEND mechanical spec | Full pipeline depth test with ~70-100 authored lines per NPC | See Section 3 | -| Audio architecture | Event-driven with asset registry + visual fallback | See Section 6 | -| Line previewer MVP | Rust CLI sharing pipeline code, 7 must-have features | See Section 7 | - -### Needs Round 2 Confirmation from Others - -| Topic | Who Needs to Confirm | What I Need | -|-------|---------------------|-------------| -| Converged tag taxonomy | **Mellanie** | Can you author with 6+3 tags per line? Is the mood/topic consolidation workable? | -| Converged tag taxonomy | **Paula** | Does the Layer 2 approach (engine-state-to-situation mapping, not per-line relationship tags) satisfy your 4-layer requirements? | -| THE FRIEND NPC assignments | **Paula** | Confirm NPC-B (Kael) for smuggler, NPC-D for detective. Or propose alternatives. | -| Miri's setting tags | **Miri** | Your proposed `lattice_tier`, `shift_phase`, `district_familiarity`, `institutional_context` — these should be engine-state context, not per-line tags. The engine knows the player is a newcomer; it activates `first_meeting` situations. Do you agree? | -| Spatial layout timing | **Araminta** | Your spatial layouts are needed before or in parallel with content packs. Confirmed? Can they be done independently of content? | -| Audio asset creation | **Ozzie** | 7-8 AI-generated files. Who generates them? What's the quality bar? Do we need a ticket for audio asset generation? | - ---- - -## 9. Emergent Interactions: Where Systems Collide - -*This is my favorite part.* Let me map the places where independently designed systems will interact to produce emergent gameplay — the stuff nobody scripted. - -### Interaction Map - -| System A | System B | Emergent Result | -|----------|----------|----------------| -| **NPC Routine** + **Observation Events** | Player sees NPC in unexpected place at unexpected time | Monologue fires: "That's not where they usually go." Player decides to follow or ignore. Neither designer planned the specific moment. | -| **Trust Progression** + **Triangle Pressure** | NPC's trust in player increases while triangle pressure increases | NPC discloses something they shouldn't under pressure. The disclosure is selected by the dialogue pipeline combining high trust + high stress mood. Not scripted — emergent from system state. | -| **Access Tier Shift** + **Monologue Dual-Lens** | Player's access tier changes at a social site (e.g., detective becomes a bar regular) | New dialogue lines become available AND the monologue reflects the shift ("They're starting to warm up to me"). The player FEELS the social change through two channels simultaneously. | -| **Sound Events** + **Fog of Perception** + **Monologue** | Player hears voices through a wall they can't see past | Sound event at fog edge -> visual indicator -> monologue interprets ("Sounds like an argument. Can't make out the words.") Player decides to move closer or not. The three systems produce a decision point. | -| **THE FRIEND Contradiction** + **Tell System** + **Monologue** | THE FRIEND's tell state escalates (nervous) while their dialogue stays friendly | The player gets conflicting signals: dialogue says "everything's fine," monologue says "they keep checking the door." The player must decide which signal to trust. Asymmetric information within a single NPC. | -| **NPC Mood** + **Time Phase** + **Unprompted Disclosure** | An NPC's mood worsens over the course of a day; by evening at the bar, they're drunk and frustrated | Layer 4 selects from `mood: [annoyed, tired]` + `trust: real` pool. The NPC says something they wouldn't have said that morning. Time + mood + alcohol = emergent information leak. | - -**This is why systems-first design works.** None of these moments are scripted events. They're collisions between independently designed systems operating on shared state. The content authors write the individual lines; the systems decide when and how those lines combine. The result is stories the designers didn't anticipate. - ---- - -## 10. Open Questions for Round 3 / Sprint Planning - -| Question | Owner | Context | -|----------|-------|---------| -| Does the 4x generation expansion apply to THE FRIEND's custom lines? Or are all 70-100 hand-authored? | Mellanie + Gestalt | Generation expansion on high-specificity NPC lines risks losing the hand-crafted voice. Recommend: no expansion on FRIEND lines. Every line hand-authored. | -| Who creates the 7-8 audio files? | Ozzie + Justine | AI-generated is confirmed, but the pipeline needs defining. Which AI tool? What format? Who evaluates quality? | -| Should the line previewer be a sprint deliverable or a tooling side-project? | Tyre + Dudley | I recommend sprint deliverable — it's the dialogue pipeline in standalone mode. Building it IS building the pipeline. | -| How does the knowledge prerequisite system handle "partial knowledge"? | Gestalt + Paula | A monologue line gated on `knows: smuggling_operation` — does the player need to know the full operation, or just that something suspicious is happening? Need a knowledge hierarchy: `suspects` < `knows_of` < `knows_details`. | -| Triangle pressure threshold — what triggers escalation? | Gestalt + Paula | Triangles need a numeric pressure value that increases based on events. When it crosses a threshold, `confrontation` situation activates. Need to define the events that increase pressure. | - ---- - -*Gestalt out. The taxonomy is converged. The FRIEND is specified. The audio architecture is minimal and extensible. The previewer is scoped. Now we need Mellanie and Paula to validate the tag schema, and Dudley to start building the NPC component architecture. The systems are ready to support the content. Let's build.* diff --git a/docs/workshops/content-gap-analysis_v0_1/round2-mellanie.md b/docs/workshops/content-gap-analysis_v0_1/round2-mellanie.md deleted file mode 100644 index 9a2821b47..000000000 --- a/docs/workshops/content-gap-analysis_v0_1/round2-mellanie.md +++ /dev/null @@ -1,355 +0,0 @@ -# Round 2 — Mellanie's Content Synthesis - -**Agent:** Mellanie (Copywriter) -**Date:** 2026-02-11 -**Scope:** Cross-agent synthesis, dependency chain, work order, concrete next steps - ---- - -## 1. Reactions to Round 1 Outputs - -### Miri's Sova Transit District: Does it give me what I need? - -**Almost. It's good. A few gaps.** - -The Sova Transit District brief is the best setting document I've gotten on any project. The sensory details are exactly what I asked for — smells (industrial lubricant, recycled air, cooking, ozone-and-metal from the span gate), sounds (cargo machinery, span gate hum, ventilation), temperature variation. These go straight into monologue. That "quotidian-with-undertow" description is the atmosphere I'm writing to. - -What I can now write that I couldn't before: -- Location-entry monologue for all three social sites -- Environmental text grounded in Krenn System culture -- News ticker content using Concordat Standard / Meridian terminology -- NPC greetings using Sova naming conventions (Kael, Voss, Drin, Lera, Torek, Maret) - -**What's still missing from my perspective:** - -1. **Slang and idiom.** Miri gave me naming conventions and cultural posture, but I need speech texture. Do Sova workers say "shift" or "rotation"? "Gate" or "transit"? "Credits" or something local? Do they swear, and if so, how? Three to five colloquialisms would anchor every line of dialogue in the setting. Without them I'll invent them, and we risk inconsistency. - -2. **The bar's name.** Miri proposed "The Last Shift." That works. But she also used "Lera's — Cold Drinks, Hot Food, No Questions" on a sign. Are these the same place? I need the canonical bar name locked so every reference is consistent. **Proposal: "The Last Shift" is the official name. "Lera's" is the informal name used by regulars. Both coexist.** This is itself a worldbuilding detail — the smuggler calls it "Lera's," the detective's case file says "The Last Shift, licensed establishment, District 7." - -3. **The logistics hub name.** Miri called it "The Terminal." Is that the colloquial name or the official one? Same question. **Proposal: "Sova Transit Freight Terminal" is official. "The Terminal" is what everyone calls it. The smuggling ring calls it nothing — they just say "the dock" or "work."** - -4. **One more constraint: what CAN'T be said on the Meridian?** Miri mentioned off-Meridian communication for the ring. For dialogue writing, I need to know what NPCs self-censor in public channels vs. voice. If the Meridian is monitored, every NPC who knows about the ring has a public voice and a private voice. That's a dialogue-level split I need to author for. - -**Bottom line: Miri gave me 90% of what I need. The remaining 10% is speech-level detail I can resolve in a short back-and-forth.** - -### Gestalt's YAML Line Pool Format: Does it work for me? - -**Yes. With one modification and two clarifications.** - -The YAML format Gestalt proposed is clean, readable, and writable. The tag taxonomy covers the four D-028 layers. The file structure (`content/templates/{site}/dialogue.yaml` etc.) is logical. The example entries read like content I'd actually author. I can work in this format starting now. - -**One modification — the `dual_lens` field:** - -Gestalt put `dual_lens` as an authoring-only tag with per-character notes. That's useful during writing, but I want it to DO something in the previewer too. When I preview a line, I want to see: "If the smuggler triggers this line's context, which OTHER lines (from the smuggler's monologue pool) might fire as a reaction?" The dual_lens field should cross-reference monologue trigger IDs, not just carry prose notes. - -Proposed change: -```yaml -dual_lens: - smuggler_context: "Routine shop talk. But Taliesin shipments are your cover run." - smuggler_monologue_ref: [lh_m_015, lh_m_016] # monologue lines that pair with this - detective_context: "Cargo volume anomaly. Worth checking manifests." - detective_monologue_ref: [lh_m_042, lh_m_043] -``` - -This connects dialogue to monologue at the authoring level. When I write a dialogue line, I can immediately link the monologue reactions. The previewer shows the full chain: NPC says X, smuggler thinks Y, detective thinks Z. - -**Two clarifications I need:** - -1. **Character-specific monologue files vs. shared monologue files.** Gestalt's structure has `templates/{site}/monologue.yaml` — one monologue file per location. But Jeroen confirmed separate pools per character. So do I write `templates/logistics-hub/monologue-smuggler.yaml` and `templates/logistics-hub/monologue-detective.yaml`? Or one file with `character: smuggler` / `character: detective` tags filtering within it? **I prefer separate files.** Two files per location, one per character. Cleaner authoring, no risk of accidentally sharing lines between pools. - -2. **The `prerequisite` field on monologue lines.** Gestalt used `prerequisite: { knows: smuggling_operation }` — a knowledge state check. Who defines the knowledge state vocabulary? I need a list of knowledge flags so my monologue prerequisites reference real engine state, not invented strings. **Gestalt or Dudley needs to define the v0.1 knowledge state vocabulary before I write monologue lines with prerequisites.** - -**Bottom line: The YAML format works. I'm adopting it. Separate monologue files per character. Need the knowledge state vocabulary defined.** - -### Paula's Dual Lens Guide and Relationship Web - -Paula's work is the narrative architecture I build on. Her proposed guide contents are exactly right — core identity, emotional starting state, what they notice, what they miss, relationship defaults, the divergence escalation curve. The relationship web with 15 NPCs, 7 triangles, and 6 bridge connections is rich enough without being bloated. - -**One thing I need from Paula that wasn't in Round 1:** The voice paragraph for each character. Not the narrative identity — the *speech pattern*. My Round 1 asked for five things: voice signature, what they notice, relationship to authority, what they lie about, emotional baseline. Paula gave me the narrative framework for all five. Now I need them translated into speech: - -- Does the smuggler think in short sentences or long ones? -- Does the detective use contractions in their inner monologue? -- When the smuggler is nervous, do they get quieter or louder? -- When the detective is frustrated, do they get clinical or profane? - -These are the micro-decisions that determine whether 500 lines sound like the same person or a committee. - -### Araminta's Visual Identity - -Araminta's color-as-relationship-state proposal is brilliant and directly affects my work. If color carries the asymmetric information visually, my monologue doesn't need to constantly explain WHO people are to the player. The smuggler sees green (friendly) and I don't need "That's Kael, my shift partner" — the color already said "you know this person." My monologue can skip identification and go straight to observation: "Kael's early. That's not like him." - -**Araminta's monologue presentation spec also answers my density question.** Max 3 lines visible, fade in/out, priority system (observation > atmosphere > tutorial). This means my lines need to be SHORT. One sentence, maybe two. Never three. The display area is small and fleeting. Every word earns its place or gets cut. - -**Her character-differentiated monologue color** (smuggler slightly warmer, detective slightly cooler) is a subtle touch that supports my voice differentiation. The reader's eye will associate color temperature with character register before they consciously parse it. Good. - -### Ozzie's Emotional Map and THE FRIEND - -Ozzie's emotional journey table is the sequence I'm writing to. Every gap he flagged is a content deliverable on my list. His instinct about THE FRIEND — the NPC designed for emotional contradiction — aligns exactly with what I need to write the most important dialogue in the game. - -His note about flat NPCs being "load-bearing for the investigation mechanic" is correct and important. The flat NPC voice kits aren't filler work. They're the noise floor that makes signal detectable. If the noise sounds fake, the signal is too easy to find. - ---- - -## 2. How THE FRIEND Changes My Content Pack Approach - -Jeroen's directive: one NPC per character should be "THE FRIEND" — production-level complex. Full profile, full voice kit, full dialogue, full tell system, full contradiction arc. The rest stay v0.1 simple. - -**This fundamentally restructures my writing priorities.** - -Before: I was planning to write template content packs (role voice kits, situation scripts) and then layer NPC-specific lines on top. Bottom-up. Generic first, specific later. - -Now: THE FRIEND gets written FIRST. Top-down for the most important NPC, then bottom-up for everyone else. - -**Why this is the right call:** - -THE FRIEND is our quality benchmark. If I write them at full depth — every dialogue layer working, every tell authored, the contradiction arc fully scripted — that becomes the reference implementation for the content pipeline. Every other NPC is a simplified version of THE FRIEND. The template system, the YAML format, the tag taxonomy, the previewer — they all get stress-tested on one NPC before I scale to fifteen. - -**What THE FRIEND needs (per character):** - -| Deliverable | Volume | Purpose | -|-------------|--------|---------| -| Full voice kit | 15-20 sample lines across all moods | The character's complete speech pattern | -| Greeting pool | 8-10 lines (access-filtered) | First contact variations: insider vs outsider vs authority | -| Trust-gated dialogue | 15-20 lines across surface/real/secret | Progressive revelation through repeated interaction | -| Routine dialogue | 10-12 lines | What they say during normal daily activity | -| Contradiction dialogue | 8-10 lines | The lines that reveal the contradiction — the lies, the deflections, the slip-ups | -| Monologue reactions (per PC) | 10-15 lines per character | How the smuggler and detective each interpret THE FRIEND's behavior | -| Tell descriptions | 5-8 lines per character | Observable behavioral markers that hint at the hidden truth | -| Post-discovery dialogue | 5-8 lines | How they talk after the player knows something is off | -| **Total per FRIEND NPC** | **~75-100 authored lines** | Production-quality NPC | - -Two FRIEND NPCs = ~150-200 authored lines. That's a significant chunk of the total content budget (~900-1200 lines). Worth it. These are the NPCs that prove the game works. - -**Who is THE FRIEND for each character?** - -Paula's relationship web has the answer: - -- **Smuggler's FRIEND: NPC-B (Logistics Worker 1 / Kael Davan).** The smuggler's closest colleague. Reliable ring member. The smuggler's anchor. The contradiction: Kael is considering cooperating with authorities (or has a secret the smuggler doesn't know about). The smuggler trusts Kael completely — and that trust is what makes the betrayal devastating. - -- **Detective's FRIEND:** This is harder because the detective starts as an outsider. The detective's FRIEND isn't a pre-existing relationship — it's a relationship BUILT during the session. **Proposal: the detective's FRIEND is NPC-F (bar owner / Lera Sessik).** The bartender who becomes the detective's primary social contact. Helpful, warm, seems to genuinely like the detective. The contradiction: Lera knows about the smuggling ring and has been providing cover. The detective's best source of social intelligence is also the ring's most effective shield. - -Paula — I need your sign-off on these two FRIEND assignments before I start writing. - ---- - -## 3. Missing Tickets Identified from All Round 1 Outputs - -Reading all six outputs, I'm seeing deliverables referenced that don't have tickets. Here's what's missing: - -| Proposed Ticket | Owner | Priority | Rationale | -|-----------------|-------|----------|-----------| -| **THE FRIEND: Smuggler's NPC (Kael Davan) — full content pack** | Mellanie + Paula | Critical | Production-level NPC. Full voice kit, full dialogue, full tell system, full contradiction arc. Tests entire pipeline. | -| **THE FRIEND: Detective's NPC (Lera Sessik) — full content pack** | Mellanie + Paula | Critical | Same as above, detective perspective. | -| **Sova Transit District slang and idiom guide** | Miri | High | Speech-level setting detail needed before dialogue authoring. Colloquialisms, register differences, what's said on-Meridian vs off. | -| **Knowledge state vocabulary for v0.1** | Gestalt + Dudley | High | List of knowledge flags (e.g., `knows: smuggling_operation`, `met: kael_davan`) that monologue prerequisites reference. Blocks monologue authoring. | -| **Opening hook content — smuggler** | Mellanie | Critical | First 10-15 monologue lines. Diegetic tutorial. Sets voice, teaches mechanics, establishes motivation. | -| **Opening hook content — detective** | Mellanie | Critical | Same for detective. | -| **Monologue files: separate per character per location** | Mellanie | High | 6 monologue files total (2 characters x 3 locations). Confirmed by Jeroen: separate pools, non-negotiable. | -| **Audio: minimum viable sound set (6-8 files)** | TBD (AI-generated) | Medium | Station ambient, 3 location variants, footsteps, monologue chime. Jeroen confirmed for v0.1. | -| **Wiki taxonomy structure** | Miri + Qatux | Critical | Full taxonomy of characters, factions, lore, star systems, technology. Jeroen: non-negotiable, must be established NOW. | -| **Line pool format specification (formal document)** | Gestalt | High | Gestalt proposed the YAML format in Round 1. Needs to be a standalone spec document, not buried in a workshop output. | -| **Spatial layout designs — 3 social sites** | Araminta | High | Floor plans, sightlines, NPC positions. Araminta identified this in Round 1. Directly affects content (what can be overheard from where). | -| **Dual Lens Authoring Guide** | Paula | Critical | Paula proposed writing it. The single most important pre-content document. Blocks everything downstream. | -| **Character voice speech patterns** | Paula + Mellanie | High | The speech-level detail from my 5 asks in Round 1. Blocks voice kits. | -| **Mirror moment design document** | Paula + Mellanie | Medium | 10-15 scripted dual-perspective observation triggers. Blocks the most impactful monologue content. | - -Some of these may overlap with existing tickets (#189, #190-192, #261, etc.). Si should cross-reference and create only what's genuinely new. - ---- - -## 4. Dependency Chain: What Must Come Before What - -Here's the full content dependency chain, updated with Round 1 inputs and Jeroen's directives: - -``` -Phase 0: FOUNDATIONS (parallel work, no dependencies between them) - | - |-- Miri: Sova slang/idiom guide - |-- Miri + Qatux: Wiki taxonomy structure - |-- Gestalt: Line pool format spec (standalone document) - |-- Gestalt + Dudley: Knowledge state vocabulary - |-- Paula: Dual Lens Authoring Guide (draft) - |-- Araminta: v0.1 Visual Grammar document - | -Phase 1: CHARACTER ARCHITECTURE (needs Phase 0) - | - |-- Paula + Mellanie: Character voice speech patterns - | | - | v - |-- Mellanie: Smuggler voice kit (needs speech patterns + Dual Lens Guide) - |-- Mellanie: Detective voice kit (needs speech patterns + Dual Lens Guide) - | -Phase 2: THE FRIEND (needs Phase 1 voice kits) - | - |-- Paula: THE FRIEND profiles (Kael + Lera) — full Tier 1 NPC profiles - | | - | v - |-- Mellanie: THE FRIEND content packs (full dialogue + monologue + tells) - | | - | v - |-- VALIDATION: Play-test THE FRIEND content through previewer - | — Does the voice sound right? - | — Does the contradiction land? - | — Does the tag system produce correct line selection? - | -Phase 3: OPENING HOOKS (parallel with Phase 2) - | - |-- Mellanie: Opening hook — smuggler (10-15 lines, diegetic tutorial) - |-- Mellanie: Opening hook — detective (10-15 lines, diegetic tutorial) - | -Phase 4: REMAINING NPCs (needs Phase 2 validation) - | - |-- Paula: NPC profiles (remaining 13 NPCs, Tier 1-3) - |-- Mellanie: NPC voice paragraphs for triangle/entangled NPCs - | -Phase 5: CONTENT PACKS (needs Phase 4) - | - |-- Mellanie: Logistics Hub content pack (#190) - |-- Mellanie: Bar content pack (#191) - |-- Mellanie: Smuggling Ring content pack (#192) - | -Phase 6: POLISH CONTENT (needs Phase 5) - | - |-- Mellanie: Environmental text (signs, terminals, notices) - |-- Mellanie: News ticker / Meridian feed (20-30 lines) - |-- Mellanie: UI microcopy - |-- Mellanie: Tell monologue lines (30-50 lines) - |-- Paula + Mellanie: Mirror moment pass - |-- Araminta: Spatial layouts (parallel with content packs) - |-- Audio: AI-generated sound set (parallel with content) -``` - -**Critical path: Paula's Dual Lens Guide -> Voice kits -> THE FRIEND -> Validation -> Scale.** - -If the Dual Lens Guide is delayed, everything downstream shifts. That's the single highest-risk dependency. - ---- - -## 5. My Proposed Work Order - -Here's what I'm proposing to work on, in sequence, with what I can start NOW vs. what's blocked: - -### Can start immediately (no dependencies): - -1. **Tag taxonomy smoke test.** Write 20 lines in Gestalt's YAML format covering one location (logistics hub), both characters' monologue, and dialogue across access tiers. Ship to Gestalt for validation. This tests the format before I scale. **~2 hours.** - -2. **Environmental text templates (generic).** Safety notices, terminal screens, door labels, shift schedule boards. These work in any station. I'll use Miri's Sova details where I have them, leave placeholders where I don't. **~3 hours.** - -3. **News ticker first draft.** 15-20 Meridian feed headlines using Miri's setting. "Concord Assembly approves Krenn System infrastructure allocation." "Span gate Terminal B maintenance: 0200-0400." "Security advisory: report unregistered freight to Commission terminal." These are cheap worldbuilding with high atmospheric return. **~2 hours.** - -### Needs Paula's Dual Lens Guide (Phase 0): - -4. **Smuggler voice kit.** 15-20 sample lines. Provisional until Paula validates. I'll write three voice options (sardonic-observational, anxious-relational, casual-competent) and let Paula pick. **~4 hours.** - -5. **Detective voice kit.** Same approach, three options (clinical-precise, weary-professional, sharp-intuitive). **~4 hours.** - -### Needs voice kit validation (Phase 1): - -6. **Opening hooks.** The first 10-15 lines each character thinks. The most important content in the game. These set voice, teach mechanics, and establish motivation simultaneously. Can't write them until the voice is locked. **~6 hours per character.** - -### Needs THE FRIEND profiles (Phase 2): - -7. **THE FRIEND: Kael Davan full content pack.** ~75-100 lines. Full voice kit, greeting pool, trust-gated dialogue, routine, contradiction arc, monologue reactions, tells. **~2 days.** - -8. **THE FRIEND: Lera Sessik full content pack.** Same depth. **~2 days.** - -### Needs remaining NPC profiles (Phase 4-5): - -9. **Content packs x3.** Logistics hub, bar, smuggling ring. ~55-70 dialogue + 30-40 monologue per pack. **~3-4 days total.** - -10. **Tell lines, mirror moments, UI copy.** Final polish pass. **~2 days.** - -**Total estimated writing time: ~12-15 working days for all v0.1 content.** - -That's achievable IF the dependency chain doesn't stall. The risk isn't my writing speed. The risk is waiting for inputs. - ---- - -## 6. Revised Content Volume Estimates - -With THE FRIEND approach and separate monologue pools confirmed, my Round 1 estimates need updating: - -| Category | Round 1 Estimate | Revised Estimate | Change | -|----------|-----------------|------------------|--------| -| Template dialogue (3 packs) | 500-600 | 400-500 | Reduced — THE FRIEND lines come out of the template budget | -| THE FRIEND: Kael (full pack) | (not estimated) | 75-100 | NEW — production-level NPC | -| THE FRIEND: Lera (full pack) | (not estimated) | 75-100 | NEW — production-level NPC | -| NPC-specific lines (~13 remaining) | 115-205 | 80-140 | Reduced — two major NPCs pulled into FRIEND category | -| Monologue — smuggler | 100-150 | 120-160 | Increased — separate pools means no shared lines | -| Monologue — detective | 100-150 | 120-160 | Same | -| Opening hooks (2 characters) | (included in monologue) | 20-30 | Broken out — these are the most important lines | -| Environmental text | 50-60 | 50-60 | Unchanged | -| News ticker / Meridian feed | 15-20 | 20-30 | Increased — Ozzie's right, cheap worldbuilding | -| UI microcopy | 20-30 | 40-50 | Increased — Gestalt's UI text inventory is larger | -| Tell monologue lines | (included in monologue) | 30-50 | Broken out — 5 categories x 3-5 lines x 2 characters | -| **Total authored** | **~900-1,215** | **~1,030-1,380** | | - -After 4x generation expansion on dialogue: **~3,200-4,200 total lines available to the system.** - -The increase comes from THE FRIEND approach (deeper content for two NPCs) and from breaking out content categories that were previously lumped together. The actual writing workload is similar — I'm just being more precise about what goes where. - ---- - -## 7. Concrete Asks and Open Questions - -### Asks (actions needed from specific people): - -| Ask | For Whom | Urgency | -|-----|----------|---------| -| Lock the Dual Lens Guide draft — this is the single biggest blocker | Paula | Immediate | -| Provide slang/idiom guide for Sova (5-10 colloquialisms, register rules) | Miri | High | -| Confirm bar name: "The Last Shift" / "Lera's" dual naming? | Miri | Quick answer | -| Confirm logistics hub name: "Sova Transit Freight Terminal" / "The Terminal"? | Miri | Quick answer | -| Define knowledge state vocabulary for monologue prerequisites | Gestalt + Dudley | High | -| Confirm or modify YAML format with my dual_lens cross-reference proposal | Gestalt | Medium | -| Confirm separate monologue files per character per location (not one file with character tags) | Gestalt | Medium | -| Sign off on THE FRIEND assignments (Kael for smuggler, Lera for detective) | Paula | High | -| Visual Grammar doc for my environmental text constraints (character limits, display rules) | Araminta | Medium | - -### Open questions I can't answer alone: - -1. **What does the generation pass actually do?** D-028 says "write 10, generate 40." But WHO generates? An LLM? A template-based system? Rule-based variation? I need to know because it affects how I write base lines. If the generator is an LLM, I need to write lines that are style-strong enough to anchor generation. If it's rule-based, I need to write lines with clear substitution patterns. - -2. **How does the previewer handle THE FRIEND's contradiction arc?** The previewer (#193) needs to simulate a SEQUENCE of interactions, not just single-line filtering. For THE FRIEND, I need to preview: "Meeting 1, the player gets surface lines. Meeting 3, they get real lines. Meeting 5, they get the contradiction. Meeting 6, post-discovery lines." Can the previewer handle temporal progression? If not, I'm testing the most important content blind. - -3. **Audio timing with monologue.** Jeroen confirmed a monologue chime in the audio set. When does it fire relative to the monologue text? Before? Simultaneous? Does it interrupt ambient audio or layer over it? I need this for writing rhythm — if there's a chime, my first monologue word needs to land AFTER the chime registers. That means the first word shouldn't be the important one. - ---- - -## 8. The Wiki Taxonomy - -Jeroen says a full wiki taxonomy must be established NOW. From a copywriting perspective, here's what the taxonomy needs to support my work: - -### Categories I need to reference while writing: - -| Category | Why I Need It | Examples | -|----------|---------------|---------| -| **Characters** | Every NPC I write dialogue for needs a canonical entry | Kael Davan, Lera Sessik, Voss, Torek Lintar | -| **Locations** | Every location-entry monologue references a place by name | Sova Transit District, The Last Shift, The Terminal | -| **Factions / Organizations** | Institutional references in dialogue and monologue | Lattice Commission, Concord Assembly, Syndic logistics consortium | -| **Technology** | Characters reference tech casually — I need consistent terminology | Lattice, Meridian, span gate, neural insert, Severance tech | -| **Star Systems** | Background references in news ticker and NPC dialogue | Krenn System, gate routes, planetary references | -| **Cultural Concepts** | Social norms, religions, philosophies characters reference | Unbound, Guardians/Severance, re-embodiment | -| **Contraband Types** | What the ring is actually smuggling — I need to write around it | Unlicensed lattice components, Severance tech, off-manifest biologicals | - -**Miri should own the taxonomy structure. Qatux should maintain it.** I'm a consumer of the wiki, not a producer — but I need it to exist before I write 1000+ lines that reference setting elements. - -**Minimum viable wiki for my purposes:** A single document with canonical names, brief definitions, and usage notes for each entry. Not a full encyclopedia — a reference card. "Lattice: neural implant technology. Everyone has one unless Unbound. Smuggler has Baseline tier. Detective has Augmented tier. Colloquial: 'lattice,' 'insert,' 'overlay.'" That's enough for me to write consistently. - ---- - -## 9. Summary: The Content Plan - -**Write THE FRIEND first. Scale from there.** - -The project lead's directive reshapes the content approach from bottom-up (templates first, NPCs later) to quality-first (one production NPC proves the pipeline, then scale). This is the right call. Here's the plan in three sentences: - -1. **Now:** Tag taxonomy smoke test, environmental text templates, news ticker draft. No dependencies. Start writing today. -2. **Next:** Voice kits and opening hooks as soon as Paula's Dual Lens Guide lands. THE FRIEND content packs immediately after. -3. **Then:** Validate THE FRIEND through the previewer. If it works, scale to all 15 NPCs and three content packs. If it doesn't, we learn what's broken before we've written 1000 lines. - -Scaffold. Validate. Scale. Same three words from Round 1. THE FRIEND is the validation step. - ---- - -*Mellanie out. Give me the voice, give me the friend, and I'll give you the words.* diff --git a/docs/workshops/content-gap-analysis_v0_1/round2-miri.md b/docs/workshops/content-gap-analysis_v0_1/round2-miri.md deleted file mode 100644 index 18ccea257..000000000 --- a/docs/workshops/content-gap-analysis_v0_1/round2-miri.md +++ /dev/null @@ -1,686 +0,0 @@ -# Round 2 — Miri's Worldbuilding Synthesis - -**Agent:** Miri (Worldbuilder & Setting Designer) -**Date:** 2026-02-11 -**Workshop:** v0.1 Content Gap Analysis — Round 2 -**Input:** All 6 Round 1 outputs (Mellanie, Paula, Araminta, Gestalt, Ozzie, Miri) - ---- - -## Part 1: The Krenn System Milestone - -Jeroen has flagged this and he's right to: **Sova Transit District in the Krenn System is the first concrete, named star system in The Settled Reach.** Everything before this was structural — factions, technology tiers, gate network topology. Sova is where the setting stops being architecture and starts being a *place*. - -This matters because every decision we make about Krenn sets precedent. The naming conventions, the cultural texture, the economic model, the institutional presence — whatever we establish here becomes the reference point for every system we build afterwards. "Is this consistent with how we did Krenn?" will be the first question for every future location. - -Let me check my Round 1 Sova brief against what the team needs, informed by their Round 1 outputs. - ---- - -## Part 2: How Sova Serves the Team (Cross-Referencing Round 1 Feedback) - -### For Mellanie — Texture, Not Lore - -Mellanie asked for five specific things (Round 1, Layer 3): smells, slang, wall decoration, ambient sound, local complaints. Let me check what my Round 1 provided and fill the gaps. - -| Mellanie's Ask | What I Provided (Round 1) | What's Still Missing | -|---|---|---| -| **Smells** | Industrial lubricant, recycled air, cooking, span gate ozone | Covered. Mellanie can write from this. | -| **Slang** | Naming conventions (Kael, Voss, Drin, etc.), first-name-primary culture | **Missing: occupational slang.** Do dock workers say "shift" or "rotation"? "Credits" or a local term? "Container" or "pod" or "crate"? Need a 15-word slang glossary. | -| **Wall decoration** | Bilingual signage (Concordat Standard + Krenn vernacular), hand-lettered informal signs | **Missing: non-institutional decoration.** Is there graffiti? Stickers? Shift change artwork? Personal touches on lockers? The *human mark* on the institutional surface. | -| **Ambient sound** | Span gate hum, cargo machinery, ventilation, bar clinks | Covered. Ozzie wants audio files; at minimum these descriptions feed monologue. | -| **Local complaint** | Implied (economic pressure, tight-enough-to-be-tempting wages) | **Missing: a specific, named grievance.** Every community has one. Suggestion: the ventilation in Sector 3 has been unreliable for months. Station maintenance says it's on the list. Everyone mentions it. It's the universal safe topic — and for the detective, it's useful: people who are talking about ventilation are *not* talking about something else. | - -**Action item: Write a "Sova Texture Appendix" — 1 page covering slang glossary (15-20 terms), informal decoration details, the local complaint, and any other sensory details Mellanie needs. This unblocks her environmental text and monologue work.** - -### For Paula — Economic Engine and NPC Motivation - -Paula's Round 1 nailed the motivational chain: Station Economics -> Employment Pressure -> Individual Desperation -> Criminal Opportunity -> Social Complicity. My Round 1 Sova brief provides the economic engine (freight-based, steady-but-tight wages, Commission presence intermittent). Let me validate her specific requests: - -| Paula's Need | Status | -|---|---| -| The economic squeeze — what makes legitimate life just hard enough | **Covered.** "Comfortable enough to be complacent, tight enough that an extra income source is tempting." | -| The interdependencies — who benefits from the grey economy | **Partially covered.** My Round 1 notes that the bar benefits, that flat NPCs deliberately don't ask. Need to make this more explicit: the *community's immune system* framing (Paula's phrase) needs a concrete list of who benefits and how. | -| The recent pressure point — what changed recently | **Covered.** Three triggers: Commission liaison rotation (3 months), increased freight volume (6 weeks), detective arrival (2 weeks). | - -Paula's relationship web (15 NPCs, 7 triangles) is excellent architecture. My Round 1 NPC name suggestions (Kael, Voss, Lera, Torek, Drin, Maret) need to map onto her NPC-A through NPC-O structure. Let me do that explicitly: - -**Proposed Name Mapping (Miri names -> Paula's structure):** - -| Paula's ID | Role | Miri's Suggested Name | Notes | -|---|---|---|---| -| NPC-A | Shift Supervisor (Hub) | **Voss** | Authority figure. Surname usage by subordinates: "Supervisor Voss" or just "Voss." | -| NPC-B | Logistics Worker 1 (Hub, Ring bridge) | **Kael Davan** | The smuggler's closest colleague. First-name basis. | -| NPC-C | Logistics Worker 2 (Hub, new hire) | **Resha** | New, compact name. Slightly softer than the Krenn norm — could suggest off-system origin, which is *why* they ask too many questions. They haven't internalized "mind your business." | -| NPC-D | Dock Inspector (Hub, Bar bridge) | **Torek Lintar** | Reassigned from my Round 1 "getting sloppy" role to the compromised inspector. Same name works — Torek is the kind of name that sounds exhausted. | -| NPC-E | Maintenance Tech (Hub, flat) | **Drin** | Single name. The type who's been here long enough that nobody uses a surname. | -| NPC-F | Bar Owner (Bar, Ring bridge) | **Lera Sessik** | Reassigned from bartender to owner (Paula's structure has the owner as the key figure). Lera works — established, observant, careful. | -| NPC-G | Off-duty Security (Bar, Hub bridge) | **Harek** | New name. Compact, military-adjacent. Someone who sits at the bar with the posture of a person who's technically off-duty. | -| NPC-H | Regular / Teacher-Family (Bar) | **Maret Korr** | Reassigned from ring-adjacent freight scheduler to the worried partner. Maret is the name of someone with a life outside the docks — domestic, personal, the mundane anchor. | -| NPC-I | Bartender (Bar, flat) | **Sess** | Short, functional. Nickname from a longer name nobody uses. The kind of name that means "I've been behind this bar for years." | -| NPC-J | Drifter / New Arrival (Bar, flat) | **No fixed Krenn name** | If they're new, they might have a different naming convention — could be from a different system. This is itself a tell. Suggestion: **Olin** — slightly longer vowel, not Krenn-standard. | -| NPC-K | Ring Leader (Ring, Bar bridge) | **Devra** | New name. Needs to sound capable, not theatrical. Devra is compact, decisive. A name that works as a legitimate business operator and a criminal coordinator. | -| NPC-L | Courier (Ring, Hub bridge) | **Renn** | Short, kinetic. A name that moves. | -| NPC-M | Fence/Buyer (Ring, external) | **Off-system name** | Not Krenn convention. Suggestion: **Sabel** — slightly different phoneme pattern. External contacts should *sound* external. | -| NPC-N | Ring Member, wavering (Ring) | **Pell** | Small, vulnerable. A name that sounds like it could break. | -| NPC-O | Lookout/Runner (Ring, flat) | **Tav** | Clipped. Young. A name with no history yet. | - -Setting note — 15 names following the Krenn convention (compact, consonant-heavy, first-name-primary) with deliberate breaks for off-system characters. The naming itself is worldbuilding: when the detective hears "Sabel" among all these Krenn-standard names, their trained instinct should flag the phoneme difference. The smuggler already knows Sabel is from outside — it's just a name to them. - -### For Araminta — Visual Framework - -Araminta's spatial layout work (floor plans, sightline diagrams) needs setting constraints from me. My Round 1 covered the general feel (mid-Reach, 40 years old, layered construction), but she needs specifics: - -| Spatial Requirement | Setting Constraint | -|---|---| -| Logistics Hub layout | Modular prefab base, retrofitted partitions. Regular grid in the main bay, irregular in older back sections. At least one area where wall layers create hidden space between the original prefab shell and the interior partition. | -| Bar layout | Converted from an older use (originally a maintenance staging area?). The irregular layout is structural, not decorative — the booths were built into spaces that already existed. The back room is a genuine maintenance access that Lera has "adopted." | -| Smuggling spaces | NOT a dedicated room. Repurposed infrastructure — a maintenance corridor between two sections of the logistics hub where the old and new construction don't quite meet. Access through a service hatch in the break room area. The ring didn't build this space; they *found* it. | -| Transition zones | The corridor between the hub and the bar district is a chokepoint — everyone who goes from work to drinks passes through the same 40 meters of corridor. This is where the smuggler notices who's heading where, and where the detective can observe patterns. | - -Gestalt's Layer 3 note about spatial information asymmetry requirements (publicly accessible area with hidden back, area with smuggler-natural-access, cross-template chokepoint) is satisfied by this layout. - -### For Gestalt — Setting Tags Validated - -Gestalt's line pool format (YAML, 6 structural tags, 3 content tags) integrates cleanly with my setting-grounded tag proposals from Round 1. Cross-referencing: - -| Miri's Setting Tag | Maps to Gestalt's Schema | Notes | -|---|---|---| -| `lattice_tier` (baseline/augmented) | Could be a `character` filter or a `prerequisite` | Determines what the character's overlay shows. Detective's augmented lattice feeds different `observe_npc` monologue. | -| `shift_phase` (on_shift/off_shift/transition) | Maps to `situation` (routine/working/social) | Setting-grounded version of the same concept. Gestalt's taxonomy works; I'd add `shift_transition` as a situation value — that's when things happen in a freight district. | -| `district_familiarity` (local/newcomer) | Maps to `situation` (first_meeting vs. repeated_visit) | Already captured in Gestalt's situation taxonomy. | -| `institutional_context` (civilian/commission/syndic) | Subset of `access` tier | The detective registers as `authority` *because* of their Commission lattice signature. This is the setting-grounded explanation for why the access tier system works in-fiction. | - -**Setting validation: the tag taxonomy is consistent with established worldbuilding. No conflicts.** - -### For Ozzie — The First 30 Seconds - -Ozzie wants five things in the first 30 seconds: sound, movement, news ticker, something out the window, a named NPC. Let me check what the setting provides for each: - -1. **Sound:** The span gate hum. This is the "you're on a space station" signal, delivered continuously. Setting note — the hum *changes pitch* with traffic volume. Morning shift startup: it rises. Late night: it settles. The change is subtle enough that residents ignore it, but specific enough that monologue can reference it. - -2. **Movement:** NPCs heading to shift. The logistics hub runs on freight schedules — people move at predictable times. Game start for the smuggler should be just before shift change: people walking past, greeting each other, the district waking up. Game start for the detective should be mid-morning: the district is already active, and the detective is arriving into an established rhythm. - -3. **News ticker:** Covered in my Round 1 Layer 8. Three types: Concord Assembly proceedings (boring), freight market prices (relevant), Commission notices (pointed). Ozzie's specific suggestion ("Dock 7 maintenance: scheduled closure 14:00-18:00" / "Security reminder: report unregistered cargo") is exactly right and setting-consistent. - -4. **Something out the window:** Setting note — Sova Transit District is on a station. There should be at least one viewport or observation area showing the Krenn system's primary: a G-type star, slightly cooler than Sol, giving a faintly amber quality to natural light. The span gate terminal area has an observation gallery above the freight bays where you can see the gate itself — a ring structure that occasionally flickers with transit energy. This is the "you are in space" moment. - -5. **A named NPC within 10 seconds:** For the smuggler: Kael, walking the same direction, same shift. "There's Kael. Early for once." For the detective: an unnamed dockworker who becomes named through institutional query — "Dock worker, second shift. ID: Drin. No flags." The detective's first NPC contact is *mediated by their insert*, not personal familiarity. - ---- - -## Part 3: Contraband Resolution - -I proposed in Round 1 that the primary smuggled cargo should be **unlicensed lattice components** — aftermarket neural lattice modifications that bypass Commission regulation. After reading all Round 1 outputs, let me pressure-test this. - -**Does "unlicensed lattice components" work for each team member's needs?** - -| Team Member | Their Need | Does Lattice Contraband Serve It? | -|---|---|---| -| **Paula** | Moral ambiguity — the smuggling should be sympathetic | **Yes.** People want better lattice access than Commission-regulated channels provide. The ring isn't moving weapons; they're moving *capability*. The moral question ("Is it wrong to give people better brain implants?") is genuinely ambiguous. | -| **Mellanie** | Writable dialogue — NPCs should be able to discuss the cargo in ways that feel natural | **Yes.** Dock workers can reference "restricted components," "aftermarket inserts," "upgrade kits." The vocabulary is concrete and setting-specific. Not drugs, not weapons — tech. Workers might personally want some of this cargo. | -| **Gestalt** | Mechanical relevance — the contraband should connect to game systems | **Yes.** Lattice components connect to the lattice/insert system (D-013, D-017). A smuggled lattice upgrade could theoretically *change what the player can perceive*. This is a gameplay hook for future development: the smuggler could acquire enhanced perception through contraband, while the detective has it through institutional issue. | -| **Ozzie** | Emotional weight — the player should feel something about what's being smuggled | **Partially.** Lattice components are abstract. Need to ground them: a specific NPC who wants a lattice upgrade for their child (medical necessity, can't afford Syndic pricing) or a worker whose failing lattice could be replaced with aftermarket components but can't get Commission clearance. The *people who need the product* make the product emotionally real. | -| **Araminta** | Visual representation — contraband should be representable at boxes-with-labels fidelity | **Yes.** Cargo containers. Manifest discrepancies. Nothing that requires special visual treatment. | - -**Contraband decision: Unlicensed lattice components as primary cargo holds up.** Secondary cargo (Severance counter-surveillance tech, off-manifest biologicals) adds variety without changing the core moral dynamic. - -**One addition:** The specific lattice components being smuggled should include **medical-grade neural lattice replacements** diverted from Syndic supply chains. This adds a humanitarian dimension: some of this cargo is going to people whose lattices are degrading and who can't afford institutional replacement. The ring isn't just moving luxury upgrades — it's also moving healthcare. This deepens the moral ambiguity and gives NPCs like Maret (NPC-H) a personal stake: maybe their aging parent needs a lattice replacement they can't afford through legitimate channels. - ---- - -## Part 4: Missing Tickets for Worldbuilding Work - -After reviewing all Round 1 outputs, here are the worldbuilding tickets that don't exist yet: - -| Proposed Ticket | Priority | Type | Rationale | Depends On | -|---|---|---|---|---| -| **Sova Texture Appendix** (slang glossary, informal decoration, local complaints, sensory details) | Critical | Story | Mellanie's monologue and environmental text are blocked without this. | #189 (Cultural generation guide) — this is a sub-deliverable | -| **Krenn System Profile** (star type, settlement history, political position, economic role) | High | Story | The wiki's first star system entry. Establishes the template for all future systems. | Nothing — can start immediately | -| **Sova Station Profile** (station type, population, districts beyond the Transit District, governance) | High | Story | NPCs reference the wider station. Dialogue needs to know what's "off-district." | Krenn System Profile | -| **Contraband Specification** (primary: lattice components, secondary: Severance tech, biologicals; with supply chain details) | High | Story | Paula's NPC motivations and Mellanie's dialogue both need to know what's being smuggled and why people want it. | Nothing — this document resolves the open question | -| **Detective Institutional Chain of Command** (who assigned the investigation, stated mandate, political pressures) | High | Story | Paula flagged this. The detective's narrative arc requires knowing who they report to and what constraints they operate under. | Krenn System Profile (jurisdiction questions) | -| **Meridian Coverage Map for Sova Transit** (where coverage is strong, where it degrades, dead spots the ring exploits) | Medium | Story | Affects detective investigation capability, smuggler operational planning, and NPC behavior (off-Meridian communication in dead spots). | Sova Station Profile | -| **Off-Station Connections Brief** (who receives the contraband, the coordinator's location, external contact details) | Medium | Story | NPC dialogue references off-station contacts. Need enough detail for consistency without building full external locations. | Contraband Specification | -| **Span Gate Transit Schedule** (how often the gate cycles, peak times, maintenance windows) | Medium | Story | The freight rhythm is the district's heartbeat. NPC routines depend on it. The ring's operational timing depends on it. | Nothing | -| **Observation Gallery / Viewport Description** (what you see looking out at the Krenn system) | Low | Story | Ozzie's "something out the window" — the visual anchor that says "space station." | Krenn System Profile | - ---- - -## Part 5: Cultural and Environmental Detail Priorities - -Reading all six Round 1 outputs, the team converges on one point: **the setting details that matter most are the ones that differentiate the two characters' experience of the same place.** Atmosphere is nice; asymmetric atmosphere is the game. - -**Priority order for cultural/environmental details:** - -1. **Details that read differently per character** (highest priority) - - The span gate schedule board: routine data for the smuggler, investigation material for the detective - - Cargo manifests: familiar paperwork vs. potential evidence - - NPC naming and greeting conventions: the smuggler *knows* everyone's name; the detective has to *learn* them - - Institutional signage: background noise for the smuggler, professional context for the detective - -2. **Details that establish presence** (high priority) - - The span gate hum (Ozzie's "sound first") - - The news ticker (worldbuilding in 30 words) - - The local complaint (ventilation in Sector 3) - - Food and drink specifics (what the bar serves, what the food vendors sell) - -3. **Details that feed investigation** (high priority) - - Meridian dead spots where off-channel communication is possible - - Architectural secrets (spaces between wall layers, repurposed maintenance corridors) - - Shift transition timing (when oversight is thinnest) - - Spending pattern indicators (what "living beyond your means" looks like in Sova) - -4. **Details that build attachment** (medium priority) - - Community events (the bar's regular card game, shift-end rituals) - - Interpersonal customs (how Krenn System people express trust, discomfort, affection) - - Personal spaces (what a locker area looks like, how people personalize their workstations) - -5. **Lore depth** (low priority for v0.1) - - Krenn System settlement history (establishes depth but doesn't directly serve gameplay) - - Broader Reach political context (Concord Assembly, Commission politics — background texture) - - The Unbound presence in the district (mentioned in Round 1, not load-bearing for v0.1) - ---- - -## Part 6: Dependencies Between Setting Work and Content/Character Work - -Here's the dependency chain with setting work highlighted: - -``` -IMMEDIATE (no dependencies): - Contraband Specification (Miri) ──> NPC motivations (Paula) - Krenn System Profile (Miri) ──> Wiki foundation - Span Gate Transit Schedule (Miri) ──> NPC routine design (Paula/Gestalt) - -FAST FOLLOW: - Sova Station Profile (Miri) ──> Off-station references in dialogue (Mellanie) - Sova Texture Appendix (Miri) ──> Environmental text (Mellanie) - ──> Monologue sensory details (Mellanie) - Detective Chain of Command (Miri+Paula) ──> Detective character build (#181) - ──> Detective voice kit (Mellanie) - -PARALLEL WITH CONTENT WORK: - Meridian Coverage Map (Miri) ──> Investigation mechanics (Gestalt/Tyre) - Off-Station Connections (Miri) ──> Ring NPC dialogue consistency (Mellanie) - Observation Gallery (Miri) ──> First-30-seconds experience (Araminta/Ozzie) -``` - -**The critical path for content:** Paula's Dual Lens Guide and my Sova setting work are the two roots. They can proceed in parallel. Mellanie is blocked until both exist. The contraband specification is the fastest-to-resolve blocker — I can write it now and unblock Paula's NPC motivation work immediately. - ---- - -## Part 7: The Wiki Taxonomy - -This is the big one. Jeroen has flagged this as non-negotiable: we need a complete, future-proof wiki structure established now, while we're building the first entry. It must scale from v0.1 (one system, one station, 15 NPCs) to the full game (hundreds of systems, thousands of NPCs). - -### Design Principles for the Wiki - -1. **Game-first, not encyclopedia-first.** The wiki exists to serve the game's content pipeline. Every entry should be writable by a team member and consumable by the game systems (even if that consumption is indirect — an NPC profile feeds dialogue authoring, which feeds YAML content packs). - -2. **Hierarchical with cross-references.** Star systems contain stations contain districts contain locations. But NPCs move between locations. Factions span systems. Technology is everywhere. The hierarchy is spatial; the cross-references are relational. - -3. **Metadata-rich.** Every entry has structured frontmatter (YAML) that enables programmatic queries. "Give me all NPCs in the Krenn System with a smuggling connection" should be answerable from metadata alone. - -4. **Template-driven.** Each category has a template. New entries follow the template. This ensures consistency and tells authors exactly what information is required vs. optional. - -5. **Scale-tested.** The structure must work with 1 star system and with 500. No nesting depth that becomes unmanageable. No category that becomes a dumping ground. - -### Proposed Wiki Directory Structure - -``` -wiki/ - _templates/ # Entry templates (one per category) - star-system.md - station.md - district.md - location.md - character.md - faction.md - technology.md - cultural-group.md - lore-entry.md - contraband-type.md - institution.md - species.md - event.md - concept.md - - star-systems/ # Top-level spatial hierarchy - krenn/ - _index.md # Krenn System profile - stations/ - sova/ - _index.md # Station Sova profile - districts/ - transit-district/ - _index.md # Sova Transit District profile - locations/ - logistics-hub.md # The Terminal - the-last-shift.md # The bar - maintenance-corridor-7b.md # Smuggling space - observation-gallery.md - commission-kiosk.md - - characters/ # All named characters, flat structure - kael-davan.md - voss.md - lera-sessik.md - torek-lintar.md - drin.md - maret-korr.md - resha.md - harek.md - sess.md - olin.md - devra.md - renn.md - sabel.md - pell.md - tav.md - - factions/ # Political and institutional bodies - concord-assembly.md # The galactic legislature - lattice-commission.md # Technology regulatory body - syndics/ - _index.md # Syndic overview - # Individual Syndics as they're created - guardians-of-severance.md # Counter-surveillance movement - the-unbound.md # Lattice refusers - - technology/ # Technology categories - neural-lattice/ - _index.md # Lattice overview - tiers/ - baseline.md - augmented.md - enhanced.md - transcendent.md - meridian.md # Information network - span-gates.md # Local gates - horizon-gates.md # Interstellar gates - re-embodiment.md # Death/resurrection technology - severance.md # Counter-surveillance tech - - cultural-groups/ # Cultures, subcultures, movements - krenn-system-culture.md # First entry - # Future: other system cultures, station subcultures - - contraband/ # Illegal/restricted goods - unlicensed-lattice-components.md - severance-equipment.md - off-manifest-biologicals.md - - institutions/ # Formal organizations (non-faction) - # Courts, academies, services, etc. as needed - - species/ # Non-human entities - # As defined — currently placeholder category - - lore/ # Historical events, concepts, cosmology - the-interstitium.md # Gate medium / between-space - settlement-eras/ - _index.md - # Individual era entries - founders.md # Progenitor civilization - builders.md # Gate builders - - concepts/ # Game-mechanical concepts with lore basis - information-asymmetry.md # How the game's core mechanic is grounded in setting - lattice-surveillance.md # How monitoring works in-universe - severance-culture.md # Counter-culture movement - - _meta/ # Wiki maintenance files - naming-conventions.md # Per-system naming rules - style-guide.md # Writing conventions for wiki entries - cross-reference-index.md # Auto-generated or maintained - changelog.md # Wiki revision history -``` - -### Entry Metadata Schema (YAML Frontmatter) - -Every wiki entry has structured frontmatter. Here are the schemas per category: - -#### Star System Entry - -```yaml ---- -type: star-system -id: krenn # Unique slug -name: Krenn System -classification: mid-reach # core | mid-reach | frontier | deep-frontier -star_type: G3V # Stellar classification -settlement_age: ~180 years # How long since first settlement -population: ~2.4 million # System-wide estimate -governance: concord-assembly # Primary governing body -gate_connections: # Horizon/span gate links - - target: [system-id] - type: horizon # horizon | span -economic_base: [logistics, mining] # Primary industries -meridian_coverage: standard # comprehensive | standard | sparse | minimal -commission_presence: moderate # heavy | moderate | light | nominal -cultural_notes: "Working-class pragmatic. Values reliability and minding your business." -tags: [v0.1, playable, mid-reach] -status: canonical # canonical | draft | proposed -created: 2026-02-11 -updated: 2026-02-11 ---- -``` - -#### Station Entry - -```yaml ---- -type: station -id: sova -name: Station Sova -system: krenn -classification: logistics-hub # Functional type -construction_era: mid-settlement # When built relative to system history -population: ~12,000 -districts: - - id: transit-district - name: Sova Transit District - type: commercial-logistics -governance: station-administrator # Local governance type -gate_access: - - type: span - connects_to: krenn-planetary-depot - traffic: freight-primary -notable_features: - - "Gate-adjacent logistics hub" - - "Mixed-era construction" -tags: [v0.1, playable] -status: canonical -created: 2026-02-11 -updated: 2026-02-11 ---- -``` - -#### District Entry - -```yaml ---- -type: district -id: sova-transit-district -name: Sova Transit District -station: sova -system: krenn -age: ~40 years -construction: prefab-modular-retrofitted -economic_engine: freight-logistics -atmosphere: quotidian-with-undertow # One-phrase mood descriptor -population: ~800 (workers + residents) -meridian_coverage: - logistics_hub: strong - bar_district: strong - older_sections: degraded - maintenance_corridors: minimal -commission_presence: intermittent # permanent | intermittent | minimal | none -locations: - - id: logistics-hub - name: The Terminal - type: workplace - - id: the-last-shift - name: The Last Shift - type: social-venue - - id: maintenance-corridor-7b - name: Corridor 7B - type: infrastructure - hidden: true -key_npcs: [kael-davan, voss, lera-sessik, torek-lintar, drin, maret-korr] -cultural_group: krenn-system-culture -local_issues: - - "Ventilation reliability in Sector 3" - - "Commission liaison rotation gap" -tags: [v0.1, playable, vertical-slice] -status: canonical -created: 2026-02-11 -updated: 2026-02-11 ---- -``` - -#### Location Entry - -```yaml ---- -type: location -id: the-last-shift -name: The Last Shift -district: sova-transit-district -station: sova -system: krenn -location_type: social-venue # workplace | social-venue | residential | infrastructure | commercial | institutional -template: bar # Game template this instantiates -capacity: 30 # Max occupancy -owner_npc: lera-sessik -regular_npcs: [kael-davan, torek-lintar, drin, maret-korr, harek] -operating_hours: "14:00 - 02:00 station time" -atmosphere: "Mid-grade bar. Not upscale, not a dive. The kind of place where working people go after shift." -architectural_notes: "Converted maintenance staging area. Irregular layout from pre-existing structure. Long bar, scattered tables, semi-private corner booth." -sensory: - sound: "Conversation, glass on surfaces, Meridian music feed" - smell: "Recycled air with cooking undertones" - lighting: "Warm, cheaper fixtures, irregular" - temperature: "Climate-controlled, comfortable" -signage: - - "Lera's -- Cold Drinks, Hot Food, No Questions" - - Shift schedule board (community use) -tags: [v0.1, social-site, bar-template] -status: canonical -created: 2026-02-11 -updated: 2026-02-11 ---- -``` - -#### Character Entry - -```yaml ---- -type: character -id: kael-davan -name: Kael Davan -system_origin: krenn -cultural_group: krenn-system-culture -age: 34 -role: dock-worker # Occupational role -employer: sova-logistics-consortium # Who they work for -home_district: sova-transit-district -entanglement: entangled # flat | triangle | entangled -triangle_ids: [hub-new-hire, ring-power-dynamic] -smuggling_role: ring-member # null if not involved -lattice_tier: baseline -relationship_to_smuggler: close-colleague -relationship_to_detective: person-of-interest -personality_summary: "Reliable, protective, loyal to people rather than institutions. The smuggler's anchor." -want: "Protect the operation and the people in it" -secret: "Smuggling ring member, mid-level" -tolerance_threshold: moderate -contentment: moderate-low -daily_routine: - - "Morning shift at logistics hub" - - "Break room during midday" - - "The Last Shift after shift end" - - "Occasional late-night ring operations" -voice_notes: "Direct, practical. Uses first names. Speaks in short declarative sentences. Doesn't waste words." -tags: [v0.1, hub-npc, ring-npc, bridge-npc] -status: canonical -created: 2026-02-11 -updated: 2026-02-11 ---- -``` - -#### Faction Entry - -```yaml ---- -type: faction -id: lattice-commission -name: The Lattice Commission -scope: reach-wide # reach-wide | regional | system | local -governance_role: regulatory # regulatory | legislative | executive | military | commercial | religious | subversive -mandate: "Regulation of neural lattice technology, certification of lattice tiers, enforcement of lattice compliance standards" -headquarters: [system-id] # TBD -structure: bureaucratic-hierarchical -public_perception: "Necessary but intrusive. The tax authority of neural technology." -player_relevance: - smuggler: "The adversary. Commission regulation is what makes lattice smuggling profitable." - detective: "The employer (or contractor). Institutional backing and constraints." -key_personnel: [] # As defined -sub_organizations: [] # Regional offices, special divisions -cultural_impact: "Commission presence shapes social behavior — people modulate what they say when Commission-tagged individuals are present." -tags: [institution, regulatory, reach-wide] -status: canonical -created: 2026-02-11 -updated: 2026-02-11 ---- -``` - -#### Technology Entry - -```yaml ---- -type: technology -id: neural-lattice -name: Neural Lattice -category: biotechnology # biotechnology | infrastructure | communication | transportation | weaponry | surveillance -prevalence: universal # universal | common | specialized | rare | unique -access: - baseline: "Standard-issue, factory default" - augmented: "Institutional or premium, enhanced capability" - enhanced: "Specialist, rare, significant capability" - transcendent: "Theoretical or post-human" -regulation: commission-controlled -contraband_relevance: "Unlicensed components bypass Commission certification, providing enhanced capability without institutional approval" -gameplay_relevance: "Determines perception modes, insert overlay capability, Meridian access depth" -setting_notes: "The lattice is to citizens of the Reach what smartphones are to us — ubiquitous, always-on, unreflectively used. Its absence (the Unbound) is more notable than its presence." -tags: [core-tech, perception, ubiquitous] -status: canonical -created: 2026-02-11 -updated: 2026-02-11 ---- -``` - -#### Contraband Entry - -```yaml ---- -type: contraband -id: unlicensed-lattice-components -name: Unlicensed Lattice Components -category: technology # technology | biological | information | material | cultural -legality: restricted # banned | restricted | controlled | gray-market -severity: moderate # severe | moderate | minor -commission_classification: "Category 3 violation — unauthorized modification of certified neural technology" -supply_chain: "Aftermarket manufacturers (often Syndic-adjacent) -> freight networks -> local distributors -> end users" -demand_drivers: - - "Enhanced capability beyond Baseline tier at affordable price" - - "Medical-grade replacements for degrading lattices at below-Syndic pricing" - - "Custom modifications for specific occupational needs" -moral_dimension: "These components serve real needs — medical, professional, personal autonomy. The Commission's regulatory monopoly prices many citizens out of legitimate access." -detection_methods: "Manifest scanning, lattice signature analysis, physical inspection" -evasion_methods: "Doctored manifests, scanner blind spots, shift-transition timing, off-Meridian coordination" -gameplay_relevance: "Primary contraband for v0.1 smuggling scenario. Establishes moral ambiguity: the player is smuggling access, not weapons." -tags: [v0.1, smuggling, lattice, moral-ambiguity] -status: canonical -created: 2026-02-11 -updated: 2026-02-11 ---- -``` - -### How the Wiki Scales - -| Scale | v0.1 | v0.5 | v1.0 | Full Game | -|---|---|---|---|---| -| Star systems | 1 (Krenn) | 3-5 | 10-20 | 100+ | -| Stations/worlds | 1 (Sova) | 5-10 | 30-50 | 500+ | -| Districts | 1 (Transit) | 5-15 | 50-100 | 1000+ | -| Characters | 15 | 50-100 | 300-500 | 5000+ | -| Factions | 5 | 8-12 | 15-20 | 30+ | -| Technology entries | 8-10 | 20-30 | 50-75 | 100+ | -| Contraband types | 3 | 8-12 | 20-30 | 50+ | -| Cultural groups | 1 | 5-10 | 20-40 | 100+ | -| Lore entries | 5-8 | 20-30 | 50-100 | 200+ | - -**Scaling notes:** - -- **Characters are flat, not nested under locations.** An NPC might move between systems over the course of the game. Their entry lives in `characters/` with location references in metadata, not under a specific station directory. - -- **Star systems are the primary spatial hierarchy.** System -> station/world -> district -> location. This is four levels deep maximum. Future expansion adds *breadth* (more systems), not *depth* (more nesting levels). - -- **Cross-references use IDs, not file paths.** When `kael-davan.md` references `sova-transit-district`, it uses the ID `sova-transit-district`, not a relative path. This means entries can be reorganized without breaking links. - -- **The `_templates/` directory is the schema contract.** When Mellanie or Paula need to add an NPC, they copy `_templates/character.md`, fill in the frontmatter and prose, and save it in `characters/`. The template tells them exactly what's required. - -- **Tags enable cross-cutting queries.** "Show me all `v0.1` content" or "all entries tagged `smuggling`" or "all `canonical` characters in `krenn`" — these are tag queries, not directory traversals. - -### Wiki Governance - -| Rule | Rationale | -|---|---| -| **Miri owns the wiki structure.** New categories, template changes, and structural decisions go through me. | Consistency requires a single maintainer for the schema. | -| **Anyone can create entries** within their domain, following templates. | Paula creates character entries. Mellanie adds voice notes. Gestalt annotates gameplay relevance. | -| **Every entry has a `status` field.** `proposed` -> `draft` -> `canonical`. | Prevents confusion about whether something is decided or speculative. Only `canonical` entries are treated as setting truth. | -| **The `_meta/naming-conventions.md` file is mandatory reading** before creating any named entity. | Name consistency is the most visible form of worldbuilding consistency. IP originality checks happen here. | -| **Cross-references must use valid IDs.** Dead links are caught by a validation script. | Referential integrity. We'll need a simple script that checks all ID references resolve. | -| **Lore entries explain WHY, not just WHAT.** Every lore entry must connect to gameplay relevance or setting texture. | Prevents lore bloat that serves nobody. If it doesn't affect gameplay or atmosphere, it doesn't need an entry yet. | - ---- - -## Part 8: IP Originality Audit (Round 2) - -After reading all Round 1 outputs, I'm doing a second IP pass on everything proposed: - -| Element | Source Risk | Assessment | -|---|---|---| -| "The Last Shift" (bar name) | Generic working-class bar name | **Clear.** No franchise association. | -| NPC names (Kael, Voss, Lera, Torek, etc.) | Constructed for Krenn System | **Clear.** Checked against Hamilton (contemporary English), Banks (Culture names), Reynolds (Dutch/Germanic). No overlap. | -| Unlicensed lattice components as contraband | Setting-specific | **Clear.** "Aftermarket neural implant mods" is common SF but our specific lattice/Commission framework makes it original. | -| "The Arrangement" (smuggling ring name) | Generic, possibly echoes John le Carre | **Watch.** Not a direct copy, but le Carre uses similar understated espionage terminology. Acceptable for now — it's an in-universe informal name, not a title. If it starts feeling too spy-novel, we rename. | -| Krenn System naming convention | Constructed | **Clear.** Consonant-heavy, compact names don't map to any specific franchise. | -| The span gate hum as atmospheric element | Setting-specific | **Clear.** Gate hum is a natural consequence of the technology. No franchise owns "infrastructure makes noise." | -| "Quotidian-with-undertow" as mood descriptor | Literary, not franchise-specific | **Clear.** This is a design note, not in-universe text. | -| Paula's NPC relationship web structure | Narrative architecture | **Clear.** Triangle dynamics are a storytelling tool, not franchise IP. | -| The Commission as regulatory body | Setting-specific | **Clear.** "Government regulates neural technology" is a natural worldbuilding consequence. Checked against Eclipse Phase (Firewall is different), Altered Carbon (Protectorate is different). Our Commission's specific mandate is original. | -| Araminta's relationship-to-player color system | Game design, not worldbuilding | **Clear.** Standard game design technique. | - -**No IP concerns flagged in Round 2.** The team is building on established original foundations. The Krenn System and Sova Transit District feel like our own. - ---- - -## Part 9: Synthesis — What Happens Next - -### Miri's Immediate Deliverables (ordered by dependency urgency) - -| Deliverable | Priority | Unblocks | Est. Effort | -|---|---|---|---| -| 1. Contraband Specification | Critical | Paula's NPC motivations, Mellanie's cargo dialogue | Small — 1-2 pages, can write now | -| 2. Sova Texture Appendix | Critical | Mellanie's environmental text, monologue sensory content | Small — 1 page | -| 3. Wiki Structure + First Entries | Critical | Entire content pipeline's organizational foundation | Medium — structure is defined above; first entries are Krenn System, Station Sova, Sova Transit District | -| 4. Krenn System Profile | High | Wiki foundation, all downstream location entries | Medium — first wiki entry, sets template precedent | -| 5. NPC Name Finalization | High | Paula's relationship web, Mellanie's voice kits | Small — mapping in Part 2 above, needs team sign-off | -| 6. Detective Chain of Command | High | Paula's detective character build, detective voice kit | Medium — institutional worldbuilding required | -| 7. Span Gate Transit Schedule | Medium | NPC routine design, ring operational timing | Small — 1 page | -| 8. Meridian Coverage Map | Medium | Investigation mechanics, ring operational geography | Small — 1 page | -| 9. Off-Station Connections Brief | Medium | Ring NPC dialogue consistency | Small — 0.5 page | - -### Key Dependencies Resolved - -1. **Contraband question:** Resolved. Unlicensed lattice components as primary, with medical-grade neural replacements as the humanitarian dimension. -2. **NPC names:** Mapped to Paula's 15-NPC structure with setting-consistent Krenn System names. -3. **Sova serves all team needs:** Validated against every Round 1 participant's specific requirements. -4. **Wiki structure:** Proposed, with templates, metadata schemas, and governance rules. - -### One Last Setting Note - -Sova Transit District is a deliberately ordinary place. It's a freight hub where people work, drink, gossip, and try to get by. The extraordinary thing about Sova is not its setting — it's what happens when you look at it through the wrong eyes. - -The smuggler sees home. The detective sees a crime scene. Neither is wrong. Both are incomplete. - -That's the game. And that's why the setting work matters: if Sova doesn't feel real, the dual lens has nothing to refract. - ---- - -*Setting note — Krenn System is now canonical. Sova is grounded. The wiki has a skeleton. Let's build.* - -*Miri out.* diff --git a/docs/workshops/content-gap-analysis_v0_1/round2-ozzie.md b/docs/workshops/content-gap-analysis_v0_1/round2-ozzie.md deleted file mode 100644 index 5a41d9711..000000000 --- a/docs/workshops/content-gap-analysis_v0_1/round2-ozzie.md +++ /dev/null @@ -1,452 +0,0 @@ -# Round 2: Ozzie — Player Experience Synthesis -## v0.1 Content Gap Analysis Workshop - -**Agent:** Ozzie (Player Experience & Wow Factor) -**Date:** 2026-02-11 -**Inputs:** All 6 Round 1 outputs + project lead direction on audio, THE FRIEND, color system, wiki - ---- - -## Reactions to Round 1 Outputs - -Before I get into the structured work, here's what hit me reading the other five. - -### Miri: I'm IN - -Sova Transit District. THE LAST SHIFT. The span gate hum. "Quotidian-with-undertow." - -Miri, you gave me goosebumps. The setting brief is the single most important output from Round 1, because it turns every other agent's proposals from abstract to CONCRETE. When Mellanie talks about a dock worker greeting, I can now HEAR it in the corridors of Sova. When Paula designs the worried partner triangle, I can SEE H sitting alone at The Last Shift, watching the door. - -The span gate hum as atmospheric anchor is EXACTLY right. That constant low vibration is our Nostromo air recycler, our Ceres spin-drum rumble. When it changes, that's a player moment. When it STOPS, that's a wow moment. We'll come back to this in audio. - -**One thing that surprised me:** The contraband being lattice components. That's GENIUS for the moral ambiguity and I didn't see it coming. The smuggler isn't moving drugs or weapons. They're moving ACCESS. They're a Robin Hood with cargo manifests. That makes the detective's investigation morally complicated in a way that pure criminal enterprise wouldn't. It makes the player's SECOND playthrough — as the character who opposes this — emotionally devastating. "Oh. I was the bad guy last time? Or was I the bad guy THIS time?" - -THAT'S the game. - -### Paula: The Relationship Web Is Terrifying (In a Good Way) - -Seven triangles. Fifteen NPCs. Every single one connected to at least two others with tension, dependency, or deception. The cross-template informant triangle (N-D-G) as the mechanism for the ring's unraveling is structurally perfect. - -But here's what actually stopped me cold: **The Worried Partner triangle (H-B-F).** H doesn't know what their partner B does after hours. F reassures H while protecting the operation. B is oblivious to the anxiety they're causing. That's not a conspiracy mechanic. That's a HUMAN STORY. And the player who discovers it — whether as smuggler or detective — is going to feel something real. - -Paula's mirror moments are also exactly what I was groping toward in Round 1 when I talked about "emotional divergence moments." Mirror 3 (The Worried Partner) and Mirror 4 (The Empty Corridor) are going to be the moments players tell their friends about. - -**What aligned:** Paula and I converged independently on the idea that the emotional centerpiece is a relationship that gets contaminated by information. I called it THE FRIEND. She designed the structural web that makes THE FRIEND possible. - -**What worried me (Round 1):** The Tier 1 full profiles are 1 page each. Five pages for five NPCs. That sounds like a lot but Paula's Layer 5 relationship web is SO detailed that it basically writes itself. I'm no longer worried about this being a bottleneck. - -### Mellanie: The Line Counts Are Real - -900-1,215 authored lines. ~3,000-3,600 after generation expansion. That's the content floor for a 30-minute session where the player encounters ~150-200 lines. - -What I love about Mellanie's breakdown is the SPECIFICITY. She didn't say "we need dialogue." She said "15-20 greeting lines, filtered by access tier and relationship." She broke #190 into five concrete sub-deliverables (role voice kits, situation scripts, monologue hooks, environmental text, trait guide). She proposed the tag taxonomy BEFORE Gestalt did and they converged on nearly identical structures. That's confidence-building. - -**What surprised me:** Mellanie's recommendation to DEFER audio and carry the atmosphere through text. She's not wrong that she CAN carry it. But — and this is why the project lead's decision matters — text-carried atmosphere is a backup plan, not the plan. With audio confirmed for v0.1, Mellanie's monologue load actually gets LIGHTER. The station hum carries ambient mood. Footsteps carry spatial presence. The monologue chime trains attention. Mellanie writes the CHARACTER. The audio carries the WORLD. - -"Scaffold, validate, scale" is the right process. I trust her completely on the writing side. - -### Araminta: Color = Relationship to Player - -YES. This is the visual system that sells asymmetric information at MINIMUM fidelity. - -The same NPC is green for the smuggler and teal for the detective. Same room, different visual reality. That's our core mechanic rendered in the cheapest possible way, and it WORKS. - -The fog rendering spec (visible / fog-edge / hidden / remembered) is also load-bearing. The "remembered" state — desaturated, static snapshot, NPCs vanished — is the visual representation of "I was here, but things may have changed." That communicates information decay without a single word of text. When the player returns and sees that things HAVE changed, that's a discovery moment. - -**What aligned:** Araminta and I both identified the same gap — the need for ONE signature visual element in the first 5 seconds. She's proposing to solve it through spatial composition (the bar feels different from the hub through room shape and density). I was thinking about a viewport showing stars. Both can work. Both should exist. - -**What I'd push back on:** Araminta recommends deferring audio entirely. The project lead has overruled this. Audio is IN. Araminta's sound indicator visual spec is still needed — we'll want visual indicators for sounds at fog edge even WITH audio, because audio communicates "something's there" and visuals communicate "where." - -### Gestalt: The Pipeline Is Ready for Content - -The YAML line pool format is clean. The selection pipeline (access filter -> situation filter -> trust filter -> mood+topic weighting) is elegant. The monologue trigger taxonomy (9 trigger types) maps directly to authoring work. - -Gestalt said something in Layer 6 that I want to amplify: **"Most tells in v0.1 will be TEXT, not visual. The monologue system IS the tell renderer."** This is exactly right. We can't animate fidgeting on colored rectangles. But we CAN write "Kael keeps checking the corridor before entering the back room" and that tells the player everything they need to know. - -The line previewer (#193) also got flagged by both Gestalt and Mellanie as critical. I agree — it's not a content deliverable, it's a content QUALITY tool. Without it, we ship content that reads well in YAML and sounds dead in the game. - ---- - -## Section 1: Missing Tickets for Player Experience Work - -Reading all six Round 1 outputs, I'm tracking these gaps that don't have tickets and should: - -### Tickets That Must Exist - -| # | Title | Priority | Type | Rationale | -|---|-------|----------|------|-----------| -| NEW-1 | **THE FRIEND NPC — Smuggler version (full production)** | Critical | Story | One deeply authored NPC for the smuggler's playthrough. Full profile, full voice kit, full contradiction arc. Project lead confirmed: one production-level NPC per character. Emotional centerpiece of v0.1. | -| NEW-2 | **THE FRIEND NPC — Detective version (full production)** | Critical | Story | Same treatment for the detective. Different NPC, different relationship, different contradiction. Must hit the same emotional beats through a different lens. | -| NEW-3 | **Opening 5-minute content sequence (per character)** | Critical | Story | The first 20 monologue lines, the first named NPC encounter, the first news ticker glance, the first environmental text read. Tightly sequenced. This IS the first impression. Blocks all playtest feedback. | -| NEW-4 | **Audio asset set — minimum viable (6-8 files)** | High | Story | Station ambient, 3 location variants, footsteps, monologue chime. AI-generated via local model. See Section 4 below for full spec. | -| NEW-5 | **News ticker / announcement board content** | High | Story | 20-30 ticker lines for The Last Shift and the logistics hub. Cheapest wow-per-word in the project. | -| NEW-6 | **Diegetic insert flavor text (per character)** | Medium | Story | POI labels, status text, notification strings — different per character. The smuggler's insert says "The Last Shift." The detective's says "Licensed establishment — District 7." | -| NEW-7 | **Flat NPC "almost interesting" pass** | High | Story | The 4-5 flat NPCs each need: one memorable trait, one "seems important but isn't" line, and a visible routine. Without this, the investigation noise floor collapses. | -| NEW-8 | **First monologue surprise moment (per character)** | High | Story | The specific monologue line where the character notices something the player didn't. Must fire before minute 15. This is our signature mechanic in content form. Requires coordination between Paula (the observation), Mellanie (the line), and Gestalt (the trigger). | -| NEW-9 | **Spatial layout review — sightlines for wow moments** | Medium | Story | Araminta's spatial layouts need a player experience pass. Where does the player FIRST see the bar? Where do they FIRST glimpse the restricted area? First impressions of each space shape the entire experience. | - -### Tickets Proposed by Others That I'm Co-Signing - -| Proposed by | Ticket | My endorsement | -|---|---|---| -| Mellanie | Smuggler voice kit | YES — blocks everything. Character voice is the foundation. | -| Mellanie | Detective voice kit | YES — same. | -| Mellanie | Monologue starter set (universal) | YES — unblocked, should start NOW. | -| Mellanie | Tag taxonomy specification | YES — Gestalt has already drafted this. Validate and lock. | -| Paula | Dual Lens Guide (full draft) | YES — the single most important document. Everything downstream needs it. | -| Araminta | v0.1 Visual Grammar | YES — root dependency for all visual work. | -| Araminta | Entity color system implementation | YES — this IS the visual proof of concept for asymmetric information. | -| Araminta | Spatial layout design (3 sites) | YES — sightlines are gameplay, not decoration. | -| Gestalt | Line previewer CLI (#193) | YES — content quality tool. Mellanie can't test without it. | - ---- - -## Section 2: Priority Ranking — Content Gaps That Hurt Most - -Here's my ranking of which gaps, if left unfilled, would DESTROY the player experience. Not "slightly diminish." DESTROY. - -### Tier 1: The Game Doesn't Exist Without These (Sprint 2 must-haves) - -1. **Character voice kits + Dual Lens Guide** — If the two characters sound the same or interpret the world the same way, there IS no game. The dual-lens is the premise. No voice = no premise. - -2. **THE FRIEND (one per character)** — D-027 success criterion #3: "player names an NPC they felt conflicted about." Without THE FRIEND, we have a technically competent social simulation with no emotional anchor. The FRIEND is the moment the game stops being a system and starts being a story. - -3. **Opening 5-minute content** — If the first 5 minutes are flat, no playtester finishes the 30. The opening monologue, the first named face, the first environmental text — these ARE the game's first impression. They must exist before any playtesting happens. - -4. **Monologue observation lines (pre-contamination)** — The character noticing what the player didn't. This is the core mechanic expressed as content. If the monologue only fires atmosphere lines and never flags something specific about an NPC's behavior, the investigation has no foothold. - -### Tier 2: The Game Feels Empty Without These (Sprint 2 high priority) - -5. **Flat NPC "almost interesting" pass** — If flat NPCs are obviously wallpaper, the 30/50/20 ratio is exposed and investigation collapses. The noise floor must be indistinguishable from signal at first glance. - -6. **Audio asset set (6-8 files)** — Confirmed in scope. The difference between silence and a station hum is the difference between "spreadsheet" and "world." See Section 4. - -7. **News ticker / environmental text** — 20-30 lines that make the station breathe. Cheapest content investment, highest presence return. - -8. **Template content packs (#190-192)** — The bulk dialogue that populates the social sites. Without these, the player talks to NPCs and gets nothing back. - -### Tier 3: The Game Feels Rough Without These (Sprint 2/3 medium priority) - -9. **Mirror moments (10-15 paired observations)** — The second playthrough's "oh THAT'S what that was" beats. Essential for replayability, but the first playthrough works without them. - -10. **Diegetic insert flavor text** — Character-specific HUD text. Sells the dual-lens through the UI layer. Not needed for first playtest but needed before the experience feels polished. - -11. **Spatial layout wow-moment pass** — First impressions of each location. Can be adjusted after initial layouts exist. - -12. **UI microcopy** — Menu text, interaction prompts, save/load. Functional placeholder strings are fine for early playtests. - ---- - -## Section 3: THE FRIEND — The Emotional Centerpiece - -Project lead confirmed: one production-level NPC per character. Full depth. This is the emotional centerpiece of v0.1. - -Good. Now let me define what "full depth" means for player experience. Not the narrative structure (that's Paula). Not the line count (that's Mellanie). The FEELING. - -### What THE FRIEND Must Deliver - -THE FRIEND is the NPC designed to make the player answer "yes" to D-027 success criterion #3: **"Name an NPC you felt conflicted about."** - -That means THE FRIEND must produce, in sequence: - -1. **Warmth** — The player must genuinely LIKE this NPC before anything goes wrong. -2. **Trust** — The player must rely on this NPC for something practical or emotional. -3. **Doubt** — One observed contradiction must crack the trust. -4. **Conflict** — The player must want two incompatible things: to trust them AND to know the truth. - -If any of these four beats is missing or weak, the criterion fails. Let me get specific. - -### THE FRIEND: Smuggler Version - -**Who:** The smuggler's closest colleague at the logistics hub. They share shifts, they cover for each other, they eat lunch together. This is the person who makes the smuggler's double life BEARABLE. When the operation feels dangerous, this friend makes it feel manageable. - -Mapped to Paula's web: this is **NPC-B** — the logistics worker who's a reliable ring member. The smuggler's anchor. - -**The warmth beat (minutes 1-10):** -- THE FRIEND greets the smuggler by nickname within the first 2 minutes of the game. -- THE FRIEND covers for the smuggler on something small and mundane — takes over a manifest check, brings them a drink, warns them about the supervisor's mood. -- Monologue fires: something affectionate, familiar, comfortable. *"Kael's got my back. He always does."* -- THE FRIEND's dialogue is warm, easy, uses insider language. Layer 1 access = peer. Layer 3 trust = real (they share genuine conversation from the start). - -**The trust beat (minutes 5-15):** -- THE FRIEND is useful. They tell the smuggler something they need to know — a shift change, a cargo update, who's asking questions. -- THE FRIEND demonstrates loyalty. They deflect when someone asks where the smuggler was during a gap in their schedule. -- Monologue fires: trust confirmation. *"If everything went sideways, Kael's the one I'd call."* - -**The contradiction beat (minutes 20-25, during or shortly after contamination):** -- The smuggler observes THE FRIEND in a place they shouldn't be. Not the ring spaces — that would be expected. Somewhere ELSE. A section of the station with no ring business. Near the Commission kiosk. Near the detective's known area. Or meeting with someone from outside the district — NPC-M (the fence/buyer) at a strange time, or someone the smuggler has NEVER seen. -- The observation must be VISUAL — the smuggler SEES it, not hears about it. The monologue fires IMMEDIATELY: *"What's Kael doing near the Commission terminal? He's got no business there."* -- If the smuggler asks THE FRIEND about it, THE FRIEND deflects. Casual. Maybe too casual. *"Oh, just checking the freight schedule on the public board. You know me."* -- Monologue fires after the deflection: *"That wasn't the freight schedule board. That was the compliance office entrance."* -- THE FRIEND LIED. To the smuggler's face. And now every warm interaction is CONTAMINATED. - -**The conflict beat (minutes 25-30+):** -- The smuggler is now watching THE FRIEND. Every routine action has a shadow. Is Kael still reliable? Is Kael talking to the detective? Is Kael cutting a deal? Is Kael trying to LEAVE the ring? -- But also: Kael is still kind. Still covers for you. Still brings you a drink. The contradiction isn't resolved. The player wants to confront AND to protect. -- D-027 criterion fires: "Name an NPC you felt conflicted about." The player says "Kael." - -**Why this works:** The contradiction isn't a betrayal — it's AMBIGUITY. Maybe Kael IS cutting a deal. Maybe Kael is protecting the smuggler by keeping them out of something dangerous. Maybe Kael is trying to leave and doesn't know how to tell the smuggler. The player doesn't know. They CAN'T know in 30 minutes. And that unresolved ambiguity is what makes them FEEL something. - -### THE FRIEND: Detective Version - -**Who:** The detective's contact in the district. Not a formal informant — someone who offered help when the detective arrived. Maybe they work at the logistics hub, maybe they're a bar regular. They've been the detective's GUIDE to this unfamiliar place — explaining who's who, which areas to check, how things work around here. - -Mapped to Paula's web: this could be **NPC-D** (the dock inspector with the gambling debt) or a new NPC designed specifically for this role. I'd argue for NPC-D — someone who has legitimate authority AND a vulnerability. - -**The warmth beat (minutes 1-10):** -- THE FRIEND approaches the detective early. Offers help. *"You look like you could use a map. I'm Drin. I know this place."* -- THE FRIEND is genuinely helpful. Accurate information. No obvious agenda. They point out useful things: where the bar is, when the shift changes happen, who the supervisor is. -- Monologue fires: cautious appreciation. *"Helpful. Maybe too helpful. But the information checks out."* - -**The trust beat (minutes 5-15):** -- THE FRIEND provides intel the detective can verify. A tip about an NPC's routine that turns out to be accurate. A warning about a corridor that's usually watched. -- THE FRIEND shows vulnerability — mentions the card game debt (if it's NPC-D), or talks about personal struggles. They become HUMAN, not just a source. -- Monologue fires: warming. *"Drin's solid. Not the usual reluctant-witness type. Maybe they actually want this district cleaned up."* - -**The contradiction beat (minutes 20-25):** -- The detective observes THE FRIEND behaving inconsistently with their stated motivations. For NPC-D: they're seen meeting privately with NPC-A (the supervisor who's taking a cut from the ring). The meeting is brief, tense, and ends with THE FRIEND looking agitated. -- Monologue: *"Ana met with the shift supervisor. Off-record. In the maintenance corridor, not the office. Why?"* -- If the detective asks THE FRIEND, they deflect. *"Just sorting out some scheduling issues. You know how it is."* -- Monologue after: *"Scheduling issues don't make you look like that."* -- THE FRIEND's information has been good. But THE FRIEND has connections they're not disclosing. And now the detective wonders: was the help GENUINE, or was it STEERING? Were they being guided toward certain things and AWAY from others? - -**The conflict beat (minutes 25-30+):** -- The detective realizes: if THE FRIEND is compromised, then some of the "helpful" intel might have been curated. Not false — but SELECTIVE. Showing the detective the small stuff to hide the big stuff. -- But also: THE FRIEND's personal vulnerability was real. The stress was real. Maybe they're TRAPPED, not malicious. -- D-027 criterion fires: "Name an NPC you felt conflicted about." The player says "Drin." - -### What Both Versions Share - -1. **The contradiction is OBSERVED, not told.** The player sees it. The monologue interprets it. The FRIEND deflects when asked. This is our core mechanic — observation + monologue + social interaction — working in concert. - -2. **The contradiction activates during or shortly after contamination.** This is the emotional bridge between daily-life (warmth, trust) and investigation (doubt, conflict). The FRIEND's contradiction IS the contamination hitting home. - -3. **The contradiction is AMBIGUOUS.** THE FRIEND might be a traitor. They might be a victim. They might be trying to HELP in a way the player can't see yet. The 30-minute vertical slice ends before resolution. The player is left with doubt, not answers. - -4. **THE FRIEND requires production-level content.** Full voice kit. Custom dialogue for all four layers. Specific monologue lines for each beat. Environmental staging (they need to BE in the wrong place at the right time). This is NOT a template NPC with extra lines — it's a fully authored character. - -### Content Requirements for THE FRIEND - -| Content type | Per FRIEND NPC | Total (x2) | -|---|---|---| -| Custom dialogue lines (all 4 layers) | 25-35 | 50-70 | -| Character-specific monologue reactions | 15-20 | 30-40 | -| Contradiction observation trigger setup | 2-3 events | 4-6 events | -| Deflection dialogue (when asked about contradiction) | 3-5 lines | 6-10 lines | -| Post-deflection monologue | 3-5 lines | 6-10 lines | -| Daily routine (authored, not generated) | 1 schedule | 2 schedules | -| Voice kit (full production) | 1 page | 2 pages | -| **Total custom lines** | **~50-65** | **~100-130** | - -This is a LOT of content for two NPCs. But these two NPCs carry D-027 criterion #3. They're the emotional centerpiece. The investment is proportional to the payoff. - -**Owners:** Paula designs the arc. Mellanie writes the voice. Gestalt defines the triggers. Ozzie validates the FEELING. - ---- - -## Section 4: Audio Assets — The Concrete Spec - -Project lead confirmed: audio is IN for v0.1. Minimum viable: station ambient, 3 location variants, footsteps, monologue chime. 6-8 files. AI-generated via local model. - -Here's the full spec. Every file, what it does, and where it plays. - -### The Audio Asset List - -| # | File name | Type | Duration | Description | Where it plays | Why it matters | -|---|-----------|------|----------|-------------|---------------|----------------| -| 1 | `amb_station_base.ogg` | Ambient loop | 60-90s | Low-frequency station hum. The span gate's subsonic vibration. Ventilation. Distant machinery. This is the sound of Sova Transit District EXISTING. | **Everywhere.** Global ambient. Plays from game start, never stops. | The "you're on a space station" signal. Ozzie's #1 priority. Without this, the world is a boardgame. With it, the world BREATHES. | -| 2 | `amb_workplace_layer.ogg` | Ambient overlay | 45-60s | Cargo machinery. Grav-lift hum. Scanner pings. Manifest terminal beeps. Distant crew voices (unintelligible). Layered on top of base ambient. | **Logistics hub** — fades in on entry, fades out on exit. | The workplace SOUNDS like work. Industrial, purposeful. Creates contrast with the bar's warmth. | -| 3 | `amb_bar_layer.ogg` | Ambient overlay | 45-60s | Muffled conversation murmur. Glass on surface. A Meridian music feed (low, indistinct — just the bass). Occasional laughter. | **The Last Shift** — fades in on entry, fades out on exit. | The bar is ALIVE. Social. Warm. When it's quiet (late night, bad day), the absence of these sounds IS information. | -| 4 | `amb_corridor_layer.ogg` | Ambient overlay | 45-60s | Echoing footsteps (not the player's — distant NPCs). Ventilation whistle. The span gate hum is louder here — less insulation. A distant door closing. | **Corridors, maintenance areas, restricted sections.** | The lonely spaces between social sites. This is where tension lives. The echo makes you feel small and exposed. | -| 5 | `sfx_footstep_metal.ogg` | SFX, looping | 0.3-0.5s | Single footstep on metal grating. Clean, defined. Not heavy — working boots on station decking. | **Player movement.** Triggers on walk. Pitch-shifted slightly each step for variation. | The single highest bang-for-buck audio asset in any game. Your feet on the deck. You are HERE. You are PHYSICAL. | -| 6 | `sfx_footstep_metal_run.ogg` | SFX, looping | 0.2-0.3s | Faster footstep. Slightly louder. Urgent. | **Player run.** Triggers on run speed. | Running should SOUND different than walking. The urgency sells the moment. | -| 7 | `sfx_monologue_chime.ogg` | UI SFX | 0.5-1.0s | A soft, crystalline tone. Not a notification bell — something subtler. A gentle harmonic that suggests "an insight is forming." Think: a neural lattice firing. Not mechanical. Organic-digital hybrid. | **Monologue appearance.** Triggers when a new monologue line fades in. | This trains the player to NOTICE monologue. It becomes Pavlovian: chime = your character is thinking = pay attention. Without it, monologue text appears silently and gets missed. THIS SOUND IS THE GAME'S SIGNATURE. | -| 8 | `sfx_monologue_chime_urgent.ogg` | UI SFX | 0.5-1.0s | Same harmonic base as #7 but with a sharper attack, slightly discordant overtone. The "your character noticed something IMPORTANT" variant. | **Observation monologue.** Triggers when the monologue flags a contradiction, anomaly, or THE FRIEND's suspicious behavior. | Two chime variants: normal thinking and "WAIT, WHAT." The player learns the difference unconsciously. When the urgent chime fires during THE FRIEND's contradiction beat, the player's stomach drops before they even read the text. | - -**That's 8 files.** 6 ambient/overlay + 2 SFX. - -### Audio Technical Notes - -- **Format:** OGG Vorbis. Godot's preferred compressed audio format. Good quality at small file sizes. -- **Generation:** AI-generated via local model on Mac or Linux server (per project lead). Suggest: stable-audio or audioldm2 for ambient, basic synthesis for SFX. -- **Looping:** Ambient files must loop seamlessly. Design with fade-in/fade-out tails that cross-fade at loop point. -- **Mixing:** Base ambient at -20dB (barely conscious). Location overlays at -15dB (audible but not dominant). Footsteps at -10dB (present, grounding). Monologue chime at -8dB (catches attention without startling). -- **Integration point:** The sound event system (#124) emits events. The client audio manager receives events and plays the appropriate file. If no file exists for an event type, fall back to visual indicator. This means audio is ADDITIVE — remove any file and the game still works through text + visuals. - -### What's NOT in the 8-file minimum - -- NPC-specific audio (voices, unique sounds) — deferred to later -- Door sounds, scanner sounds, cargo sounds — atmospheric but not essential -- Music — no music in gameplay, per Araminta's recommendation (which I support) -- Three-range directional audio (muffled voices through walls, distant conversations) — system architecture supports it, content deferred -- Span gate transit event sound — would be amazing but is a milestone feature, not v0.1 - -### The Monologue Chime Is Non-Negotiable - -I want to emphasize this. If we ship 8 files, 7 of them could be ambient loops and the 8th MUST be the monologue chime. The chime is our tutorial. It's our attention director. It's the audio equivalent of Araminta's eye-icon observation marker. It says "YOUR CHARACTER IS THINKING" before the player consciously processes the text. - -Two variants (normal + urgent) is ideal. If we can only do one, make it the normal chime. The urgent variant can come later. - ---- - -## Section 5: The "Wow Moment" Budget - -Every game has a limited number of moments that make the player go "WHOA." In a 30-minute vertical slice, we get maybe 4-5 of these. Spend them wisely. Spend them wrong and the game is forgettable. - -Here's my wow moment budget for v0.1, ordered chronologically through the 30-minute session: - -### The Essential Wow Moments (MUST hit in v0.1) - -**Wow Moment #1: Arrival (minute 0-1)** -> The game starts. The station hum is already playing. The player sees their hab unit / starting location. NPCs are already moving — the world was here before them. Their first monologue line fires with a soft chime. They read it. They're a PERSON in a PLACE. - -- **What delivers it:** Audio (station hum) + NPC movement + monologue chime + first monologue line -- **Content required:** Opening monologue sequence, station ambient audio, pre-populated NPC routines -- **Emotional target:** Curiosity, grounding. "Where am I? This feels real." - -**Wow Moment #2: The Character's Eye (minute 5-15)** -> The player walks into The Last Shift. They see NPCs. The monologue fires: "Riks is at his usual table. But he's not drinking. He's watching the door." The player didn't notice this. Their CHARACTER did. The player looks at Riks with new eyes. - -- **What delivers it:** Observation monologue with the urgent chime variant. An NPC whose behavior was VISUALLY present but not obviously remarkable. -- **Content required:** Observation monologue lines (Mellanie), NPC routine with observable deviation (Paula/Gestalt), urgent monologue chime (audio) -- **Emotional target:** Surprise, respect for the character. "My character is smarter than me." - -**Wow Moment #3: THE FRIEND's Contradiction (minute 20-25)** -> The smuggler sees Kael near the Commission terminal. Or the detective sees Drin meeting the supervisor in the maintenance corridor. The urgent chime fires. The monologue: "What's Kael doing there?" The player asks. Kael lies. The monologue knows it's a lie. - -- **What delivers it:** THE FRIEND's full contradiction arc (see Section 3). Audio urgency chime. Visual positioning (THE FRIEND must be in the WRONG place for the player to SEE them there). -- **Content required:** Full FRIEND content package. Spatial staging. Specific monologue for the observation, the question, and the aftermath. -- **Emotional target:** Dread, betrayal, conflict. "I trusted you. What are you doing?" - -**Wow Moment #4: The Divergence Reveal (second playthrough, minute 5-10)** -> The player starts their second character. They walk into the same logistics hub. But it's DIFFERENT. The colors are different (Araminta's relationship color system). The names are different (the detective sees "Worker" where the smuggler saw "Kael"). The monologue is different (analytical vs. familiar). Same room. Different world. The player realizes: "Oh. I was only seeing HALF of this." - -- **What delivers it:** The dual-lens system working in concert across ALL layers. Entity colors. Access tiers. Character voice. Insert text. -- **Content required:** All dual-lens content for the logistics hub. Both character voice kits. Both opening sequences. -- **Emotional target:** Revelation, awe. "THE GAME IS DOING SOMETHING I'VE NEVER SEEN." - -### The Nice-to-Have Wow Moments (target for v0.1, survive without) - -**Wow Moment #5: The News Ticker Gut-Punch** -> The smuggler is at The Last Shift. The news ticker scrolls: "Commission advisory: increased cargo inspections at logistics hubs system-wide." Monologue: "...That's not good." -> The detective sees the same ticker. Monologue: "About time." - -- **What delivers it:** Environmental text + dual-lens monologue response -- **Content required:** Ticker content (Mellanie), dual monologue reactions, ticker display system -- **Emotional target:** The same information hits differently. The asymmetry in THREE WORDS of monologue. - -**Wow Moment #6: The Quiet Moment** -> Late in the session. The player is alone in a corridor. The station hum is the only sound. The monologue fires, unprompted: "Sometimes I wonder if it's worth it." (Smuggler) / "Sometimes I forget why I started doing this." (Detective) -> A moment of vulnerability. The character is a person, not just a lens. - -- **What delivers it:** Time-idle monologue trigger. Audio ambience (corridor layer). Character voice depth. -- **Content required:** Reflective monologue lines (Mellanie). Time-idle trigger (Gestalt). -- **Emotional target:** Connection. Empathy. "I care about this person." - -### The Wow Budget Summary - -| Moment | Essential? | Content load | Risk if missing | -|---|---|---|---| -| #1 Arrival | YES | Low (audio + 3-5 lines) | Game feels dead from second 1 | -| #2 Character's Eye | YES | Medium (observation system + lines) | Core mechanic unproven | -| #3 FRIEND Contradiction | YES | HIGH (full NPC package) | D-027 criterion #3 fails | -| #4 Divergence Reveal | YES (2nd playthrough) | HIGH (dual-lens across all systems) | Replayability argument collapses | -| #5 Ticker Gut-Punch | Nice-to-have | Low (ticker + 2 lines) | Missed opportunity, not fatal | -| #6 Quiet Moment | Nice-to-have | Very low (2 monologue lines) | Character depth feels thin | - -Four essential, two stretch. That's the budget. - ---- - -## Section 6: Cross-Agent Alignment & Worries - -### Where Everyone Converged (High Confidence) - -- **Dual Lens Guide is the root dependency.** All six of us identified this. Paula writes, everyone else consumes. Nothing starts until it exists. -- **The monologue is the game.** Gestalt, Mellanie, and I all agree: the monologue carries perception, tells, atmosphere, tutorial, and character voice. It's the hardest-working system in the project. -- **Color = relationship to player.** Araminta proposed it. Project lead approved it. I am thrilled. This IS asymmetric information rendered visually. -- **YAML for line pools.** Mellanie proposed it. Gestalt refined it. No disagreement. Lock it and go. -- **Spatial layout matters.** Araminta's sightline diagrams and my "first impression" approach are the same concern from different angles. The bar should be entered from a specific direction that shows you a specific view first. -- **Miri's setting is the substrate.** Everyone is building on Sova Transit District. The naming, the economics, the atmosphere — it's all load-bearing now. - -### Where I Disagree or Have Concerns - -**1. Mellanie wanted to defer audio. Project lead overruled.** -Mellanie said she can carry atmosphere through text alone. She CAN. But text-carried atmosphere is the fallback, not the plan. With the monologue chime in place, Mellanie's observation lines hit HARDER. Audio and text are multiplicative, not competitive. The chime primes the player's attention. The text delivers the insight. Together they're more than either alone. - -**2. Araminta wanted to defer audio entirely. Also overruled.** -Same reasoning. But Araminta's visual sound indicators are still needed alongside audio — the fog-edge ripple that shows sound direction is visual information that audio alone can't communicate in a top-down view. - -**3. Paula's relationship web may be too complex for v0.1.** -Seven triangles across 15 NPCs is structurally beautiful. But can we actually populate all seven with authored content in time? My instinct says: build the web, but prioritize content for the triangles the player is MOST LIKELY to encounter in 30 minutes. The Worried Partner (H-B-F) and The New Hire Problem (B-C-A) are the highest-impact mundane triangles. The Wavering Member (K-N-L) is the highest-impact entangled triangle. Start there. Fill the others as time allows. - -**4. Gestalt's 4x generation expansion worries me for monologue.** -Dialogue generation (write 10, expand to 40) works because dialogue is situational and fungible. Monologue generation is riskier — the character's PRIVATE THOUGHTS need to feel specific and authored, not templated. Mellanie flagged this too: "I'd estimate a 2x generation pass on monologue at best." I agree. Budget for 2x on monologue, 4x on dialogue. Don't let generated monologue flatten the character voice. - -**5. The line previewer (#193) needs to exist before content is "done."** -Both Gestalt and Mellanie flagged this. I'm escalating it: without the previewer, we can't test the FEEL of content. We can read YAML. We can check tag coverage. But we can't experience the rhythm of monologue lines firing in sequence, the pace of dialogue encounters, the feeling of walking through the bar while text populates the world. The previewer is our only pre-integration quality tool. It should be Sprint 2. - -### What I'm Most Worried About - -**Repetition in a 30-minute session.** Mellanie estimates the player encounters ~150-200 lines per playthrough. With ~3,000-3,600 total lines after expansion, that's a 5-7% utilization rate per session. Sounds fine. But monologue is different — the player might enter the logistics hub 4-5 times in 30 minutes. If they get the same "Busy morning" line twice, the spell breaks. We need DEPTH in high-frequency triggers (enter_location, observe_npc) and can get away with less variety in low-frequency triggers (discover_evidence, witness_interaction). - -**The 30-minute runway before contamination.** D-027 says 30 minutes of daily life before the conspiracy activates. I championed this. I still believe it. But 30 minutes of UNCONTAMINATED daily life needs to be genuinely engaging — not "waiting for the plot to start." This is where the mundane triangles, THE FRIEND's warmth phase, the news ticker, and the monologue observation system all need to fire. If even one of those is thin, the first 20 minutes feel like a waiting room. - ---- - -## Section 7: Dependency Chain (Player Experience View) - -Here's the order things need to happen from a "when does the player experience come alive" perspective: - -``` -WEEK 1-2: Foundation - Paula: Dual Lens Authoring Guide (THE critical path document) - Miri: Finalize Sova setting details (contraband specifics, detective chain of command) - Gestalt: Lock tag taxonomy + line pool format - Audio: Generate amb_station_base.ogg + sfx_monologue_chime.ogg (the two most important files) - -WEEK 2-3: Character Voice - Mellanie: Smuggler voice kit + Detective voice kit - Paula: THE FRIEND profile (smuggler version) + THE FRIEND profile (detective version) - Araminta: Visual Grammar doc + Entity color system spec - -WEEK 3-4: Opening Experience - Mellanie: Opening 5-minute content (both characters) - Mellanie: Monologue starter set (universal) - Mellanie: News ticker content (20-30 lines) - Audio: Generate remaining 6 files - Araminta: Spatial layouts (3 sites) - -WEEK 4-6: Depth - Paula: Full NPC profiles (Tier 1 entangled first, then Tier 2, then Tier 3) - Mellanie: THE FRIEND full content package (both versions) - Mellanie: Template content packs (#190-192) - Mellanie: Flat NPC "almost interesting" pass - Gestalt: Line previewer (#193) - -WEEK 6+: Polish - Paula: Mirror moment design pass - Mellanie: Observation monologue lines (tell-driven) - Mellanie: Diegetic insert flavor text - Ozzie: Playtest and gut-check -``` - -The player experience comes online at WEEK 4 — when we have character voice, THE FRIEND's warmth phase, and the opening 5 minutes working together. Everything before that is infrastructure. Everything after is depth and polish. - ---- - -## The Bottom Line - -Round 1, I said: "We need to write the moments, not just design them." - -Round 2, I'm saying: **"We now know WHICH moments. Let's write THESE."** - -Four essential wow moments. THE FRIEND at the center. Eight audio files. A monologue chime that becomes the game's heartbeat. An opening 5 minutes that makes the player forget they're looking at colored rectangles. A contradiction that makes them forget they're playing a game. - -The team is aligned. The setting is concrete. The systems are ready. The content gaps are mapped and prioritized. - -Let's fill the canyon. - ---- - -*Written by Ozzie. Still from the gut. But now the gut has a spreadsheet.* diff --git a/docs/workshops/content-gap-analysis_v0_1/round2-paula.md b/docs/workshops/content-gap-analysis_v0_1/round2-paula.md deleted file mode 100644 index 80320927b..000000000 --- a/docs/workshops/content-gap-analysis_v0_1/round2-paula.md +++ /dev/null @@ -1,469 +0,0 @@ -# Round 2 — Paula's Narrative Synthesis - -**Agent:** Paula (Narrative & Political Depth) -**Workshop:** v0.1 Content Gap Analysis — Round 2 -**Date:** 2026-02-11 - ---- - -## What I Read and What Changed - -I read all six Round 1 outputs. Here's what landed: - -- **Mellanie** gave me exactly what I needed: a concrete authoring model (scaffold, validate, scale), a tag taxonomy that maps to my four dialogue layers, and a clear dependency chain back to my deliverables. She also confirmed what I suspected — separate monologue pools per character are non-negotiable. Jeroen has confirmed this. Good. That's the game. -- **Gestalt** translated my relational layers into a selection pipeline (hard filter, hard filter, soft selector, weighted selection). The entanglement math tracks with my 30/50/20 split, though Gestalt's NPC distribution proposal differs from mine in detail. I'll reconcile below. -- **Miri** delivered Sova Transit District. This is the setting I was waiting for. The economics/motivation chain works — I'll react in detail below. The naming conventions (Kael, Voss, Lera, Torek, Drin, Maret) are concrete enough to start writing relationship webs. -- **Ozzie** crystallized THE FRIEND concept. His emotional journey map (curiosity > grounding > comfort > attachment > unease > dread > investigation) is the template I need for the contradiction arc design. He's right that the contradiction must be discoverable through observation, not told through dialogue. -- **Araminta** confirmed color = relationship to player (Jeroen approved). This means the visual system directly expresses my access tier model — green/teal/amber/red maps to trusted/unknown/flagged/hostile. The fog rendering spec (visible/fog-edge/hidden/remembered) has narrative implications I'll address. - -Three things changed from my Round 1 position: - -1. **THE FRIEND is now a confirmed design requirement**, not a suggestion. Jeroen says: one production-level complex NPC per character, full pipeline depth. This elevates my relationship web work — two NPCs need to be designed at a completely different depth than the other 13. -2. **Audio is in v0.1 scope** (6-8 files, AI-generated). This means Mellanie doesn't need to carry 100% of the sensory atmosphere through monologue. Some of those sound-interpretation lines can be lighter. -3. **Wiki structure is non-negotiable and must be established NOW.** This has implications for how I organize NPC profiles and relationship data — it needs to be future-ready, not just v0.1-ready. - ---- - -## 1. Missing Tickets Identified from Round 1 - -Reading all six outputs, I found content work that nobody has ticketed yet. Some of these were implied across multiple outputs but never explicitly called out as deliverables. - -### Tickets that must exist - -| Proposed Title | Type | Owner | Rationale | Dependencies | -|---|---|---|---|---| -| **THE FRIEND: Smuggler's Friend NPC — full profile + contradiction arc** | Story | Paula (profile) + Mellanie (voice) | Jeroen confirmed: production-level NPC. Full 10-axis, backstory, voice kit, dialogue set, tell system, contradiction arc. Pipeline depth test. | Dual Lens Guide, Setting brief | -| **THE FRIEND: Detective's Friend NPC — full profile + contradiction arc** | Story | Paula (profile) + Mellanie (voice) | Same as above, detective perspective. Different NPC, different contradiction, different emotional register. | Dual Lens Guide, Setting brief | -| **Contradiction arc design document** | Story | Paula | Defines how THE FRIEND's shift works mechanically: trigger conditions, monologue sequence, observable tells, dialogue changes pre/post discovery. Reusable pattern for future complex NPCs. | THE FRIEND profiles | -| **Opening hook content — smuggler (first 5 minutes)** | Story | Mellanie | Gestalt's opening-hook.yaml concept. 10-15 tightly sequenced monologue lines. The most important lines in the game. | Voice kits, Dual Lens Guide | -| **Opening hook content — detective (first 5 minutes)** | Story | Mellanie | Same for detective. Different emotional register, different tutorial pathway. | Voice kits, Dual Lens Guide | -| **Access tier shift design document** | Story | Paula + Gestalt | How access tiers change during gameplay. Gestalt flagged this in Round 1: tier shifts ARE the social gameplay. Need concrete shift paths per character per social site. | Dual Lens Guide | -| **News ticker content — Sova Transit District** | Story | Mellanie + Miri | 20-30 ticker lines. Ozzie and Miri both flagged this as high-value, low-cost. Needs Miri for setting consistency. | Setting brief | -| **Spatial layout design — Logistics Hub** | Story | Araminta | Floor plan, sightlines, NPC positions. Araminta proposed this. Layout affects what content makes sense — must be parallel with content packs, not after. | Setting brief | -| **Spatial layout design — Bar (The Last Shift)** | Story | Araminta | Same for bar. | Setting brief | -| **Spatial layout design — Smuggling spaces** | Story | Araminta | Same for ring spaces. | Setting brief | -| **Wiki taxonomy and structure** | Story | Miri + Qatux | Jeroen: non-negotiable, must be NOW. Full future-ready taxonomy: characters, factions, lore, star systems, technology, species, cultures, etc. Sova/Krenn is the first entry. | None — can start immediately | -| **Krenn System wiki entry** | Story | Miri | First concrete star system. Worldbuilding milestone. Establishes the pattern for all future system entries. | Wiki taxonomy | -| **Setting-grounded tag additions for line pools** | Story | Miri + Gestalt | Miri proposed lattice_tier, shift_phase, district_familiarity, institutional_context. These need to be validated against Gestalt's format spec and integrated. | Line pool format spec | -| **Monologue presentation spec** | Story | Araminta | Typography, animation, stacking, priority rules. Araminta defined this in Round 1 but it needs to be a spec document, not just workshop notes. | Visual Grammar | -| **Sound indicator visual spec** | Story | Araminta | Fog-edge indicators for the three-range model. Required even if audio exists — visual fallback for information. | Visual Grammar | -| **Diegetic tutorial monologue lines** | Story | Mellanie | Gestalt's diegetic tutorial concept needs actual authored lines. 8-10 per character, covering movement, fog, sound, NPC interaction, insert. | Voice kits, Opening hooks | - -### Tickets that already exist but need scope updates - -| Existing Ticket | Update Needed | -|---|---| -| #261 (Dual Lens Authoring Guide) | Scope confirmed. Add: emotional divergence moments (Ozzie's ask), access tier shift paths (Gestalt's ask), authoring checklist with display context tags (Araminta's ask). | -| #189 (Cultural generation guide) | Now includes Sova Transit District as first concrete instance. Miri's Round 1 output IS the v0.1 slice of this guide. | -| #190-192 (Template content packs) | Each pack now needs a parallel spatial layout (Araminta) as co-deliverable. Content and layout must be developed together, not sequentially. | -| #179 (NPC profiles) | Two NPCs (THE FRIEND x2) now require production-level depth. Remaining 13 stay at v0.1 tiers. Ticket scope must reflect this split. | - ---- - -## 2. Dependency Chain for Narrative Content - -Round 1 showed me, Mellanie, and Gestalt all proposing slightly different dependency chains. After reading all three, here's the reconciled version. The key insight: three tracks can run in parallel, converging at the content pack stage. - -``` -TRACK A: Narrative Architecture (Paula) TRACK B: Setting (Miri) TRACK C: Systems (Gestalt + Araminta) - -1. Dual Lens Authoring Guide (#261) 1. Sova Setting Brief (#189) 1. Line Pool Format Spec (done R1) - | | | -2. Relationship Web + Triangles 2. Wiki Taxonomy + Krenn Entry 2. Visual Grammar (Araminta) - | | | -3. THE FRIEND profiles (x2) 3. NPC Cultural Notes 3. Spatial Layouts (x3) (Araminta) - | | | -4. NPC Profiles (Tier 1-3) 4. Environmental Detail Catalog 4. Line Previewer (#193) - | | - └──────────────────────┬────────────────────────┘ | - | | - v | - 5. Character Voice Kits (Mellanie) | - | | - 6. Opening Hooks (Mellanie) | - | | - └──────────────────────────────────────────────────────────────┘ - | - v - 7. Content Packs (x3) (Mellanie) - | - 8. Tell Lines + Mirror Moment Pass (Paula reviews) - | - 9. News Ticker + Environmental Text (Mellanie + Miri) -``` - -### What can start NOW (no dependencies) - -| Deliverable | Owner | Status | -|---|---|---| -| Dual Lens Authoring Guide | Paula | Can begin immediately. Draft in this document. | -| Sova Setting Brief | Miri | **Done** (Round 1 output). Needs formalization into a document. | -| Line Pool Format Spec | Gestalt | **Done** (Round 1 output). Needs formalization. | -| Wiki Taxonomy | Miri + Qatux | Can begin immediately. Structure-only, content follows. | -| Visual Grammar | Araminta | Can begin immediately. | -| Provisional Voice Kit drafts | Mellanie | She proposed writing 3 options per character without waiting. Good instinct. | -| Monologue starter set (universal) | Mellanie | 50-60 lines for common situations. Unblocked. | - -### What blocks the most work - -The **Dual Lens Authoring Guide** is the single highest-leverage document. It blocks: -- Mellanie's voice kits (she needs emotional profiles before writing voice) -- NPC profiles (dual-lens notes per NPC require the guide) -- Content packs (the authoring checklist lives in the guide) -- Mirror moments (defined by the dual-lens framework) - -I'm delivering the refined outline in Section 3 below. The full draft is my next deliverable after this workshop. - ---- - -## 3. Dual Lens Authoring Guide — Refined Outline - -Round 1 gave me the bones. Round 2 input refines the structure. Here's the updated outline incorporating feedback from all six agents. - -### Part 1: The Two Characters (retained from Round 1, expanded) - -The character comparison table from my Round 1 (core identity, emotional starting state, relationship to district, what they notice, what they miss, internal monologue voice, relationship default) stays. It was well-received. - -**Addition from Ozzie:** Emotional divergence moments. 5 concrete situations where the characters have opposite emotional reactions. Not just "who knows what" — "who FEELS what." These become Mellanie's writing atoms. - -**Addition from Mellanie:** Voice signature section. Not personality traits — speech patterns. Short/long sentences, vocabulary register, internal monologue style (observations vs. feelings vs. hypotheses). The five things Mellanie needs: voice signature, what they notice, relationship to authority, what they lie about, emotional baseline. - -### Part 2: The Dual-Lens Rule (retained, refined) - -The core test: "Does it read differently through each lens?" with the three types of difference (access, interpretation, emotional weight). - -**Addition from Gestalt:** The examples must include the tag implications. When I show an NPC arriving late as a dual-lens example, I also show which `access`, `trust`, and `situation` tags would be different per character. The guide must bridge narrative intent to mechanical expression. - -### Part 3: Access Tier Mapping (retained, expanded with shift paths) - -The per-NPC-role access tier table stays. - -**Addition from Gestalt:** Access tier SHIFT paths. For each social site, the 2-3 most likely tier transitions per character. Not every combination — just the ones content packs must support. - -| Social Site | Character | Starting Tier | Likely Shift | Trigger | -|---|---|---|---|---| -| Logistics Hub | Smuggler | insider + peer | insider > hostile | Cover blown — seen with detective, or ring member reports suspicion | -| Logistics Hub | Detective | authority | authority > peer | Earns trust by keeping a minor infraction quiet | -| Bar | Smuggler | insider (regular) | insider > hostile | Same as above — social contamination from hub | -| Bar | Detective | public | public > insider | Repeated visits, earns regular status (3-4 visits) | -| Ring | Smuggler | insider + peer | peer > hostile | Suspected of cooperation with detective | -| Ring | Detective | public (doesn't know ring exists) | public > hostile | Stumbles into ring awareness — NPCs react defensively | - -This table directly feeds content packs: Mellanie needs lines for each starting state AND each shifted state. - -### Part 4: Divergence Escalation Curve (retained) - -The four-phase timeline (Arrival > Daily life > Tension > Crisis point) stays. This is the narrative arc that the storyteller orchestrates. - -### Part 5: Authoring Checklist (retained, expanded) - -The three-question checklist stays. - -**Addition from Araminta:** Question 4 — "What display context does this line use?" (spoken dialogue, overheard conversation, monologue reaction, environmental text). Every line must declare its rendering pipeline. - -**Addition from Mellanie:** Question 5 — "What tags express the dual-lens difference?" If the access tier is different per character, the line needs the correct `access` list. If the trust tier is different, the `trust` tag must reflect the lower threshold. - -### Part 6: THE FRIEND (new section — Jeroen's directive) - -Full specification of the production-level Friend NPC for each character. See Section 5 below for the detailed design. - -### Estimated Length - -~12-15 pages. Longer than I estimated in Round 1 (~10 pages) because Gestalt's mechanical mapping and the FRIEND section add depth. But this is the bible — better thorough than thin. - ---- - -## 4. Relationship Web and Triangle Design — Reconciliation - -My Round 1 proposed 15 NPCs with 7 triangles. Gestalt proposed a different NPC distribution and 4 triangles. Miri provided the Sova setting with triangle opportunities per template. Let me reconcile. - -### Where We Agree - -- 15 NPCs across 3 templates (5 per template) -- 3 flat, 7-8 mundane triangle, 3-4 entangled -- Bridge NPCs connect templates -- Cross-template triangles are essential -- The ring's vulnerability is social, not physical - -### Where We Diverge - -| Dimension | Paula (Round 1) | Gestalt (Round 1) | Resolution | -|---|---|---|---| -| **Number of triangles** | 7 (2 per template + 1 cross) | 4 (1 per template + 1 cross) | **5 triangles.** 7 is too many for 15 NPCs — too many overlapping roles. 4 is mechanically minimal but doesn't test mundane triangles enough. 5 gives us 1 entangled + 1 mundane per hub/bar, 1 entangled for ring, 1 cross-template. | -| **Ring structure** | Named ring leader, courier, fence, waverer, lookout | Ring leader, courier, lookout, contact, fixer | **Merge.** The waverer is narratively essential (potential informant). The contact (ring's bar presence) is mechanically essential (cross-template bridge). Drop the fence (M) and fixer — external contacts can be referenced, not instantiated. | -| **Flat NPC count** | 5 (E, I, J, M, O) | 4-5 | **3 flat NPCs.** Miri's setting gives even flat NPCs social texture. With only 15 total, 5 flat feels wasteful. 3 flat NPCs (maintenance tech, bartender, stranger/drifter) provide the noise floor. The bartender moves from flat to mundane — Miri's Lera Sessik is too socially positioned to be wallpaper. | -| **THE FRIEND placement** | Not explicitly in web | Not explicitly in web | **THE FRIEND NPCs are the most important nodes.** They must be placed where they have maximum narrative leverage. See Section 5. | - -### Revised Relationship Web (15 NPCs, 5 Triangles) - -Using Miri's Krenn System names where proposed, creating new ones for gaps. - -**Template 1: Logistics Hub ("The Terminal") — 5 NPCs** - -| # | Name | Role | Entanglement | Triangle | THE FRIEND? | -|---|---|---|---|---|---| -| 1 | **Voss** | Shift Supervisor | Mundane (compromised by cut, but thinks of it as pragmatism) | Triangle 1: Hub Power | No | -| 2 | **Kael Davan** | Dock Worker, ring member | Entangled | Triangle 1, Triangle 5 (cross) | **Smuggler's FRIEND** | -| 3 | **Maret Korr** | Freight Scheduler, ring-adjacent | Mundane (aware, silent, conflicted) | Triangle 2: Worried Knowledge | No | -| 4 | **Drin** | Dock Inspector | Mundane (gambling debt, compromisable) | Triangle 2, Triangle 5 (cross) | No | -| 5 | **Pael** | Maintenance Tech | Flat | None | No | - -**Template 2: Bar ("The Last Shift") — 5 NPCs** - -| # | Name | Role | Entanglement | Triangle | THE FRIEND? | -|---|---|---|---|---|---| -| 6 | **Lera Sessik** | Bartender/Owner | Mundane (complicit through willful ignorance) | Triangle 3: Bar Tensions | No | -| 7 | **Torek Lintar** | Bar regular, off-duty dock worker, ring-adjacent | Mundane (getting sloppy with spending) | Triangle 3, Triangle 5 (cross) | No | -| 8 | **Hael** | Bar regular, teacher/family person (Kael's partner) | Mundane (worried about Kael's late nights) | Triangle 4: The Worried Partner | No | -| 9 | **Sera Venn** | Bar regular, Commission field tech (off-duty) | Mundane (institutional presence in social space) | Triangle 4 | **Detective's FRIEND** | -| 10 | **Ren** | Drifter/new arrival | Flat | None | No | - -**Template 3: Smuggling Ring ("The Arrangement") — 5 NPCs** - -| # | Name | Role | Entanglement | Triangle | THE FRIEND? | -|---|---|---|---|---|---| -| 11 | **Nils Davan** | Ring coordinator (Kael's older sibling) | Entangled | Triangle 1: Hub Power | No | -| 12 | **Kosse** | Courier | Entangled | Triangle 5: The Informant Question | No | -| 13 | **Naia** | Ring member, wavering (considering cooperation) | Entangled | Triangle 5: The Informant Question | No | -| 14 | **Tev** | Lookout/runner | Flat | None | No | -| 15 | *Off-station coordinator* | Referenced, not instantiated | — | — | No | - -### The Five Triangles - -**Triangle 1: Hub Power (Voss - Kael - Nils)** -- Voss (supervisor) takes a cut to smooth inspections. Kael (dock worker) is the ring's hands on the floor. Nils (ring coordinator) gives orders through intermediaries. -- Tension: Voss resents being managed by someone who technically works under him. Kael is loyal to Nils by blood but uncomfortable with the escalation. Nils pushes for higher volume. -- **Smuggler relevance:** Navigates this daily. Knows the hierarchy, the resentments, the pressure points. -- **Detective relevance:** Sees Voss's anxiety, Kael's efficiency, senses something beneath the surface. Doesn't know Nils exists initially. - -**Triangle 2: Worried Knowledge (Maret - Drin - Voss)** -- Maret (freight scheduler) sees the manifest discrepancies. She's not in the ring — she just processes the paperwork and has noticed patterns. Drin (dock inspector) has a gambling debt and has been compromised into looking away during inspections. Voss (supervisor) maintains the schedule that creates the windows. -- Tension: Maret suspects but doesn't know whom to tell. Drin is being squeezed and might crack. Voss needs both of them functional and quiet. -- **Smuggler relevance:** Knows Maret is smart and worried — a risk. Knows Drin is compromised — a tool. Must manage both. -- **Detective relevance:** Maret is a potential cooperative witness. Drin is a potential turned asset. Both paths lead toward the operation. - -**Triangle 3: Bar Tensions (Lera - Torek - Ren)** -- Lera (bartender) runs a tight establishment and knows the after-hours crowd keeps the lights on. Torek (bar regular, dock worker) has been spending visibly beyond his income — new jacket, buying rounds, latest lattice accessories. Ren (drifter) is new in town and asking questions that could be innocent job-seeking or something else. -- Tension: Lera is protective of her regulars but Torek's spending is drawing attention. Ren's questions make everyone nervous. Is Ren competition? An informant? Just looking for work? -- **Smuggler relevance:** Torek's spending is a liability. Ren is an unknown variable. Lera is an ally who needs managing. -- **Detective relevance:** Torek's spending is a flag. Ren is a potential fresh source. Lera is the social hub who sees everything. -- **Note:** This is a mundane triangle with potential entanglement. Torek's spending COULD be from the ring, or from a side hustle, or from an inheritance. The ambiguity is the point. - -**Triangle 4: The Worried Partner (Hael - Kael - Sera)** -- Hael (teacher, Kael's partner) is worried about Kael's late nights and evasive answers. Hael confides in Sera (the detective's friend, a Commission field tech) over drinks at the bar. Sera hears Hael's worries and, depending on the detective's actions, might connect them to the investigation — or might protect Hael by not reporting. -- Tension: Hael's loyalty to Kael vs. growing suspicion. Sera's friendship with Hael vs. institutional duty. Kael's obliviousness to the anxiety he's causing at home. -- **Smuggler relevance:** The most emotionally loaded triangle. Kael is the smuggler's FRIEND. Hael is Kael's partner. The smuggler knows why Kael is busy and can't say. If Hael asks the smuggler directly, there's no good answer. -- **Detective relevance:** Sera is the detective's FRIEND. Hael is a potential source — a partner who suspects something. If the detective asks Sera about Hael, Sera faces a loyalty test: friend vs. duty. - -**Triangle 5: The Informant Question (Naia - Kosse - Drin) [CROSS-TEMPLATE]** -- Naia (wavering ring member) is considering cooperation with authorities. Kosse (courier) suspects Naia is unreliable and has told Nils. Drin (dock inspector, compromised) is the institutional contact who could receive Naia's information — but Drin is himself compromised. -- Tension: Three ways the ring unravels. Naia turns informant (from inside). Drin breaks under pressure and cooperates (institutional corruption cracks). Kosse's suspicion of Naia creates internal ring conflict that becomes observable. -- **Smuggler relevance:** Naia is the biggest threat. Must decide: support, report to Nils, or try to calm them down. Each choice has cascading consequences. -- **Detective relevance:** Doesn't know any of this yet. But the consequences of this triangle — nervous behavior, hushed arguments, people avoiding each other — are the observable signals that the investigation follows. - -### Triangle Distribution Validation - -| Category | NPCs | Count | Percentage | D-029 Target | -|---|---|---|---|---| -| Flat | Pael, Ren, Tev | 3 | 20% | ~30% | -| Mundane triangle | Voss, Maret, Drin, Lera, Torek, Hael, Sera | 7 | 47% | ~50% | -| Entangled | Kael, Nils, Kosse, Naia, (+ Torek borderline) | 4 | 27% | ~20% | - -Slightly under on flat, slightly over on entangled compared to D-029. For a 15-NPC vertical slice, this is acceptable — we need enough conspiracy thread to prove the investigation mechanic. In a full game district of 40+ NPCs, the ratio normalizes. The flat count being lower than target is offset by the 3 flat NPCs being genuinely ordinary — Pael fixes things, Ren is genuinely just looking for work (or isn't — the ambiguity stays), Tev watches corridors. - ---- - -## 5. THE FRIEND: Contradiction Arc Design - -Jeroen's directive: one production-level complex NPC per character. Full profile, full voice kit, full dialogue, full tell system, full contradiction arc. - -Let me design both. - -### Smuggler's FRIEND: Kael Davan - -**Who they are:** Dock worker at the Logistics Hub. The smuggler's closest colleague — they share shifts, eat lunch together, cover for each other. Kael is in the ring. He handles the physical cargo: routing flagged containers, managing the dock-side handoffs. He's been doing this for two years and is good at it. - -**Surface presentation (first 10 minutes):** Warm, reliable, slightly sardonic. Greets the smuggler with genuine affection. Talks about shift schedules, complains about Voss, asks about your weekend. Feels like the best coworker you've ever had. - -**What the smuggler knows:** Kael is a ring member. This isn't a secret from the smuggler — it's shared context. They work together on the legitimate side AND the illegitimate side. The smuggler trusts Kael because they've shared risk. - -**The contradiction:** Kael is meeting with someone the smuggler doesn't recognize. Late. In the restricted maintenance corridor. The smuggler's monologue: *"That's Kael. But who's he talking to? I don't know that face."* - -This is NOT the detective. This is someone else. Someone from outside the ring's known network. Kael has a side arrangement the smuggler doesn't know about — and the monologue's certainty ("I know everyone Kael knows") is what makes the discovery hit. - -**The shift arc:** - -| Phase | Timing | What the smuggler observes | Monologue register | Tell | -|---|---|---|---|---| -| **Comfort** | 0-10 min | Kael is warm, reliable, present. Business as usual. | Fond, casual: *"Kael's already at the dock. Good. The day's better when he's on shift."* | None — Kael is baseline comfortable | -| **First crack** | 10-15 min | Kael checks his lattice more often than usual. Excuses himself from lunch. | Mild curiosity: *"Kael's distracted today. Probably nothing."* | Behavioral: increased lattice checking, shortened social interactions | -| **The observation** | 15-20 min | The smuggler sees Kael in the restricted corridor talking to an unknown person. The person leaves before the smuggler gets close. | Alarm + confusion: *"That wasn't anyone from our rotation. And Kael didn't tell me about a meeting."* | Spatial: Kael in unexpected location at unexpected time | -| **Confrontation opportunity** | 20-25 min | The smuggler can ask Kael about it. Kael deflects: "Just a thing. Don't worry about it." He's lying. The smuggler KNOWS he's lying because they know Kael's tells. | Betrayal crystallizing: *"He looked left before answering. He always looks left when he's making something up. Kael is lying to me."* | Dialogue: evasion, subject change, forced casualness | -| **New equilibrium** | 25-30 min | Everything looks normal again. But the smuggler is now watching Kael. Every warm interaction is contaminated with doubt. | Conflicted: *"Same old Kael. Laughing at the same jokes. ...What are you not telling me?"* | Emotional: the smuggler's observation lines about Kael shift from fond to analytical | - -**What Kael is actually doing (the truth the player may or may not discover):** Kael's partner Hael has been asking questions. Kael is scared. The unknown person is someone from a different district who's offered to help Kael exit the ring — for a price. Kael is trying to get out to protect Hael. He's not betraying the smuggler — he's trying to save his family. But from the smuggler's perspective, any unauthorized contact is a security breach. - -**Why this works narratively:** The contradiction isn't "Kael is secretly evil." The contradiction is "Kael is secretly desperate, and his desperation is making him do exactly the kind of thing that could get everyone caught." The smuggler's anger is justified (Kael broke protocol). Kael's motivation is sympathetic (he's protecting his family). There's no clean answer. That's the conflict that Ozzie's D-027 criterion #3 is looking for: an NPC the player feels conflicted about. - -**What this tests in the pipeline:** Full 10-axis profile, multi-phase dialogue that changes based on observation state, tell system (lattice checking, spatial deviation, dialogue evasion), monologue that tracks emotional shift over time, dual-lens notes (the detective sees Kael's behavior change too — but reads it as guilt, not desperation). - ---- - -### Detective's FRIEND: Sera Venn - -**Who they are:** Commission field technician, off-duty bar regular. Sera is the detective's pre-existing contact in the district — someone from the same institutional world who transferred to Sova a year ago. They're the detective's social anchor: the one person in the district who speaks their language, who understands institutional culture, who can be honest over a drink. - -**Why a Commission tech, not another investigator:** Sera isn't the detective's partner or supervisor. She's lateral — a technician who maintains Commission equipment, not an investigator. This means she has institutional access (she knows Commission systems, she can look things up) but no investigative mandate. She helps the detective because they're friends, not because it's her job. That makes her help feel personal, not procedural. - -**Surface presentation (first 10 minutes):** Competent, slightly wry, comfortable in the district. When the detective visits the bar, Sera waves them over. Easy rapport. She fills in background — who the regulars are, what the district's like, which areas to avoid after dark. She's the detective's guide to a place they don't know yet. - -**What the detective knows:** Sera is reliable. She transferred to Sova for routine work after a stressful posting elsewhere. She doesn't have skin in the smuggling game. She's the detective's safe harbor in an unfamiliar social landscape. - -**The contradiction:** Sera always leaves when Torek Lintar arrives at the bar. Always. Three times in a row. The detective's monologue: *"That's the third time Sera's left when Torek walked in. That's not coincidence."* - -**The shift arc:** - -| Phase | Timing | What the detective observes | Monologue register | Tell | -|---|---|---|---|---| -| **Trust** | 0-10 min | Sera is warm, informative, helpful. Shares district intel freely. Offers to look things up in Commission systems. | Professional + personal warmth: *"Good to see a familiar face. Sera always was the reliable one."* | None — Sera is baseline comfortable | -| **Background data** | 10-15 min | Sera mentions Hael (Kael's partner) as "a friend from the district." Hael joins them occasionally. Sera and Hael have a genuine friendship. | Noting: *"Sera's connected here. Good. She knows the locals."* | Social: Sera has relationships outside institutional channels | -| **The pattern** | 15-20 min | Third time Sera excuses herself when Torek arrives. Different excuses each time. "Early shift." "Headache." "Need to check on something." | Suspicion activating: *"That's the third time. Sera leaves when Torek arrives. Why?"* | Behavioral: avoidance pattern, excuse variety, timing correlation | -| **The question** | 20-25 min | The detective asks Sera about Torek. Sera tenses. "He's just a loud drunk. I don't like loud drunks." She's deflecting. Not quite lying — but not telling the whole truth. The detective's training flags the evasion. | Professional analysis + personal conflict: *"She's not lying. But she's not telling me everything. Sera, what do you know?"* | Dialogue: controlled deflection, topic change, re-establishing warmth quickly | -| **Contaminated trust** | 25-30 min | Sera continues being helpful. Maybe even MORE helpful — as if compensating. But the detective can't stop watching her. Is Sera compromised? Is she protecting someone? Is she protecting the detective from something? | Analytical doubt: *"Still the same Sera. Still reliable. ...But reliable about what?"* | Emotional: the detective's observation lines about Sera shift from trusting to evaluating | - -**What Sera actually knows (the truth the player may or may not discover):** Sera knows Torek. She knows him because Hael confided in her about Kael's behavior, and Sera — being a Commission tech with access to systems — ran an unofficial check on Kael's work patterns. She found the manifest discrepancies. She knows something is wrong at the logistics hub. She hasn't reported it because Hael is her friend and reporting would mean Hael's partner gets investigated, possibly arrested, and Hael's life falls apart. Sera is protecting Hael by not reporting. She avoids Torek because Torek is connected to the ring and she doesn't want to be seen near him while she's sitting on unreported evidence. - -**Why this works narratively:** Sera isn't corrupt. She isn't a traitor. She's a good person making a terrible choice: loyalty to a friend vs. duty to her institution. The detective's discovery doesn't reveal a villain — it reveals a moral compromise that the detective themselves might understand. The conflict becomes: do I report Sera? Do I use what she knows? Do I confront her and risk losing my only ally in the district? - -**Why the Sera-Hael-Kael chain works:** Triangle 4 (The Worried Partner) feeds directly into Sera's contradiction. Hael's worry about Kael becomes Sera's knowledge. Sera's silence becomes the detective's discovery. The detective's investigation into the smuggling ring passes directly through their friend's concealment. Every thread is connected. That's the web. - -### THE FRIEND Design Principles (Reusable Pattern) - -Both FRIEND NPCs follow the same structural pattern. This is the reusable template for production-level complex NPCs: - -| Element | Requirement | -|---|---| -| **Relationship phase** | 3+ phases with distinct monologue registers (trust, crack, contamination) | -| **Observable contradiction** | Discoverable through the observation system, NOT told through dialogue | -| **Sympathetic motivation** | The FRIEND isn't evil — their concealment comes from a place of care or fear | -| **No clean resolution** | The player can't "fix" the situation without cost. Every response (confront, ignore, exploit, protect) has consequences | -| **Dual-lens resonance** | The other character's playthrough recontextualizes the FRIEND's behavior. Kael's desperation reads differently when you've played the detective and know the investigation is closing in. Sera's silence reads differently when you've played the smuggler and know what she's protecting. | -| **Triangle integration** | The FRIEND's contradiction connects to at least one triangle, creating cascade potential | -| **Tell progression** | 3+ observable behavioral changes that the monologue system can flag | -| **Dialogue shift** | Pre-discovery and post-discovery dialogue pools must feel different — same person, different tension | - ---- - -## 6. Mirror Moments — Refined by Mellanie's Monologue Approach - -Mellanie confirmed: separate pools, observation-event-triggered, independently coherent. This is the right foundation for mirror moments. Let me refine my Round 1 proposals against her authoring model. - -### What Changed - -In Round 1, I proposed mirror moments as paired monologue lines tagged to the same observation trigger. After reading Mellanie's approach, I'm refining: mirror moments aren't a special content type — they're a **quality of certain monologue lines that only becomes apparent on replay.** The authoring format doesn't need a "mirror" tag. It needs two independently authored lines that happen to respond to the same trigger, written by someone (me, reviewing Mellanie's work) who understands both characters well enough to ensure the ironic resonance. - -### The Mirror Moment Authoring Process - -1. Mellanie writes the monologue pools per character, per trigger. -2. I review both pools side by side and identify **natural mirrors** — places where the two characters' responses to the same trigger create dramatic irony. -3. Where natural mirrors don't exist but should, I flag the gap. Either Mellanie writes a new line, or I propose one for her to voice-match. -4. I tag mirrors in the authoring notes (the `dual_lens` field in Gestalt's format), NOT as a system tag. Mirrors are an authoring-layer quality check, not a runtime filter. - -### Revised Mirror Moments for v0.1 - -I'm keeping my Round 1 proposals but grounding them in Miri's Sova setting and Mellanie's trigger taxonomy. - -| Mirror | Trigger | Smuggler Line | Detective Line | What replay reveals | -|---|---|---|---|---| -| **1: The Friend's Routine** | `observe_npc` (Kael arriving at work) | *"Kael's here. Good — I was starting to worry."* | *"The dock worker from the case file. Davan, K. Unremarkable on paper."* | The smuggler's warmth + the detective's clinical assessment of the same person. On replay, the player recognizes that one character's friend is the other character's suspect. | -| **2: The Empty Corridor** | `enter_location` (maintenance corridor, night) | *"South access is clear. Nobody using the route tonight. Good."* | *"This corridor should see foot traffic during shift change. It's empty. Why?"* | The smuggler's relief IS the detective's clue. On replay, the player understands the silence is manufactured. | -| **3: The Worried Partner** | `observe_npc` (Hael at the bar, looking tired) | *"Hael looks rough. I should probably not mention seeing Kael at the hub so late."* | *"Spouse of hub worker Davan. Visible stress markers. Possible entry point for information."* | The smuggler sees a friend to protect. The detective sees a source to cultivate. Hael is caught between two people who both think they're acting in Hael's interest. | -| **4: The Spending** | `observe_npc` (Torek buying a round) | *"Torek's generous tonight. He needs to be more careful with that."* | *"The dock worker — Lintar — buying drinks for the table. On a standard logistics salary?"* | The smuggler knows (or suspects) where the money comes from and worries about exposure. The detective sees the spending as a financial tell. Same observation, different fear. | -| **5: Sera Leaving** | `witness_interaction` (Sera excuses herself when Torek arrives) | *"Sera's headed out. Smart — Torek gets loud after three drinks. Nobody wants to deal with that."* | *"That's twice now. Venn leaves when Lintar arrives. Coincidence? Filing it."* | The smuggler has the innocent explanation (Sera avoids loud drunks). The detective has the investigative read (avoidance pattern). On replay as the smuggler, the player who played detective first thinks: "Wait — WAS it just the noise?" | -| **6: The Hum** | `enter_location` (near span gate terminal) | *"The gate hum's stronger today. More transits than usual. Should be a busy shift."* | *"Increased gate activity. Higher cargo volume means more opportunity for irregularities."* | Same sensory data, different interpretive framework. Smuggler thinks logistics. Detective thinks investigation. Both are right. | -| **7: The Commission Kiosk** | `enter_location` (passing the Commission terminal in the hub) | *"The Commission kiosk. Nobody ever uses it for anything real. Keep walking."* | *"Institutional presence. Minimal. That's either reassuring or concerning."* | The smuggler dismisses institutional infrastructure. The detective evaluates it. On replay, the player understands how the ring benefits from the smuggler's attitude being universal. | - -**Target: 10-12 mirror moments for v0.1.** These 7 are the core structural mirrors tied to major narrative elements (THE FRIEND, the triangles, the setting). I'll identify 3-5 more during the review pass on Mellanie's monologue pools — organic mirrors that emerge from the content rather than being pre-designed. - ---- - -## 7. Reaction to Miri's Sova Transit District - -### Does the economics/motivation chain work for my narrative? - -**Yes. Emphatically.** - -Miri's Sova setting is exactly the economic substrate I asked for in Round 1. Let me trace the chain: - -``` -Freight economy (steady but modest wages) - → Permanent mild financial pressure (comfortable but tight) - → Smuggling as supplemental income (rational risk calculus) - → Community complicity (everyone benefits indirectly) - → Institutional thin-ness (Commission is intermittent) - → Normalized deviance (the abnormal becomes normal) - → The detective walks into a community that resists investigation not from malice, but from self-interest -``` - -This chain does three critical things for my narrative design: - -**1. It makes the smuggler sympathetic.** The smuggler isn't a cartel boss — they're a logistics worker who said yes to moving a container and discovered they're good at it. The ring isn't violent, isn't chaotic, isn't even particularly ambitious. It's a community survival mechanism. When the detective threatens to dismantle it, they're threatening the economic immune system Miri described. That's genuine moral complexity, not just "both sides." - -**2. It makes the detective's job genuinely hard.** The detective enters a district where non-cooperation is the default — not because people are criminal, but because the grey economy is everyone's business. Even flat NPCs have a reason to be unhelpful. Pael the maintenance tech doesn't know about the ring, but he's noticed his paycheck covers more than it should (contractors paid through ring-adjacent money). Drin the inspector looks away not because he's evil but because his gambling debt makes him vulnerable and the ring made that vulnerability work for them. Every NPC Miri describes has a motivation chain that starts with "the economy is slightly too tight for comfort." - -**3. It grounds the triangles in economic reality.** Triangle 2 (Worried Knowledge) exists because Maret processes manifests for a living and notices discrepancies. Triangle 3 (Bar Tensions) exists because Torek's spending is visible in a community where everyone knows everyone's financial position. Triangle 4 (Worried Partner) exists because Kael's late nights are economically implausible on a standard salary. The economic substrate generates the social signals that the observation system tracks. - -### What I need from Miri in Round 2 or a follow-up - -Three small additions to the Sova brief that would tighten the narrative: - -1. **The specific contraband mix.** Miri proposed unlicensed lattice components as primary cargo. I endorse this strongly — it creates the moral ambiguity of "they're moving access, not weapons." But I also want one item in the mix that's darker: something the smuggler doesn't look at too closely, that hints at the ring being connected to something bigger than local commerce. A sealed container that Nils says is "just components" but is heavier than it should be. This is the storyteller's contamination seed — the thing that makes the smuggler question whether they really know what they're part of. - -2. **The Commission liaison rotation detail.** Miri says the previous liaison was reassigned 3 months ago. I need to know: was this actually routine, or was it arranged? If the ring (or someone above the ring) influenced the rotation to get a less experienced liaison, that's a deeper conspiracy thread the detective can discover. If it was genuinely routine, that's a red herring the detective might chase. Either way, I need to know so I can write the NPC dialogue around it. - -3. **Hael's profession detail.** Miri placed a "teacher/family person" in the bar. If Hael is a teacher, what do they teach? Station kids? Adult education? This matters because Hael's social position affects how their worry reads to both characters. A teacher is someone the community trusts and respects — their worry carries social weight. If Hael starts asking questions publicly, the community pays attention in a way they wouldn't if Hael were just "someone's partner." - -### One strong validation - -Miri's naming conventions work. Kael, Voss, Lera, Torek, Drin, Maret — compact, consonant-heavy, first-name-primary in social contexts. These names are writeable. Mellanie can put these in dialogue and they feel natural. The IP distance from Hamilton's conspicuously-English names (Ozzie, Nigel, Paula) is exactly right. I've added Nils, Hael, Sera, Naia, Kosse, Pael, Tev, and Ren to fill the remaining roster slots, following Miri's conventions. - ---- - -## 8. Cross-Agent Synthesis: What I Need From Each Person - -| From | What I need | Why | When | -|---|---|---|---| -| **Mellanie** | Provisional voice kit drafts (3 options per character) | I can't finalize THE FRIEND dialogue until I know how the characters sound. Give me the options, I'll select/blend based on narrative needs. | Before content packs | -| **Mellanie** | Review of my mirror moment proposals | Are these writable? Do the voice registers hold? Would you phrase them differently? | After voice kits | -| **Gestalt** | Confirmation that the access tier shift table (Section 3) maps cleanly to the line selection pipeline | If tier shifts change the `access` tag mid-game, does the selection pipeline handle that? Or does it need a state flag? | Before Dual Lens Guide final draft | -| **Gestalt** | Tell trigger specification for THE FRIEND arcs | Kael's lattice-checking and Sera's avoidance pattern need to be expressible as observation triggers. Are they in the taxonomy? | Before FRIEND profiles | -| **Miri** | Contraband specifics, Commission rotation backstory, Hael's profession | Three small setting details that tighten narrative threads. See Section 7. | Before NPC profiles | -| **Miri** | Review of my NPC naming additions | Do Nils, Hael, Sera, Naia, Kosse, Pael, Tev, Ren fit Krenn System conventions? | Quick validation | -| **Araminta** | Spatial layouts for all three templates | I need to know where NPCs physically ARE before I finalize routine descriptions and observation opportunities. Where does the "restricted corridor" meeting happen? Where is the bar's corner booth? | Parallel with content packs | -| **Araminta** | Confirmation that color shifts support THE FRIEND arc | When the smuggler discovers Kael's secret meeting, does Kael's color shift from green to amber? What triggers that visually? | Before FRIEND profiles | -| **Ozzie** | Gut check on THE FRIEND contradiction arcs | Do Kael and Sera's shifts feel right emotionally? Is the discovery satisfying? Does the replay resonance work? | After this document | - ---- - -## 9. Summary: What I Deliver Next - -| Deliverable | Priority | Depends On | Target | -|---|---|---|---| -| **Dual Lens Authoring Guide — full draft** | Critical (blocks everything) | Nothing — writing now | Next sprint | -| **THE FRIEND: Kael Davan — full production profile** | Critical (pipeline test) | Dual Lens Guide, Mellanie voice kits, Miri setting details | After DLG | -| **THE FRIEND: Sera Venn — full production profile** | Critical (pipeline test) | Same as above | After DLG | -| **Relationship web (this document, Section 4) — formalized** | High | Miri validation, Araminta layouts | After layouts | -| **NPC Profiles: Tier 1 (4 entangled: Nils, Kosse, Naia, + Kael enhanced)** | High | Relationship web, Dual Lens Guide | After DLG | -| **NPC Profiles: Tier 2 (7 mundane: Voss, Maret, Drin, Lera, Torek, Hael, Sera enhanced)** | High | Tier 1 profiles | After Tier 1 | -| **NPC Profiles: Tier 3 (3 flat: Pael, Ren, Tev)** | Medium | Setting brief | After setting | -| **Access tier shift design document** | High | Gestalt validation | After DLG | -| **Mirror moment review pass** | Medium | Mellanie's monologue pools | During content pack authoring | -| **Contradiction arc design document** (reusable pattern) | Medium | Both FRIEND profiles complete | After FRIEND profiles | - -The Dual Lens Guide is the critical path. Everything else follows from it. I'm starting the full draft immediately after this workshop concludes. - ---- - -*The honest truth is: Round 1 gave us the parts. Round 2 is about the connections between the parts. The relationship web isn't just NPCs in a grid — it's a chain of consequences where Kael's fear for Hael becomes Sera's silence becomes the detective's doubt becomes the smuggler's betrayal. Every thread pulls on every other thread. That's what makes 15 NPCs feel like a community, not a cast list. And THE FRIEND, at the center of each character's web, is the emotional proof that the whole system works.* - -*Paula out. The web is woven. Now we write the people in it.* diff --git a/docs/workshops/content-gap-analysis_v0_1/workshop-outcomes.md b/docs/workshops/content-gap-analysis_v0_1/workshop-outcomes.md deleted file mode 100644 index b4bdedded..000000000 --- a/docs/workshops/content-gap-analysis_v0_1/workshop-outcomes.md +++ /dev/null @@ -1,82 +0,0 @@ -# Workshop Outcomes: v0.1 Content Gap Analysis - -**Workshop:** v0.1 Content Gap Analysis -**Date:** 2026-02-11 -**Rounds:** 2 (Analysis + Synthesis) -**Participants:** Mellanie, Paula, Araminta, Miri, Gestalt, Ozzie -**Facilitator:** Jeroen -**Documenter:** Qatux -**Status:** DONE — all decisions actioned, tickets created -**Full notes:** `docs/workshops/content-gap-analysis_v0_1/SUMMARY.md` - ---- - -## What the Workshop Accomplished - -Six agents independently analyzed 9 content layers across the vertical slice (D-027), then synthesized across all outputs. The project lead issued 9 directive decisions between rounds. Remarkable cross-agent convergence: the Dual Lens Guide, monologue as primary carrier, and the tag taxonomy were independently identified by multiple agents without coordination. THE FRIEND concept evolved from Ozzie's emotional instinct to Paula's structural design to Mellanie's authoring plan in a single workshop. - ---- - -## Decisions Produced - -| ID | Decision | Domain | Source | -|----|----------|--------|--------| -| D-032 | Separate monologue pools per character | content.md | Lead directive #1 | -| D-033 | Entity color = relationship to player | perception.md | Araminta R1 + lead directive #2 | -| D-034 | THE FRIEND production-level NPC pattern | content.md | Ozzie concept + lead directive #4 + Paula design | -| D-035 | Converged tag taxonomy for line pools (6+3 tags) | content.md | Gestalt + Mellanie convergence | -| D-036 | Sova Transit District / Krenn System as v0.1 setting | content.md | Miri R1 + lead directive #6 | -| D-037 | Contraband specification | content.md | Miri R1/R2 | -| D-038 | Audio in v0.1 scope via Stable Audio Open (8 files) | scope.md | Lead directives #3 + #9 | -| D-039 | v0.1 wow moment scope — all 6 moments | scope.md | Ozzie R1/R2 + lead directive #8 | -| D-040 | Wiki taxonomy structure | process.md | Miri R2 + lead directive #5 | - -All 9 decisions confirmed by project lead between rounds as non-negotiable directives. - ---- - -## Open Questions Identified - -| ID | Question | Owner | Status | -|----|----------|-------|--------| -| Q-012 | How does the generation expansion pass work? LLM, template-based, or rule-based? | Gestalt, Mellanie | Raised this workshop | -| Q-013 | How does the line previewer handle THE FRIEND's temporal progression? | Gestalt, Dudley | Raised this workshop | -| Q-014 | Audio timing with monologue — when does the chime fire relative to text? | Gestalt, Ozzie | Raised this workshop | -| Q-015 | Does 4x generation expansion apply to THE FRIEND's custom lines? | Mellanie, Gestalt | Raised this workshop | -| Q-016 | Knowledge hierarchy for monologue prerequisites | Gestalt, Paula | Raised this workshop | -| Q-017 | Triangle pressure threshold — what events trigger escalation? | Gestalt, Paula | Raised this workshop | - ---- - -## Tickets Created - -48 total tickets (42 new + 6 updates). See `docs/workshops/content-gap-analysis_v0_1/TICKETS.md` for full list. - -**Critical (9 new):** #297 Kael Davan full profile, #298 Sera Venn full profile, #299 Opening hook (smuggler), #300 Opening hook (detective), #301 Wiki taxonomy, #302 Sova Texture Appendix, #303 v0.1 Visual Grammar, #304 Entity Color System Spec, #305 Dialogue selection pipeline. - -**High (23 new):** Content and narrative (#306, #307, #310, #328), visual and spatial layouts (#311-318), worldbuilding (#319-322), systems and implementation (#308, #309, #323-327). - -**Medium (10 new):** Mirror moments, tutorial content, environmental standards, tell derivation (#329-338). - -**Updated (6):** #261 promoted to critical with expanded scope; #189, #168, #124, #90, #193 updated. - ---- - -## Key Flags - -- Detective's FRIEND confirmed as Sera Venn (Paula, not Mellanie's Lera proposal). Lera Sessik remains the bar owner. -- NPC triangle count: Paula reconciled from 7 to 5 triangles in Round 2. Five-triangle model is canonical. -- Tag taxonomy convergence was independent: Mellanie and Gestalt proposed nearly identical structures without coordination. -- Dual Lens Guide (#261) is the single highest-risk dependency — everything downstream blocks on it. - ---- - -## Critical Path Produced - -Dual Lens Guide (#261) → Voice Kits → THE FRIEND Content Packs → Validation → Content at Scale. - -Three parallel tracks: narrative (Paula), setting (Miri), systems (Gestalt + Araminta) — converging at content pack production. - ---- - -*Compiled by Qatux. Source: `docs/workshops/content-gap-analysis_v0_1/SUMMARY.md`, `TICKETS.md`. Decisions in `decisions/content.md` (D-032 through D-040 excl. D-033 in perception.md, D-038/D-039 in scope.md, D-040 in process.md).* diff --git a/docs/workshops/v01-content-scoping/SUMMARY.md b/docs/workshops/v01-content-scoping/SUMMARY.md deleted file mode 100644 index dc30d8f8c..000000000 --- a/docs/workshops/v01-content-scoping/SUMMARY.md +++ /dev/null @@ -1,325 +0,0 @@ -# v0.1 Content Scoping Workshop — Summary - -**Date:** 2026-02-12 -**Called by:** Jeroen -**Participants:** Gestalt (Systems Design), Paula (Narrative), Tyre (Architecture), Mellanie (Copywriter), Stig (UI), Dudley (Server), SI (Project Manager), Qatux (Documenter) -**Rounds:** 2 + closing round (lead resolutions) -**Purpose:** Scope and prioritize content work for v0.1 vertical slice. Apply Wiki Review long-term strategy (300-world generator model) to the hand-authored Sova Transit District proof. -**Key constraint:** v0.1 proves the interaction model. All structures must be generator-compatible for the 300-world future. - -**Source files:** -- `docs/workshops/v01-content-scoping/round1-tracking.md` -- `docs/workshops/v01-content-scoping/round2-tracking.md` -- `docs/workshops/v01-content-scoping/si-ticket-changes.md` -- `docs/workshops/v01-content-scoping/v01-content-scoping-workshop-brief.md` -- Round 1 responses: `round1-gestalt.md` through `round1-si.md` -- Round 2 responses: `round2-gestalt.md` through `round2-si.md` - ---- - -## 1. Workshop Overview - -**Round 1** — 7 responses across 6 topics (wiki fixes, NPC architecture, content directory, interaction model, scope boundary, tickets). Produced 17 consensus items, 5 disagreements, 7 wiki gaps, 7 decisions ready to formalize, 26 surviving tickets + 7 new proposals. - -**Round 2** — Lead issued 4 decisions resolving the major disagreements (NPC mapping, content format, interaction model, pause behavior). 7 responses addressed remaining convergence work. Gestalt changed 6 of 10 NPC mapping positions to Paula's reads. Tyre and Dudley independently produced structurally identical ObserverSnapshot v3 definitions. Mellanie delivered canonical PC voice registers and the Kael Davan content pack template. - -**Closing round** — Lead resolved 3 remaining questions: Q-012 (16 EntityKnowledge keys), Q-013 (server-authoritative pause, NEW-12 killed), Q-016 (`verbs[]` rename confirmed). Established process rule: no ticket merges across domain teams. - ---- - -## 2. Decisions Made (D-042 through D-061) - -### From Round 1 Consensus (7) - -| ID | Decision | -|----|----------| -| D-042 | Drin promoted from Tier 3 to Tier 2. | -| D-043 | THE NOBODY mechanic deferred to v0.2; hidden pattern+motivation data ships in v0.1 content files. | -| D-044 | v0.1 interaction model: 7 interactions (Move, Look, Monologue, Examine Object, Examine NPC, Talk, Overhear). | -| D-045 | v0.1 scope IN additions: News ticker, PC-as-NPC, Time progression, Relationship state transitions. | -| D-046 | v0.1 scope OUT additions: Inventory, Stealth, Combat, Player-facing save/load, Lattice modification. | -| D-047 | v0.1 triangles: 3 active forks (T1, T2, T4), 2 passive tensions (T3, T5). | -| D-048 | Client receives all text from server via state updates; client does not load or evaluate content files. | - -### From Round 2 + Closing (13) - -| ID | Decision | -|----|----------| -| D-049 | YAML is the content file format for v0.1. RON converter available as optional build-time tool. Server loads YAML directly; RON cache is a future production optimization. | -| D-050 | Gestalt's NPC pattern/motivation mapping is canonical for v0.1. Paula's emotional/narrative layer becomes v0.2 annotations. Version-toggle approach. | -| D-051 | v0.1 ships single context-sensitive action; multi-verb architecture modeled underneath. Server computes N available verbs per entity. v0.1 client shows priority-0 only. v0.2 client reads full list — no server changes. | -| D-052 | 3-state pause: Normal (100%), Overlay (50%), Paused (0%). Server-authoritative — client is a dumb renderer. Client sends pause IPC command; reads `sim_speed` from ObserverSnapshot. | -| D-053 | Self-contained triangle forks for v0.1. No cross-triangle cascade. v0.2 adds storyteller-managed cascade. | -| D-054 | ObserverSnapshot v3 protocol. Extends v2 with: `sim_speed`, `nearby_interactions`, `active_dialogue`, `monologue`, `overheard`, `knowledge_updates`, `examine_result`, `ticker_headlines`. Backward compatible via serde defaults. | -| D-055 | 16 EntityKnowledge keys. 4 new generic role-perspective keys. `trust_read` merged into `trust_level`. `secret_held` renamed to `leverage_held` (expanded value space). `secret_confidence` → `leverage_confidence`. `social_debt` and `loyalty_conflict` deferred to v0.2. | -| D-056 | PC voice registers defined. Smuggler: feeling-first, fragments, concrete/physical. Detective: analysis-first, complete sentences, institutional vocabulary. | -| D-057 | Content directory: `content/` with `schema/`, `global/`, `districts/` top-level split. JSON Schema validation at build time. Dialogue by location+role. Monologue partitioned by character. | -| D-058 | THE FRIEND content pack template: Kael Davan. 91 lines across 5 arc phases. Becomes template for all subsequent packs. | -| D-059 | Monologue display: 160 char max, 2-line max, 4-6s display, 2s cooldown, queue depth 1, 9-level priority ordering. | -| D-060 | `actions[]` renamed to `verbs[]` across all surfaces (server, client, YAML, wiki, decisions). | -| D-061 | No ticket merges across domain teams. Shared epics fine; each team gets own ticket with own definition of done. | - ---- - -## 3. EntityKnowledge — 16 Keys - -**Architecture:** All keys are observer-to-target. Interpretation lives in content (monologue pools, voice registers, archetype briefs), not schema. Same key, same enum, different meaning per archetype. - -### 12 Existing Keys - -| # | Key | Category | -|---|-----|----------| -| 1 | `name` | Identity | -| 2 | `role` | Identity | -| 3 | `faction` | Identity | -| 4 | `species` | Identity | -| 5 | `location` | Spatial | -| 6 | `routine_pattern` | Behavioral | -| 7 | `trust_level` | Relational (absorbs `trust_read`) | -| 8 | `leverage_held` | Relational (renamed from `secret_held`; expanded: secrets, debts, promises, obligations, compromising positions) | -| 9 | `leverage_confidence` | Relational (renamed from `secret_confidence`) | -| 10 | `relationship_state` | Relational | -| 11 | `behavior_flags` | Behavioral (tracks tells + contradictions) | -| 12 | `known_associates` | Social | - -### 4 New Role-Perspective Keys - -| # | Key | Values | What It Stores | -|---|-----|--------|---------------| -| 13 | `risk_assessment` | none / low / moderate / high / critical | How this NPC threatens observer's position | -| 14 | `loyalty_assessment` | solid / dependable / uncertain / wavering / hostile | How predictably this NPC serves observer's interests | -| 15 | `position_integrity` | solid / thin / cracking / blown / N/A | Status of active deception involving this NPC | -| 16 | `moral_weight` | innocent / peripheral / complicit / compromised / willing | Observer's subjective moral assessment | - -**Deferred to v0.2:** `social_debt` (no favor economy in 30-min session), `loyalty_conflict` (inferable from `behavior_flags` + `loyalty_assessment`). - -**Not added:** `tell_observed`, `contradiction_flagged` — tracked in existing `behavior_flags`. - ---- - -## 4. NPC Mapping - -### v0.1 Canonical (Gestalt's Mechanical Mapping) - -| # | Name | Tier | Pattern | Motivation | -|---|------|------|---------|-----------| -| 1 | Kael Davan | T1 | FRIEND | OPERATOR | -| 2 | Sera Venn | T1 | FRIEND | WITNESS | -| 3 | Naia Tamm | T1* | MIRROR | CIVILIAN | -| 4 | Voss | T2 | SYSTEM | OPERATOR | -| 5 | Lera Sessik | T2 | ANCHOR | OPERATOR | -| 6 | Torek Lintar | T2 | CATALYST | CIVILIAN | -| 7 | Devra | T2 | THRESHOLD | HANDLER | -| 8 | Maret Korr | T2 | WITNESS | SKEPTIC | -| 9 | Resha | T2 | CATALYST | CIVILIAN | -| 10 | Drin | T2 | SYSTEM | TURNCOAT | -| 11 | Renn | T2 | THRESHOLD | OPERATOR | -| 12 | Pell | T2 | CATALYST | TURNCOAT | -| 13 | Harek | T2 | ANCHOR | HANDLER | -| 14 | Sess | T3 | ANCHOR | CIVILIAN | -| 15 | Olin | T3 | CATALYST | CIVILIAN | -| 16 | Sabel | T3 | GHOST | OPERATOR | -| 17 | Tav | T3 | SYSTEM | CIVILIAN | - -**Off-stage:** Nils Davan — GHOST + HANDLER - -**Distribution:** 8 of 9 patterns present (REMNANT correctly absent; NOBODY deferred). All 6 motivations present. CIVILIAN at 6/17 (35%) matches D-029 noise floor (~30%). - -### v0.2 Emotional Layer (Paula's Annotations) - -Paula annotated all 10 disagreement NPCs with emotional/narrative depth descriptions specifying what content each v0.2 motivation/pattern unlocks (~30-50 lines per NPC). The version-toggle approach: same NPCs, same schema, deeper analytical lens. - -### Resolution Process - -Gestalt changed 6 of 10 Round 1 disagreement positions to Paula's reads (Maret pattern+motivation, Resha motivation, Harek pattern, Drin pattern, Sabel pattern, Olin motivation). Gestalt held on 3 (Voss motivation, Devra motivation, Sess pattern). Tav was a design-choice change (NOBODY deferred = SYSTEM+CIVILIAN instead). - ---- - -## 5. Content Architecture - -### Format -YAML for all content files (D-049). RON converter in `tooling/` as optional build-time optimization. Server loads YAML directly via `serde_yaml`. JSON Schema validation at authoring and build time. - -### Directory Structure - -``` -content/ - content.yaml # manifest - _schema/ # JSON Schema files - _meta/ # infrastructure - global/ - facts.yaml - factions.yaml - enums/ # situations, topics, moods, triggers, access-tiers, activities - knowledge/ - entity-attributes.yaml - regions/ - districts/ - sova-transit/ - district.yaml - npcs/ # per-NPC YAML (tier-conditional fields) - locations/ - triangles/ # 5 triangle definitions - lines/ - dialogue/ # by location + role (not NPC) - monologue/ # partitioned by character - routines/ - templates/ -``` - -**Canonical ID format:** `{system}.{station}.{district}.{type}.{slug}` - -### Validation Pipeline (3-tier) -1. **Authoring time:** IDE with JSON Schema autocomplete -2. **Build time:** `make validate-content` — JSON Schema + cross-reference validation -3. **Load time:** serde_yaml deserialization + semantic validation (StableId assignment, relationship wiring) - -### Schemas Defined -- `npc-profile.schema.json` — tier-conditional fields, pattern/motivation enums, axes, tells, access tiers, trust levels, friend_arc, triangle membership -- `dialogue-pool.schema.json` — tagged per D-028/D-035, role+location based, access/trust/situation gating, knowledge_grants -- `monologue-pool.schema.json` — character-partitioned (D-032), trigger+prerequisite (AND-only)+priority+cooldown, 160 char max - ---- - -## 6. Interaction Model - -### 7 Verbs (D-044) -Move, Look, Monologue, Examine Object, Examine NPC, Talk, Overhear. - -### Architecture -- Server computes N available verbs per entity every tick via `verbs[]` field (D-060 rename from `actions[]`) -- Priority-sorted: context determines which verb surfaces as `[E]` prompt -- Post-contradiction: Examine can rise above Talk (detective investigating flagged NPC) -- `verbs[]` embedded in ObserverSnapshot via `nearby_interactions`, not separate message - -### v0.1 Client -Single context-sensitive action. `[E] Talk` / `[E] Examine`. One keybind. `InteractPrimary` PlayerAction variant sends priority-0 verb. - -### v0.2 Extension -`[E] Talk [F] Observe` — horizontal label row. `InteractWith` PlayerAction variant. Client reads full `verbs[]` list. **No server changes needed.** - -### Convergence -Tyre (`AvailableActions`/`ActionOption`), Dudley (`EntityInteractions`/`AvailableAction`), and Stig (`InteractionOptions`) independently produced structurally identical designs. Naming unification deferred to implementation (Q-015). - ---- - -## 7. Pause System - -### 3 States (D-052) - -| State | Speed | Trigger | -|-------|-------|---------| -| Normal | 100% (1.0) | Default | -| Overlay | 50% (0.5) | Knowledge panel, dialogue | -| Paused | 0% (0.0) | Spacebar (always) | - -### Authority -**Server-authoritative.** Tick rate is a server simulation concern. Client is a dumb renderer — renders ObserverSnapshots at whatever rate the server sends them. Client sends pause IPC command to server. Client reads `sim_speed` from ObserverSnapshot for visual feedback. - -Spacebar from any state goes to Paused. Spacebar from Paused resumes to pre-pause state. Multiple overlays don't stack below 50% in v0.1. - -**NEW-12 (client pause state machine) killed** — client doesn't manage time. Stig's `PauseManager` reduced to sending IPC commands and reading `sim_speed`. - ---- - -## 8. Scope Boundary - -### IN (v0.1) -- WASD movement + collision -- Context-sensitive interaction (7 verbs, single-action prompt) -- Monologue system (tagged triggers, FactId prerequisites, AND-only) -- Knowledge graph (player learns facts, relationships change) -- 2 playable characters (smuggler, detective) -- THE FRIEND arc (Kael for smuggler, Sera for detective) -- 5 triangles: 3 active forks (T1, T2, T4), 2 passive tensions (T3, T5) -- 6 wow moments (D-039) -- 3 social sites (Terminal, Last Shift, Maintenance Corridors) -- NPC routines (schedule-based movement) -- News ticker (world-space at bar) -- PC-as-NPC (other character exists as NPC) -- Time progression (DayPhase) -- Relationship state transitions (Friendly → PersonOfInterest) -- Self-contained triangle forks (no cross-triangle cascade) -- ~695 authored content items (~200 monologue + ~350 dialogue + ~50 environmental + ~20 ticker + ~50 UI + ~25 PC-as-NPC) - -### OUT (v0.1) -- THE NOBODY / dynamic tier promotion (data ships, mechanic deferred) -- Archetype transitions -- Multiple FRIEND candidates per character -- Secondary contraband variation -- Gate network / multi-world -- Content generation / randomization -- Modding support (mod-compatible conventions ship; overlay implementation doesn't) -- Inventory system (evidence is knowledge, not physical items) -- Stealth mechanics (social stealth, not mechanical) -- Combat system -- Player-facing save/load (session-based 30-minute slice) -- Lattice modification/upgrade -- Cross-triangle cascade (storyteller-managed, v0.2) -- `social_debt` / `loyalty_conflict` EntityKnowledge keys - ---- - -## 9. Ticket Summary - -### Counts - -| Category | Count | Teams | -|----------|-------|-------| -| Wiki fixes (A-series) | 8 | copy | -| Style guides & specs (B-series) | 5 | copy | -| Content directory & schema (C-series) | 10 | copy (1), server (8), ci (1) | -| Design specs (D-series) | 2 | server (1), copy (1) | -| Workshop tickets (NEW 1-7) | 7 | copy | -| Lead decision tickets (NEW 8-14, excl. killed NEW-12) | 6 | server (4), client (2) | -| **Total new tickets** | **38** | **copy (21), server (13), client (2), ci (1)** | -| Existing ticket updates | 10 | — | - -### Sprint 3 Allocation - -**Copy team (15 tickets):** -- P0: #261 (Dual Lens Guide — **critical path root**, blocks 9 tickets), C1 (content dir design), A1 (canonical names), A2 (Naia Tamm rename), A7 (smuggler attributes) -- P1: B2 (MIRROR spec), B4 (smuggler voice + moral arc), NEW-1 (NPC mapping), NEW-5 (wow moment checklist), A10 (Nils stub), A11 (Triangle 1 fix) -- P2: B3 (PC-as-NPC spec), A8 (shortcode fix), NEW-2 (Drin expansion), NEW-7 (interaction verb spec) - -**Server team (6 additions to existing 10):** -- C2 (directory skeleton), C3 (schemas), C9 (validate-content CLI), NEW-9 (proximity + InteractionOptions), #326-P1 (loader skeleton), NEW-11 (tick rate scaling) - -**Client team (1 addition):** -- NEW-10 (extensible interaction prompt) - -### Critical Paths - -**Chain 1 — Content Authoring:** -`#261` → B4 → A6 (Sprint 4) → NEW-4 (Sprint 4) → content packs (Sprint 5) - -**Chain 2 — Content Architecture:** -C1 → C2+C3 (Sprint 3) → C4-C8+NEW-3 (Sprint 4) → #326-P2 (Sprint 4) - -**Chain 3 — Interaction Pipeline:** -NEW-7 (soft) → NEW-9 (server) → NEW-10 (client) - -**#261 (Dual Lens Authoring Guide) is the single biggest blocker.** Blocks 9 downstream tickets across the entire content pipeline. Recommended: Paula as owner, 5-day time-box. - -### Key Existing Ticket Updates -- #368: Close (wiki delivered) -- #369: Repurpose as parent epic -- #326: Split into Phase 1 (Sprint 3, skeleton) + Phase 2 (Sprint 4, real content) -- #86: Update ECS component list to workshop output -- #88: Add #237 (A* pathfinding) dependency - ---- - -## 10. Open Items Carried Forward - -| ID | Item | Owner | Priority | -|----|------|-------|----------| -| Q-014 | 3 NPC surnames awaiting Miri validation: Drin Vassar, Sess Torin, Tav Lenn | Miri | Low | -| Q-015 | Interaction struct naming: `AvailableActions` (Tyre) vs `EntityInteractions` (Dudley). Trivial — resolved at implementation time. | Tyre/Dudley | Low | -| Q-017 | 695 authored items validated as scope input but not independently verified by other agents. | SI/Mellanie | Low (informational) | - -None of these block Sprint 3 work. - ---- - -*Compiled by Qatux. Workshop produced 20 decisions (D-042 through D-061), 38 new tickets + 10 updates, canonical NPC mapping for 17 NPCs, 16-key EntityKnowledge spec, full content architecture, and Sprint 3-5 roadmap. 3 minor open items carried forward. #261 is the critical path root.* diff --git a/docs/workshops/v01-content-scoping/round1-dudley.md b/docs/workshops/v01-content-scoping/round1-dudley.md deleted file mode 100644 index 31673dcf9..000000000 --- a/docs/workshops/v01-content-scoping/round1-dudley.md +++ /dev/null @@ -1,826 +0,0 @@ -# Round 1 — Dudley (Server Developer) - -## Topic 2: NPC Architecture — Server-Side Entity Data & ECS Design - -### Current State - -The server already has a basic NPC component set from D-024 (`server/src/npc/mod.rs`): `Npc` marker, `Want`, `Secret`, `Relationships`, `ToleranceThreshold`, `DailyRoutine`, `InformationInventory`, `Contentment`, `PersonalityTraits`, `TellSystem`, `SkillSet`, `CombatCapability`. These implement the 10-axis model but are string-heavy placeholders. They don't yet encode the three-system NPC model (pattern + motivation + composition). - -The knowledge graph (`server/src/knowledge/`) is production-ready for Sprint 2 scope: `KnowledgeGraph` component with BTreeMap storage, `EntityKnowledge`/`FactKnowledge` entries, confidence hierarchy, decay system, event-driven updates via `KnowledgeEventQueue`. - -### What Each Pattern Requires (System A) - -Patterns define what the character *means to the story*. Most pattern behavior emerges from existing D-024 axes plus a pattern tag and pattern-specific state. The simulation doesn't need a unique system per pattern — it needs the pattern tag to gate content selection and a small amount of pattern-specific state. - -```rust -/// System A: Thematic pattern tag. -/// Drives content selection (which monologue pool, which dialogue options). -/// The pattern itself is behavioral coloring on top of D-024 axes, -/// not a separate simulation system. -#[derive(Component, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] -pub enum ThematicPattern { - Friend, - Mirror, - Anchor, - Ghost, - Catalyst, - Threshold, - Remnant, - System, - Nobody, -} -``` - -Pattern-specific server-side state needed for v0.1: - -| Pattern | Extra State Beyond D-024 | v0.1? | -|---------|-------------------------|-------| -| FRIEND | `FriendArc` component — phase tracking, contradiction fact IDs, tell progression stage, discovery state | YES (Kael, Sera) | -| MIRROR | None — MIRROR power is *absence* of contradiction. Normal D-024 axes, no secret, no hidden state. | YES (Naia Tamm) | -| ANCHOR | None — contentment axis (already exists) IS the anchor mechanic. | Maybe | -| GHOST | `GhostInfluence` — list of entities this ghost controls, communication channel. Not physically present. | NO (v0.2+) | -| CATALYST | `CatalystTrigger` — arrival condition, disruption event chain. | NO (v0.2+) | -| THRESHOLD | `GateCondition` — what the player needs to pass. Maps to knowledge prerequisites. | Maybe | -| REMNANT | None — InformationInventory with deep historical facts suffices. | Maybe | -| SYSTEM | `InstitutionalRole` — faction affiliation, procedure set, authority level. | YES (Torek) | -| NOBODY | `NobodyState` — promotion stage (Nobody/Noticed/Recognized/Known/Invested), interaction counter, dormant pattern+motivation. | DEFERRED per workshop brief | - -THE FRIEND is the only pattern that requires a dedicated component in v0.1: - -```rust -/// THE FRIEND arc state (D-034). -/// Tracks the emotional progression that exercises every content pipeline. -/// One per FRIEND NPC (Kael for smuggler, Sera for detective). -#[derive(Component, Debug, Clone, Serialize, Deserialize)] -pub struct FriendArc { - /// Which playable character this FRIEND belongs to. - /// The simulation doesn't know "the player" — it knows character IDs. - pub bonded_character: StableId, - /// Current arc phase. Advances based on knowledge events + interaction count. - pub phase: FriendPhase, - /// FactIds that constitute the contradiction (e.g., "kael.secret_meetings"). - /// When the bonded character learns these, phase shifts to Doubt. - pub contradiction_facts: Vec, - /// Tell progression: index into the tell sequence. - /// Tells become more visible as phase advances. - pub tell_stage: u8, - /// Has the bonded character directly observed the contradiction? - pub contradiction_discovered: bool, -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] -pub enum FriendPhase { - /// Default — warmth, trust-building. "We're in this together." - Warmth, - /// Player has hints — something is off. Tells become visible. - Trust, - /// Contradiction evidence accumulating. Monologue turns questioning. - Doubt, - /// Direct confrontation or discovery. Relationship fractures. - Conflict, -} -``` - -### What Each Motivation Requires (System B) - -Motivations define what the character *does in gameplay*. Like patterns, most behavior comes from D-024 axes. The motivation tag gates which interaction options the server offers and how the NPC responds in dialogue selection. - -```rust -/// System B: Functional motivation tag. -/// Drives NPC behavior in interactions — what they want from the player, -/// what information they'll share, how they respond to pressure. -#[derive(Component, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] -pub enum FunctionalMotivation { - Handler, - Witness, - Turncoat, - Civilian, - Operator, - Skeptic, -} -``` - -Motivation-specific state: - -| Motivation | Extra State | v0.1 Notes | -|-----------|-------------|------------| -| HANDLER | `HandlerState` — which entities they manage, pressure level, directive queue | YES — Voss manages the ring | -| WITNESS | `WitnessKnowledge` — specific observed FactIds, willingness to share, fear level | YES — key investigation mechanic | -| TURNCOAT | `LoyaltyState` — current allegiance, flip conditions, which side they're reporting to | Maybe (depends on NPC mapping) | -| CIVILIAN | None — the *absence* of special state IS the civilian mechanic. Normal D-024 axes. | YES — most Tier 3 NPCs | -| OPERATOR | `OperatorGoal` — current objective, resources managed, competence level | YES — Kael, Lera | -| SKEPTIC | `SkepticTarget` — what institution/system they doubt, what questions they ask | Maybe | - -Most motivations don't need dedicated components. The motivation tag + existing D-024 axes + content tagging (D-035) handle the behavioral differentiation. The server's job is to expose the tag for content selection, not to simulate each motivation as a separate state machine. - -### Proposed ECS Component Design (v0.1 Complete) - -Here's the full component bundle for spawning an NPC entity. Components are split into identity (always present), behavioral (from D-024), pattern/motivation (System A+B), and optional: - -```rust -/// Identity components — every NPC has these -pub struct NpcIdentity { - pub stable_id: StableId, // server-side, never changes - pub canonical_id: String, // content-addressing key ("sova.kael_davan") - pub display_name: String, // "Kael Davan" - pub short_name: String, // "Kael" — used in social contexts (D-036) -} - -/// Content tier — determines simulation depth (D-026 + D-029) -#[derive(Component, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] -pub enum ContentTier { - Tier1, // Production-level (FRIEND, MIRROR) — full sim, all axes active - Tier2, // Templated with variation — full sim, most axes active - Tier3, // Procedural filler — background sim, minimal axes -} - -/// Access tier map — D-028 Layer 1. -/// Determines which dialogue access tiers this NPC responds to -/// for each interacting character. -#[derive(Component, Debug, Clone, Serialize, Deserialize)] -pub struct AccessTierMap { - /// Default access tier for unknown characters - pub default_access: AccessTier, - /// Per-entity overrides (e.g., Kael treats smuggler as "insider") - pub overrides: BTreeMap, -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] -pub enum AccessTier { - Public, - Insider, - Authority, - Peer, - Hostile, -} - -/// Trust level for gossip gating — D-028 Layer 3. -/// Per-relationship trust determines disclosure tier. -#[derive(Component, Debug, Clone, Serialize, Deserialize)] -pub struct TrustLevels { - /// Per-entity trust level. Absent = surface only. - pub levels: BTreeMap, -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] -pub enum TrustTier { - Surface = 0, - Real = 1, - Secret = 2, -} - -/// Triangle membership — which social triangles this NPC participates in. -/// Used by the server to determine which events ripple through which NPCs. -#[derive(Component, Debug, Clone, Serialize, Deserialize)] -pub struct TriangleMembership { - pub triangles: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct TriangleRef { - pub triangle_id: String, // "hub_power", "dock_loyalty", etc. - pub role: String, // NPC's role within this triangle -} - -/// NPC routine — schedule-based movement (D-031 day phases) -#[derive(Component, Debug, Clone, Serialize, Deserialize)] -pub struct NpcRoutine { - pub schedule: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct RoutineEntry { - pub phase: DayPhase, - pub location: String, // canonical location ID ("sova.terminal", "sova.last_shift") - pub tile: TilePosition, // exact position within location - pub activity: String, // "working", "drinking", "patrolling" — drives animation + availability -} - -/// Mood state — drives D-035 mood tag selection for dialogue lines -#[derive(Component, Debug, Clone, Serialize, Deserialize)] -pub struct MoodState { - pub current_mood: Mood, - pub stress: f32, // 0.0-1.0, accumulated from events -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] -pub enum Mood { - Neutral, - Friendly, - Guarded, - Anxious, - Hostile, - Distracted, - Resigned, - Amused, -} -``` - -**Full NPC entity bundle for spawning:** - -```rust -/// Everything needed to spawn a v0.1 NPC entity. -/// Not all components required — ContentTier determines which are populated. -struct NpcBundle { - // Always present: - npc: Npc, - identity: NpcIdentity, - content_tier: ContentTier, - pattern: ThematicPattern, - motivation: FunctionalMotivation, - position: TilePosition, - knowledge: KnowledgeGraph, - routine: NpcRoutine, - - // Tier 1-2: - want: Want, - secret: Secret, - relationships: Relationships, - tolerance: ToleranceThreshold, - information: InformationInventory, - contentment: Contentment, - personality: PersonalityTraits, - tells: TellSystem, - skills: SkillSet, - access_tiers: AccessTierMap, - trust_levels: TrustLevels, - mood: MoodState, - triangles: TriangleMembership, - - // Pattern-specific (optional): - friend_arc: Option, - - // Combat (optional, D-024): - combat: Option, -} -``` - -### Key Design Principle - -The simulation guarantees: **pattern and motivation are tags for content selection, not unique simulation subsystems.** The server doesn't run 9 different pattern AIs. It runs one NPC tick loop that checks the pattern tag when selecting dialogue, scheduling tell visibility, and evaluating arc progression. THE FRIEND is the sole exception in v0.1 because its arc progression is load-bearing for the vertical slice. - ---- - -## Topic 3: Content Loader — Load Sequence & NPC Spawning - -### What the Server Content Loader Needs - -The server needs to transform content files into ECS entities with components. State consistency requires a defined load sequence with validation at each stage. - -**Server content requirements:** - -1. **District definition** — map dimensions, chunk layout, walkability grid, z-levels, location boundaries -2. **NPC profiles** — identity, axes, pattern, motivation, routine, relationships, knowledge, access tiers -3. **FactId catalog** — all valid fact identifiers with metadata (what category, what it means) -4. **Triangle definitions** — which NPCs, what roles, escalation conditions -5. **Dialogue line pools** — tagged lines per D-035 (server does selection, client does display) -6. **Monologue pools** — tagged lines per D-035 (separate per character, D-032) -7. **Contraband definitions** — what items exist, manifest templates for ring operations - -**What the server does NOT need from content files:** -- Visual assets (sprites, tilesets) — client only -- Audio assets — client only -- UI text that isn't dialogue/monologue — client only -- Wiki prose — authoring format only - -### Proposed Load Sequence - -``` -PHASE 1: VALIDATE - Read content manifest (content/manifest.ron) - Validate all referenced files exist - Validate schema compliance (FactId catalog, NPC profiles, etc.) - FAIL FAST if any validation error — do not partially load - -PHASE 2: GLOBAL RESOURCES - Load FactId catalog → FactCatalog resource - Load contraband definitions → ContrabandDefs resource - Load triangle definitions → TriangleDefs resource - Load dialogue pools → DialoguePool resource - Load monologue pools → MonologuePool resource (per-character, D-032) - -PHASE 3: MAP - Load district walkability grid → WalkabilityMap resource (already exists) - Load location boundaries → LocationMap resource (new) - Load interactable object positions → spawn Object entities - -PHASE 4: ENTITIES - For each NPC profile: - Allocate StableId via EntityRegistry - Spawn entity with NpcBundle components (derived from profile) - Initialize KnowledgeGraph with background facts - Set initial position from routine (current day phase) - For each playable character: - Spawn with PlayerCharacter marker + full component set - Initialize KnowledgeGraph with character-specific background - -PHASE 5: RELATIONSHIPS - Wire up Relationships components (now that all StableIds exist) - Wire up AccessTierMap overrides (per-entity access) - Wire up TrustLevels (per-entity trust) - Wire up FriendArc.bonded_character - Wire up TriangleMembership references - -PHASE 6: VERIFY - Assert all StableId references resolve - Assert all routine locations exist in LocationMap - Assert all FactIds in NPC knowledge exist in FactCatalog - Assert FriendArc NPCs exist and are bonded to valid characters - Log load summary: N entities, M facts, K dialogue lines -``` - -Phase ordering matters. Phase 5 requires all entities from Phase 4 to exist (StableId resolution). Phase 3 must complete before Phase 4 (NPCs need valid positions). Phase 2 must complete before Phase 4 (NPCs reference FactIds and dialogue pools). - -### How an NPC Profile Becomes a Spawned Entity - -Assuming RON format (Tyre's call on format — I need structured, typed data, not free-form YAML): - -``` -// content/districts/sova/npcs/kael_davan.ron -NpcProfile( - canonical_id: "sova.kael_davan", - display_name: "Kael Davan", - short_name: "Kael", - content_tier: Tier1, - pattern: Friend, - motivation: Operator, - - // D-024 axes - want: "Exit the ring, protect partner Naia. Wants a clean life.", - secret: "Meeting unknown contact in restricted corridor. Trying to leave the ring.", - tolerance_threshold: 0.65, - contentment: 0.4, - personality: ["loyal", "cautious", "practical"], - skills: ["cargo_handling", "logistics", "forging_manifests"], - combat_trained: false, - - // Routine (D-031 day phases) - routine: [ - (phase: Morning, location: "sova.terminal", tile: (42, 18, 0), activity: "working"), - (phase: Afternoon, location: "sova.terminal", tile: (45, 20, 0), activity: "working"), - (phase: Evening, location: "sova.last_shift", tile: (80, 55, 0), activity: "drinking"), - (phase: Night, location: "sova.residential", tile: (30, 70, 0), activity: "sleeping"), - ], - - // Knowledge — what Kael knows at game start - background_facts: [ - ("contraband.ring_exists", KnowsDetails), - ("contraband.lattice_components", KnowsDetails), - ("npc.voss.is_handler", KnowsDetails), - ("npc.naia.partner", KnowsDetails), - ("location.restricted_corridor", KnowsOf), - ], - - // Relationships (resolved to StableIds at load time via canonical_id lookup) - relationships: [ - (target: "sova.naia_tamm", kind: "partner", trust: Real), - (target: "sova.voss", kind: "handler", trust: Real), - (target: "sova.drin", kind: "colleague", trust: Surface), - ], - - // Access tiers — who can talk to Kael at what level - access: ( - default: Public, - overrides: [ - ("sova.smuggler", Insider), // smuggler PC gets insider access - ("sova.detective", Public), // detective is just another face - ("sova.voss", Peer), - ], - ), - - // FRIEND-specific (only if pattern == Friend) - friend_arc: Some(( - bonded_character: "sova.smuggler", - initial_phase: Warmth, - contradiction_facts: [ - "kael.secret_meetings", - "kael.restricted_corridor_visits", - ], - )), - - // Tell system (D-034) - tells: [ - "Checks comm device when alone — frequency increases as stress rises", - "Avoids eye contact with Voss after receiving new instructions", - "Takes longer routes to avoid restricted corridor during busy hours", - ], -) -``` - -**Load transformation:** - -1. Parser reads `NpcProfile` from RON file -2. Loader allocates `StableId` via `EntityRegistry::register()` -3. Canonical ID → StableId mapping stored in `ContentAddressMap` resource -4. Components constructed from profile fields — string references to other NPCs deferred to Phase 5 -5. `KnowledgeGraph::with_background()` called with the background_facts list -6. Entity spawned with full component bundle -7. Phase 5: `relationships`, `access.overrides`, `trust_levels`, and `friend_arc.bonded_character` resolved using `ContentAddressMap` canonical_id → StableId lookup - -### Resources the Loader Creates - -```rust -/// Maps canonical content IDs to runtime StableIds. -/// Created during Phase 4, used in Phase 5 for reference resolution. -#[derive(Resource)] -pub struct ContentAddressMap { - pub by_canonical: BTreeMap, -} - -/// All valid FactIds in this district + global facts. -/// Used for validation and monologue prerequisite checking. -#[derive(Resource)] -pub struct FactCatalog { - pub facts: BTreeMap, -} - -pub struct FactMetadata { - pub category: String, - pub description: String, - pub discoverable_by: Vec, // which characters can learn this -} - -/// Location boundaries within the district. -/// Maps location IDs to tile regions for proximity triggers. -#[derive(Resource)] -pub struct LocationMap { - pub locations: BTreeMap, -} - -pub struct LocationDef { - pub canonical_id: String, - pub bounds: Vec, // bounding polygon or rect - pub z_level: i32, -} - -/// Tagged dialogue line pool (D-028, D-035). -/// Server selects lines; client displays them. -#[derive(Resource)] -pub struct DialoguePool { - pub lines: Vec, - // Indices by role, access, trust for fast filtering - pub by_role: BTreeMap>, -} - -/// Tagged monologue line pool (D-032, D-035). -/// Separate per playable character — hard partition. -#[derive(Resource)] -pub struct MonologuePool { - pub smuggler: Vec, - pub detective: Vec, -} -``` - ---- - -## Topic 4: Interaction Model — Server Events & Availability - -### Minimum Server Events for v0.1 - -The simulation needs to support four interaction types: approach + dialogue, monologue triggers, object examination, and overhearing. Each requires specific server-side events. - -```rust -/// Interaction events flowing through the server. -/// Produced by interaction systems, consumed by dialogue/monologue/knowledge systems. -#[derive(Debug, Clone)] -pub enum InteractionEvent { - /// Player entered proximity range of an NPC (triggers interaction availability). - /// Range: configurable, default 3 tiles (Manhattan distance). - ProximityEnter { - character: Entity, - target: Entity, - distance: u32, - }, - - /// Player left proximity range of an NPC. - ProximityExit { - character: Entity, - target: Entity, - }, - - /// Player requested interaction with target entity. - /// Server validates: is target in range? Is target interactable? What options? - InteractionRequest { - character: Entity, - target: Entity, - tick: u64, - }, - - /// Server response: available interaction options for this target. - /// Sent to client via ObserverSnapshot extension. - InteractionOptions { - character: Entity, - target: Entity, - options: Vec, - }, - - /// Player selected a dialogue topic/line. - DialogueSelect { - character: Entity, - npc: Entity, - topic: String, - tick: u64, - }, - - /// Server selected a dialogue response (D-035 pipeline output). - DialogueResponse { - npc: Entity, - line_id: String, - text: String, - // Knowledge updates that result from this line being spoken - knowledge_grants: Vec, - }, - - /// Conversation ended (player walked away, topic exhausted, NPC terminated). - DialogueEnd { - character: Entity, - npc: Entity, - reason: DialogueEndReason, - }, - - /// Monologue triggered by game state (D-035 trigger types). - MonologueTrigger { - character: Entity, - trigger_type: MonologueTriggerType, - context: MonologueContext, - }, - - /// Player examined an interactable object. - ExamineObject { - character: Entity, - object: Entity, - tick: u64, - }, - - /// Overheard conversation fragment (proximity-based, D-018 sound model). - OverheardFragment { - listener: Entity, - speakers: Vec, - content_hint: String, // not full text — what the listener picked up - knowledge_grants: Vec, - }, -} - -#[derive(Debug, Clone)] -pub struct InteractionOption { - pub kind: InteractionKind, - pub label: String, // displayed to player - pub enabled: bool, // false = visible but greyed out (shows the player what's possible) - pub disabled_reason: Option, // why it's greyed out -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub enum InteractionKind { - Talk, // initiate dialogue - Examine, // look more closely - Overhear, // listen to nearby conversation (passive — may not need explicit action) -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub enum DialogueEndReason { - PlayerLeft, // walked out of range - TopicExhausted, // no more lines available - NpcTerminated, // NPC ended conversation (mood, tolerance) - Interrupted, // another event broke the conversation -} - -/// What knowledge a dialogue line grants when spoken. -#[derive(Debug, Clone)] -pub struct KnowledgeGrant { - pub grant_type: KnowledgeGrantType, -} - -#[derive(Debug, Clone)] -pub enum KnowledgeGrantType { - LearnFact { fact_id: FactId, confidence: KnowledgeConfidence }, - LearnAttribute { target: StableId, key: String, value: String }, - UpdateRelationship { target: StableId, new_state: RelationshipState }, -} - -/// Monologue trigger types (D-035 `trigger` enum). -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] -pub enum MonologueTriggerType { - EnterLocation, - ObserveNpc, - HearSound, - ObserveAnomaly, - PostConversation, - DiscoverEvidence, - WitnessInteraction, - TimeIdle, - ReturnVisit, -} - -/// Context passed with monologue triggers for line selection. -#[derive(Debug, Clone)] -pub struct MonologueContext { - pub location: Option, - pub observed_npc: Option, - pub relevant_facts: Vec, -} -``` - -### Proximity Trigger System - -```rust -/// System: check proximity between player character and NPCs each tick. -/// Emits ProximityEnter/ProximityExit events when distance crosses threshold. -/// v0.1 uses Manhattan distance on same z-level. Simple, deterministic. -const INTERACTION_RANGE: u32 = 3; - -fn check_proximity( - player_query: Query<(Entity, &TilePosition), With>, - npc_query: Query<(Entity, &TilePosition), With>, - mut proximity_state: ResMut, - mut events: ResMut, - time: Res, -) { - let Ok((player_entity, player_pos)) = player_query.single() else { return }; - - for (npc_entity, npc_pos) in npc_query.iter() { - let distance = player_pos.manhattan_distance(npc_pos); - let in_range = distance.is_some_and(|d| d <= INTERACTION_RANGE); - let was_in_range = proximity_state.is_near(player_entity, npc_entity); - - if in_range && !was_in_range { - proximity_state.set_near(player_entity, npc_entity); - events.push(InteractionEvent::ProximityEnter { - character: player_entity, - target: npc_entity, - distance: distance.unwrap(), - }); - } else if !in_range && was_in_range { - proximity_state.set_far(player_entity, npc_entity); - events.push(InteractionEvent::ProximityExit { - character: player_entity, - target: npc_entity, - }); - } - } -} - -/// Tracks which entities are currently in proximity. -/// BTreeSet for deterministic iteration. -#[derive(Resource, Default)] -pub struct ProximityState { - near_pairs: BTreeSet<(Entity, Entity)>, -} -``` - -### How the Server Determines Available Interaction Options - -When the player sends `PlayerAction::Interact`, the server runs a pipeline: - -``` -1. RANGE CHECK - Is there an NPC or interactable object within INTERACTION_RANGE? - If multiple targets, pick closest (Manhattan distance tiebreaker: lowest StableId). - -2. AVAILABILITY CHECK (per target) - Is the NPC in an interactable activity? (not sleeping, not in combat) - What's the NPC's current mood? (Hostile NPCs may refuse) - Is the NPC already in conversation with someone else? - -3. ACCESS TIER RESOLUTION - Look up AccessTierMap for the interacting character. - Determine: Public / Insider / Authority / Peer / Hostile access level. - -4. OPTION GENERATION - Talk: always available if NPC is interactable + not hostile - Examine: always available for objects, available for NPCs if in LOS - (Overhear is passive — triggered by proximity to NPC-NPC conversations, not by player action) - -5. RESPONSE - Pack InteractionOptions into ObserverSnapshot extension. - Client renders the context-sensitive prompt. -``` - -The critical insight: **the server never sends dialogue text unprompted.** The flow is: -- Server tells client "you can Talk to Kael" (via snapshot) -- Client shows interaction prompt -- Player selects "Talk" -- Server runs dialogue selection pipeline (D-035: access filter → situation filter → trust filter → mood/topic weighted selection) -- Server sends selected line + any knowledge grants -- Client displays line, processes knowledge grants - -This keeps the server authoritative over what you can learn and when. - -### What Goes into the ObserverSnapshot (v3) - -The ObserverSnapshot needs new fields for interaction support: - -```rust -pub struct ObserverSnapshot { - // ... existing v2 fields ... - - /// NPCs currently in interaction range with available options. - pub nearby_interactions: Vec, - - /// Active dialogue state (if in conversation). - pub active_dialogue: Option, - - /// Monologue lines triggered this tick. - pub monologue_lines: Vec, - - /// Overheard fragments (proximity-based). - pub overheard: Vec, -} - -pub struct NearbyInteraction { - pub entity_id: u64, // StableId - pub display_name: String, - pub options: Vec, -} - -pub struct ActiveDialogue { - pub npc_entity_id: u64, - pub npc_name: String, - pub current_line: Option, - pub available_topics: Vec, -} - -pub struct DialogueLineDisplay { - pub line_id: String, - pub text: String, - pub mood: String, -} - -pub struct MonologueLine { - pub line_id: String, - pub text: String, - pub trigger: MonologueTriggerType, -} - -pub struct OverheardLine { - pub speaker_id: u64, - pub fragment: String, -} -``` - ---- - -## Topic 5: Server Features Blocked by Missing Content - -### What I Can Build Right Now (No Content Dependency) - -These server systems are purely structural — they need the *schema* but not the *data*: - -| System | Status | Blocked? | -|--------|--------|----------| -| Content loader framework (Phase 1-6 skeleton) | Can build | NOT blocked — test with fixture data | -| Proximity trigger system | Can build | NOT blocked | -| Interaction event pipeline | Can build | NOT blocked | -| Dialogue selection pipeline (D-035 tag filtering) | Can build | NOT blocked — test with synthetic tagged lines | -| Monologue trigger system | Can build | NOT blocked — test with synthetic lines | -| Monologue prerequisite checker | Already built (KnowledgeGraph.fact_at_least) | Done | -| NPC routine scheduler (day phase → position) | Can build | NOT blocked | -| Knowledge decay | Already built | Done | -| FriendArc phase transition logic | Can build | NOT blocked — trigger conditions are structural | - -### What I Cannot Build Without Content - -| Blocked Feature | What Content Is Missing | Who Produces It | -|----------------|------------------------|-----------------| -| **Actual NPC spawning** | NPC profiles in RON/YAML format. Need all 17 Sova NPCs with axes, routine, relationships, background knowledge, access tiers. | Paula (profiles) + Tyre (format) | -| **Dialogue selection testing with real lines** | Tagged dialogue line pools per D-035. Need at minimum THE FRIEND lines (Kael: ~70-100, Sera: ~70-100) and a baseline pool for Tier 2-3 NPCs. | Mellanie (authored lines) | -| **Monologue testing with real lines** | Tagged monologue pools per D-032/D-035. Need smuggler pool + detective pool, minimum viable before repetition. | Mellanie (authored lines) | -| **NPC routine pathfinding** | District map with walkability data and location definitions. Need the Sova Transit District spatial layout. | Tyre (map format) + Stig (Godot map editor?) | -| **Overheard conversations** | NPC-to-NPC conversation scripts or generation rules. Which NPCs talk to each other, about what, when. | Paula (scripts) + Gestalt (rules) | -| **FactId catalog** | Complete list of discoverable facts for Sova, categorized. Currently wiki has some fact vocabulary but not a machine-readable catalog. | Gestalt (catalog design) + Paula (fact content) | -| **Triangle escalation logic** | Formal escalation conditions for each triangle. "When X learns Y, Z happens." Currently prose descriptions only. | Gestalt (conditions) + Paula (narrative) | -| **Contraband manifest data** | Manifest templates, discrepancy patterns, cargo types. Detective investigation vectors need concrete data. | Miri (setting) + Gestalt (mechanics) | - -### Priority Order for Unblocking - -1. **FactId catalog** — blocks everything knowledge-related. I need the schema NOW, content can come incrementally. -2. **NPC profiles in structured format** — blocks spawning. Even partial profiles unblock integration testing. -3. **District spatial layout** — blocks routine scheduler, proximity system integration testing. -4. **Dialogue line pools** — blocks dialogue pipeline integration. Synthetic data works for unit tests but not for end-to-end. -5. **Monologue line pools** — blocks monologue pipeline integration. Same story. - -### What I Propose to Do in Parallel - -While content is being produced, I'll build with fixture/synthetic data: - -- **Fixture NPC profiles**: hand-write 3-4 test profiles (Kael, Sera, one Tier 2, one Tier 3) in whatever format Tyre proposes. These become the "reference implementation" that real profiles must match. -- **Synthetic dialogue pool**: ~20-30 tagged lines exercising all D-035 tags. Enough to test the selection pipeline, not enough to feel like a game. -- **Synthetic monologue pool**: ~10-15 lines per character with varied trigger types and prerequisites. -- **Test district map**: 50x50 walkable area with 3 blocked-out locations (terminal, bar, corridors). - -This lets me build and test every system end-to-end. When real content arrives, it drops into the same loader — the schema is the contract. - -### One Dependency I Need Resolved - -**The Interact action is currently a no-op** (`server/src/simulation/input.rs:86`). To build the interaction pipeline, I need to extend `PlayerAction` with: - -```rust -pub enum PlayerAction { - // ... existing variants ... - Interact, // becomes: interact with nearest target - InteractWith(u64), // interact with specific entity by StableId - SelectDialogueTopic(String), // choose a topic in active dialogue - EndDialogue, // walk away from conversation -} -``` - -This is a protocol change (ObserverSnapshot v2 → v3). Stig needs to know about the new snapshot fields. I need Tyre's sign-off on the protocol evolution strategy. diff --git a/docs/workshops/v01-content-scoping/round1-gestalt.md b/docs/workshops/v01-content-scoping/round1-gestalt.md deleted file mode 100644 index 8db72dd42..000000000 --- a/docs/workshops/v01-content-scoping/round1-gestalt.md +++ /dev/null @@ -1,468 +0,0 @@ -# Round 1 — Gestalt (Systems Design) - -*cracks knuckles* - -Let me break down what all of this actually means mechanically. - ---- - -## Topic 1: Wiki Fixes - -### 1a. Do any triangles need restructuring beyond Triangle 1? - -**Triangle 1 (Hub Power)**: Yes, needs a fork. Addressed below. - -**Triangle 2 (Worried Knowledge)**: Structurally sound but smuggler lens is weak. The smuggler "manages" Maret and Drin — that's passive. The smuggler needs a DECISION in this triangle too. Proposed fix: when Maret gets close to reporting, the smuggler can either (a) feed Maret a cover story through Voss, (b) pressure Drin to reassure Maret, or (c) let it ride and hope Maret stays scared. This isn't a restructure — it's adding a smuggler decision node to an existing triangle. - -**Triangle 3 (Bar Tensions)**: Fine as-is. This is a MUNDANE triangle (D-029: 50% mundane). Its job is to be noise floor. Torek's ambiguous spending, Olin's ambiguous intent, Lera's ambiguous loyalty — the player reads signals that might mean nothing. That IS the mechanic. Don't add a fork — the ambiguity IS the fork. The player decides whether to investigate or ignore, and both decisions have consequences (wasted time or missed signal). - -**Triangle 4 (Worried Partner)**: Excellent. No changes. Both FRIEND NPCs are nodes. The triangle IS the contradiction structure. This is the best-designed triangle in the set. - -**Triangle 5 (Informant Question)**: Structurally sound but resolution timing matters. Pell's wavering, Renn's suspicion, Drin's vulnerability — all three paths toward unraveling operate on different timescales. In a 30-minute session, the player observes the TENSION but probably doesn't see the RESOLUTION. That's fine for v0.1 — the tension is the content, the resolution is the hook for continued play. No restructure needed, but we need to be explicit: Triangle 5 is a **passive triangle** in v0.1 (observable tension, unresolved fork). - -**Summary: Active vs. Passive Triangles for v0.1** - -| Triangle | Status | Smuggler Decision? | Detective Decision? | Resolution in 30 min? | -|----------|--------|---------------------|---------------------|----------------------| -| 1: Hub Power | **Active** | YES (escalation fork) | No (observes consequences) | Partial | -| 2: Worried Knowledge | **Active** | YES (manage Maret) | YES (flip Drin or work Maret) | Partial | -| 3: Bar Tensions | **Passive** | No (assess risk) | No (read signals) | No (ambiguity is permanent) | -| 4: Worried Partner | **Active** | YES (protect Kael/lie to Hael) | YES (ask Sera about Hael) | Yes (FRIEND contradiction) | -| 5: Informant Question | **Passive** | No (observes Pell's nervousness) | No (sees downstream signals) | No (hook for continuation) | - -**3 active forks, 2 passive tensions. That's correct for 30 minutes.** - ---- - -### 1b. Triangle 1 Fork Design - -The existing triangle: Nils (off-stage) pushes for higher volume. Voss (shift supervisor) wants stability. Kael is caught between sibling loyalty and operational caution. The smuggler's role is currently passive — they just watch. - -**The fork: The Escalation Decision** - -**Setup (minute 5-10):** Devra approaches the smuggler during a routine shift. Message from Nils: next shipment is double volume. Nils needs more hands and wider timing windows. Voss has to adjust the shift schedule to create a bigger gap. The smuggler is asked to help convince Voss — or handle the extra volume personally. - -**The smuggler decides:** - -| Choice | Immediate Effect | Triangle Consequence | Detective Signal | Mechanical Outcome | -|--------|-----------------|---------------------|-----------------|-------------------| -| **Side with Nils (escalate)** | Extra shipment gets handled. More money. Kael is relieved (less family pressure). | Voss gets more anxious, becomes sloppy. Voss's tells accelerate. Operation becomes more visible. | Manifest discrepancies spike. Voss's behavior flags: `"nervous,schedule_changes,evasive"`. Detective investigation ACCELERATES. | `exposure_risk` increases globally. `cover_integrity` of ring drops to `"thin"`. Wow moment #2 (Character's Eye) triggers EARLIER. | -| **Side with Voss (stabilize)** | Shipment gets rejected or delayed. Nils applies more pressure on Kael directly. | Kael's distraction increases (more contact with exit coordinator). Operation stays quiet but INTERNAL tension builds. | Fewer observable signals. Detective investigation SLOWS. But Kael's tells (lattice checking, distraction) become more visible. | `exposure_risk` stays low. But Kael's `behavior_flags` escalate faster. FRIEND contradiction (wow moment #3) hits HARDER because it comes from internal pressure, not external. | -| **Mediate (delay)** | Smuggler proposes a compromise: half volume increase, phased over two shipments. Neither side satisfied. | Nils loses confidence in the smuggler. Voss is temporarily calmed. Kael is confused ("I thought you were handling this"). | Mixed signals. Operation is inconsistent — some shifts are busier, others normal. Detective reads organizational confusion accurately. | Smuggler's `operational_trust` with Nils drops. Smuggler's relationship with Devra becomes strained. Creates a SECOND decision point later when Nils sends a more forceful message. | - -**What the detective observes (per smuggler choice):** - -The detective doesn't see the decision. They see its CONSEQUENCES: - -- **Post-escalation:** "Voss changed the night shift schedule. Third time this week. The pattern is getting louder." Monologue trigger: `observe_anomaly` + `prerequisite: { "investigation.shift_mismatch": "Suspects" }`. The detective's investigation accelerates because Voss's anxiety produces more observable signals. - -- **Post-stabilize:** "The hub's been quiet this week. Schedules normal. But that dock worker — Kael — he's checked his lattice eleven times this shift." The detective's investigation pivots from institutional signals (schedules, manifests) to personal signals (Kael's behavior). - -- **Post-mediate:** "Something's off. Last night's shift had extra cargo. Tonight it's normal. There's no pattern I can find, and that's the pattern." The detective is confused, which is realistic and interesting — real investigations hit dead ends. - -**Key design note:** The fork doesn't change WHAT the detective discovers — it changes WHEN and HOW. All three paths lead to the ring. The smuggler's choice shapes the detective's journey, not the detective's destination. - ---- - -### 1c. Should Drin be promoted to Tier 2? - -**Yes. Unambiguously.** - -Drin is doing Tier 2 work in a Tier 3 body. Mechanically, Drin is: -- Member of Triangle 2 (Worried Knowledge) — one of our 3 active triangles -- Member of Triangle 5 (Informant Question) — one of our 2 passive triangles -- Compromised by Harek (gambling debt) — a coercion arc -- The easiest NPC for the detective to flip -- The most vulnerable ring asset for the smuggler to manage -- A bridge between 2 triangles across 2 social sites - -A Tier 3 NPC gets ~10-15 authored lines and 3 axes (Want, Routine, Personality). That's not enough for an NPC who appears in 2 triangles and is a potential informant. - -**Tier 2 requires:** - -| Axis | Drin's Content | -|------|---------------| -| **Want** | Keep his job, clear the debt, stop looking over his shoulder | -| **Secret** | Gambling debt to Harek. Harek holds IOUs. Drin looks the other way during inspections in exchange for debt forgiveness. | -| **Relationship 1** | Harek (debt holder, coercer) — fear-based, asymmetric | -| **Relationship 2** | Voss (depends on Drin's compliance) — professional, strained | -| **Relationship 3** | Maret (colleague, doesn't know about Drin's compromise) — guilt-adjacent | -| **Tolerance** | LOW — already past breaking. The compromise IS his post-threshold state. | -| **Routine** | Maintenance shifts, inspection rounds (these ARE the windows he's leaving open) | -| **Information** | Knows inspection schedule gaps, knows he's being used, doesn't know ring structure beyond "someone benefits from my compliance" | -| **Contentment** | Very low. Trapped. Remembers when the job was just a job. | -| **Personality** | Quiet, avoidant, anxious. Doesn't make eye contact during compromised inspections. | -| **Tell** | Changes route when Harek is present. Shorter inspection times on specific shifts. Increased break frequency (stress smoking equivalent). | -| **Skills** | Maintenance tech, inspection procedures. No combat. | - -**Content requirement: ~40-60 authored lines** (Tier 2 standard): -- 15-20 dialogue (routine greetings, deflection, cracking under pressure) -- 8-12 trust-gated (what Drin reveals when scared vs. when trusting) -- 5-8 unprompted (nervous comments, redirect attempts) -- 5-8 monologue per character (detective: "He's hiding something, his inspection times are irregular" / smuggler: "Drin's been twitchy. If he cracks, we're all exposed") - -**Tier adjustment: Tier 3 roster drops from 5 to 4** (Sess, Olin, Sabel, Tav). Tier 2 grows from 10 to 11. Total content budget increase: +30-45 authored lines. This is well within scope for the value Drin provides. - ---- - -## Topic 2: v0.1 NPC Architecture - -### 2a. Full NPC → Pattern + Motivation Mapping - -Here's every NPC mapped. I'm assigning based on what each character DOES in v0.1, not what they might become at 300-world scale. - -| # | Name | Tier | Thematic Pattern | Functional Motivation | Composition Rationale | -|---|------|------|-----------------|----------------------|----------------------| -| 1 | Kael Davan | **T1** | **FRIEND** | **OPERATOR** | Trust anchor hiding a contradiction + running ring cargo operations. FRIEND+OPERATOR = identity betrayal ("I didn't know who you really were") | -| 2 | Sera Venn | **T1** | **FRIEND** | **WITNESS** | Trust anchor hiding a contradiction + carrying unreported evidence. FRIEND+WITNESS = loyalty vs. duty ("She saw something and chose silence") | -| 3 | Voss | T2 | **SYSTEM** | **OPERATOR** | Institutional authority (shift supervisor) + running the schedule that enables smuggling. SYSTEM+OPERATOR = corrupted authority ("The system works for the wrong people") | -| 4 | Lera Sessik | T2 | **ANCHOR** | **OPERATOR** | "Is this enough?" embodied + running a business on willful ignorance. ANCHOR+OPERATOR = contentment with a price ("She makes it work by not looking") | -| 5 | Torek Lintar | T2 | **CATALYST** | **CIVILIAN** | His spending disrupts equilibrium + he's just living his life (spending money, going to the bar). CATALYST+CIVILIAN = accidental disruption ("He doesn't know he's a liability") | -| 6 | Devra | T2 | **THRESHOLD** | **HANDLER** | Gatekeeper between player and ring's deeper layers + managing operations from above. THRESHOLD+HANDLER = obstacle with authority ("You go through her or you don't go") | -| 7 | Maret Korr | T2 | **SYSTEM** | **WITNESS** | Institutional scheduler (the manifests, the numbers) + saw discrepancies she hasn't reported. SYSTEM+WITNESS = honest system under threat ("The numbers don't lie, but she might have to") | -| 8 | Resha | T2 | **CATALYST** | **SKEPTIC** | New hire whose questions force defensiveness + doubts the "mind your business" culture. CATALYST+SKEPTIC = innocent disruption ("They just asked a question. Everyone flinched.") | -| 9 | Naia Tamm | T2 | **MIRROR** | **CIVILIAN** | Honest transparency reveals others' dishonesty + living her life (teaching, worrying about Kael). MIRROR+CIVILIAN = innocence endangered ("The one person who isn't lying, surrounded by liars") | -| 10 | Drin | **T2** (promoted) | **REMNANT** | **TURNCOAT** | Remembers when the job was just a job + loyalty coerced from institution to ring by debt. REMNANT+TURNCOAT = corruption's collateral ("He was an honest inspector once") | -| 11 | Sess | T3 | **ANCHOR** | **CIVILIAN** | Quiet contentment behind the bar + uninvolved, discreet. ANCHOR+CIVILIAN = social wallpaper with depth ("The bartender sees everything and says nothing — because nothing's wrong with his life") | -| 12 | Olin | T3 | **CATALYST** | **SKEPTIC** | New arrival whose presence forces everyone to assess threat + asks questions with ambiguous intent. CATALYST+SKEPTIC = the unknown variable ("Friend or threat? The question itself is the disruption.") | -| 13 | Renn | T2 | **THRESHOLD** | **OPERATOR** | Physical gatekeeper of cargo movement (courier) + competent, goal-oriented, runs the route. THRESHOLD+OPERATOR = the machinery of the operation ("Renn moves the product. Get past Renn, you're inside.") | -| 14 | Pell | T2 | **CATALYST** | **TURNCOAT** | Wavering creates potential disruption to entire operation + loyalty actively shifting. CATALYST+TURNCOAT = ticking bomb ("When Pell breaks, everything moves.") | -| 15 | Harek | T2 | **GHOST** | **HANDLER** | Shapes events through debt leverage on Drin, not through direct ring membership + applies pressure from above (off-duty security with information and leverage). GHOST+HANDLER = invisible power ("Harek doesn't run the ring. He just owns the inspector.") | -| 16 | Sabel | T3 | **THRESHOLD** | **OPERATOR** | Off-station gatekeeper of supply chain + runs the external logistics. THRESHOLD+OPERATOR = distant machinery (1-2 brief appearances, mostly off-stage) | -| 17 | Tav | T3 | **SYSTEM** | **CIVILIAN** | Ring lookout following procedure + uninvolved beyond their assigned role. SYSTEM+CIVILIAN = the lowest rung ("Tav watches the door. That's it. That's the whole job.") | - -**Pattern distribution:** - -| Pattern | Count | NPCs | v0.1 Coverage | -|---------|-------|------|--------------| -| FRIEND | 2 | Kael, Sera | Full (production-level, D-034) | -| MIRROR | 1 | Naia Tamm | Full (T2, emotional depth) | -| ANCHOR | 2 | Lera, Sess | Full + sketch | -| SYSTEM | 3 | Voss, Maret, Tav | Full + sketch | -| THRESHOLD | 3 | Devra, Renn, Sabel | Full + sketch | -| CATALYST | 4 | Torek, Resha, Olin, Pell | Full + sketch | -| GHOST | 1 | Harek | Light (indirect power) | -| REMNANT | 1 | Drin | Light (promoted T2) | -| NOBODY | 0 | — | Deferred to v0.2 | - -**Motivation distribution:** - -| Motivation | Count | NPCs | -|-----------|-------|------| -| OPERATOR | 5 | Kael, Voss, Lera, Renn, Sabel | -| WITNESS | 2 | Sera, Maret | -| HANDLER | 2 | Devra, Harek | -| TURNCOAT | 2 | Drin, Pell | -| CIVILIAN | 5 | Torek, Naia Tamm, Sess, Olin, Tav | -| SKEPTIC | 2 | Resha, Olin | - -Note: Olin gets dual motivation (CIVILIAN/SKEPTIC) because his intent is ambiguous. In the data, he's tagged SKEPTIC (asking questions), but the player doesn't know if that's genuine curiosity or something else. - -**Composition check — does this create interesting interactions?** - -Sova has 4 CATALYSTs. That's a lot. But it's thematically correct: this is a district under pressure. Multiple disruption sources is what makes the ring fragile and the investigation possible. Every CATALYST threatens the status quo differently — Torek through visibility, Resha through innocence, Olin through ambiguity, Pell through betrayal. - -The 5 OPERATORs show a district where everyone is RUNNING something — cargo (Kael), schedules (Voss), a bar (Lera), a route (Renn), a supply line (Sabel). The district hums with operational competence. That's the "quotidian-with-undertow" atmosphere of D-036. - ---- - -### 2b. Required vs. Deferrable Patterns and Motivations - -**Required for v0.1** (must be present AND mechanically exercised): - -| System | Required | Why | -|--------|----------|-----| -| FRIEND | Must ship | Emotional core, D-034, wow moments #3 and #4 | -| MIRROR | Must ship | Proves non-FRIEND Tier 1 depth works. Naia Tamm's honesty is the contrast that makes the liars visible. | -| ANCHOR | Must ship | "Is this enough?" is the thematic question. Lera must embody contentment-with-a-price. | -| SYSTEM | Must ship | Institutional authority is what the detective works within and the smuggler works around. Voss is essential. | -| THRESHOLD | Must ship | The investigation REQUIRES gatekeepers. Devra is the wall between the detective and the ring's interior. | -| CATALYST | Must ship | Without disruption, nothing happens in 30 minutes. Torek or Pell must force someone's hand. | -| OPERATOR | Must ship | People who run things ARE the district. | -| WITNESS | Must ship | Investigation requires witnesses. Sera and Maret. | -| HANDLER | Must ship | Pressure from above drives tension. Devra. | -| TURNCOAT | Must ship | Loyalty shifting is the detective's lever and the smuggler's fear. Drin or Pell. | -| CIVILIAN | Must ship | Noise floor (D-029). Without civilians, every NPC is suspicious. | -| SKEPTIC | Should ship | Questions create friction. Resha's honest questions. Low effort — just give Resha dialogue that asks inconvenient things. | - -**Deferrable to v0.2+:** - -| System | Status | Why Deferrable | -|--------|--------|----------------| -| GHOST (full) | Present, light | Harek's indirect power works at T2 without GHOST-specific mechanics. The "absent power" system (Nils operating off-stage, Ghost entities sending messages through intermediaries) is v0.2 content. | -| REMNANT (full) | Present, light | Drin's "remembers simpler times" is narrative color, not a mechanical system. v0.2 can add REMNANT-specific content (history triggers, memory-based dialogue). | -| NOBODY | **Deferred** | Dynamic tier promotion is a separate system. See 2c. | - ---- - -### 2c. THE NOBODY — Ship in v0.1 or Defer? - -**Recommendation: Ship DATA, defer MECHANIC.** - -| What | v0.1 | v0.2 | -|------|------|------| -| Hidden pattern+motivation in NPC data | YES | YES | -| Tier 3 NPCs have name, routine, greeting | YES | YES | -| Interaction counter (track player attention) | NO | YES | -| Stage transitions (NOBODY → NOTICED → RECOGNIZED → KNOWN → INVESTED) | NO | YES | -| Dormant content activation (hidden Tier 2 content unlocks) | NO | YES | -| Content pool for promotion paths | NO | YES | - -**Why defer the mechanic:** - -1. **System scope**: Dynamic tier promotion requires an interaction counter, trigger evaluation, content activation pipeline, and enough dormant content to justify promotion. Each of those is a system to build, test, and prove. That's v0.2 scope. - -2. **The wow moments don't need it**: D-039 lists 6 wow moments. None require NOBODY promotion. The 30-minute session proves observation, contradiction, divergence, and emotional attachment. NOBODY promotion is a 60+ minute payoff. - -3. **Architectural compatibility**: The content schema includes hidden fields for pattern and motivation from day one. Tier 3 NPCs have `hidden_pattern` and `hidden_motivation` in their content files. The promotion engine reads these when it exists. Zero rework needed. - -4. **Risk reduction**: If NOBODY promotion doesn't work (feels gamey, triggers too easily, content feels thin at activation), we haven't spent v0.1 effort on it. - -**What this means for Tier 3 NPCs in v0.1:** - -Sess, Olin, Sabel, Tav are functional sketches. They have names, routines, greetings, and 10-15 authored lines each. They feel like PEOPLE — they nod at you, they move through the district on schedule, they have brief exchanges with each other. They're just not promotion targets yet. In v0.1, the player's attention is on the 13 NPCs who are already activated (2 Tier 1, 11 Tier 2). That's plenty for 30 minutes. - ---- - -### 2d. Smuggler Attributes → EntityKnowledge Keys - -The wiki review identified 8 smuggler-specific attributes. Here's how they map to the knowledge graph. - -**Existing keys that already serve double duty:** - -| Wiki Attribute | Maps To | How It Works | -|----------------|---------|-------------| -| `trust_read` | **`trust_level`** (existing) | Same key, different interpretation per character. Detective: "will they cooperate?" Smuggler: "will they hold under pressure?" Values already cover both: `"trusted"`, `"reliable"`, `"uncertain"`, `"suspicious"`, `"compromised"`. | -| `leverage_held` | **`secret_held`** (existing) | Leverage IS secret knowledge. Smuggler knowing Drin's gambling debt is stored as `secret_held: "gambling_debt"`. The fact that this is leverage is contextual — the smuggler's operational framework makes it leverage, the detective's framework makes it evidence. Same data, different interpretation. | - -**New smuggler-specific keys (4 for v0.1):** - -| New Key | Value Format | Example | Mechanical Purpose | -|---------|-------------|---------|-------------------| -| `exposure_risk` | enum: `"minimal"`, `"moderate"`, `"high"`, `"critical"` | Torek: `"high"` (spending is visible). Maret: `"moderate"` (smart, might report). | Smuggler risk assessment. Gates monologue: "Torek's spending is going to get us all caught." Drives smuggler decisions about which NPCs to manage. | -| `loyalty_assessment` | enum: `"solid"`, `"reliable"`, `"uncertain"`, `"wavering"`, `"turned"` | Pell: `"wavering"`. Renn: `"solid"`. Kael: `"reliable"` (smuggler doesn't know about exit yet). | Operational trust map. Different from `trust_level` — that's interpersonal, this is operational. You can trust someone personally but doubt their operational loyalty. | -| `cover_integrity` | enum: `"solid"`, `"thin"`, `"cracking"`, `"blown"` | Kael: `"solid"` (baseline) → `"cracking"` (post-contradiction). Voss: `"thin"` (after escalation fork). | Cover assessment. When `cover_integrity` drops, smuggler monologue shifts: "Kael's cover is slipping. If I can see it, so can the detective." | -| `moral_weight` | enum: `"innocent"`, `"peripheral"`, `"complicit"`, `"compromised"`, `"willing"` | Naia Tamm: `"innocent"`. Drin: `"compromised"`. Lera: `"complicit"`. Kael: `"willing"`. | Moral arc driver. The smuggler's Comfort→Doubt→Reckoning→Compromise phases are tracked through who they've assessed as `"innocent"` vs. `"complicit"`. When innocents are threatened, the smuggler doubts. | - -**Deferred to v0.2 (2 keys):** - -| Deferred Key | Why Defer | -|-------------|-----------| -| `social_debt` | Favor economy doesn't have time to develop in 30 minutes. The smuggler doesn't owe or collect favors in the vertical slice — they make decisions. | -| `loyalty_conflict` | Can be inferred from `behavior_flags` + `loyalty_assessment`. Kael's conflict (ring vs. partner) shows up as `behavior_flags: "distracted,evasive"` + implicit knowledge from the smuggler's pre-existing information about Kael's home life. A dedicated key is cleaner but not essential. | - -**Updated EntityKnowledge key count: 18** (14 existing + 4 new smuggler-specific) - -| Category | Keys | Character | -|----------|------|-----------| -| Identity | `name`, `role`, `faction`, `species` | Both | -| Social | `relationship_type`, `trust_level` | Both | -| Behavioral | `routine_pattern`, `behavior_flags` | Both | -| Secret | `secret_held`, `secret_confidence` | Both | -| Detective-specific | `tell_observed`, `contradiction_flagged` | Detective | -| Smuggler-specific | `exposure_risk`, `loyalty_assessment`, `cover_integrity`, `moral_weight` | Smuggler | - -**Symmetry note:** The detective has 2 specific keys (`tell_observed`, `contradiction_flagged`). The smuggler has 4. This asymmetry is intentional and correct. The detective's knowledge graph is EVIDENCE-focused (fewer keys, deeper per-NPC). The smuggler's is RISK-focused (more keys, broader assessment across all NPCs). Different information architectures for different gameplay loops. - -**Full example — Smuggler's knowledge of Drin (post-Drin-promotion, mid-game):** - -```rust -EntityKnowledge { - last_known_position: Some(TilePosition { x: 52, y: 18 }), - last_observed_tick: 1600, - last_updated_tick: 1600, - confidence: KnowledgeConfidence::KnowsDetails, - source: KnowledgeSource::Inferred { - basis: vec![FactId("relationship.trust_network".to_string())], - }, - state: KnowledgeState::Active, - relationship: RelationshipState::Known, - known_attributes: BTreeMap::from([ - ("name".to_string(), "Drin".to_string()), - ("role".to_string(), "maintenance tech".to_string()), - ("faction".to_string(), "civilian".to_string()), - ("relationship_type".to_string(), "asset".to_string()), - ("trust_level".to_string(), "compromised".to_string()), - ("routine_pattern".to_string(), "maintenance shifts, inspection rounds".to_string()), - ("behavior_flags".to_string(), "nervous,avoids_harek_eye_contact".to_string()), - ("secret_held".to_string(), "gambling_debt".to_string()), - ("secret_confidence".to_string(), "confirmed".to_string()), - // Smuggler-specific: - ("exposure_risk".to_string(), "high".to_string()), - ("loyalty_assessment".to_string(), "uncertain".to_string()), - ("cover_integrity".to_string(), "cracking".to_string()), - ("moral_weight".to_string(), "compromised".to_string()), - ]), -} -``` - -**How this drives gameplay:** The smuggler sees Drin and their monologue fires: "Drin's twitchy again. His cover's cracking. If the detective gets to him first, he'll fold in ten seconds." The `exposure_risk: "high"` + `cover_integrity: "cracking"` combination gates a smuggler decision: spend time reassuring Drin (protecting the operation) or write him off and plan for what happens when he breaks. - ---- - -## Topic 4: Minimum Interaction Set - -### What proves the core loop? - -The core loop (D-027 criterion #4): **OBSERVE → NOTICE → FOLLOW → DISCOVER** - -Let me map this to concrete interactions: - -**7 interactions. No more.** - -| # | Interaction | Input | System | Output | Proves | -|---|-------------|-------|--------|--------|--------| -| 1 | **Move** | WASD keys | Movement + collision | Position change, LOS update | Physical embodiment, exploration | -| 2 | **Look** | Passive (automatic) | Perception + LOS | See NPCs, objects, environment | Observation, spatial awareness | -| 3 | **Monologue** | Triggered (automatic) | Monologue system | Internal text + audio chime | Character voice, anomaly detection | -| 4 | **Examine Object** | Context-key on environment | Interaction system | Description text, knowledge update | Environmental investigation | -| 5 | **Examine NPC** | Context-key on NPC (non-dialogue) | Observation system | Behavioral observations, tell detection | Passive intelligence gathering | -| 6 | **Talk** | Context-key on NPC (dialogue) | Dialogue system | Tagged line selection, response | Active information gathering, confrontation | -| 7 | **Overhear** | Passive (proximity) | Sound/proximity system | Overheard dialogue fragments | Environmental intelligence, atmosphere | - -**Why these 7 and not 6 or 8:** - -The critical split is **Examine NPC vs. Talk**. These MUST be separate interactions: - -- **Examine NPC** = study without initiating contact. You watch Kael from across the hub. Monologue fires: "He's checked his lattice three times since I sat down." Updates `behavior_flags` and `tell_observed`. No dialogue, no social cost. - -- **Talk** = initiate dialogue. You walk up to Kael and say something. Tagged line selection fires based on access tier, trust level, situation. Social cost: Kael knows you engaged. NPCs react to being approached. - -The detective's loop is: **Examine first** (accumulate tells across multiple observations) → **Talk later** (use evidence in confrontation). If you collapse Examine and Talk into one "Interact" action, the detective can't study behavior without initiating contact. That breaks the investigation loop. - -The smuggler's loop is inverted: **Talk first** (social, operational, casual) → **Examine when suspicious** ("something's off with Kael, let me watch him"). If you collapse them, the smuggler can't shift from social mode to surveillance mode. - -**Context-sensitive prompt logic:** - -| Target | Range | Available Actions | Prompt Text | -|--------|-------|-------------------|-------------| -| NPC | Out of LOS | None | (not visible) | -| NPC | In LOS, far | Look (auto) | (no prompt — monologue may fire) | -| NPC | In LOS, mid | Look + Examine | `[E] Observe` | -| NPC | In LOS, close | Look + Examine + Talk | `[E] Observe` / `[F] Talk` | -| Object | In LOS, close | Examine | `[E] Examine` | -| NPC conversation | In earshot | Overhear (auto) | (no prompt — text appears as overheard) | - -**What's explicitly NOT in the minimum set:** - -| Excluded | Why | When | -|----------|-----|------| -| Inventory (pick up items) | v0.1 is about observation, not collection. Evidence is knowledge-graph entries, not physical items. | v0.2 | -| Stealth (crouch, hide) | No stealth system. The player's presence is always visible. Managing attention is social, not mechanical. | v0.3+ | -| Combat | Not in D-027 success criteria. No combat encounters in 30-minute session. | v0.2+ | -| Lattice query (search databases) | The detective's analytical lattice works through monologue, not a separate interaction. "Checking the manifest" = Examine Object, not a lattice query UI. | v0.2 (as expansion of Examine) | -| Trade/buy/sell | No economic interaction in v0.1. | v0.3+ | -| Use item | No item use. | v0.2+ | - -**Does this minimum prove the 6 wow moments?** - -| Wow Moment | Required Interactions | Covered? | -|------------|----------------------|----------| -| 1. Arrival | Move + Look + Monologue | YES | -| 2. Character's Eye | Look + Monologue (auto-triggered) | YES | -| 3. FRIEND Contradiction | Look + Examine NPC + Talk | YES | -| 4. Divergence Reveal | Move + Look + Monologue (replay) | YES | -| 5. News Ticker Gut-Punch | Look (read ticker) + Monologue | YES (requires ticker as environmental object, Examine not needed — it's passive text in the environment) | -| 6. Quiet Moment | Move (idle) + Monologue (time_idle trigger) | YES | - -All 6 wow moments are achievable with 7 interactions. No additional interactions required. - ---- - -## Topic 5: v0.1 Scope Boundary - -### Is the IN/OUT split correct? - -Let me go item by item. - -**IN list review:** - -| # | Item | Verdict | Notes | -|---|------|---------|-------| -| 1 | WASD movement + collision | **CORRECT IN** | Non-negotiable. | -| 2 | Context-sensitive interaction | **CORRECT IN** | The 7-interaction model above. | -| 3 | Monologue system | **CORRECT IN** | Drives wow moments #2, #5, #6. | -| 4 | Knowledge graph | **CORRECT IN** | Core mechanic. Without it, nothing gates. | -| 5 | 2 playable characters | **CORRECT IN** | D-027. Non-negotiable. | -| 6 | THE FRIEND arc | **CORRECT IN** | D-034. Non-negotiable. | -| 7 | 5 triangles, 1 fork each | **ADJUST** | 5 triangles YES. But only **3 active forks** (T1, T2, T4). Triangles 3 and 5 are passive (tension visible, fork not resolved). See Topic 1a. | -| 8 | 6 wow moments | **CORRECT IN** | D-039. Non-negotiable (lead directive). | -| 9 | 3 social sites | **CORRECT IN** | Required for triangles and bridge NPCs. | -| 10 | NPC routines | **CORRECT IN** | Routines create the patterns the player reads. Essential for Examine NPC and tell detection. | - -**MISSING from IN — should be added:** - -| Missing Item | Why It Must Be IN | Dependency | -|-------------|-------------------|------------| -| **News ticker** | Wow moment #5 requires a ticker with dual monologue reactions. Must exist as environmental text. | Client (Stig): ticker display. Copy (Mellanie): ticker text + monologue lines. | -| **PC-as-NPC** | When playing smuggler, the detective exists as an NPC (and vice versa). Required for Divergence Reveal (wow moment #4) — second playthrough reveals the other character was there all along. | Content: ~20-30 authored items per PC-as-NPC (SUMMARY confirms). Server: spawn the other PC as an NPC entity. | -| **Time progression** | NPC routines require time to pass. The 30-minute session maps to in-game time (D-031). Without time, routines don't advance, shift transitions don't happen, the smuggling window never opens. | Server (Dudley): game clock. Already decided in D-031. | -| **Relationship state transitions** | The knowledge graph stores `RelationshipState` (Unknown/Known/Friendly/PersonOfInterest/Hostile). FRIEND arc requires Friendly→PersonOfInterest transition. Without state transitions, the color shift (green→amber) never happens. | Server: state machine. Knowledge graph: transition triggers. | - -**OUT list review:** - -| # | Item | Verdict | Notes | -|---|------|---------|-------| -| 1 | THE NOBODY / dynamic tier promotion | **CORRECT OUT** | Data ships, mechanic deferred. See Topic 2c. | -| 2 | Archetype transitions | **CORRECT OUT** | No archetype system in v0.1. | -| 3 | Multiple FRIEND candidates | **CORRECT OUT** | 1 per character. Pool architecture from day one, selection deferred. | -| 4 | Secondary contraband variation | **CORRECT OUT** | Primary contraband fixed (lattice components). Secondary (medical/severance) referenced in dialogue but not mechanically varied per seed. | -| 5 | Gate network / multi-world | **CORRECT OUT** | 1 district. No gates. | -| 6 | Content generation / randomization | **CORRECT OUT** | v0.1 is hand-authored. | -| 7 | Modding support | **CORRECT OUT** | Obviously. | - -**MISSING from OUT — should be explicitly excluded:** - -| Should Be Explicitly OUT | Why | Risk If Not Excluded | -|--------------------------|-----|---------------------| -| **Inventory system** | No item pickup or management. Evidence is knowledge, not physical. | Feature creep. Someone will want "pick up the manifest printout." No. The detective READS the manifest (Examine Object). Knowledge graph updates. No physical item. | -| **Stealth mechanics** | No crouch, hide, LOS manipulation. | Immersive sim instincts will demand it. Defer. The smuggler's "stealth" is social (being in the right place at the right time, having the right cover identity). | -| **Combat system** | No fighting. Zero combat encounters. | D-027 success criteria don't mention combat. If combat appears in v0.1, it ate someone else's scope. | -| **Save/load** | Session-based. Play 30 minutes, experience the slice. No mid-session save. | Testing needs save/load (Dudley's concern). But SHIPPED v0.1 doesn't. Dev-mode save is fine, player-facing save is v0.2. | -| **Lattice modification/upgrade** | Player cannot modify their neural lattice. | Contraband IS lattice components. Someone will ask "can the player use smuggled mods?" No. Not in v0.1. | - -**Revised scope boundary summary:** - -``` -IN (v0.1 — SHIPS): - Core Systems: - [x] WASD movement + collision - [x] 7-interaction model (Move, Look, Monologue, Examine Object, Examine NPC, Talk, Overhear) - [x] Monologue system (tagged triggers, FactId prerequisites, audio chime) - [x] Knowledge graph (EntityKnowledge, FactIds, RelationshipState transitions) - [x] Time progression (game clock, day phases) - [x] NPC routines (schedule-based movement, routine deviations as tells) - - Content: - [x] 2 playable characters (smuggler, detective) - [x] PC-as-NPC (~20-30 authored items per character) - [x] THE FRIEND arc (Kael/smuggler, Sera/detective) - [x] THE MIRROR (Naia Tamm) - [x] 5 triangles (3 active forks, 2 passive tensions) - [x] 3 social sites (Terminal, Last Shift, Maintenance Corridors) - [x] News ticker (environmental text + dual monologue reactions) - [x] 6 wow moments (D-039) - [x] 17 NPCs (2 T1, 11 T2, 4 T3) — Drin promoted - [x] 8 patterns exercised (NOBODY data-only) - [x] 6 motivations exercised - [x] 18 EntityKnowledge keys (14 shared + 2 detective + 4 smuggler, symmetry note: 2 detective-specific keys are deliberately not mirrored as they are not needed) - -OUT (v0.2+): - [ ] THE NOBODY mechanic (dynamic tier promotion) - [ ] Archetype transitions - [ ] Multiple FRIEND candidates per character - [ ] Secondary contraband variation per seed - [ ] Gate network / multi-world - [ ] Content generation / randomization - [ ] Modding support - [ ] Inventory system - [ ] Stealth mechanics - [ ] Combat system - [ ] Player-facing save/load - [ ] Lattice modification/upgrade - [ ] social_debt / loyalty_conflict EntityKnowledge keys -``` - -**Final scope assessment:** The IN list is tight. Every item serves at least one wow moment or D-027 criterion. The 4 additions (news ticker, PC-as-NPC, time progression, relationship state transitions) are all REQUIRED by existing scope items — they're dependencies, not additions. The 5 explicit exclusions (inventory, stealth, combat, save/load, lattice mods) prevent the most likely scope creep vectors. - -Is this fun? Does this create interesting decisions? YES — because the smuggler and detective have different interaction priorities (Talk-first vs. Examine-first), different knowledge keys (operational vs. evidential), and different relationships to the same NPCs. The same 17 NPCs, 5 triangles, and 3 social sites produce two fundamentally different 30-minute experiences. That's the proof. diff --git a/docs/workshops/v01-content-scoping/round1-mellanie.md b/docs/workshops/v01-content-scoping/round1-mellanie.md deleted file mode 100644 index af9190a1f..000000000 --- a/docs/workshops/v01-content-scoping/round1-mellanie.md +++ /dev/null @@ -1,261 +0,0 @@ -# Round 1 — Mellanie (Copywriter / LIBRARIAN) - -## v0.1 Content Scoping Workshop - ---- - -## Topic 1: Wiki Fixes — Voice Review - -### 1a. Naia Tamm (THE MIRROR) — Voice Samples Needed: YES - -The current Hael profile has three voice samples. All three are anxious: worried-to-Sera, warm-with-Kael-reference, brittle-near-breaking. That's the Worried Partner voice. It's a good voice. It's not THE MIRROR voice. - -THE MIRROR is Tier 1 emotional depth with NO contradiction arc, no secret. Her power is transparency. The wiki summary says: "When events drag the MIRROR into the conspiracy, the damage is devastating — the player broke the one genuinely innocent person." That needs voice samples that establish what innocence sounds like so the player recognizes what they're losing. - -**Naia Tamm needs 5 voice samples minimum:** - -1. **Baseline warm** — How she talks when nothing's wrong. Open, direct, no subtext. This is the calibration line. The player needs to hear what "no hidden agenda" sounds like in a world where everyone has one. - > *"The kids did something brilliant today — Ren figured out the cycle conversion problem by herself. Eight years old. I almost cried in front of the class."* - -2. **Concerned for Kael** — Not the anxious spiral from the current profile. Straightforward worry from someone who doesn't play games. - > *"Kael's been quiet. I don't need an explanation, I need to know they're okay. That's it. That's the whole thing."* - -3. **Perceptive without suspicion** — THE MIRROR reads emotional states accurately but doesn't weaponize the reading. Notices things, says them plainly. - > *"You seem different today. Not bad-different. Just... carrying something. You know you can put it down here, right?"* - -4. **Under pressure** — When events start closing in. THE MIRROR doesn't become evasive or strategic. She becomes more honest, not less. That's what makes it devastating. - > *"Something's happening that nobody's telling me about. I can feel it. I don't want to guess. I want someone to just say it."* - -5. **Damaged** — After events have touched her. THE MIRROR doesn't transform into a different archetype. She stays herself — honest, transparent — but now the honesty includes pain. - > *"I didn't do anything wrong. I know that. But everything's different now, and I can't make it go back."* - -**Voice discipline for THE MIRROR:** Complete sentences. No operational subtext. No evasion vocabulary. Naia doesn't deflect — she states. Where Kael clips ("Don't worry about it") and Sera redirects ("He's just loud"), Naia just... says the thing. That directness is her signature and her vulnerability. - -**Dual-lens note:** Both characters should monologue differently about Naia. The smuggler sees someone to protect ("Naia doesn't know. She can't know."). The detective sees someone too trusting for this environment ("Tamm. Open book. Either she's genuine or she's the best liar in the district. ...No. She's genuine. And that's worse."). - -**Action:** Paula does the rename cascade. I'll write the voice samples above into the updated profile. These five samples are enough for me to author monologue about Naia and dialogue for her. - ---- - -### 1b. Kael and Sera Voice Distinctness — SUFFICIENT, with one gap - -**Kael's voice:** Direct, clipped, practical. Short sentences. Warm through understatement. Evasive through brevity. -- Casual: *"Shift's looking smooth today."* (7 words, done.) -- Evasive: *"It's nothing. Just a thing."* (No elaboration. The silence IS the tell.) - -**Sera's voice:** Competent, precise, conversational. Complete sentences with context. Professional warmth. Evasive through redirection. -- Casual: *"There you are. Grab a seat — Hael was here earlier, you just missed them."* (Provides context, frames the social landscape.) -- Evasive: *"Torek? He's just loud. Gets a couple drinks in him and decides everyone needs to hear his opinions."* (Plausible alternative explanation, delivered smoothly.) - -These are authoring-ready. I can write Kael lines and Sera lines and they won't sound like each other. The distinction is structural: Kael speaks in fragments, Sera speaks in sentences. Kael's warmth is physical presence ("There you are — good"), Sera's warmth is social attention ("Grab a seat, let me tell you about..."). - -**The gap:** I need voice parameters for the smuggler and detective as internal narrators, not just for the NPCs they observe. The monologue guide has example lines but no formal voice sample set for the PC voices. I know what Kael sounds like when he talks. I know what the smuggler sounds like when she thinks ABOUT Kael. But I need a sharper definition of: - -- **Smuggler internal voice:** How terse? How emotional? How operational? The authoring guide examples lean toward short + feeling-forward ("Kael's here. Good — I was starting to worry."). Is that the canonical register? -- **Detective internal voice:** How clinical? How personal? How much institutional vocabulary? The examples lean analytical-with-subtext ("Dock worker. Davan, K. Unremarkable on paper."). Confirm or adjust. - -**Ask:** This might be the voice kit work that's blocked on Paula's Dual Lens Guide (#261). If the workshop can confirm the internal voice registers from the monologue guide examples as canonical, I can start writing without waiting. The examples in the authoring guide are good. Just tell me they're the baseline and I'll scale from there. - ---- - -## Topic 4: Interaction Model — Monologue Pool Sizing - -### How Much Monologue Does v0.1 Need? - -Short answer: **80-110 monologue lines per character, 160-220 total.** - -Here's the math. - -### Trigger Frequency in a 30-Minute Session - -I walked through a mental playthrough. Player enters 3 locations, observes NPCs, has conversations, discovers things, idles, returns to places. Estimated trigger fires: - -| Trigger Type | Fires Per Session | Notes | -|---|---|---| -| `enter_location` | 8-12 | 3 sites, multiple visits | -| `observe_npc` | 15-20 | Known NPCs entering sightlines | -| `hear_sound` | 3-5 | Rare, high-impact | -| `observe_anomaly` | 4-6 | Tells, cargo anomalies | -| `post_conversation` | 6-10 | After dialogue exchanges | -| `discover_evidence` | 3-5 | Physical evidence moments | -| `witness_interaction` | 4-6 | NPC-NPC observations | -| `time_idle` | 3-5 | Player pauses, watches | -| `return_visit` | 4-6 | Returning to familiar locations | -| **Total triggers** | **50-75** | | - -Not every trigger should fire a line. Monologue competes with gameplay for attention. If the inner voice never shuts up, the player stops listening. I'd say the system should fire on **40-50% of eligible triggers** = the player hears **~25-35 monologue lines per playthrough**. - -### Why 80-110 Lines Per Character, Not 25-35? - -Three reasons: - -**1. Prerequisite gating creates narrow windows.** A line gated on `relationship_state: PersonOfInterest` only fires after the contradiction (~minute 15-20). A line with `prerequisite: null` fires from the start. The pool isn't flat — it's a funnel. Many lines are only eligible for part of the session. You need more authored lines than the player will hear because most lines are locked most of the time. - -**2. Repetition threshold.** If the player enters the Terminal 3 times and hears the same arrival line twice, the world feels like a game. Minimum 3 lines per location per trigger type that shares a prerequisite window. Some trigger types need 4-5 variants (especially `observe_npc` for THE FRIEND, who the player sees repeatedly). - -**3. Knowledge progression creates parallel tracks.** The smuggler who knows `contraband.ring_exists` at `KnowsDetails` hears different lines than the smuggler at `Suspects`. Same trigger, same location, different prerequisite — different line. Each confidence level on important FactIds needs its own line. - -### Per-Trigger Breakdown (One Character, All Locations) - -| Trigger Type | Lines Needed | Per Location | Rationale | -|---|---|---|---| -| `enter_location` | 12-15 | 4-5 | Baseline + knowledge-gated variants per site | -| `observe_npc` | 20-25 | varies | 2-3 per observable NPC across relationship states | -| `hear_sound` | 6-8 | 2-3 | Rare trigger, each must count | -| `observe_anomaly` | 8-12 | 3-4 | Tell observations, cargo anomalies, schedule breaks | -| `post_conversation` | 10-15 | varies | 1-2 per NPC conversation, gated on content/outcome | -| `discover_evidence` | 6-8 | 2-3 | Specific evidence moments, heavily gated | -| `witness_interaction` | 6-8 | 2-3 | NPC-NPC observation, relationship-dependent | -| `time_idle` | 6-8 | 2-3 | Character-revealing, atmospheric | -| `return_visit` | 6-8 | 2-3 | Location revisits with accumulated knowledge | -| **Total per character** | **80-107** | | | - -**Two characters x ~95 average = ~190 monologue lines total.** - -Round up for safety margin: **~200 monologue lines** is the target. That gives the player ~25-35 heard lines per session with minimal repetition and knowledge-state variation. - -### THE FRIEND Gets Disproportionate Coverage - -Kael (smuggler's perspective) and Sera (detective's perspective) should each have **15-20 monologue lines** from their respective character's pool — more than any other single NPC. THE FRIEND contradiction is the emotional core. The player needs to feel the warmth, notice the cracks, experience the shift, and live in the contaminated aftermath. That's 4-5 phases x 3-4 lines per phase. - -Other NPCs get 2-4 monologue lines each (first observation, notable behavior, knowledge-gated reactions). Background NPCs might get 1 generic observation line or none. - ---- - -## Topic 5: v0.1 Scope — Content That Must Ship - -### The Hard Numbers - -Everything below is the **floor** — minimum viable for a 30-minute session that doesn't feel empty, repetitive, or placeholder. - -#### 1. Monologue Pools — ~200 lines - -| Category | Smuggler | Detective | Total | -|---|---|---|---| -| THE FRIEND observations | 15-20 | 15-20 | 30-40 | -| Other NPC observations | 20-30 | 20-30 | 40-60 | -| Location arrival/return | 15-20 | 15-20 | 30-40 | -| Evidence/anomaly reactions | 12-15 | 12-15 | 24-30 | -| Atmosphere/idle/sound | 10-12 | 10-12 | 20-24 | -| Post-conversation reactions | 8-12 | 8-12 | 16-24 | -| **Subtotal** | **80-109** | **80-109** | **160-218** | - -**Target: ~200 monologue lines, hard-partitioned by character.** - -#### 2. NPC Dialogue — ~300-400 lines - -| NPC Tier | NPCs | Lines Per NPC | Total | -|---|---|---|---| -| Tier 1 — THE FRIEND (Kael, Sera) | 2 | 70-100 | 140-200 | -| Tier 1 — THE MIRROR (Naia Tamm) | 1 | 50-70 | 50-70 | -| Tier 2 — Essential (Voss, Lera) | 2 | 25-35 | 50-70 | -| Tier 2 — Triangle support (Torek, Maret, others) | 3-4 | 15-25 | 45-100 | -| Tier 3 — Background | 5-8 | 5-10 | 25-80 | -| **Subtotal** | **13-17** | | **310-520** | - -**Target: ~350 dialogue lines across all NPCs.** The FRIEND NPCs account for 40-50% of the dialogue budget. That's correct — they exercise every pipeline. - -#### 3. Environmental Text — ~50 items - -| Category | Count | Examples | -|---|---|---| -| Terminal screens | 8-10 | Shift schedules, manifest summaries, status readouts | -| Safety/regulatory notices | 6-8 | "Authorized personnel beyond this point," hazard markings | -| Bar signage | 4-6 | Menu, house rules, "The Last Shift" sign, back room door | -| Corridor markers | 4-6 | Section labels, access warnings, maintenance tags | -| Lattice/kiosk displays | 4-6 | Commission notices, calibration status, public announcements | -| Interactable documents | 5-8 | Manifest pages, crew rosters, posted schedules (evidence) | -| **Subtotal** | | **~50** | - -#### 4. News Ticker / Meridian Feed — ~20 items - -Headlines that create atmosphere and occasionally deliver world-state information. Mix of: -- Gate network status (3-4 lines) -- Krenn System local news (4-5 lines) -- Commission regulatory notices (3-4 lines) -- Economic/trade reports (3-4 lines) -- Human interest / cultural (3-4 lines) - -**Target: 20 ticker items.** Some are static background; 3-5 should be reactive to game state (new headlines after key events). - -#### 5. UI Microcopy — ~50 strings - -| Category | Count | -|---|---| -| Interaction prompts ("Talk," "Examine," "Listen") | 10-12 | -| Knowledge panel labels and descriptors | 12-15 | -| Relationship state labels (Friendly, PersonOfInterest, etc.) | 5-8 | -| Status messages ("New information," "Contradiction discovered") | 8-10 | -| Tutorial/onboarding monologue (diegetic, D-016) | 10-15 | -| **Subtotal** | **~50** | - -The tutorial text is monologue, not HUD — per D-016, the character teaches the player through internal voice. "How do I interact with this person?" becomes the character thinking *"Sera's over there. Should go say hello."* That's 10-15 lines of contextual teaching buried in the monologue pool. - -#### 6. PC-as-NPC Content — ~20-30 lines - -The other playable character exists as an NPC (D-029 Concept A). The detective exists in the smuggler's world; the smuggler exists in the detective's world. - -- NPC dialogue for the other PC: ~10-15 lines (surface-level, public access, functional) -- Monologue about the other PC: ~5-8 lines per character (identification, assessment, interaction reactions) -- Environmental evidence of the other PC: ~3-5 items (schedule entries, incident reports, lattice traces) - -**Target: ~25 items across both perspectives.** - ---- - -### Grand Total: v0.1 Content That Must Ship - -| Category | Items | Priority | -|---|---|---| -| Monologue pools (2 characters) | ~200 lines | **Critical** — core interaction proof | -| NPC dialogue | ~350 lines | **Critical** — interaction model requires it | -| Environmental text | ~50 items | **High** — world must feel inhabited | -| News ticker | ~20 items | **Medium** — atmosphere, can be thin at launch | -| UI microcopy | ~50 strings | **High** — game is unplayable without it | -| PC-as-NPC content | ~25 items | **Medium** — D-027 requires both characters exist | -| **TOTAL** | **~695** | | - -**~695 authored content items.** Not lines of code. Not generated output. Hand-written, tagged, reviewed content. - -For context: the authoring guide already contains ~40 example monologue lines across 3 sample pools. Those are usable as-is — they're tagged, prerequisite-gated, and voice-correct. That's ~6% of the monologue target. A start, not a finish. - ---- - -### Authoring Order (What I Write First) - -1. **THE FRIEND: Kael content pack** — ~100 lines (dialogue + monologue from both characters). This exercises every tag, every trigger type, every prerequisite format, every access tier. If this works, everything else is variation. - -2. **THE FRIEND: Sera content pack** — ~100 lines. Different contradiction mechanics (cumulative vs. sudden), different voice, same pipeline depth. - -3. **THE MIRROR: Naia Tamm** — ~60-70 lines. Tests the honest-NPC pattern. Simpler prerequisites, no contradiction arc, but full emotional depth. - -4. **Tier 2 NPCs** — ~100-150 lines across Voss, Lera, Torek, Maret. Each gets a focused pack covering their triangle roles. - -5. **Environmental text + ticker** — ~70 items. Can be written in parallel with NPC packs. Uses Miri's setting details. - -6. **Remaining monologue fill** — Top up the pools to ~200 total. Fill gaps in trigger coverage, add knowledge-state variants, idle lines, atmosphere. - -7. **UI copy + tutorial monologue** — ~50 strings. Blocked on Stig's UI spec (need display constraints and interaction prompt format). - -8. **Tier 3 background + PC-as-NPC** — ~50 items. Last priority. These can be thin and still work. - ---- - -### Dependencies / Asks - -| I Need | From | Blocking | -|---|---|---| -| Confirm monologue guide examples as canonical PC voice registers | Gestalt or Paula | Monologue authoring (all) | -| Naia Tamm rename cascade complete | Paula | MIRROR content pack | -| Smuggler-lens sections in NPC profiles | Paula | Smuggler monologue about Tier 2 NPCs | -| Display constraints (char limits, stacking rules, ticker format) | Stig + Araminta | UI microcopy, ticker, environmental text | -| Knowledge state vocabulary (which FactIds gate which content) | Gestalt | Prerequisite authoring for monologue | -| Content file schema (YAML structure confirmed) | Tyre | All content files | - -**Biggest risk:** THE FRIEND content packs are the critical path. If those work — tags validate, prerequisites fire correctly, voice is distinct, dual-lens reads land — everything else scales from the pattern. If those don't work, we find out with 200 lines already written. - -Write the benchmark first. Validate. Then scale. - ---- - -*Mellanie, Round 1. Three words, not thirty — except when you need the numbers.* diff --git a/docs/workshops/v01-content-scoping/round1-paula.md b/docs/workshops/v01-content-scoping/round1-paula.md deleted file mode 100644 index 882d58e3e..000000000 --- a/docs/workshops/v01-content-scoping/round1-paula.md +++ /dev/null @@ -1,519 +0,0 @@ -# Round 1 — Paula (Librarian / Narrative & Political Depth) - -## Topic 1: Wiki Fixes - -### 1a. Hael → Naia Tamm Rename — Full Cascade Plan - -**16 files require changes.** The rename touches every file that references Hael by name, including cross-references in profiles, location descriptions, knowledge system examples, and the monologue authoring guide. - -#### File-by-file rename plan - -| # | File | Change Type | Details | -|---|------|-------------|---------| -| 1 | `wiki/npcs/hael.md` | **Rename + rewrite** | File becomes `wiki/npcs/naia-tamm.md`. All internal references change. Header becomes "Naia Tamm — THE MIRROR". Pattern assignment changes from implicit to explicit MIRROR. | -| 2 | `wiki/npcs/index.md` | Content update | Roster table row 9: "Hael" → "Naia Tamm". Triangle 4 diagram: all 3 "Hael" labels. Bridge NPCs table: not listed (Naia isn't a bridge NPC). Social site listing for The Last Shift: "Hael (Teacher)" → "Naia Tamm (Teacher)". | -| 3 | `wiki/index.md` | Content update | NPC listing under Tier 2: `[Hael](npcs/hael.md) — Kael's partner` → `[Naia Tamm](npcs/naia-tamm.md) — Kael's partner`. | -| 4 | `wiki/npcs/kael-davan.md` | Content update | **Heaviest single file.** 20+ occurrences. Axis 1 secondary Want, Axis 2 (deep secret), Relationship 2 (full section), Axis 4 tolerance, Axis 5 routine, Axis 6 information inventory, Axis 7 contentment, Voice sample (Mood: Protective), Dual-lens smuggler notes, Triangle 4 role notes, Secret section, Contradiction arc Phase 1 through 5, Authoring notes. Every "Hael" → "Naia" in dialogue/casual references (Krenn first-name-primary convention). Every "Hael" → "Naia Tamm" in formal/profile references. | -| 5 | `wiki/npcs/sera-venn.md` | Content update | ~15 occurrences. Relationship 2 (full section), Axis 4 tolerance, Axis 5 routine, Axis 6 information inventory, Axis 7 contentment, Tell system, Voice sample, Dual-lens notes, Triangle 4 role notes, Secret section, Contradiction arc, Authoring notes. Same casual/formal distinction as Kael's file. | -| 6 | `wiki/npcs/lera-sessik.md` | Content update | Axis 6 information inventory: "Hael's worry about Kael" → "Naia Tamm's worry about Kael". | -| 7 | `wiki/npcs/maret-korr.md` | Content update | Axis 5 routine: "goes for Hael's company sometimes" → "goes for Naia's company sometimes". | -| 8 | `wiki/authoring/monologue-guide.md` | Content update | Any monologue examples referencing Hael. | -| 9 | `wiki/locations/krenn-system/the-last-shift.md` | Content update | NPC presence list, social dynamics references. | -| 10 | `wiki/world/sova-transit-district.md` | Content update | Any district NPC references. | -| 11 | `wiki/factions/the-ring.md` | Content update | Likely references Hael as collateral/vulnerability for Kael. | -| 12 | `wiki/knowledge/relationship-states.md` | Content update | Any example entries using Hael as a relationship target. | -| 13 | `wiki/knowledge/entity-attributes.md` | Content update | Scan for Hael in example EntityKnowledge entries. | -| 14 | `wiki/knowledge/fact-catalog.md` | Content update | FactId entries referencing Hael (e.g., `npc.hael.worry`, `relationship.kael.hael`). IDs change to `npc.naia_tamm.*` and `relationship.kael.naia_tamm`. | -| 15 | `wiki/world/krenn-system.md` | Content update | NPC naming examples list. | -| 16 | `decisions/content.md` | Content update | D-034 references Hael twice (Kael's partner, Triangle 4). D-036 references Hael in the naming examples list. | - -#### Naming convention for the rename - -Per Krenn System conventions (D-036, Miri Round 1): -- **Formal/profile references:** "Naia Tamm" (full canonical name) -- **Casual/dialogue/in-character references:** "Naia" (first-name-primary, Krenn convention) -- **NPC profile page title:** "Naia Tamm — THE MIRROR" -- **Canonical ID:** `krenn.naia-tamm` -- **Filename:** `naia-tamm.md` - -#### Profile header changes for naia-tamm.md - -The renamed file also needs structural updates to reflect the MIRROR pattern: - -``` -# Naia Tamm — THE MIRROR - -**Tier 1 (MIRROR) NPC** | The Last Shift (Bar) | Mundane -``` - -Note: The brief identifies Naia Tamm as the first MIRROR instance with "Tier 1 emotional depth." The SUMMARY confirms: "50-70 authored lines." This is between Tier 1 (70-100) and Tier 2 (40-60). The profile needs a content requirement update reflecting MIRROR-specific depth: -- ~50-70 authored lines (no generation expansion — same rule as FRIEND) -- Full 10-axis profile (already present in current Tier 2 format) -- NO contradiction arc, NO secret — this is the MIRROR's defining constraint -- Emotional weight comes from what HAPPENS TO Naia, not what Naia hides - ---- - -### 1b. Smuggler Attribute Vocabulary - -The existing EntityKnowledge attributes (entity-attributes.md) are detective-shaped: `tell_observed`, `contradiction_flagged`, `secret_held`, `secret_confidence` all describe an investigative lens. The smuggler needs parallel attributes that describe an operational lens. - -#### Proposed Smuggler-Specific EntityKnowledge Keys - -| Key | Value Format | What It Captures | Examples | -|-----|-------------|------------------|----------| -| `trust_read` | enum: `solid`, `reliable`, `shaky`, `unknown`, `compromised` | Smuggler's assessment of whether this person can be trusted with operational knowledge | Kael: `"solid"` (pre-contradiction), `"compromised"` (post-observation). Voss: `"reliable"`. Drin: `"compromised"` (known vulnerability). | -| `exposure_risk` | enum: `none`, `low`, `moderate`, `high`, `critical` | How much this NPC's behavior threatens operational security | Torek: `"high"` (spending beyond means). Maret: `"moderate"` (observant, could notice). Resha: `"moderate"` (asks questions). Pell: `"critical"` (might turn). | -| `loyalty_assessment` | enum: `committed`, `dependable`, `neutral`, `wavering`, `hostile` | Smuggler's read on where this person's loyalty lies | Renn: `"committed"`. Kael: `"dependable"` (pre-contradiction). Pell: `"wavering"`. Voss: `"dependable"` (financially motivated). | -| `leverage_held` | string or null | What the smuggler knows they could use against this person | Drin: `"gambling debt to Harek"`. Voss: `"schedule manipulation evidence"`. Pell: `"ring membership knowledge"`. | -| `social_debt` | string or null | Favors owed, obligations, reciprocal relationships | Kael: `"years of mutual cover, personal friendship"`. Lera: `"bar provides meeting space, ring provides revenue"`. | -| `moral_weight` | enum: `none`, `light`, `heavy`, `crushing` | How much guilt or moral cost the smuggler feels about this relationship | Naia Tamm: `"heavy"` (lying to Kael's innocent partner). Renn: `"none"` (operational colleague, no personal bond). Maret: `"light"` (knows she's worried, pragmatically ignores it). | -| `cover_integrity` | enum: `solid`, `stressed`, `cracking`, `blown` | Whether this person's cover/role is holding up | Kael: `"stressed"` → `"cracking"` (tells accumulating). Torek: `"cracking"` (spending visible). Devra: `"solid"` (brokering cover holds). | -| `loyalty_conflict` | string or null | Which competing loyalties this person faces | Kael: `"ring vs. Naia Tamm, ring vs. exit attempt"`. Sera: `"Commission vs. Naia Tamm's friendship"`. Voss: `"shift authority vs. Nils's demands"`. | - -#### How smuggler attributes map to EntityKnowledge - -These 8 keys would be added to the `known_attributes` BTreeMap alongside the existing 14. They use the same string:string format. The smuggler's knowledge graph populates them; the detective's does not (or populates them differently — the detective's `trust_read` of an NPC reflects institutional trust, not operational trust). - -#### What a smuggler-lens section looks like in an NPC profile - -Every NPC profile currently has "Dual-Lens Notes" with a "Smuggler" and "Detective" subsection. The smuggler-lens expansion adds structured operational data below the monologue note. Here's what the expanded format looks like, using Voss as an example: - -```markdown -### How the Smuggler Sees Voss - -**Operational Profile:** - -| Attribute | Value | Rationale | -|-----------|-------|-----------| -| trust_read | reliable | Financially motivated, predictable | -| exposure_risk | moderate | Institutional face — first person investigated | -| loyalty_assessment | dependable | Compliant because the money is good | -| leverage_held | schedule manipulation evidence | Smuggler knows Voss adjusts manifests | -| social_debt | null | No personal relationship | -| moral_weight | none | Voss chose this; smuggler doesn't feel guilt | -| cover_integrity | stressed | Manifest reworks are increasing | -| loyalty_conflict | shift authority vs. Nils's demands | Resents being managed, might cooperate if pressured | - -**Monologue tone (baseline):** Operational assessment. *"Voss is tense today. -Nils must have changed the window again."* - -**Monologue tone (post-escalation):** Risk evaluation. *"Voss reworked the -manifest three times today. He's rattled. If he cracks, we're all exposed."* - -**Moral arc phase:** Comfort (baseline) — Voss is a tool, not a person the -smuggler thinks about. If Voss breaks, the phase shifts to Doubt ("Am I -responsible for what happens to him?"). -``` - -Each NPC profile gets this treatment. The smuggler-lens sections should match the detective-lens sections in depth and specificity. The detective reads people through behavioral analysis; the smuggler reads people through operational risk assessment. - -#### Smuggler Moral Arc Phases - -The brief identifies 4 phases: **Comfort → Doubt → Reckoning → Compromise.** These map to the smuggler's relationship with the consequences of the operation: - -| Phase | Trigger | Internal State | Monologue Tone | -|-------|---------|---------------|----------------| -| **Comfort** | Default. The operation is manageable. Money helps. People are fine. | Pragmatic rationalization. "This is a service. Nobody's getting hurt." | Matter-of-fact, confident | -| **Doubt** | Sees the operation's human cost. Naia Tamm's worry. Maret's anxiety. Pell's terror. | Questions the rationalization. "Nobody's getting hurt — except everyone adjacent to this." | Reflective, unsettled | -| **Reckoning** | A specific harm: Pell disappears. Drin is broken. Naia Tamm discovers Kael's secret. The smuggler's actions contributed. | Can't rationalize. Must choose: continue, reform, or exit. | Conflicted, sharp | -| **Compromise** | Player choice determines resolution. Some damage is done. The question becomes: can you live with it? | Whatever the player decided, the cost is visible. | Quiet, weighted | - -Every NPC's smuggler-lens section should include a note about which moral arc phase the relationship triggers or inhabits. - ---- - -### 1c. Nils Davan Stub Page + Triangle 1 Escalation Sequence - -#### Nils Davan Stub Page - -```markdown -# Nils Davan - -**Off-Stage NPC** | Smuggling Ring (Coordinator) | Entangled - ---- - -## Core Identity - -**Name**: Nils Davan -**Age**: 39 -**Role**: Ring coordinator (strategic — personnel, security, growth decisions) -**System Origin**: Krenn System, Station Sova (born and raised, same as Kael) -**Lattice Tier**: Standard professional -**Employer**: Self-employed (freight consulting cover); The Arrangement - (ring leadership) -**Relationship to Kael**: Older sibling - ---- - -## Function - -Nils is the ring's strategic leader — the person who decides volume, -personnel, risk tolerance. Nils brought Kael into the ring ("It's just -moving containers. You're good at logistics. We take care of our own."). -Nils pushes for escalation: higher volume, tighter margins, more profit. -This push is the primary source of tension in Triangle 1 and the catalyst -for Kael's exit attempt. - -**Off-stage in v0.1.** Nils is referenced constantly but never directly -encountered by the player. Nils exists through: -- Kael's dialogue ("Nils wants the next shipment doubled") -- Voss's resentment ("Another 'adjustment' from above") -- Devra's coordination ("Nils says push the timeline forward") -- Renn's reporting ("I told Nils about Pell") - -This is the GHOST pattern: absent power shaping events through influence. - ---- - -## What the Player Knows - -**Smuggler:** Knows Nils exists, knows Nils is Kael's sibling, knows Nils -gives strategic orders. May receive direct instructions from Nils via -lattice communication (voice only — Nils doesn't appear in person). The -smuggler experiences Nils as a disembodied authority figure whose decisions -create consequences the smuggler must manage. - -**Detective:** Doesn't know Nils exists initially. Nils's name surfaces -through investigation: Kael's family records (lattice query), ring members' -references in overheard conversations, Pell's potential testimony. The -detective builds Nils as a conceptual entity before ever having a name — -"someone is giving orders" → "the coordinator" → "Nils Davan, Kael's -sibling." - ---- - -## Escalation Pressure - -Nils is pushing for increased volume because: -1. External demand (Sabel reports higher demand for lattice components - from other systems) -2. Profit motive (higher volume = higher margins, Nils takes the - largest cut) -3. Ambition (Nils wants to expand beyond Sova to other districts on the - station) - -This escalation creates the pressure that: -- Makes Voss anxious (more schedule manipulation, more risk) -- Makes Kael desperate (higher stakes, more danger for Naia) -- Makes Pell crack (risk-to-reward ratio inverted) -- Makes the whole operation more detectable (the detective arrives - during this escalation, not by coincidence) - ---- - -## Pattern + Motivation - -**Pattern:** GHOST — absent power shaping events -**Motivation:** HANDLER — managing operations, applying pressure from above - ---- - -**Cross-References:** [Kael Davan](kael-davan.md), [Voss](voss.md), -[Devra](devra.md), [Renn](renn.md), [Pell](pell.md) -``` - -#### Triangle 1 Escalation Sequence - -Triangle 1 (Hub Power: Voss - Kael - Nils) is currently the weakest triangle because the smuggler role is passive — the smuggler observes tension but doesn't make decisions. Here's the escalation fork: - -**The Nils-vs-Voss Escalation Decision** - -Nils (via lattice message or Devra intermediary) orders a doubled shipment during a window when Voss has already flagged the schedule as too tight. Voss refuses to create the schedule gap. Kael is caught in the middle. - -**Escalation sequence (5 beats across the 30-minute session):** - -| Beat | Timing | Event | Smuggler Sees | Detective Sees | -|------|--------|-------|---------------|----------------| -| 1 | ~5 min | Nils sends order for doubled volume next cycle via Devra | Devra relays: "Nils wants double. Next cycle." Smuggler knows this means tighter windows, more risk. | Nothing visible. Normal hub operations. | -| 2 | ~10 min | Voss pushes back — refuses to rework schedule for the doubled window | Voss is visibly stressed. Clipped with Kael. "I already posted the rotation." | Voss reworks the manifest for the third time (tell). Detective notes nervous schedule adjustments. | -| 3 | ~15 min | Kael asks the smuggler for advice — **THE FORK** | **Decision point.** Kael says: "Nils wants double. Voss says no. I need to talk to one of them. Which one?" | Kael and smuggler have a private conversation the detective can't hear. Observable: Kael and an unknown colleague talking intensely near the break room. | -| 4 | ~20 min | **Path A**: Smuggler backs Voss → smuggler tells Kael to push back on Nils. Kael contacts Nils (via lattice), argues for maintaining current volume. Nils is unhappy. **Path B**: Smuggler backs Nils → smuggler tells Kael to pressure Voss. Kael pressures Voss to comply. Voss capitulates, resentfully. **Path C**: Smuggler stays neutral → smuggler tells Kael to handle it himself. Kael freezes, does nothing. Nils interprets silence as refusal. | **Path A**: Voss relaxes slightly. Manifests stabilize. But Nils has marked the smuggler as unreliable. **Path B**: Voss's schedule suddenly changes again. Fourth manifest revision. Detective monologue: "Something just changed. The schedule revised again — after hours." **Path C**: Nothing changes immediately. But the unresolved tension escalates into Beat 5. | **All paths**: Detective observes varying levels of hub stress. Path B is most detectable (visible schedule change). Path A is least detectable (tension decreases). Path C delays visibility to Beat 5. | -| 5 | ~25 min | **Consequences arrive.** **Path A**: Nils sends a cold message to Kael: "We'll discuss this." Kael is frightened. The smuggler realizes pushing back on Nils has consequences for Kael — and the smuggler is the one who recommended it. **Path B**: The doubled shipment goes through during Voss's reluctant window. Renn runs the courier route. The operation succeeds but Voss's fourth manifest revision creates a data anomaly Maret will find. **Path C**: Nils acts unilaterally — sends the shipment anyway, bypassing normal coordination. Devra scrambles. The operation succeeds sloppily. More detectable. | **Path A**: Kael is visibly shaken. Smuggler monologue: "I told Kael to push back. Now Nils is angry. Did I just put a target on Kael's back?" **Path B**: Smuggler monologue: "It worked. But Voss looks like he's going to break. And Maret was watching the manifests." **Path C**: Smuggler monologue: "I didn't decide. Nils decided for everyone. That's what happens when you don't choose." | **All paths produce detective-visible signals** — the question is timing and magnitude. Path B is loudest. Path C is messiest. Path A is quietest but pushes consequences to the FRIEND contradiction arc. | - -**Why this works:** The smuggler is no longer passive. The decision has immediate consequences (Beat 4) and delayed consequences (Beat 5) that feed into other triangles. Path B feeds Triangle 2 (Maret sees the anomaly). All paths affect Kael's emotional state, which feeds Triangle 4 (Worried Partner). The detective sees the EFFECTS without understanding the cause — which is exactly how occlusion-based investigation works. - ---- - -### 1d. Drin — Tier 2 Promotion Content - -If Gestalt confirms promotion, here's what the expanded Tier 2 profile contains. Drin currently has 3 axes (Want, Routine, Personality) + voice hint + function note. Tier 2 requires all 10 axes + voice sample + dual-lens notes + triangle notes + ~40-60 authored lines. - -#### Axes to add (7 new axes for Drin): - -**2. Secret / Vulnerability:** -- Surface secret: Gambling debt to Harek. Known to bar regulars, not formally reported. -- Deep secret: Drin knows his inspection negligence is being used by the ring. He's not looking away by accident anymore — after the first few "coincidental" clean inspections during flagged container processing, Drin understood the pattern. He's complicit, not just negligent. The debt is the lever; the knowledge is the chain. -- Vulnerability: Double bind. Reporting his compromise exposes him to institutional consequences (negligent inspections). Not reporting makes him deeper complicit each cycle. - -**3. Relationships:** -- Harek: Debt holder. The relationship started as friendly (card games, bar nights). The debt transformed it into a power dynamic Drin can't escape. Harek doesn't even know he's a tool — Harek thinks it's just a card game debt. -- Voss: Shift supervisor. Voss needs Drin's inspections to stay clean. Drin reads Voss's professional attention as surveillance. Every "good work, Drin" from Voss feels loaded. -- Maret Korr: Fellow hub worker. Maret processes the manifests Drin's inspections clear. They share break room time occasionally. Drin is aware that Maret is smart enough to connect his inspection reports to the manifest anomalies. He avoids prolonged interaction with her — not out of guilt, but out of fear. - -**4. Tolerance Threshold:** -- Low and declining. The gambling debt was manageable. The inspection negligence was uncomfortable. The realization that he's actively enabling a smuggling operation has pushed Drin past functional tolerance. He's operating on routine, not commitment. One external push — the detective asking about inspection protocols, Pell approaching him for help, Harek calling in the debt — could trigger a break. - -**5. Daily Routine** (expanded from current): -- 06:00-14:00: Day shift (maintenance rounds + dock inspections) -- Inspection windows: 3-4 per shift, scheduled by Voss. The "compromised" inspections happen during specific bay rotations that align with ring activity. Drin knows which ones. His body language changes during those inspections — faster, less thorough, eyes forward not searching. -- 10:30: Break room. Avoids Harek if present. Avoids Maret for different reasons. May eat alone. -- 14:00-16:00: Post-shift. Home or bar for card games (2x/week — the games continue because stopping would signal awareness). -- Night: Home, insomnia, reviewing what he ignored during the day. - -**6. Information Inventory:** -- Knows: Which containers receive cursory inspections (operational awareness). Harek's debt amount and terms. Voss's schedule patterns. The maintenance corridors' physical layout (pipe access, junction boxes, environmental systems — maintenance tech knowledge). Which corridors have Meridian dead spots. Maret's increasing scrutiny of manifests (observed her checking records after his shifts). -- Doesn't know: Ring structure (Drin doesn't know names, hierarchy, or the operation's scope — only that specific containers are expected to pass). Kael's involvement (Drin works different parts of the bay). Pell, Renn, Devra (has no ring contact — the compromise flows through the debt, not through recruitment). - -**7. Contentment:** -- Very low. Was moderate before the debt became leverage. Drin found satisfaction in maintenance work — fixing things, keeping systems running. The inspection compromise pollutes that satisfaction. Every clean report filed is a small self-betrayal. Drin's contentment trajectory: steady → declining → collapsed. He still finds momentary peace in pure maintenance tasks (pipe repair, wiring, physical work with no moral dimension). - -**8. Personality Traits** (expanded from "quiet, methodical, avoidant"): -- Primary: Avoidant — dodges confrontation, minimizes interaction, retreats into procedural work. -- Secondary: Competent — genuinely skilled at maintenance. The competence is his last source of self-respect. -- Tertiary: Guilty — the guilt is corrosive but suppressed. Manifests as insomnia, shortened social interactions, inability to maintain eye contact during compromised inspections. - -**9. Tell System** (new): - -| Tell | Trigger | Observable To | -|------|---------|---------------| -| Faster inspections on flagged bays | Ring-relevant containers scheduled for his inspection window | Smuggler (knows the pattern), Maret (if comparing inspection times to bay traffic), Detective (if tracking inspection duration data) | -| Avoids Harek at the bar | Debt anxiety — doesn't want casual interaction that reminds him of the leverage | Bar regulars, Detective (if tracking avoidance patterns) | -| Insomnia tells — tired eyes, slower response | Accumulated guilt disrupting sleep | Maret (works near him), Voss (notices the performance dip), anyone paying attention at the hub | -| Refuses to discuss inspection procedures | Topic triggers defensive response — "I run them by the book" | Detective (classic deflection — compare with Sera's topic avoidance), Resha (asks procedural questions, gets stonewalled) | - -**10. Skill Set** (expanded): -- Occupational: Environmental systems maintenance, pipe/wiring repair, dock inspection protocols, equipment calibration, facility safety checks. -- Ring-relevant (involuntary): Knows which inspection windows matter, can identify containers by routing codes, understands bay access schedules. -- Combat tag: No. -- Lattice capability: Baseline. - -#### Voice Sample (Tier 2: 2-3 lines): - -**Mood: Professional (baseline)** -*"Junction 4-C has a pressure variance. I'll need 20 minutes with the coupling. Standard repair."* - -**Mood: Evasive (pressed about inspections)** -*"I run them by the book. Every container gets the standard check. If you've got questions about the process, talk to Voss."* [Flat delivery, eye contact avoided] - -**Mood: Breaking (if directly confronted)** -*"What do you want me to say? I do the inspections. I file the reports. If there's a problem, it's not — I didn't — I just do the job."* [Voice cracks. Eyes down.] - -#### Content requirement: ~40-60 authored lines - ---- - -### 1e. Canonical Names — Which NPCs Need Them - -**5 NPCs already have full canonical names:** -- Kael Davan -- Sera Venn -- Lera Sessik -- Torek Lintar -- Maret Korr - -**1 NPC gains a full name through the rename:** -- Hael → Naia Tamm - -**1 off-stage NPC has a full canonical name:** -- Nils Davan (Kael's sibling — surname established) - -**10 NPCs currently have first names only and need canonical surnames:** - -| NPC | Current Name | Proposed Full Name | Surname Source | Rationale | -|-----|-------------|-------------------|---------------|-----------| -| Voss | Voss | Voss Harsk | Miri's surname list | Short-form first name + consonant-heavy surname. Harsk has the authoritative weight appropriate for a shift supervisor. | -| Devra | Devra | Devra Rosta | Miri's surname list | Mid-form + fluid surname. Rosta has the off-station feel (Devra was born on Orbital Manufacturing Platform 3). | -| Resha | Resha | Resha Neven | Miri's surname list | Mid-form + softer surname. Neven feels younger, matches Resha's 23-year-old new-hire energy. | -| Renn | Renn | Renn Kosse | Miri's surname list | Short-form + double-s surname. Kosse is one of Miri's example names — works as surname for a young courier. | -| Pell | Pell | Pell Talvik | Miri's surname list | Short-form + heritage-weight surname. Talvik is an "old founding family" name per Miri — ironic for someone cracking under pressure. | -| Harek | Harek | Harek Pellam | Miri's surname list | Mid-form + institutional-feeling surname. Pellam has the station security weight. | -| Drin | Drin | Drin Vassar | Extrapolated from Krenn phonetics | Short-form + mid-weight surname. Vassar follows the consonant-vowel-consonant pattern. Not on Miri's list — propose for Miri to validate. | -| Sess | Sess | Sess Torin | Extrapolated from Krenn phonetics | Short-form + compact surname. Torin echoes the utilitarian Krenn naming style. Propose for Miri validation. | -| Olin | Olin | Olin (no surname given) | Deliberate omission | Olin is the ambiguity NPC. A drifter who doesn't volunteer a surname is itself a data point. The detective notes the missing surname; the smuggler reads it as evasion. The absence is load-bearing. | -| Sabel | Sabel | Sabel (surname unknown) | Off-station character | Sabel operates from elsewhere in the Krenn System. No one in Sova uses Sabel's surname — the transactional relationship doesn't require it. If needed later, Miri can generate one. | -| Tav | Tav | Tav Lenn | Extrapolated from Krenn phonetics | Short-form + monosyllabic surname. Tav is young and peripheral — a short, working-class name pair. Propose for Miri validation. | - -**Notes for Miri:** -- 3 surnames are extrapolated (Vassar, Torin, Lenn) and need validation against Krenn phonetic rules. -- 2 NPCs (Olin, Sabel) deliberately omit surnames for narrative reasons. -- Olin's missing surname should be noted in the profile as a deliberate character detail, not a gap. - -**Implementation note:** Per D-036, Krenn convention is first-name-primary in social contexts. Adding surnames does NOT change how NPCs are addressed in dialogue. Surnames appear in: profile headers, formal identification (detective lattice queries), and the player's knowledge graph when they learn the full name. Most players will never use or need the surnames — they exist for world consistency and investigative depth. - ---- - -### 1f. Other Wiki Gaps Not in the Brief - -Having reviewed all 17 NPC profiles, the 3 location files, knowledge system files, and the authoring guide, here are gaps I identified beyond what the brief covers: - -#### Gap 1: PC-as-NPC Profiles Missing - -D-029 references "PC-as-NPC Concept A for v0.1" — the other playable character exists as an NPC (~20-30 authored items). **No wiki content exists for this.** We need: -- A smuggler-as-NPC profile (how the detective sees and interacts with the smuggler character when not played) -- A detective-as-NPC profile (how the smuggler sees and interacts with the detective character when not played) - -These are load-bearing for the dual-lens experience. The smuggler player should encounter "the Commission investigator" as a threatening NPC. The detective player should encounter "the dock worker" as an unremarkable colleague of Kael's. - -**Blocks:** Server entity spawning, dialogue systems, monologue content about the other PC. - -#### Gap 2: Monologue Content Pool — Zero Authored Lines - -The wiki profiles contain example monologue lines (embedded in contradiction arc descriptions), but there is no monologue content file. The authoring guide (`wiki/authoring/monologue-guide.md`) defines the format, but no actual pool exists. Mellanie needs a minimum viable pool before the monologue system can be tested. - -**Blocks:** Monologue system integration testing, client UI monologue display. - -#### Gap 3: NPC Routine YAML Layer Missing - -D-028 and the SUMMARY specify a 2-layer routine format: YAML (engine-readable) + prose (human-readable). The wiki has the prose layer for all NPCs (Section 5 in each profile). The YAML layer does not exist. - -**Blocks:** Server NPC scheduling, routine deviation detection. - -#### Gap 4: Triangle Fork Decision Points Not Mechanically Specified - -Triangle 1's fork is designed above (1c). But Triangles 2-5 also need player decision points specified for both characters. Currently the triangles describe tension but not player agency. Specifically: -- **Triangle 2 (Worried Knowledge):** What decision does the detective make about Maret? (Approach as witness? Apply pressure? Wait?) What does the smuggler decide about Drin? (Reinforce the compromise? Try to relieve pressure?) -- **Triangle 3 (Bar Tensions):** What decision does either character make about Olin? (Investigate? Befriend? Ignore?) What about Torek's spending? (Smuggler: warn him? Detective: follow the money?) -- **Triangle 4 (Worried Partner):** Decision points exist implicitly (in the FRIEND contradiction arcs) but aren't formalized as explicit player choices. -- **Triangle 5 (Informant Question):** What does the smuggler decide about Pell? (Support, report, or manage?) How does the detective find Pell? - -**Blocks:** Storyteller event triggers, dialogue branching, consequence propagation. - -#### Gap 5: FactId Catalog — Smuggler Path Entries Sparse - -The fact catalog (`wiki/knowledge/fact-catalog.md`) likely has detective-oriented entries (manifest discrepancies, behavioral observations). Smuggler-path FactIds need equivalent coverage: operational facts (who handles what), risk assessments, loyalty intelligence. - -**Blocks:** Knowledge graph population for smuggler character, monologue prerequisite checking. - -#### Gap 6: Location Files Lack Smuggler-Specific Detail - -The three location files (Terminal, Last Shift, Maintenance Corridors) describe physical spaces but don't map smuggling-relevant features: dead spots, timing windows, surveillance gaps, handoff points. The smuggler experiences these spaces as an operational landscape; the locations need that layer. - -**Blocks:** Environmental monologue triggers (smuggler entering a corridor and thinking about the operation), spatial gameplay design. - -#### Gap 7: Harek Is Tier 2 But Missing Triangle Membership - -Harek has a full Tier 2 profile (10 axes, voice sample, dual-lens notes) but is explicitly "not a triangle member." He's described as "external pressure on Drin" in Triangle 2. This is structurally odd — Harek does Tier 2 work (the leverage dynamic is essential to Triangle 2 and Triangle 5) without being IN a triangle. If Drin is promoted, Harek's role as the unseen fourth wall of Triangle 2 should be formalized — either as a triangle member or as a named structural role ("external pressure node"). - ---- - -## Topic 2: v0.1 NPC Architecture — Pattern/Motivation Mapping - -The workshop brief asks whether the existing 17 NPCs implicitly match the three-system NPC architecture. **Yes — the profiles were designed before the formal system was named, but the patterns are already present.** Let me make the mapping explicit. - -### Full NPC → Pattern + Motivation Assignment - -| # | NPC | Tier | Pattern | Motivation | Implicit Evidence in Current Profile | -|---|-----|------|---------|-----------|--------------------------------------| -| 1 | Kael Davan | 1 | **FRIEND** | **OPERATOR** | Definitionally THE FRIEND (D-034). Runs dock operations + ring cargo handling. Competent, goal-oriented. | -| 2 | Sera Venn | 1 | **FRIEND** | **WITNESS** | Definitionally THE FRIEND (D-034). Accidentally witnessed manifest discrepancies. Carries information she can't act on. | -| 3 | Naia Tamm | 1* | **MIRROR** | **CIVILIAN** | Established as THE MIRROR (SUMMARY). No contradiction, no secret. Uninvolved in conspiracy. Living their life. | -| 4 | Voss | 2 | **SYSTEM** | **HANDLER** | Institutional embodiment — the shift supervisor IS the legitimate system. Manages operations, applies scheduling pressure. Procedure-citing under stress. | -| 5 | Lera Sessik | 2 | **ANCHOR** | **OPERATOR** | Embodies contentment — "Is this enough? Yes, if the bar stays open." Running the bar is her life. Genuine answer to the thematic question. | -| 6 | Torek Lintar | 2 | **CATALYST** | **CIVILIAN** | His spending forces others to react. Disrupts the bar's equilibrium. Not managing anything — just living visibly. The disruption is unintentional. | -| 7 | Devra | 2 | **THRESHOLD** | **OPERATOR** | Gatekeeper between the local ring and the external supply chain. Running the external coordination. The detective must get past Devra to reach the upstream network. | -| 8 | Maret Korr | 2 | **WITNESS** | **SKEPTIC** | Accidentally witnessed manifest discrepancies (parallel to Sera but from the data side). Doubts the system — the numbers don't add up, and she can't ignore them. | -| 9 | Resha | 2 | **CATALYST** | **CIVILIAN** | Her questions force hub workers to react defensively. New energy disrupting an equilibrium. Not suspicious — just curious in the wrong direction. | -| 10 | Renn | 2 | **THRESHOLD** | **OPERATOR** | Physical gatekeeper — the courier who controls corridor access. Running the transport operation. The detective must trace Renn's routes to map the physical smuggling chain. | -| 11 | Pell | 2 | **CATALYST** | **TURNCOAT** | His potential defection forces a crisis. Loyalty actively shifting. The most dangerous NPC in the ring because his decision cascades everywhere. | -| 12 | Harek | 2 | **ANCHOR** | **HANDLER** | Embodies complacent contentment — "Is this enough? Yes, absolutely." But unconsciously manages Drin through debt leverage. The comfortable man whose comfort creates a tool for others. | -| 13 | Drin | 3→2 | **SYSTEM** | **TURNCOAT** | Institutional embodiment — the dock inspector IS the inspection system. His compromise means the system itself is corrupted. Loyalty shifting under pressure (could crack and cooperate). | -| 14 | Sess | 3 | **NOBODY** | **CIVILIAN** | Social wallpaper. Sees everything, says nothing. Background that could become foreground through player investment. Living their life. | -| 15 | Olin | 3 | **CATALYST** | **CIVILIAN** | New variable forcing evaluation. Ambiguous intent creates productive uncertainty. Uninvolved (as far as anyone knows). | -| 16 | Sabel | 3 | **GHOST** | **OPERATOR** | Absent power — off-station, never fully present. Shapes events through shipments. Running the upstream supply operation. | -| 17 | Tav | 3 | **NOBODY** | **OPERATOR** | Peripheral, barely visible. Running lookout operations at the lowest level. Background ring member who the detective might never notice. | - -*Naia Tamm at "Tier 1 (MIRROR)" — not THE FRIEND tier but production emotional depth. - -#### Off-stage NPC: - -| NPC | Pattern | Motivation | Notes | -|-----|---------|-----------|-------| -| Nils Davan | **GHOST** | **HANDLER** | Absent authority applying pressure through intermediaries. Classic GHOST+HANDLER composition. | - -### Pattern Coverage Analysis - -| Pattern | v0.1 Count | NPCs | Notes | -|---------|-----------|------|-------| -| FRIEND | 2 | Kael, Sera | Core v0.1 requirement (D-034) | -| MIRROR | 1 | Naia Tamm | First MIRROR instance | -| ANCHOR | 2 | Lera, Harek | Both embody "is this enough?" differently | -| GHOST | 2 | Sabel, Nils | Both off-stage — absent power | -| CATALYST | 3 | Torek, Resha, Olin (+ Pell) | Pell is CATALYST by effect, TURNCOAT by motivation | -| THRESHOLD | 2 | Devra, Renn | Both gatekeep access to the operation | -| SYSTEM | 2 | Voss, Drin | Both ARE institutional processes (scheduling, inspection) | -| NOBODY | 2 | Sess, Tav | Minimum viable NOBODY presence | -| REMNANT | 0 | — | **Not represented in v0.1.** No character embodies "remembers when things were different." Acceptable — REMNANT is a long-game pattern that requires historical depth v0.1 doesn't have. | - -**Missing: REMNANT.** This is fine for v0.1. Sova Transit District is 40 years old — there's no deep history for a REMNANT to remember. REMNANT patterns belong on older worlds (mature/ancient drift stages) where someone lived through the founding generation. - -### Motivation Coverage Analysis - -| Motivation | v0.1 Count | NPCs | -|-----------|-----------|------| -| HANDLER | 3 | Voss, Harek, Nils | -| WITNESS | 2 | Sera, Maret | -| TURNCOAT | 2 | Pell, Drin | -| CIVILIAN | 5 | Naia Tamm, Torek, Resha, Olin, Sess | -| OPERATOR | 5 | Kael, Lera, Devra, Renn, Tav | -| SKEPTIC | 1 | Maret | - -**SKEPTIC is underrepresented.** Only Maret doubts the system. But this is mechanically correct — Sova's culture is pragmatic, mind-your-business. Questioning is rare. The detective IS the external skeptic. One internal SKEPTIC (Maret) is enough for v0.1. - -### Composition Highlights - -The most dramatically rich compositions in v0.1: - -| Composition | NPC | Why It Works | -|------------|-----|-------------| -| FRIEND+OPERATOR | Kael | "I was your friend AND I was running the operation you're investigating." Identity betrayal at maximum. | -| FRIEND+WITNESS | Sera | "I was your friend AND I was sitting on evidence the whole time." Concealment as betrayal. | -| MIRROR+CIVILIAN | Naia Tamm | "I was the one innocent person, and the conspiracy touched me anyway." Innocence endangered. | -| SYSTEM+TURNCOAT | Drin | "The system itself is corrupt, and the person embodying it might break." Institutional rot. | -| CATALYST+TURNCOAT | Pell | "The person forcing the crisis is the person whose loyalty is shifting." Maximum instability. | -| GHOST+HANDLER | Nils | "The invisible authority whose pressure creates every visible consequence." Classic absent power. | -| ANCHOR+HANDLER | Harek | "The comfortable man whose comfort creates tools for others." Unconscious complicity. | - ---- - -## Topic 5: Scope Boundary — What Content Is Missing That Blocks Implementation? - -### Content that MUST be authored before coding starts - -These are items where the server or client team cannot proceed without authored content: - -| # | Missing Content | Blocks | Priority | Team | -|---|----------------|--------|----------|------| -| 1 | **Smuggler-lens sections for all 17 NPC profiles** | Smuggler character knowledge graph population, dual-lens monologue selection, smuggler EntityKnowledge examples | Critical | Copy (Paula + Mellanie) | -| 2 | **PC-as-NPC profiles** (smuggler seen by detective, detective seen by smuggler) | Server entity spawning for second character, dialogue with other PC, monologue about other PC | Critical | Copy (Paula) | -| 3 | **Minimum monologue pool** (~50-80 lines per character) | Monologue system integration testing, client UI display, tag taxonomy validation | Critical | Copy (Mellanie) | -| 4 | **NPC routine YAML layer** (engine-readable schedules for all 17 NPCs) | Server NPC scheduling, routine-based movement, deviation detection | Critical | Copy (Paula) + Server (Dudley) format spec | -| 5 | **Triangle fork decision points** (mechanically specified for all 5 triangles) | Storyteller event triggers, dialogue branching, consequence system | High | Copy (Paula + Gestalt) | -| 6 | **Smuggler EntityKnowledge attribute definitions** (8 new keys) | Smuggler knowledge graph implementation, smuggler monologue prerequisites | High | Copy (Paula) + Server (Dudley) | -| 7 | **FactId catalog — smuggler path entries** | Knowledge graph population, monologue prerequisite validation | High | Copy (Paula) | -| 8 | **Content file schema** (wiki → engine-readable format) | Content loader development, hot-reload testing | High | Tyre + Dudley | -| 9 | **Location files — smuggler operational layer** (dead spots, timing windows, handoff points) | Environmental monologue triggers, spatial gameplay, smuggler navigation | Medium | Copy (Paula + Miri) | -| 10 | **Naia Tamm MIRROR-depth content** (~50-70 authored lines) | MIRROR pattern validation, emotional baseline testing | Medium | Copy (Mellanie) | -| 11 | **Nils Davan stub** (as designed in 1c above) | Triangle 1 fork implementation, GHOST pattern reference | Medium | Copy (Paula) — draft provided above | -| 12 | **Drin Tier 2 expansion** (if promoted) | Triangle 2 + Triangle 5 implementation, TURNCOAT pattern testing | Medium | Copy (Paula) — draft provided above | - -### Content that is nice-to-have but does NOT block implementation - -- Full canonical names (surnames) — cosmetic, knowledge graph uses canonical_id not surnames -- NOBODY tier promotion content — explicitly OUT for v0.1 -- Archetype transition mechanics — v0.2+ -- Secondary contraband variation — deferred -- Gate topology — not relevant to single-district v0.1 - -### The honest truth about the gap - -The wiki is detective-complete and smuggler-incomplete. Every NPC profile has a "How the Detective Sees [NPC]" section that provides enough mechanical detail for implementation. The smuggler sections are 1-2 sentence monologue notes. This means the server team could build and test the detective's knowledge graph, monologue system, and interaction model from existing content. They CANNOT do the same for the smuggler. - -The smuggler-lens content is the single largest content gap blocking v0.1 implementation. It's not a small fix — it requires adding structured operational data, moral arc phases, and smuggler-specific EntityKnowledge attributes to every NPC profile. Estimated scope: 17 NPC profiles x ~30 minutes of writing each = ~8-10 hours of focused copy work. - -But what SUSTAINS that across hours of play is the smuggler moral arc. The detective has a clear progression (investigate → discover → confront → resolve). The smuggler needs an equally clear progression (participate → doubt → reckon → compromise). Every NPC interaction should advance or complicate one of those phases. The smuggler-lens sections need to map every NPC to a moral arc phase, not just an operational assessment. - -Let me complicate this further: the smuggler and detective paths aren't just parallel — they're entangled through the NPCs. When the smuggler makes a decision about Pell (Triangle 5), the consequences affect what the detective sees when investigating Pell's disappearance. When the detective pressures Maret (Triangle 2), the smuggler sees Maret's increased anxiety. The cross-character consequence propagation is the v0.1 proof of concept. If we ship smuggler content that doesn't map to detective consequences (and vice versa), we've built two separate games in the same district, not one occlusion-based experience. - -**Recommendation:** Prioritize items 1-4 (smuggler-lens, PC-as-NPC, monologue pool, routine YAML) as Sprint 3 copy team deliverables. Items 5-7 can proceed in parallel with server architecture work. Items 8-12 are dependencies that should be ticketed and scheduled. diff --git a/docs/workshops/v01-content-scoping/round1-si.md b/docs/workshops/v01-content-scoping/round1-si.md deleted file mode 100644 index fb684dc5a..000000000 --- a/docs/workshops/v01-content-scoping/round1-si.md +++ /dev/null @@ -1,233 +0,0 @@ -# Round 1 — SI (Project Manager) -## Topic 6: Ticket Landscape for v0.1 Content Scoping - ---- - -## 1. Round 2 Ticket List Review — What Survives the 300-World Reframe? - -The Round 2 list (`si-ticket-changes.md`) proposed 29 new tickets across 4 groups. The reframe changes their priority and framing but kills fewer than expected — because v0.1 is hand-authored, most content tickets are still needed. The key shift: every structure created now must be a generator template later. - -### 1a. Tickets That Survive Unchanged - -These are v0.1 essentials unaffected by the 300-world reframe: - -| R2 ID | Title | Team | Rationale | -|-------|-------|------|-----------| -| A1 | Apply canonical full names to all NPC wiki pages | copy | Required for v0.1 content. Names are content, not metadata. | -| A2 | Rename Hael → Naia Tamm across all wiki files | copy | Unanimous decision. Blocks all Naia content. | -| A7 | Add 5 smuggler-specific entity attributes | copy | Dual-lens parity is a v0.1 requirement (D-027). | -| A8 | Standardize location shortcodes in monologue-guide | copy | Bug fix. Blocks monologue authoring. | -| A10 | Stub NPC profile for Nils Davan | copy | Required for Triangle 1 fix. | -| A11 | Fix Triangle 1 — add Volume Escalation decision | copy | v0.1 requires 5 triangles with forks (D-027, D-039). | -| B2 | THE MIRROR pattern spec | copy | Required for Naia Tamm. Also becomes a generator template. | -| B3 | PC-as-NPC unified spec | copy | Required for two-character proof (D-027). | -| B4 | Smuggler voice card + moral arc spec | copy | Dual-lens parity. Also becomes a generator template. | -| B5 | NPC-format briefs for both PCs | copy | Required for wow moment #4 (Divergence Reveal). | -| C1 | Content directory structure design doc | copy | Prerequisite for all content conversion. | - -### 1b. Tickets That Survive — Reframed - -These still need doing but their framing shifts to "generator template first": - -| R2 ID | Title | Team | Reframe | -|-------|-------|------|---------| -| A3 | Create wiki/cultural-groups/krenn-system.md | copy | Becomes the reference implementation for seed.yaml + brief.md dual artifact. Overlaps with existing #319. **Merge** A3 into #319 with expanded scope. | -| A4 | Create regional style guide template | copy | Becomes the seed.yaml template definition, not just a wiki template. Every field must map to a generator input. | -| A6 | Add smuggler-perspective FactId progression text | copy | Survives. Blocked by B4 (smuggler voice). | -| A9 | Add Thematic Question field to Tier 1 profiles | copy | Low priority. Nice-to-have for authoring guidance. | -| A12 | Create environmental text examples | copy | Needed for wow moments (#1 Arrival, #5 News Ticker). | -| B1 | NPC Authoring Style Guide | copy | Reframed: this becomes the NPC generator specification. The style guide IS the generator input format. Most complex ticket — many blockers. | -| C2 | Create content/ directory skeleton | server | Schema must be 300-world compatible from day one. | -| C3 | Content schema definitions | server | Schemas become validation rules for generated content too. | -| C4-C8 | Enum, attribute, pool, template, triangle YAMLs | server | All survive. These ARE the v0.1 content in engine-readable format. | -| C9 | Implement make validate-content CLI | server | Validates hand-authored v0.1 AND future generated output. | -| C10 | Pre-commit FactId typo check | ci | Cheap safety net. Survives. | -| D2 | Seed configuration schema | server | Needed for v0.1 (even with 1-candidate pools). | - -### 1c. Tickets That Are Obsolete or Deferred - -| R2 ID | Title | Disposition | Rationale | -|-------|-------|-------------|-----------| -| A5 | Add Cultural Groups section to wiki/index.md | **Defer** (v0.2+) | Wiki index restructuring is cosmetic. Content itself matters more. | -| D1 | cultural_gate modifier design doc | **Defer** (v0.2+) | Not in v0.1 IN list. Cultural gating is a generator-era feature. | -| D3 | Secondary contraband variant FactId text | **Kill** | Explicitly OUT in v0.1 scope ("Secondary contraband variation" listed as v0.2+). | - -**Score: 26 survive, 1 deferred, 1 deferred, 1 killed = 26 actionable for v0.1.** - ---- - -## 2. Existing Ticket Updates - -These existing tickets need status changes based on workshop context: - -| ID | Title | Current Status | Action | -|----|-------|---------------|--------| -| #368 | Knowledge vocabulary for v0.1 content | in_progress (Sprint 2) | **Close when wiki review is accepted.** The wiki at `wiki/` is the output. Workshop is the review. | -| #369 | Wiki Review Workshop Outputs (epic) | backlog | **Repurpose** as parent epic for v0.1 content scoping tickets. Update description to reflect this workshop's scope. | -| #301 | Wiki taxonomy and structure | backlog | **Assign to copy team.** Downscope for v0.1: focus on Sova district structure only. Full 500+ world taxonomy is a generator-era concern. | -| #319 | Krenn System wiki entry | backlog | **Merge with A3.** Expanded scope: wiki page + seed.yaml reference implementation. Assign to copy. | -| #261 | Dual Lens Authoring Guide | backlog | **Still critical.** Workshop confirms it blocks all content authoring (#190, #191, #192, #297, #298, #299, #300). Assign to copy. Sprint 3 target. | -| #310 | Character voice speech patterns | backlog | **Overlaps with B4** (smuggler voice card). Merge or make B4 block #310. | -| #306 | News ticker / Meridian feed content | backlog | **Overlaps with D4.** D4 expands scope from 20-30 to 40-50 headlines. Update #306 description. | -| #326 | YAML content loader | backlog | **Assign to server.** Blocked by C1 + C2. Sprint 4 target (after content exists). | - ---- - -## 3. New Tickets Needed (Not in Round 2 List) - -The IN list and workshop topics reveal gaps not covered by the Round 2 tickets: - -| Proposed ID | Title | Type | Team | Priority | Description | Dependencies | -|-------------|-------|------|------|----------|-------------|--------------| -| NEW-1 | NPC pattern/motivation mapping for v0.1 | task | copy | high | Assign System A pattern + System B motivation to all 17 Sova NPCs. Output: mapping table in wiki. Informs all NPC content authoring and server component design. | None | -| NEW-2 | Drin tier promotion evaluation | task | copy | medium | Evaluate whether Drin should be promoted from Tier 3 to Tier 2. Drin participates in Triangle 2 and Triangle 5 and is compromised by Harek — Tier 2 work in a Tier 3 profile. If promoted, expand profile. | NEW-1 | -| NEW-3 | Wiki → YAML content conversion (Sova NPCs) | story | copy | high | Convert 17 NPC wiki profiles to engine-readable YAML in content/districts/sova-transit/npcs/. Must match schema from C3. First concrete content files. | C1, C2, C3 | -| NEW-4 | Monologue content pool — minimum viable set | story | copy | high | Author minimum monologue line pool to avoid repetition in a 30-minute session. Size TBD by Mellanie (Topic 4 answer), but estimate 80-120 lines covering: arrival observations, NPC routine commentary, environmental flavor, contradiction hints, idle reflections. Dual-lens (smuggler + detective variants). | #261, B4 | -| NEW-5 | v0.1 wow moment content checklist | task | copy | high | Map D-039's 6 wow moments to specific content deliverables. Track which tickets deliver which moments. Acceptance criteria: every wow moment has identified content backing it. | None | -| NEW-6 | PC-as-NPC content authoring (authored lines) | story | copy | high | Author the actual content for PC-as-NPC: 5-7 routine entries per character, 3-5 observation monologue lines per character when seeing the other PC, reverse dual-lens notes. ~20-30 authored items total. Distinct from B5 (spec) — this is the writing. | B3, B5 | -| NEW-7 | Interaction model minimum spec | story | copy | medium | Document the minimum interaction verbs for v0.1: walk, talk, observe, overhear. What triggers each? What UI does each need? What server events? Bridges Topic 4 into implementation tickets for server/client. | None (informed by workshop Topic 4 answers) | - ---- - -## 4. Sprint Assignment - -### Sprint 3 (Know) — Copy Team - -Sprint 3's goal: "Player can observe NPCs, track knowledge, interact." The server team needs content to load. Copy's Sprint 3 is the **content foundation sprint**. - -**Sprint 3 copy tickets (proposed):** - -| Priority | Ticket | Rationale | Blocked By | -|----------|--------|-----------|------------| -| P0 | A2: Hael → Naia Tamm rename | Unblocks all Naia content. Quick win. | — | -| P0 | A1: Apply canonical full names | Unblocks content conversion. Quick win. | — | -| P0 | A7: Smuggler entity attributes | Unblocks smuggler-lens content. | — | -| P0 | C1: Content directory structure design | Unblocks all content conversion. | — | -| P0 | #261: Dual Lens Authoring Guide | Blocks 9 downstream tickets. Critical path. | — | -| P1 | A10: Nils Davan stub | Unblocks A11. | — | -| P1 | A11: Triangle 1 fix | Needed for 5-triangle requirement. | A10 | -| P1 | B2: MIRROR pattern spec | Unblocks Naia content. Generator template. | — | -| P1 | B4: Smuggler voice + moral arc | Unblocks dual-lens authoring. Generator template. | A7 | -| P1 | NEW-1: NPC pattern/motivation mapping | Informs all NPC content + server components. | — | -| P1 | NEW-5: Wow moment content checklist | Tracking ticket. Ensures nothing falls through. | — | -| P2 | A8: Shortcode fix | Cleanup. Blocks monologue authoring quality. | — | -| P2 | B3: PC-as-NPC spec | Unblocks B5 and NEW-6. | A7 | -| P2 | NEW-7: Interaction model minimum spec | Bridges workshop into server/client tickets. | — | - -**Sprint 3 server tickets (content-related, proposed additions):** - -| Priority | Ticket | Rationale | Blocked By | -|----------|--------|-----------|------------| -| P1 | C2: Create content/ directory skeleton | Unblocks all YAML content files. | C1 | -| P1 | C3: Content schema definitions | Unblocks validation + content conversion. | C1 | - -### Sprint 4+ (later sprints) - -| Ticket | Team | Rationale for Deferral | -|--------|------|----------------------| -| A3/merged #319: Krenn brief + seed.yaml | copy | Needs A4 template first. Not blocking Sprint 3 content. | -| A4: Regional style guide / seed template | copy | Generator-era format. v0.1 can use wiki directly. | -| A6: Smuggler FactId progression text | copy | Blocked by B4. Sprint 4 if B4 completes Sprint 3. | -| A9: Thematic Question field | copy | Low priority authoring guidance. | -| A12: Environmental text examples | copy | Sprint 4. Needed for wow moment #1 but not blocking server. | -| B1: NPC Authoring Style Guide | copy | Most complex ticket with 5+ blockers. Sprint 4-5 assembly. | -| B5: PC NPC-format briefs | copy | Blocked by B3. Sprint 4. | -| NEW-3: Wiki → YAML conversion | copy | Blocked by C1, C2, C3. Sprint 4. | -| NEW-4: Monologue content pool | copy | Blocked by #261, B4. Sprint 4-5. | -| NEW-6: PC-as-NPC content authoring | copy | Blocked by B3, B5. Sprint 5. | -| C4-C8: Content YAML files | server | Blocked by C2. Sprint 4. | -| C9: validate-content CLI | server | Blocked by C3. Sprint 4. | -| C10: FactId pre-commit | ci | No blockers but low urgency. Sprint 4. | -| D2: Seed configuration schema | server | Sprint 4-5. Needed before game-start flow. | -| #326: YAML content loader | server | Blocked by C2. Sprint 4-5. | - ---- - -## 5. Dependency Chain — Critical Path - -``` -Sprint 3 Critical Path (Copy): - -#261 (Dual Lens Guide) ─────────────────────────────┐ - ├── blocks #297 (FRIEND: Kael) │ - ├── blocks #298 (FRIEND: Sera) │ - ├── blocks #299 (Opening hook: smuggler) │ - ├── blocks #300 (Opening hook: detective) │ - ├── blocks #310 (Voice speech patterns) │ - ├── blocks NEW-4 (Monologue pool) │ - └── blocks #190, #191, #192 (Content packs) │ - │ -A7 (Smuggler attributes) ──┬── blocks B4 (Voice+arc) │ - ├── blocks B3 (PC-as-NPC) │ - │ │ -B4 (Smuggler voice+arc) ──┼── blocks A6 (FactId text)│ - │ blocks NEW-4 │ - │ │ -B3 (PC-as-NPC spec) ──────┼── blocks B5 (PC briefs) │ - │ blocks NEW-6 (Content) │ - │ │ -C1 (Content dir design) ──┬── blocks C2 (skeleton) │ - ├── blocks C3 (schemas) │ - │ │ -C2 (skeleton) ────────────┼── blocks C4-C8 (YAMLs) │ - │ blocks NEW-3 (convert) │ - │ blocks #326 (loader) │ - │ │ -C3 (schemas) ─────────────┼── blocks C9 (validator) │ - │ blocks NEW-3 (convert) │ - │ -A10 (Nils stub) ──────────┼── blocks A11 (Triangle 1) │ - │ -B2 (MIRROR spec) ─────────┼── blocks A9 (Thematic Q) │ - │ blocks Naia authoring │ -``` - -**The two critical chains for Sprint 3 are:** - -1. **Content authoring chain:** #261 → B4 → A6 → content packs → monologue pool -2. **Content architecture chain:** C1 → C2/C3 → C4-C8/NEW-3 → #326 (loader) - -Both chains must begin in Sprint 3 even though they won't complete until Sprint 4-5. Sprint 3's job is to lay the foundation: get #261, C1, A7, and B2 done. - ---- - -## 6. IN List → Ticket Coverage Map - -| v0.1 IN List Item | Existing Tickets | New Tickets Needed | Status | -|-------------------|------------------|--------------------|--------| -| WASD movement + collision | Sprint 1-2 (done) | — | Covered | -| Context-sensitive interaction | #240 (Sprint 3) | NEW-7 (spec) | Partially covered — needs spec | -| Monologue system | #45, #119, #120, #122, #253 | NEW-4 (content pool) | Architecture covered, content gap | -| Knowledge graph | #351, #368, #309 | — | Covered | -| 2 playable characters | #57, #180, #182 | — | Covered (architecture) | -| THE FRIEND arc (Kael, Sera) | #297, #298 (blocked by #261) | — | Covered but blocked | -| 5 triangles with forks | #42, #106, #188, #250 | A11 (Triangle 1 fix), C8 (YAML) | Partially covered — weak Triangle 1 | -| 6 wow moments (D-039) | No dedicated tickets | NEW-5 (checklist) | Gap — needs tracking ticket | -| 3 social sites | #54, #190, #191, #192 | C7 (YAML templates) | Covered but blocked by #261 | -| NPC routines | #88, #101 (Sprint 3) | — | Covered (server) | -| Dual-lens parity | #261 | A7, B4, A6 | Major gap — smuggler lens incomplete | -| PC-as-NPC | — | B3, B5, NEW-6 | Gap — no tickets exist yet | -| Content directory | #326 (loader only) | C1, C2, C3 | Gap — structure undefined | -| Content validation | — | C9, C10 | Gap — no validation exists | - ---- - -## 7. Summary - -**Round 2 list scorecard:** 26 of 29 tickets survive (1 killed: D3 secondary contraband; 2 deferred: A5 wiki index, D1 cultural_gate). - -**New tickets proposed:** 7 (NEW-1 through NEW-7). - -**Sprint 3 copy team:** 14 tickets proposed. Critical path starts with #261 (Dual Lens Guide) and C1 (Content directory design). - -**Biggest risk:** #261 is the single biggest blocker in the entire content pipeline. It blocks 9 tickets directly and cascades into everything. If it slips, Sprint 4-5 content authoring is delayed. Recommend it gets assigned immediately with Paula as owner. - -**Action items for Round 2:** -1. Other agents answer Topics 1-5 — their answers refine NEW-1 (pattern mapping), NEW-4 (pool size), NEW-7 (interaction minimum) -2. Lead approves ticket list -3. SI creates tickets -4. Qatux documents scope decisions - ---- - -*Compiled by SI. Source: Round 2 ticket list, current ticket database (369 tickets), workshop brief, decisions/scope.md (D-027, D-039).* diff --git a/docs/workshops/v01-content-scoping/round1-stig.md b/docs/workshops/v01-content-scoping/round1-stig.md deleted file mode 100644 index 111af7485..000000000 --- a/docs/workshops/v01-content-scoping/round1-stig.md +++ /dev/null @@ -1,373 +0,0 @@ -# Round 1 Response: Stig (UI Developer) -## v0.1 Content Scoping Workshop - ---- - -## Topic 3: What Does the Client Need from Content Files? - -The client is a renderer. It doesn't decide what happens — the server does. So the client's content needs are narrow: display strings, visual parameters, and layout hints. Everything else stays server-side. - -### What the client loads directly - -| Data | Format | Why | -|------|--------|-----| -| **NPC display names** | `display_name: "Kael Davan"` | Name label above entity rectangle. Must be the name the *player character* knows — "Dock Worker" before identification, "Kael Davan" after. Server sends the current display name per entity via state update, not the content file. | -| **Location display names** | `display_name: "The Terminal"` | HUD location indicator, minimap labels. Short names only — "The Terminal", not "Sova Transit Logistics Hub, Bay 7-C". | -| **Monologue text** | `text: "Morning shift. Recycled air..."` | Rendered by the monologue display system. The server selects the line; the client receives the `id` + `text`. Client doesn't evaluate prerequisites. | -| **Dialogue text** | `text: "Container 4471 sat in temp..."` | Rendered in the dialogue panel. Server selects, client displays. | -| **Entity color palette** | `relationship_colors` map in a client config | D-033 palette. Client derives color from `RelationshipState` sent by server. Not per-NPC content. | -| **Time of day** | Phase enum: `morning`, `afternoon`, `evening`, `night` | HUD clock display. Server sends current phase. Client renders as text and ambient lighting tint. | - -### What the client does NOT need - -- NPC profiles, axes, secrets, triangle definitions — server-only -- FactId catalog, prerequisite maps — server-only evaluation -- Access tiers, trust levels — server filters before sending to client -- NPC routines/schedules — server simulates, client receives position updates -- Knowledge graph state — server tracks, sends display-relevant slices - -### Format recommendation - -Client content should be a thin layer. I don't need to parse the full wiki YAML. What I need is: - -```yaml -# content/client/strings.yaml -locations: - terminal: - display_name: "The Terminal" - short_name: "Terminal" - minimap_label: "T" - bar: - display_name: "The Last Shift" - short_name: "Last Shift" - minimap_label: "LS" - corridor: - display_name: "Corridor B-7" - short_name: "B-7" - minimap_label: "B7" - -hud: - time_phases: - morning: "Morning Shift" - afternoon: "Afternoon" - evening: "Evening" - night: "Night Cycle" -``` - -Monologue and dialogue text can arrive as part of the server state update — `{type: "monologue", id: "terminal_m_001", text: "Morning shift..."}`. The client doesn't need the full YAML pools on disk. Server selects, client renders. This keeps the client thin and prevents any information leakage (the client literally cannot show what it doesn't have). - -**Bottom line:** The client needs display strings + the server's state stream. It should never have access to content it shouldn't be rendering. Every pixel of information passes through the server's information boundary first. - ---- - -## Topic 4: UI Elements for the Minimum Interaction Model - -I'll walk through each element: what it looks like, where it sits, how the player reaches it. - -### 4.1 The Screen Layout (Overview) - -``` -+------------------------------------------------------------------+ -| | -| | -| | -| GAME WORLD | -| (full viewport) | -| | -| | -| | -| [MONOLOGUE] | -| bottom-left, 1-2 lines | -| | -| [INTERACTION PROMPT] | -| near-player, contextual | -| | -+------------------------------------------------------------------+ -| LOCATION | TIME | | [MINIMAP] | -| The Terminal| Morning | | (insert) | -| | | | | -+------------------------------------------------------------------+ -``` - -The game world fills the viewport. UI elements float over it, positioned to stay out of the player's sightline toward the center of the screen where the action is. - -**Core principle: the center is sacred.** Nothing permanent lives in the center third of the screen. That's where the character is, where NPCs are, where the player looks. UI lives at the edges and appears only when relevant. - -### 4.2 Interaction Prompt - -**What it is:** A single-action context label that appears when the player is close enough to interact with something. - -**Position:** Offset from the target entity, above and slightly right. Tracks the entity position in world space (not screen-fixed). Small — 12-14px equivalent at reference resolution. - -**Appearance:** -``` - [Talk] <- NPC within interaction range - Kael Davan <- entity name (if known) - [====] <- entity rectangle -``` - -Or for objects: -``` - [Examine] - Manifest Terminal - [====] -``` - -**Behavior:** -- **Appears** when player enters interaction radius (~1.5 tiles) AND has line of sight -- **Disappears** when player moves away or breaks LOS -- **Changes based on context:** The same NPC shows "Talk" normally, "Ask about..." after contradiction discovery, or nothing if no interaction is available -- **Single action.** No menus. No radial wheels. The server decides what the primary interaction is based on entity state + player knowledge. The prompt shows ONE thing. Press [E] or [Space] to do it. -- If multiple interactions are available, the prompt shows the most relevant one. The player gets a *decision* about whether to interact, not a *menu* of options. - -**Why single-action:** Too many clicks. A radial menu means the player stops, reads, selects, then engages. A single prompt means: approach, press, you're in. The game should feel like walking into a conversation, not operating a database. - -**Edge case — multiple valid actions:** If the player needs to choose between "Talk" and "Examine" on the same entity, the prompt changes based on proximity angle or a simple toggle (tap [E] = primary, hold [E] = secondary). But for v0.1, I'd argue: default to "Talk" for NPCs, "Examine" for objects, and handle the edge cases when they arise. - -### 4.3 Dialogue Display - -**What it is:** How conversation text appears once the player initiates dialogue. - -**Position:** Bottom-center of the screen, overlaying the game world. The world stays visible behind it — the player can still see NPCs moving, can still read the room. - -**Layout:** -``` -+------------------------------------------------------------------+ -| | -| GAME WORLD | -| (still visible, slightly dimmed) | -| | -| | -+------------------------------------------------------------------+ -| | -| KAEL DAVAN | -| "Container 4471 sat in temp storage overnight. | -| Scheduling backed up again." | -| | -| > [Continue] [End conversation] | -| | -+------------------------------------------------------------------+ -``` - -**Specifications:** -- **Width:** ~60% of screen width, centered horizontally -- **Height:** Variable, 3-5 lines maximum. If the line is longer, it scrolls on input -- **Background:** Semi-transparent dark panel (80% opacity). Not opaque — the world behind bleeds through. The conversation is happening IN the world, not in a separate screen -- **Speaker name:** Top-left of the panel, in the entity's relationship color (D-033). Teal if unknown, green if friendly, amber if person of interest -- **Text:** Off-white, clean sans-serif, left-aligned. One NPC line at a time -- **Advance:** [Space] or [E] advances to next line. No auto-advance — the player controls the pace -- **Exit:** [Escape] or [Q] ends conversation at any point. The NPC reacts (server determines reaction based on conversation progress) - -**What this is NOT:** -- No branching dialogue trees visible on screen. The server determines what the NPC says next based on access tier, trust, and state. The player experiences a conversation, not a menu -- No portraits. Top-down game — we see the entities. A portrait would be a second representation that contradicts the top-down perspective -- No response selection in v0.1. The conversation flows. The player's choices are: continue, leave, or (post-discovery) confront. Confrontation is a separate interaction prompt, not a dialogue option - -### 4.4 Monologue Display - -**What it is:** The player character's internal voice. Text that represents what the character thinks, notices, feels. - -**Position:** Bottom-left of the viewport, above the HUD bar. Offset from the dialogue panel position so they never overlap. - -**Layout:** -``` -+------------------------------------------------------------------+ -| | -| GAME WORLD | -| | -| | -| | -| | -| +-----------------------------------------+ | -| | Kael's here. Good -- I was starting | | -| | to worry. | | -| +-----------------------------------------+ | -| | -+------------------------------------------------------------------+ -``` - -**Specifications:** -- **Width:** ~40% of screen width, anchored left -- **Height:** 1-2 lines. Monologue is brief (authoring guide says "one breath") -- **Background:** Minimal. A subtle text shadow or very faint panel (20-30% opacity). The monologue should feel like it's floating in the character's head, not displayed in a UI box -- **Text color:** Character-specific tint. Detective: cool blue-white `#c8d8f0`. Smuggler: warm amber-white `#f0e0c8`. Subtle — not a spotlight, just a whisper of character identity -- **Animation:** Fades in over 0.3s, holds for 4-6 seconds (adjusted by text length), fades out over 0.5s. Does not stack — a new monologue replaces the current one. If the old one hasn't finished, it fades faster (0.15s) before the new one appears -- **Audio cue:** Soft chime on appearance (D-038: `sfx_monologue_chime.ogg`). Sharper variant for anomaly observations (`sfx_monologue_chime_urgent.ogg`) -- **During dialogue:** Monologue can appear DURING a conversation (post_conversation trigger fires after exchange, but observe_anomaly can fire mid-conversation if the player spots something while talking). When dialogue panel is active, monologue shifts up slightly to sit above the dialogue panel, maintaining the same left-anchored position - -**Critical rule: monologue must not compete with dialogue.** They occupy different screen regions (left vs. center), use different visual treatments (floating vs. paneled), and serve different functions (character's inner voice vs. NPC's spoken words). If both are on screen simultaneously, the player reads dialogue first (center, larger, solid panel) and catches monologue peripherally (left, smaller, ghostly). This mirrors how internal reactions work — you hear the other person speaking while your own thought forms underneath. - -### 4.5 Knowledge Panel (Neural Lattice Interface) - -**What it is:** The player's diegetic notebook. A neural lattice overlay that shows what the character knows — people, facts, relationships. - -**Diegetic framing:** This isn't a game journal. It's the character checking their implant's records. The detective's Analytical lattice organizes information automatically. The smuggler's Baseline lattice shows simpler records — people they know, places they've been. - -**Access:** Press [Tab] to toggle. Pauses the game (or slows to near-pause — design decision for Gestalt). The lattice overlay slides in from the right side of the screen. - -**Layout:** -``` -+------------------------------------------------------------------+ -| | -| GAME WORLD | LATTICE OVERLAY | -| (visible, | | -| dimmed) | PEOPLE [tab] | -| | Kael Davan [green] | -| | Sera Venn [green] | -| | Voss [teal] | -| | "Dock Worker" [teal] | -| | | -| | PLACES | -| | The Terminal | -| | The Last Shift | -| | | -| | OBSERVATIONS | -| | "Manifest discrepancy | -| | — Container 4471" | -| | | -+------------------------------------------------------------------+ -``` - -**Specifications:** -- **Width:** ~30% of screen width, anchored right -- **Sections:** People / Places / Observations. Simple tabs or vertical scroll -- **People entries:** Display name + relationship color dot. Click/select for detail: known attributes, last seen location, relationship state -- **Places:** Location names discovered so far. Click for minimap highlight -- **Observations:** Key facts in plain language. These are the FactIds rendered as human-readable sentences. "Manifest discrepancy observed at Terminal" not "`investigation.manifest_discrepancy: Suspects`" -- **Visual treatment:** Dark panel with a subtle scan-line effect or faint grid overlay — this is a lattice interface, not a paper notebook. The diegetic feel comes from the typography and visual treatment, not from elaborate 3D renders -- **Character-specific:** The detective's lattice shows more analytical structure (observations auto-categorized, flagged items highlighted in amber). The smuggler's lattice is simpler — people and places, fewer analytical overlays -- **Empty state:** At game start, the lattice is sparse. Detective has a few case-file entries. Smuggler knows people but has no "observations" section initially. The lattice fills as the player discovers things - -### 4.6 HUD Elements - -**What's always visible:** - -``` -+------------------------------------------------------------------+ -| | -| GAME WORLD | -| | -+------------------------------------------------------------------+ -| The Terminal | Morning Shift | +----------+ | -| | | | MINIMAP | | -| | | | (D-013)| | -+------------------------------------------------------------------+ -``` - -**Location name:** Bottom-left corner of the HUD bar. Shows current area. Updates on zone transition with a brief fade. - -**Time of day:** Next to location. Shows the current phase in plain language ("Morning Shift", "Evening", "Night Cycle"). Updates on phase transition. No clock numbers — the character doesn't check the time, they feel the shift rhythm. - -**Minimap (insert):** Bottom-right corner. Small — 120x120px at reference resolution. Shows: -- Player position (character-color dot, D-033) -- Known NPC positions within close range (relationship-colored dots) -- Location boundaries (thin lines, muted) -- POI markers for discovered locations (small icons) -- Fog — areas not yet discovered are dark - -The minimap IS the neural lattice navigation overlay (D-013). It should look like a technology interface, not a game map. Subtle grid lines, faint glow at the edges, no terrain texturing. Information appears on it only as the character learns it. - -**What's NOT always visible:** -- Character name — the player knows who they are. Don't waste pixels reminding them -- Health/status bars — no health system in v0.1 -- Inventory indicators — no inventory in v0.1 (knowledge-based, per Gestalt's direction) -- Quest markers — this is not that kind of game -- Mini-objectives — the player decides what to do - -### 4.7 News Ticker - -The Meridian news feed in The Last Shift. This is a diegetic element — it exists in the world, on the bar's display screen. - -**Implementation:** A world-space text object attached to the bar's display entity. Scrolling text, left-to-right, station news headlines. The player reads it by standing near the display, not through a HUD overlay. - -**Why world-space:** D-039 Wow Moment #5 requires the same ticker to produce different monologue reactions per character. If the ticker were a HUD element, it would feel like a notification system. In world space, it's a thing in the bar that you walk over to and read. The monologue fires because your character is looking at it, not because the UI decided to inform you. - ---- - -## Topic 5: Minimum UI for a 30-Minute Vertical Slice - -### Must be polished (player-facing, first impression) - -| Element | Why polished | Effort level | -|---------|-------------|-------------| -| **Monologue display** | This IS the game's voice. If monologue feels janky, the character feels dead. Smooth fade, correct timing, readable text, audio chime sync. | Medium — text rendering + animation + audio trigger | -| **Interaction prompt** | First thing the player tries. Walk to NPC, see "Talk", press key, it works. If this is clunky, the game feels broken. | Low — context label + input handler | -| **Dialogue panel** | Second thing the player tries. Text must be readable, pacing must feel natural, exit must work cleanly. | Medium — text display + input flow + state management | -| **Entity relationship colors** | D-033. The color palette tells the player who matters before any text appears. Green = safe, amber = something changed. THE FRIEND's color shift (green to amber) is Wow Moment #3. | Low — shader/tint parameter driven by server state | -| **Fog of perception** | D-011. If the player can see everything, there's no game. LOS shadowcasting must work. | High — but this is Dudley/Tyre territory, not UI | - -### Can be placeholder (functional, not pretty) - -| Element | Why placeholder is OK | Placeholder spec | -|---------|----------------------|-----------------| -| **Minimap** | Players will use it but don't expect polish in a vertical slice. A dot on a dark rectangle is sufficient. | Player dot + area boundary lines. No labels, no icons. | -| **HUD bar** | Location name + time phase in plain text, no styling. | Left-aligned text, default font, dark background strip. | -| **Knowledge panel** | Players may not even find it in 30 minutes. But it must exist for the detective's analytical loop. | Plain text list on a dark overlay. No scan-line effects, no diegetic styling. Functional data display. | -| **News ticker** | D-039 Wow Moment #5 needs it, but the ticker itself can be simple scrolling text. The wow is in the monologue reaction, not the ticker's visual polish. | Scrolling text on a world-space panel. Monospace font. Functional. | - -### Can be deferred entirely (v0.2+) - -| Element | Why defer | -|---------|----------| -| **Perception mode overlays** | D-017: only natural vision in v0.1. No thermal, no camera feeds, no tracking. | -| **Inventory UI** | No inventory system in v0.1. Knowledge-based interaction. | -| **Character selection screen** | v0.1 can start with a character toggle or separate launch configs. No menu needed. | -| **Settings/options menu** | Dev builds. Hardcode resolution, keybindings. | -| **Tutorial/onboarding** | Monologue IS the tutorial (D-016: "That terminal might have access logs"). No separate tutorial UI. | -| **Map zoom/pan** | Camera locked (D-015). No map interaction beyond the minimap. | - -### The 30-minute visual journey - -Here's what the player actually sees, minute by minute: - -**Minute 0-1 (Arrival):** Black screen fades in. Station ambient plays. The game world appears, character in the center, fog surrounding them. First monologue fades in at bottom-left: "Morning shift. Recycled air and cargo lubricant." Chime sounds. HUD bar shows "The Terminal | Morning Shift". Minimap shows a small illuminated area around the player. - -**Minute 1-5 (Exploration):** Player moves with WASD. Fog recedes as they explore. NPC rectangles appear in the viewport — colored dots. Walking near an NPC shows their display name and [Talk] prompt. First dialogue: the panel slides up from the bottom, semi-transparent, NPC name in relationship color. Text advances on input. Conversation ends, panel slides down. Monologue fires: "Kael's here. Good." - -**Minute 5-15 (The Character's Eye):** Monologue fires unprompted with the urgent chime — the character noticed something the player didn't. The text is different: sharper, the urgent variant. "Dock worker Davan -- lattice activity spiked." The player hasn't done anything — the game is teaching them that their character has a mind. - -**Minute 15-20 (Building routine):** Player moves between Terminal and Bar. Location name transitions on the HUD. The bar is warmer (amber lighting tint). Minimap updates with new area. Monologue at bar entry: different tone, different character voice. Dialogue with Sera Venn — the panel text feels different from Kael's. Same UI, different voice. - -**Minute 20-25 (THE FRIEND's contradiction):** Kael's entity color shifts — green to amber. 0.5s fade per D-033. This is silent, visual. No fanfare. The urgent monologue chime fires. "Kael? By the service hatch? And that's -- I don't know them." If the player presses [Tab], the knowledge panel now shows Kael as "Person of Interest" with an observation entry. - -**Minute 25-30 (The quiet moment):** Player standing still in a corridor. After idle time, monologue fades in without chime. Reflective. Quiet. "No Meridian signal down here. No eyes, no ears." The game breathes. The UI is invisible. The world is present. - -### Summary: v0.1 UI bill of materials - -| System | Files/Scenes | Priority | -|--------|-------------|----------| -| Monologue renderer | 1 scene + 1 script | P0 (must ship) | -| Interaction prompt | 1 scene + 1 script | P0 | -| Dialogue panel | 1 scene + 1 script | P0 | -| Entity color system | Shader + config | P0 | -| HUD bar (location + time) | 1 scene + 1 script | P1 (placeholder OK) | -| Minimap | 1 scene + 1 script | P1 | -| Knowledge panel | 1 scene + 1 script | P1 | -| News ticker (world-space) | 1 scene + 1 script | P1 | -| Fog rendering | Shader + integration | P0 (shared with server team) | - -Total: ~9 scenes, ~9 scripts, 2 shaders. This is a tight UI. Every element earns its pixel. - ---- - -## Open Questions for Other Participants - -**For Dudley (server):** -- What does the state update message look like? I need: entity positions, display names, relationship states, monologue triggers (id + text), dialogue lines (id + text + speaker), time phase, location zone ID. What's the IPC message format? -- Does the server send the full text of monologue/dialogue lines, or just IDs that the client looks up locally? I prefer full text in the message (keeps client thin, prevents info leakage), but there's a bandwidth trade. - -**For Gestalt (systems):** -- Does opening the knowledge panel pause the game? Semi-pause? If NPCs keep moving while you read, you miss things. If the game pauses, it breaks immersion. I lean toward semi-pause (simulation runs at 10% speed). -- Single-action interaction prompt: does this work for the systems design? Or does the player need to choose between "Talk" and "Observe" on the same NPC? - -**For Mellanie (copy):** -- Maximum monologue line length? I'm designing for 1-2 lines of display text (~80 characters per line, ~160 max). Is that enough for the voice? -- How many monologue lines can fire in sequence before it feels like a wall of text? I'd say 1 at a time with 2-3 second gaps minimum. - -**For Araminta (visual):** -- Diegetic styling for the knowledge panel — how far do we push the "lattice interface" look in v0.1? My instinct: minimal. Faint grid, slightly blue-shifted palette, clean type. Save the fancy scan-line effects for when we have art budget. -- Monologue text color per character — I proposed detective blue-white and smuggler amber-white. Does this conflict with the entity color palette (D-033)? - ---- - -*The player's eye goes to the center. Everything else stays out of the way until it's needed. Then it appears, does its job, and vanishes.* diff --git a/docs/workshops/v01-content-scoping/round1-tracking.md b/docs/workshops/v01-content-scoping/round1-tracking.md deleted file mode 100644 index 5bf05cedc..000000000 --- a/docs/workshops/v01-content-scoping/round1-tracking.md +++ /dev/null @@ -1,491 +0,0 @@ -# Round 1 Tracking — Qatux (Documenter) -## v0.1 Content Scoping Workshop - -**Status:** All 7 responses received (Gestalt, Paula, Tyre, Mellanie, Stig, Dudley, SI). Round 1 complete. -**Date:** 2026-02-12 - ---- - -## 1. Agreements (Consensus Items) - -These items have clear consensus across respondents and could be decided immediately: - -| # | Item | Supporters | Status | -|---|------|-----------|--------| -| A-01 | **Drin promoted to Tier 2** | Gestalt (unambiguous yes), Paula (full Tier 2 profile drafted), Mellanie (implicitly — budgets Drin as Tier 2) | Ready to decide | -| A-02 | **THE NOBODY mechanic deferred to v0.2; data ships in v0.1** | Gestalt (explicit: ship data, defer mechanic), Dudley (NobodyState deferred per brief) | Ready to decide | -| A-03 | **YAML as content format** (with dissent — see D-01) | Tyre (detailed rationale), Stig (accepts server-sent text), Mellanie (needs author-readable format) | Needs resolution with Dudley | -| A-04 | **7-interaction minimum** (Move, Look, Monologue, Examine Object, Examine NPC, Talk, Overhear) | Gestalt (designed it), Stig (UI for each), Dudley (server events for each) | Ready to decide | -| A-05 | **~200 monologue lines total** (~100 per character) | Mellanie (80-110 per character, detailed math), Gestalt (implicitly validates via wow moment mapping) | Ready to decide | -| A-06 | **~695 total authored content items for v0.1** | Mellanie (200 monologue + 350 dialogue + 50 environmental + 20 ticker + 50 UI + 25 PC-as-NPC) | Needs validation from others | -| A-07 | **5 triangles: 3 active forks, 2 passive tensions** | Gestalt (explicit table: T1/T2/T4 active, T3/T5 passive), Paula (aligns with triangle fork detail) | Ready to decide | -| A-08 | **Naia Tamm needs MIRROR-specific voice samples** | Mellanie (5 samples written), Paula (naming cascade planned) | Ready to decide | -| A-09 | **Content directory: `global/` + `districts/` top-level split** | Tyre (detailed tree), Dudley (load sequence matches), Gestalt (aligns with Wiki Review consensus) | Ready to decide | -| A-10 | **Dialogue files by location + role, not by NPC** | Tyre (explicit design choice, per D-035) | Needs validation from Dudley, Gestalt | -| A-11 | **THE FRIEND arc is the critical path for v0.1** | Tyre (Tier 4 risk, "everything converges on wow moment #3"), Dudley (FriendArc is the sole pattern-specific component), Gestalt (maps all wow moments to FRIEND), Mellanie (writes FRIEND content first) | Consensus | -| A-12 | **Client receives text from server, doesn't load content files directly** | Stig (explicit: "server selects, client renders"), Dudley (server authoritative over dialogue/monologue selection), Tyre (aligns with D-010 information boundary) | Ready to decide | -| A-13 | **Single-action interaction prompt (no radial menus)** | Stig (explicit: "single prompt, press E"), Gestalt (context-sensitive prompt table) | Ready to decide | -| A-14 | **PC-as-NPC required for v0.1** | Gestalt (missing from IN list, adds it), Paula (Gap 1: profiles missing, must be authored), Mellanie (budgets ~25 items) | Ready to decide | -| A-15 | **News ticker required for v0.1** | Gestalt (missing from IN list, wow moment #5), Stig (world-space implementation), Mellanie (budgets ~20 items) | Ready to decide | -| A-16 | **Time progression required for v0.1** | Gestalt (missing from IN list, dependency for routines), Dudley (DayPhase already exists), Stig (HUD display designed) | Ready to decide | -| A-17 | **Self-contained triangle forks for v0.1 (no cross-triangle cascade)** | Tyre (explicit scope control recommendation, "strongly recommend self-contained") | Needs validation from Gestalt | - ---- - -## 2. Disagreements (Require Resolution) - -### D-01: Content File Format — YAML vs. RON - -| Position | Advocate | Argument | -|----------|----------|----------| -| **YAML** | Tyre | Author readability, native multi-line text, JSON Schema validation, any language can emit it, 1.5ms parse difference irrelevant | -| **RON** | Dudley | Structured + typed data, all examples in RON format, mentions "Tyre's call on format" suggesting deference but preference for RON | - -**Impact:** Affects every content file, loader implementation, validation pipeline, generator output format. -**Note:** Dudley writes "Tyre's call on format" in his response, which suggests he'll defer. But his manifest example uses `content/manifest.ron` and all NPC profile examples are in RON. The two proposals need reconciliation before implementation. - -### D-02: NPC Pattern/Motivation Mapping — 10 of 17 NPCs Disagree - -This is the largest disagreement in Round 1. Gestalt and Paula independently mapped all 17 NPCs. They agree on 7 and disagree on 10. - -#### Full Comparison Table - -| # | NPC | Tier | Gestalt Pattern | Paula Pattern | Match? | Gestalt Motivation | Paula Motivation | Match? | -|---|-----|------|----------------|--------------|--------|-------------------|-----------------|--------| -| 1 | Kael Davan | T1 | FRIEND | FRIEND | YES | OPERATOR | OPERATOR | YES | -| 2 | Sera Venn | T1 | FRIEND | FRIEND | YES | WITNESS | WITNESS | YES | -| 3 | Naia Tamm | T1* | MIRROR | MIRROR | YES | CIVILIAN | CIVILIAN | YES | -| 4 | Voss | T2 | SYSTEM | SYSTEM | YES | **OPERATOR** | **HANDLER** | **NO** | -| 5 | Lera Sessik | T2 | ANCHOR | ANCHOR | YES | OPERATOR | OPERATOR | YES | -| 6 | Torek Lintar | T2 | CATALYST | CATALYST | YES | CIVILIAN | CIVILIAN | YES | -| 7 | Devra | T2 | THRESHOLD | THRESHOLD | YES | **HANDLER** | **OPERATOR** | **NO** | -| 8 | Maret Korr | T2 | **SYSTEM** | **WITNESS** | **NO** | **WITNESS** | **SKEPTIC** | **NO** | -| 9 | Resha | T2 | CATALYST | CATALYST | YES | **SKEPTIC** | **CIVILIAN** | **NO** | -| 10 | Renn | T2 | THRESHOLD | THRESHOLD | YES | OPERATOR | OPERATOR | YES | -| 11 | Pell | T2 | CATALYST | CATALYST | YES | TURNCOAT | TURNCOAT | YES | -| 12 | Harek | T2 | **GHOST** | **ANCHOR** | **NO** | HANDLER | HANDLER | YES | -| 13 | Drin | T2 (promoted) | **REMNANT** | **SYSTEM** | **NO** | TURNCOAT | TURNCOAT | YES | -| 14 | Sess | T3 | **ANCHOR** | **NOBODY** | **NO** | CIVILIAN | CIVILIAN | YES | -| 15 | Olin | T3 | CATALYST | CATALYST | YES | **SKEPTIC** (dual) | **CIVILIAN** | **NO** | -| 16 | Sabel | T3 | **THRESHOLD** | **GHOST** | **NO** | OPERATOR | OPERATOR | YES | -| 17 | Tav | T3 | **SYSTEM** | **NOBODY** | **NO** | **CIVILIAN** | **OPERATOR** | **NO** | - -**Summary:** 7 full agreements, 4 pattern-only disagreements, 2 motivation-only disagreements, 4 both-disagree cases. - -#### Analysis of Each Disagreement - -| NPC | Disagreement | Gestalt's Reasoning | Paula's Reasoning | Assessment | -|-----|-------------|--------------------|--------------------|------------| -| **Voss** (motivation) | OPERATOR vs HANDLER | "Running the schedule that enables smuggling" | "Manages operations, applies scheduling pressure" | Both defensible. Gestalt sees Voss as OPERATING the system; Paula sees Voss as HANDLING people through scheduling authority. Voss arguably does both. | -| **Devra** (motivation) | HANDLER vs OPERATOR | "Managing operations from above" = HANDLER | "Running the external coordination" = OPERATOR | Swapped vs Voss. Gestalt sees Devra as a handler (pressure from above), Paula sees Devra as running things (operational). | -| **Maret** (both) | SYSTEM+WITNESS vs WITNESS+SKEPTIC | "Institutional scheduler... saw discrepancies" | "Accidentally witnessed discrepancies... doubts the system" | Core question: is Maret primarily a SYSTEM embodiment (institutional role) or a WITNESS (defined by what she saw)? Motivation: does she WITNESS (passive) or SKEPTIC (active questioning)? | -| **Resha** (motivation) | SKEPTIC vs CIVILIAN | "Doubts the 'mind your business' culture" | "Not suspicious — just curious" | Key difference: Gestalt interprets Resha's questions as genuine skepticism; Paula interprets them as innocent curiosity (CIVILIAN). | -| **Harek** (pattern) | GHOST vs ANCHOR | "Shapes events through debt leverage, not direct membership" | "Embodies complacent contentment — but unconsciously creates tools" | Gestalt sees Harek's indirect influence as GHOST-like; Paula sees Harek's comfortable contentment as ANCHOR-like. Both are valid reads of different aspects. | -| **Drin** (pattern) | REMNANT vs SYSTEM | "Remembers when the job was just a job" | "The dock inspector IS the inspection system" | Gestalt foregrounds Drin's nostalgia; Paula foregrounds Drin's institutional role. SYSTEM seems mechanically stronger (his compromise corrupts the system). | -| **Sess** (pattern) | ANCHOR vs NOBODY | "Quiet contentment behind the bar" | "Social wallpaper... background that could become foreground" | Gestalt sees Sess as genuinely content (ANCHOR at T3); Paula sees Sess as currently invisible (NOBODY). Depends on whether ANCHOR can be T3. | -| **Olin** (motivation) | SKEPTIC (dual) vs CIVILIAN | "Asks questions with ambiguous intent" = SKEPTIC | "Uninvolved (as far as anyone knows)" = CIVILIAN | Gestalt gives Olin dual motivation (ambiguity IS the character). Paula keeps it simpler. | -| **Sabel** (pattern) | THRESHOLD vs GHOST | "Off-station gatekeeper of supply chain" | "Absent power — off-station, never fully present" | Gestalt sees Sabel as a gatekeeper (THRESHOLD); Paula sees Sabel as absent power (GHOST). Both are right about different functions. | -| **Tav** (both) | SYSTEM+CIVILIAN vs NOBODY+OPERATOR | "Ring lookout following procedure... lowest rung" | "Peripheral, barely visible... running lookout operations" | Gestalt sees a system functionary; Paula sees a background figure doing a job. | - -**Resolution path:** These disagreements reflect genuinely different analytical lenses. Gestalt maps from *mechanical function* (what does this NPC do in the system?). Paula maps from *narrative weight* (what does this NPC mean to the story?). Round 2 should produce a single canonical mapping with explicit rationale per NPC. - -### D-03: Smuggler EntityKnowledge Keys — 4 New vs 8 New - -| Position | Advocate | Keys | -|----------|----------|------| -| **4 new keys** (+ 2 existing repurposed, + 2 deferred) | Gestalt | New: `exposure_risk`, `loyalty_assessment`, `cover_integrity`, `moral_weight`. Repurposed: `trust_level` → `trust_read`, `secret_held` → `leverage_held`. Deferred: `social_debt`, `loyalty_conflict`. | -| **8 new keys** (all as new additions) | Paula | All 8 as separate new keys: `trust_read`, `exposure_risk`, `loyalty_assessment`, `leverage_held`, `social_debt`, `moral_weight`, `cover_integrity`, `loyalty_conflict` | - -**Key difference:** Gestalt argues `trust_read` and `leverage_held` already exist as `trust_level` and `secret_held` with per-character interpretation. Paula treats them as distinct keys. Gestalt also defers `social_debt` (no time for favor economy in 30min) and `loyalty_conflict` (inferable from existing keys). - -**Impact:** Affects knowledge graph schema, smuggler monologue prerequisite vocabulary, content authoring complexity. - -### D-04: Examine NPC vs Talk — Separate or Combined? - -| Position | Advocate | Argument | -|----------|----------|----------| -| **Separate interactions** (E to Examine, F to Talk) | Gestalt | Detective loop: examine first → talk later. Smuggler loop: talk first → examine when suspicious. Collapsing them breaks both loops. | -| **Single primary action** (context determines) | Stig | "Default to Talk for NPCs, Examine for objects, handle edge cases when they arise." Asks Gestalt to confirm. | - -**Impact:** Directly affects UI design, keybinding, server interaction pipeline. -**Note:** Not a strong disagreement — Stig asks the question, Gestalt has a firm answer. Needs explicit decision. - -### D-05: Knowledge Panel Pause Behavior - -Stig asks: "Does opening the knowledge panel pause the game? Semi-pause?" -- Stig leans toward semi-pause (10% simulation speed) -- No response from Gestalt yet in this round - ---- - -## 3. Open Questions (From Respondents) - -### From Gestalt -- Q: Should triangle forks cascade across triangles in v0.1? (Tyre says no — self-contained) - -### From Paula -- Q: Other wiki gaps? (She identified 7 additional gaps beyond the brief's list — see section 7) -- Q: Harek's structural role — formalize as triangle member or "external pressure node"? - -### From Tyre -- Q: Protocol evolution v2 → v3 — sign-off needed for new ObserverSnapshot fields -- Q: Line previewer CLI — when to build? (Early, per his recommendation) - -### From Mellanie -- Q: Confirm monologue guide examples as canonical PC voice registers? (Blocks all monologue authoring) -- Q: Maximum monologue line length? (She needs char limits from Stig — Stig proposes ~160 chars/2 lines) -- Q: Smuggler internal voice register — how terse? How operational? -- Q: Detective internal voice register — how clinical? How institutional? - -### From Stig -- Q: IPC message format for state updates? (For Dudley) -- Q: Server sends full text or line IDs? (Stig prefers full text — keeps client thin) -- Q: Lattice panel diegetic styling — how far in v0.1? (For Araminta) -- Q: Monologue text colors per character — conflict with D-033 entity palette? (For Araminta) - -### From Dudley -- Q: `PlayerAction::Interact` is currently a no-op — needs extension (protocol change) -- Q: Need Tyre sign-off on ObserverSnapshot v2 → v3 protocol evolution - ---- - -## 4. Scope Boundary — Revised IN/OUT - -### Gestalt's Additions to IN (4 items) - -| Added Item | Rationale | Cross-Support | -|-----------|-----------|---------------| -| **News ticker** | Required for wow moment #5 | Stig (designed world-space implementation), Mellanie (budgeted 20 items) | -| **PC-as-NPC** | Required for divergence reveal (wow moment #4) | Paula (identified as Gap 1), Mellanie (budgeted 25 items) | -| **Time progression** | Required for NPC routines, shift transitions | Dudley (DayPhase exists), Stig (HUD designed) | -| **Relationship state transitions** | Required for FRIEND arc (Friendly → PersonOfInterest) | Dudley (RelationshipState in knowledge graph) | - -### Gestalt's Additions to OUT (5 items) - -| Excluded Item | Rationale | Risk if not excluded | -|-------------|-----------|---------------------| -| **Inventory system** | Evidence is knowledge, not physical items | Feature creep ("pick up the manifest") | -| **Stealth mechanics** | Social stealth, not mechanical stealth | Immersive sim instincts will demand it | -| **Combat system** | Not in D-027 criteria | Ate scope from other features | -| **Player-facing save/load** | Session-based 30-minute slice | Dev-mode save fine, player-facing deferred | -| **Lattice modification/upgrade** | Contraband IS lattice components but player can't use them | "Can the player use smuggled mods?" No. | - ---- - -## 5. Content Volume Estimates (Mellanie) - -| Category | Items | Priority | -|----------|-------|----------| -| Monologue pools (2 characters) | ~200 lines | Critical | -| NPC dialogue | ~350 lines | Critical | -| Environmental text | ~50 items | High | -| News ticker | ~20 items | Medium | -| UI microcopy | ~50 strings | High | -| PC-as-NPC content | ~25 items | Medium | -| **TOTAL** | **~695** | | - -**Authoring order (Mellanie's proposed sequence):** -1. THE FRIEND: Kael content pack (~100 lines) — exercises every pipeline -2. THE FRIEND: Sera content pack (~100 lines) -3. THE MIRROR: Naia Tamm (~60-70 lines) -4. Tier 2 NPCs (~100-150 lines: Voss, Lera, Torek, Maret) -5. Environmental text + ticker (~70 items) -6. Remaining monologue fill (top up to ~200) -7. UI copy + tutorial monologue (~50 strings) -8. Tier 3 background + PC-as-NPC (~50 items) - ---- - -## 6. Technical Risk Assessment (Tyre) - -| Feature | Risk | Primary Factor | Mitigation | -|---------|------|----------------|------------| -| WASD + collision | Low | None significant | Already built | -| 3 social sites | Low | Art (not v0.1 concern) | Functional boxes | -| NPC routines | Low-Medium | Content authoring time | Start schedules early | -| Knowledge graph | Medium | Downstream dependency chain | Sprint 2 narrow scope | -| 2 playable characters | Medium | Content volume doubling | Content validation tooling | -| Context-sensitive interaction | Medium | Dialogue selection tuning | Line previewer CLI | -| **Monologue system** | **High** | Trigger detection + prerequisite eval | Simple AND-only prerequisites | -| **THE FRIEND arc** | **High** | Integration of all systems | Dedicated integration test | -| 5 triangle forks | Medium-High | Cascade complexity | Self-contained forks | -| 6 wow moments | Varies | #3 is the critical path | Prioritize everything unblocking #3 | - -**Critical path:** Knowledge graph → Contradiction detection → FRIEND phase transitions → Spatial staging → Monologue trigger → Monologue display → FRIEND content authored and loaded. - -**What will take longer than expected (Tyre's warnings):** -1. Monologue prerequisite tuning (gap between "works" and "feels right") -2. Dialogue selection weighting (same tuning problem) -3. Spatial staging for THE FRIEND (Kael in Corridor B-7 when player is nearby, without feeling scripted) -4. Content conversion (17 NPC wiki profiles → YAML, ~2-3 full days) - ---- - -## 7. Wiki Gaps Identified (Paula) - -Beyond the 5 issues in the brief, Paula identified 7 additional gaps: - -| # | Gap | Blocks | Priority | -|---|-----|--------|----------| -| Gap 1 | **PC-as-NPC profiles missing** | Server entity spawning, dialogue, monologue about other PC | Critical | -| Gap 2 | **Monologue content pool — zero authored lines** | Monologue system integration testing | Critical | -| Gap 3 | **NPC routine YAML layer missing** | Server NPC scheduling, deviation detection | Critical | -| Gap 4 | **Triangle fork decision points not mechanically specified** | Storyteller triggers, dialogue branching | High | -| Gap 5 | **FactId catalog — smuggler path entries sparse** | Knowledge graph population, monologue prerequisites | High | -| Gap 6 | **Location files lack smuggler operational detail** | Environmental monologue triggers, spatial gameplay | Medium | -| Gap 7 | **Harek has no triangle membership despite T2 role** | Triangle 2/5 formalization | Medium | - ---- - -## 8. ECS / Server Architecture (Dudley) - -### Components Proposed - -| Component | Purpose | v0.1? | -|-----------|---------|-------| -| `ThematicPattern` | System A tag (9 patterns) | Yes | -| `FunctionalMotivation` | System B tag (6 motivations) | Yes | -| `FriendArc` | THE FRIEND phase tracking, contradiction detection | Yes (Kael, Sera only) | -| `ContentTier` | Tier1/Tier2/Tier3 simulation depth | Yes | -| `AccessTierMap` | D-028 Layer 1 dialogue access filtering | Yes | -| `TrustLevels` | D-028 Layer 3 gossip gating | Yes | -| `TriangleMembership` | Triangle role references per NPC | Yes | -| `NpcRoutine` | Schedule-based movement (DayPhase → position) | Yes | -| `MoodState` | D-035 mood tag for dialogue selection | Yes | -| `NobodyState` | Promotion stages + interaction counter | Deferred | -| `GhostInfluence` | Off-stage influence | Deferred | -| `CatalystTrigger` | Arrival/disruption event chain | Deferred | - -### Key Design Principle (Dudley) -"Pattern and motivation are tags for content selection, not unique simulation subsystems. THE FRIEND is the sole exception in v0.1 because its arc progression is load-bearing." - -### What Dudley Can Build Now (No Content Dependency) -- Content loader framework (Phase 1-6 skeleton) -- Proximity trigger system -- Interaction event pipeline -- Dialogue selection pipeline (D-035 tag filtering) -- Monologue trigger system -- NPC routine scheduler -- FriendArc phase transition logic -- All with fixture/synthetic data - -### What Dudley Cannot Build Without Content -- Actual NPC spawning (needs profiles in structured format) -- Real dialogue/monologue testing (needs authored lines) -- NPC routine pathfinding (needs district spatial layout) -- Overheard conversations (needs NPC-NPC scripts) -- FactId catalog (needs machine-readable version) -- Triangle escalation logic (needs formal conditions) - ---- - -## 9. UI Architecture (Stig) - -### v0.1 UI Bill of Materials - -| Element | Priority | Effort | -|---------|----------|--------| -| Monologue renderer | P0 (must ship) | Medium | -| Interaction prompt | P0 | Low | -| Dialogue panel | P0 | Medium | -| Entity color system | P0 | Low | -| HUD bar (location + time) | P1 (placeholder OK) | Low | -| Minimap | P1 | Medium | -| Knowledge panel | P1 | Medium | -| News ticker (world-space) | P1 | Low | -| Fog rendering | P0 (shared with server) | High | - -**Total:** ~9 scenes, ~9 scripts, 2 shaders. - -### Key Design Decisions (Stig) -- Center of screen is sacred (no permanent UI) -- Monologue: bottom-left, 40% width, fades in/out, character-tinted text -- Dialogue: bottom-center, 60% width, semi-transparent dark panel, world visible behind -- Interaction prompt: world-space, tracks entity, single action -- Knowledge panel: right-side overlay on [Tab], diegetic lattice interface -- News ticker: world-space text on bar's display entity (not HUD) -- Monologue display time: 4-6 seconds adjusted by text length -- Character text colors: Detective blue-white `#c8d8f0`, Smuggler amber-white `#f0e0c8` - ---- - -## 10. Cross-Reference: Ticket Categories (Tyre) - -Tyre proposes ticket splits across 8 categories: - -1. **Content Infrastructure** — directory structure, content loader (4 phases), validation schemas, line previewer CLI -2. **Wiki → Content Conversion** — NPC profiles (17), locations (3), fact catalog, triangles (5), routines -3. **Monologue System** — trigger detection, prerequisite evaluation, line pool selection, pacing/cooldown, content authoring, display UI, chime audio -4. **Dialogue System** — pool loader, selection algorithm, content authoring, UI -5. **Interaction Model** — proximity detection, state machine, prompt UI -6. **THE FRIEND Arc** — phase transitions, contradiction detection, tell accumulation, content (Kael + Sera), relationship colors, integration test -7. **NPC Rendering + Routines** — schedule execution, deviation events, sprite/label rendering, movement animation -8. **Cross-Cutting** — PC-as-NPC, news ticker, smuggler lens parity, Naia Tamm rename - -**Dependency chain critical path (Tyre):** -``` -Content directory structure - -> Content loader (Phase 1-2) - -> NPC profile conversion -> NPC schedule execution - -> Content loader (Phase 3-4) - -> Dialogue pool loader -> Dialogue selection -> Dialogue UI - -> Monologue trigger detection - -> Prerequisite evaluation - -> Line pool selection - -> Monologue pacing -> Monologue display UI - -Knowledge graph (Sprint 2) - -> Contradiction detection -> FRIEND phase transitions - -> Monologue prerequisite evaluation - -> Tell system accumulation -``` - ---- - -## 11. Items Requiring Round 2 Resolution - -| # | Item | Required Participants | Priority | -|---|------|---------------------|----------| -| R2-01 | **Canonical NPC pattern/motivation mapping** (resolve 10 disagreements) | Gestalt, Paula | Critical | -| R2-02 | **Content format: YAML vs RON** | Tyre, Dudley | Critical | -| R2-03 | **Smuggler EntityKnowledge keys: 4 new vs 8 new** | Gestalt, Paula, Dudley | High | -| R2-04 | **Examine NPC vs Talk: separate or combined interaction?** | Gestalt, Stig, Dudley | High | -| R2-05 | **Knowledge panel pause behavior** | Gestalt, Stig | Medium | -| R2-06 | **PC voice register confirmation** (blocks Mellanie's authoring) | Gestalt or Paula | High | -| R2-07 | **Triangle fork cascade: self-contained or cross-triangle?** | Gestalt, Tyre | High | -| R2-08 | **Harek's structural role** (triangle member vs external pressure node) | Gestalt, Paula | Medium | -| R2-09 | **ObserverSnapshot v2 → v3 protocol change** | Tyre, Dudley, Stig | High | -| R2-10 | **SI ticket review** (pending SI response) | SI | High | - ---- - -## 12. Decisions Ready to Formalize - -If the lead approves, these can become decisions immediately (no further discussion needed): - -| Proposed ID | Decision | Source | -|-------------|----------|--------| -| D-042 | Drin promoted from Tier 3 to Tier 2 | Gestalt (unanimous), Paula (profile drafted) | -| D-043 | THE NOBODY mechanic deferred to v0.2; hidden pattern+motivation data ships in NPC content files for v0.1 | Gestalt, Dudley | -| D-044 | v0.1 interaction model: 7 interactions (Move, Look, Monologue, Examine Object, Examine NPC, Talk, Overhear) | Gestalt (designed), Stig (UI for each), Dudley (server events) | -| D-045 | v0.1 scope: add News ticker, PC-as-NPC, Time progression, Relationship state transitions to IN list | Gestalt (rationale per item) | -| D-046 | v0.1 scope: add Inventory, Stealth, Combat, Player-facing save/load, Lattice modification to explicit OUT list | Gestalt (rationale per item) | -| D-047 | v0.1 triangles: 3 active forks (T1, T2, T4), 2 passive tensions (T3, T5) | Gestalt | -| D-048 | Client receives all text from server via state updates; client does not load or evaluate content files | Stig, Dudley, Tyre (information boundary principle) | - ---- - -## 13. Ticket Analysis (SI) - -### Round 2 List Scorecard - -**26 of 29 tickets survive the 300-world reframe.** - -| Disposition | Count | Tickets | -|-------------|-------|---------| -| Survive unchanged | 11 | A1, A2, A7, A8, A10, A11, B2, B3, B4, B5, C1 | -| Survive reframed | 15 | A3 (merge into #319), A4, A6, A9, A12, B1, C2, C3, C4-C8, C9, C10, D2 | -| Deferred (v0.2+) | 2 | A5 (wiki index restructure), D1 (cultural_gate modifier) | -| Killed | 1 | D3 (secondary contraband variant FactIds — explicitly OUT) | - -### 7 New Tickets Proposed - -| ID | Title | Team | Priority | Key Dependencies | -|----|-------|------|----------|-----------------| -| NEW-1 | NPC pattern/motivation mapping for v0.1 | copy | high | None | -| NEW-2 | Drin tier promotion evaluation | copy | medium | NEW-1 | -| NEW-3 | Wiki → YAML content conversion (Sova NPCs) | copy | high | C1, C2, C3 | -| NEW-4 | Monologue content pool — minimum viable set | copy | high | #261, B4 | -| NEW-5 | v0.1 wow moment content checklist | copy | high | None | -| NEW-6 | PC-as-NPC content authoring (authored lines) | copy | high | B3, B5 | -| NEW-7 | Interaction model minimum spec | copy | medium | None (informed by workshop Topic 4) | - -### Existing Ticket Updates - -| ID | Title | Action | -|----|-------|--------| -| #368 | Knowledge vocabulary for v0.1 content | Close when wiki review accepted | -| #369 | Wiki Review Workshop Outputs (epic) | Repurpose as parent epic for v0.1 content scoping | -| #301 | Wiki taxonomy and structure | Assign to copy, downscope for v0.1 (Sova only) | -| #319 | Krenn System wiki entry | Merge with A3 (expanded: wiki page + seed.yaml reference) | -| **#261** | **Dual Lens Authoring Guide** | **CRITICAL BOTTLENECK — blocks 9 downstream tickets** | -| #310 | Character voice speech patterns | Merge with or block on B4 | -| #306 | News ticker / Meridian feed content | Update scope per D4 (40-50 headlines) | -| #326 | YAML content loader | Assign to server, blocked by C1+C2, Sprint 4 | - -### Sprint 3 Copy Team (14 tickets proposed) - -**P0 — Must start immediately:** - -| Ticket | Title | Blocked By | -|--------|-------|------------| -| A2 | Hael → Naia Tamm rename | — | -| A1 | Apply canonical full names | — | -| A7 | Smuggler entity attributes | — | -| C1 | Content directory structure design | — | -| **#261** | **Dual Lens Authoring Guide** | **— (Critical path root)** | - -**P1 — Start after P0s:** - -| Ticket | Title | Blocked By | -|--------|-------|------------| -| A10 | Nils Davan stub | — | -| A11 | Triangle 1 fix | A10 | -| B2 | MIRROR pattern spec | — | -| B4 | Smuggler voice + moral arc | A7 | -| NEW-1 | NPC pattern/motivation mapping | — | -| NEW-5 | Wow moment content checklist | — | - -**P2 — Fit in around P0/P1:** - -| Ticket | Title | Blocked By | -|--------|-------|------------| -| A8 | Shortcode fix | — | -| B3 | PC-as-NPC spec | A7 | -| NEW-7 | Interaction model minimum spec | — | - -### Sprint 3 Server Tickets (content-related) - -| Ticket | Title | Blocked By | -|--------|-------|------------| -| C2 | Create content/ directory skeleton | C1 | -| C3 | Content schema definitions | C1 | - -### Critical Path (SI's Analysis) - -Two parallel chains must begin in Sprint 3: - -**Chain 1 — Content authoring:** -``` -#261 (Dual Lens Guide) → B4 (Smuggler voice) → A6 (FactId text) → content packs → monologue pool -``` - -**Chain 2 — Content architecture:** -``` -C1 (Directory design) → C2/C3 (skeleton/schemas) → C4-C8/NEW-3 (YAML files) → #326 (loader) -``` - -**#261 is the single biggest blocker in the entire content pipeline.** It blocks 9 tickets directly and cascades into everything. SI recommends immediate assignment with Paula as owner. - -### v0.1 IN List → Ticket Coverage - -| IN List Item | Status | Gaps | -|-------------|--------|------| -| WASD movement + collision | Covered (Sprint 1-2 done) | — | -| Context-sensitive interaction | Partially covered | Needs NEW-7 spec | -| Monologue system | Architecture covered | Content gap (NEW-4) | -| Knowledge graph | Covered | — | -| 2 playable characters | Covered (architecture) | — | -| THE FRIEND arc | Covered but **blocked by #261** | — | -| 5 triangles with forks | Partially covered | Weak Triangle 1 (A11) | -| 6 wow moments | **Gap** | Needs NEW-5 tracking ticket | -| 3 social sites | Covered but blocked by #261 | — | -| NPC routines | Covered (server) | — | -| Dual-lens parity | **Major gap** | Smuggler lens incomplete (A7, B4, A6) | -| PC-as-NPC | **Gap** | No tickets exist (B3, B5, NEW-6) | -| Content directory | **Gap** | Structure undefined (C1, C2, C3) | -| Content validation | **Gap** | No validation exists (C9, C10) | - ---- - -*Qatux, Round 1 tracking. For the record: all 7 responses cataloged, 17 consensus items, 5 disagreements requiring resolution, 7 additional wiki gaps identified, 10 open questions, 7 decisions ready to formalize. SI confirms 26 surviving tickets + 7 new proposals. #261 (Dual Lens Authoring Guide) is the critical bottleneck — blocks 9 downstream tickets across the entire content pipeline.* diff --git a/docs/workshops/v01-content-scoping/round1-tyre.md b/docs/workshops/v01-content-scoping/round1-tyre.md deleted file mode 100644 index ec001dba5..000000000 --- a/docs/workshops/v01-content-scoping/round1-tyre.md +++ /dev/null @@ -1,672 +0,0 @@ -# Round 1 — Tyre (Technical Architect) -## v0.1 Content Scoping Workshop - -*cracks knuckles* - -Three topics assigned to me. Let me be honest about what each means technically. - ---- - -## Topic 3: Content Directory Structure - -### Format Decision: YAML - -Not RON, not JSON, not TOML. YAML. Here's why: - -| Criterion | YAML | RON | JSON | -|---|---|---|---| -| Content author readability | Excellent | Poor (Rust syntax) | Decent | -| Multi-line text (dialogue) | Native (`\|`, `>`) | Awkward | Escaped strings | -| serde support in Rust | `serde_yaml` (mature) | `ron` crate (mature) | `serde_json` (mature) | -| Schema validation tooling | JSON Schema (rich) | None standard | JSON Schema (native) | -| Generator output compatibility | Any language can emit YAML | Rust-only ergonomic | Any language | -| Hot-reload parse speed | Fast enough (~2ms for 100KB) | Faster (~0.5ms) | Fast (~1ms) | - -RON would be natural if only Rust engineers touched content. But Mellanie and Paula author content, and asking them to write `NpcProfile(axes: Axes(want: "Protect the operation"))` instead of `want: "Protect the operation"` is a tax with no return. The 1.5ms parse speed difference is irrelevant — content loads once at startup and on hot-reload. - -**Validation pipeline:** YAML files validate against JSON Schema definitions (one schema per content type). The server's `content_loader` also validates by attempting `serde_yaml::from_reader::()` — if it deserializes into the Rust struct, it's valid. Both checks run: schema catches structural issues early (missing required fields, wrong types), serde catches semantic issues (enum variant doesn't exist, value out of range). - -### Proposed Directory Structure - -``` -content/ - content.yaml # Manifest: lists all districts, content version - schema/ # JSON Schema definitions for validation - npc.schema.json - location.schema.json - fact.schema.json - district.schema.json - dialogue.schema.json - monologue.schema.json - routine.schema.json - triangle.schema.json - global/ # Shared across ALL districts (generator-safe) - facts/ # FactId definitions — the vocabulary - contraband.yaml # contraband.ring_exists, contraband.lattice_components, ... - location.yaml # location.corridor_b7_restricted, ... - investigation.yaml # investigation.manifest_discrepancy, ... - world.yaml # world.commission_regulations, ... - relationship.yaml # relationship.ring_membership, ... - progress.yaml # progress.initial_suspicion, ... - factions/ - lattice-commission.yaml - syndics.yaml - the-ring.yaml # Ring is district-local but faction def is global - concord-assembly.yaml - guardians-of-autonomy.yaml - entity-schema/ # EntityKnowledge attribute definitions - attributes.yaml # The 14 canonical keys from entity-attributes.md - enums/ # Tag enum definitions (D-035) - situations.yaml # 13 situation enums - topics.yaml # 9 topic enums - moods.yaml # 8 mood enums - access-tiers.yaml # public, insider, authority, peer, hostile - trust-tiers.yaml # surface, real, secret - triggers.yaml # 9 monologue trigger types - districts/ - sova-transit/ # v0.1: hand-authored district - district.yaml # District metadata, social site refs, NPC roster - npcs/ # One file per NPC - kael-davan.yaml # Tier 1 FRIEND — full 10-axis + tells + contradiction - sera-venn.yaml # Tier 1 FRIEND — full 10-axis + tells + contradiction - voss.yaml # Tier 2 - lera-sessik.yaml # Tier 2 - torek-lintar.yaml # Tier 2 - devra.yaml # Tier 2 - maret-korr.yaml # Tier 2 - resha.yaml # Tier 2 - harek.yaml # Tier 2 - naia-tamm.yaml # Tier 1 MIRROR (renamed from Hael) - renn.yaml # Tier 2 - pell.yaml # Tier 2 - drin.yaml # Tier 2 or 3 (pending promotion decision) - sess.yaml # Tier 3 - olin.yaml # Tier 3 - sabel.yaml # Tier 3 - tav.yaml # Tier 3 - locations/ - the-terminal.yaml # Social site: logistics hub - the-last-shift.yaml # Social site: bar / "Lera's" - maintenance-corridors.yaml # Social site: smuggling spaces - triangles/ - hub-power.yaml # Triangle 1: Voss/Nils power struggle - ring-trust.yaml # Triangle 2: internal ring loyalty - bar-tension.yaml # Triangle 3: bar social dynamics - investigation-pressure.yaml # Triangle 4: detective pressure - leverage-web.yaml # Triangle 5: Harek/Drin/compromise - dialogue/ # Grouped by location, then by role - the-terminal/ - dock-worker.yaml # Role-based, not NPC-named - shift-supervisor.yaml - scheduler.yaml - new-hire.yaml - the-last-shift/ - bartender.yaml - bar-regular.yaml - bar-owner.yaml - maintenance-corridors/ - courier.yaml - ring-operative.yaml - monologue/ # Hard partition per character (D-032) - smuggler/ - the-terminal.yaml - the-last-shift.yaml - maintenance-corridors.yaml - general.yaml # time_idle, non-location triggers - detective/ - the-terminal.yaml - the-last-shift.yaml - maintenance-corridors.yaml - general.yaml - routines/ - schedules.yaml # All NPC schedules: time → location → activity -``` - -### Key Design Choices - -**1. `global/` vs `districts/` split.** -Everything in `global/` is district-independent. FactId vocabulary, faction definitions, attribute schemas, tag enums — these are the *language* the content speaks. Districts are *instances* of content written in that language. When generators produce District #247, they use the same `global/` vocabulary. - -**2. Dialogue by location + role, NOT by NPC.** -Per D-035: `role` is a template-defined role, NPC assignment is runtime. The file `dialogue/the-terminal/dock-worker.yaml` contains all dialogue lines for the dock-worker role at the Terminal. At runtime, Kael (or any other dock worker) draws from this pool based on access/trust/situation filtering. This is generator-compatible — a generated district creates its own role pools. - -**3. Monologue files are per-character per-location.** -D-032 mandates hard partition. The directory structure enforces it physically. No risk of accidentally sharing lines between characters. - -**4. Facts in `global/`, not per-district.** -The FactId vocabulary (`contraband.ring_exists`) is global — it's the *language of knowledge*. The specific confidence progression text in the fact catalog is also global (it describes what each confidence level means for that fact). What varies per district is which facts are *relevant* and which NPCs *know* them — that's in the NPC profiles and the knowledge graph at runtime, not in the fact definitions. - -Exception: if future districts introduce district-specific facts (e.g., `mining.union_dispute` on a mining world), those can live in `districts/{district}/facts/` as extensions. The loader merges global + local. - -**5. One NPC per file.** -Each NPC profile is self-contained. This means: -- Content authors can work on different NPCs in parallel without merge conflicts -- Generators output one file per generated NPC -- Validation runs per-file (fast feedback) -- Git blame is clean (who wrote what, when) - -### Content Addressing - -**`canonical_id`** is a required field inside every content YAML file. It uniquely identifies the entity across the entire game. Format: `{type}:{slug}`. - -```yaml -# content/districts/sova-transit/npcs/kael-davan.yaml -canonical_id: "npc:kael-davan" -``` - -```yaml -# content/global/facts/contraband.yaml -facts: - - fact_id: "contraband.ring_exists" # FactId string IS the canonical_id -``` - -```yaml -# content/districts/sova-transit/locations/the-terminal.yaml -canonical_id: "loc:sova-transit:the-terminal" -``` - -```yaml -# content/districts/sova-transit/triangles/hub-power.yaml -canonical_id: "tri:sova-transit:hub-power" -``` - -**Why `canonical_id` is in the file, not derived from the path:** -- Files can be reorganized without breaking references -- Generators can place files anywhere and assign IDs programmatically -- Cross-file references use the `canonical_id` string, not file paths -- Duplicate ID detection is a validation rule (build fails if two files claim the same canonical_id) - -**Runtime mapping:** At content load, the server builds a `ContentRegistry`: -```rust -struct ContentRegistry { - // canonical_id string → StableId (assigned deterministically via hash or sequential) - id_map: BTreeMap, - // Reverse lookup - reverse_map: BTreeMap, -} -``` - -The `StableId(u64)` assigned at load time is deterministic — same content files always produce same IDs (sorted canonical_ids, sequential assignment). This satisfies D-010 principle 4 (deterministic simulation). - -### Wiki → Content File Mapping - -The wiki is the **authoring reference** (narrative intent, character depth, prose descriptions). Content files are the **engine data** (structured values, tagged lines, schedule timings). The transformation is: - -| Wiki Source | Content Target | Transformation | -|---|---|---| -| `wiki/npcs/kael-davan.md` | `districts/sova-transit/npcs/kael-davan.yaml` | 10-axis prose → structured YAML fields. Routine prose → time/location pairs. Tells prose → tell tag list. | -| `wiki/locations/krenn-system/the-terminal.md` | `districts/sova-transit/locations/the-terminal.yaml` | Prose description → spatial properties (bounds, sightlines, Meridian coverage, access requirements). | -| `wiki/knowledge/fact-catalog.md` | `global/facts/*.yaml` | Per-FactId entries, split by category file. Confidence progression text included as authoring reference. | -| `wiki/knowledge/entity-attributes.md` | `global/entity-schema/attributes.yaml` | Attribute key definitions + valid values + usage notes. | -| `wiki/factions/*.md` | `global/factions/*.yaml` | Faction identity → mechanical properties (access tier modifiers, trust defaults). | -| `wiki/authoring/monologue-guide.md` | `global/enums/*.yaml` + schema definitions | Tag taxonomy → enum value lists + schema. | -| `wiki/npcs/index.md` (triangles) | `districts/sova-transit/triangles/*.yaml` | Triangle descriptions → structured NPC references + fork definitions. | - -**The wiki doesn't go away.** Wiki remains the human reference for "why is Kael this way?" The content file says `want: "Protect the operation and the people in it"` — the wiki explains what that means narratively, what the secondary want is, how it evolved. Writers read wiki, engine reads content files. - -### NPC Profile File Example - -```yaml -# content/districts/sova-transit/npcs/kael-davan.yaml -canonical_id: "npc:kael-davan" -display_name: "Kael Davan" -tier: 1 -pattern: "FRIEND" # System A (thematic) -motivation: "OPERATOR" # System B (functional) — pending Gestalt's mapping -district: "sova-transit" - -# D-024: 10-axis model -axes: - want: "Protect the operation and the people in it" - secret: - surface: "Ring member, handles physical cargo" - deep: "Trying to exit the ring via unauthorized contact" - relationships: - - target: "npc:nils-davan" - kind: "sibling" - trust: 0.85 - - target: "npc:naia-tamm" # Renamed from Hael - kind: "partner" - trust: 0.95 - - target: "npc:smuggler-pc" # PC-as-NPC reference - kind: "close_colleague" - trust: 0.90 - tolerance: - current_stress: 0.55 - threshold: 0.75 - routine: - description: "Morning shift 06:00-14:00, bar after shift, home evenings" - information: - known_facts: - - "contraband.ring_exists:KnowsDetails" - - "contraband.lattice_components:KnowsDetails" - - "contraband.supply_chain:KnowsOf" - - "location.corridor_b7_restricted:KnowsDetails" - - "location.smuggling_route:KnowsDetails" - - "world.shift_schedule:KnowsDetails" - contentment: 0.45 - -# D-024: 3 supporting axes -personality: - traits: ["loyal", "careful", "conflict-avoidant"] -tells: - - trigger: "lying" - behavior: "looks left" - - trigger: "stressed" - behavior: "lattice checking" - - trigger: "discussing_exit" - behavior: "forced casualness" -skills: - set: ["logistics", "cargo_handling", "dock_operations"] - combat_trained: false - -# Entity attribute defaults (what a NEW observer would learn) -initial_attributes: - role: "dock worker" - faction: "civilian" # True faction hidden until discovered - species: "human" - routine_pattern: "morning shift at logistics hub, bar after shift" - -# THE FRIEND arc data (Tier 1 only) -friend_arc: - character: "smuggler" # This NPC is FRIEND to the smuggler - phases: - - name: "warmth" - triggers: [] # Default state - - name: "trust" - triggers: - - fact: "relationship.trust_network" - min_confidence: "KnowsOf" - - name: "doubt" - triggers: - - observation: "kael_in_corridor_b7" # Spatial staging trigger - - name: "conflict" - triggers: - - attribute_set: "contradiction_flagged" - contradiction: - type: "spatial" # Seen in wrong place - location: "loc:sova-transit:maintenance-corridors" - expected_location: "loc:sova-transit:the-terminal" - time_window: "shift_transition" -``` - -### Dialogue File Example - -```yaml -# content/districts/sova-transit/dialogue/the-terminal/dock-worker.yaml -role: "dock_worker" -location: "loc:sova-transit:the-terminal" - -lines: - - id: "terminal_d_001" - text: "Manifest says 240 kilos but that container's sitting heavy. Could be packing material. Could be anything." - access: [insider, peer] - trust: surface - situation: [routine, shift_start] - topic: [cargo] - mood: [comfortable] - - - id: "terminal_d_002" - text: "Voss moved the schedule again. Third time this rotation. Says it's efficiency." - access: [public] - trust: surface - situation: [routine, shift_end] - topic: [routine, colleague] - mood: [comfortable] - - - id: "terminal_d_003" - text: "You want to know about the night shift? Nobody wants the night shift. That's your answer." - access: [authority] - trust: surface - situation: [investigation] - topic: [routine, investigation] - mood: [suspicious] - - - id: "terminal_d_015" - text: "Nils has been... look, I can't talk about family here. Not with the scanners running." - access: [insider, peer] - trust: real - situation: [social, alone] - topic: [trust, personal] - mood: [worried, conflicted] - tags: ["nils_reference", "ring_internal"] -``` - -### Monologue File Example - -```yaml -# content/districts/sova-transit/monologue/smuggler/the-terminal.yaml -character: smuggler -location: "loc:sova-transit:the-terminal" - -lines: - - id: "terminal_m_s_001" - text: "Same dock, same hum, same shift. Kael's already at his station. Reliable as the gate cycle." - trigger: enter_location - prerequisite: null - topic: [routine, colleague] - mood: [comfortable] - tags: ["opening", "kael_reference"] - - - id: "terminal_m_s_007" - text: "That container's been in temp storage fourteen hours. Standard turnaround is six. Someone's buying time." - trigger: observe_anomaly - prerequisite: - facts: - contraband.supply_chain: KnowsOf - topic: [cargo] - mood: [analytical] - tags: ["investigation_seed"] - - - id: "terminal_m_s_012" - text: "Kael? In Corridor B-7? During shift transition? He has no reason to be there. None that I know of." - trigger: observe_npc - prerequisite: - entity: - target: "npc:kael-davan" - attribute: "routine_pattern" - condition: "deviation" - facts: - location.corridor_b7_restricted: KnowsOf - topic: [colleague, danger] - mood: [suspicious, conflicted] - tags: ["friend_contradiction", "wow_moment_3"] - dual_lens: - detective: "The dock worker — Davan — in a restricted corridor during transition. That's not routine maintenance." - notes: "THE FRIEND contradiction moment. Urgent chime. This is wow moment #3." -``` - -### Content Load Sequence (Server-Side) - -``` -PHASE 1: VOCABULARY LOAD (global/) - ├── Load global/enums/*.yaml → build tag enum registries - ├── Load global/facts/*.yaml → build FactId registry - ├── Load global/factions/*.yaml → build faction definitions - ├── Load global/entity-schema/attributes.yaml → build attribute key registry - └── Validate: all enum values, fact IDs, attribute keys are unique - -PHASE 2: DISTRICT LOAD (districts/{id}/) - ├── Load district.yaml → district metadata, NPC roster, location list - ├── Load npcs/*.yaml → NPC profiles - │ ├── Validate canonical_ids unique - │ ├── Validate relationship targets exist - │ ├── Validate known_facts reference valid FactIds - │ └── Build canonical_id → StableId mapping (ContentRegistry) - ├── Load locations/*.yaml → location spatial definitions - ├── Load triangles/*.yaml → triangle NPC references + fork definitions - │ └── Validate all NPC refs exist in ContentRegistry - ├── Load dialogue/**/*.yaml → line pool registry - │ └── Validate all tag values against enum registries - ├── Load monologue/**/*.yaml → per-character line pool registry - │ └── Validate prerequisites reference valid FactIds + entity attributes - └── Load routines/schedules.yaml → NPC schedule data - -PHASE 3: ENTITY SPAWN - ├── For each NPC in roster: - │ ├── Spawn bevy_ecs Entity - │ ├── Insert Npc marker component - │ ├── Insert axis components (Want, Secret, Relationships, etc.) - │ ├── Insert KnowledgeGraph component (pre-populated from information.known_facts) - │ ├── Insert DailyRoutine component (from routine data) - │ ├── Register StableId ↔ Entity in EntityRegistry - │ └── If Tier 1 FRIEND: insert FriendArc component with phase data - ├── For each location: - │ ├── Spawn location entity with spatial properties - │ └── Register in ContentRegistry - └── Build dialogue/monologue indices for fast runtime lookup - -PHASE 4: READY - └── Content loaded, entities spawned, registries built → simulation can start -``` - -**Hot-reload path:** File watcher detects YAML change → re-parse affected file → validate → if NPC: update axis components in-place (no respawn needed for value changes). If dialogue/monologue: rebuild affected line pool index. If structural change (new NPC, removed NPC): log warning, require restart. Hot-reload is a development convenience, not a production feature. - ---- - -## Topic 5: Technical Risk in the IN List - -I'll tier these. Tier 1 = low risk. Tier 2 = medium, manageable. Tier 3 = hard, needs careful scoping. Tier 4 = this is where the schedule dies if we're not careful. - -### Tier 1 — Low Risk (will work, standard engineering) - -**WASD movement + collision.** Already have `movement.rs` with `TilePosition`. Collision is tile-based occupancy checking. 8-directional movement is in `PlayerAction` already. Z-level transitions are the only wrinkle — handle as tile properties (stairs, elevators). Estimate: done or nearly done. - -**3 social sites (Terminal, Last Shift, Maintenance Corridors).** These are map content, not systems work. Server needs location entities with spatial bounds and properties (Meridian coverage, access restrictions). Client needs tile rendering. The hard part is art — which is explicitly "functional boxes with labels" for v0.1 (D-014). Estimate: location data loading is part of content loader; rendering is standard tile mapping. - -**NPC routines (schedule-based movement).** Time system exists (D-031, `time.rs`). Day phases exist. Schedule format is defined. NPCs move to specified locations at phase boundaries. This is a state machine: `current_phase → lookup schedule → pathfind to target location → move`. Estimate: 2-3 dev-days for the schedule system. Content authoring for 17 NPC schedules is the longer pole. - -### Tier 2 — Medium Risk (technically straightforward but integration-heavy) - -**Knowledge graph.** D-041 is well-defined. Types exist in `types.rs`. Sprint 2 delivers core data structures + direct observation flow + basic decay. The risk isn't the knowledge graph itself — it's that **everything depends on it**. Monologue prerequisites query it. Dialogue filtering queries it. The FRIEND arc's contradiction detection queries it. Entity rendering uses `RelationshipState` from it. If knowledge graph delivery slips, everything downstream slips. - -*Mitigation:* Knowledge graph Sprint 2 scope is intentionally narrow (direct observation + decay only). Sprint 3 adds the complex stuff. But Sprint 3 is also when monologue, dialogue, and FRIEND arc need to work. The dependency chain is tight. - -**2 playable characters seeing same world differently.** Architecturally, this is already designed for (D-010 principle 3). The `ObserverSnapshot` is per-entity — two players get different snapshots. Knowledge graphs are per-entity — two PCs have different knowledge. The risk is **content volume and consistency**. Every piece of monologue content is written twice (one per character). Every NPC needs a smuggler-lens AND detective-lens. Every triangle fork needs to make sense from both perspectives. - -*Mitigation:* The dual-lens requirement is a content team problem more than a server/client problem. But it doubles the content validation surface area — a monologue line that references a fact the detective can't learn is a content bug, not a code bug. Content validation tooling (Topic 3's schema validation) is the mitigation. - -**Context-sensitive interaction (approach NPC → prompt → dialogue).** Server: proximity trigger → interaction state → dialogue pool query. Client: prompt rendering → dialogue display. The plumbing is standard. The risk is the **dialogue selection algorithm**. D-035 defines 6 structural tags + 3 selection tags. Filtering by access + trust + situation is a hard filter (combinatorial but finite). Selecting by topic + mood is a weighted selection (needs tuning). The algorithm itself is maybe 200 lines of Rust. The tuning to make it *feel good* is the unknown. - -*Mitigation:* Build the line previewer CLI (already on my priority list) early. Let Mellanie and Paula test dialogue selection before it's in-game. Iterate on weights outside the game loop. - -### Tier 3 — High Risk (technically complex, integration-dependent) - -**Monologue system (tagged triggers, FactId prerequisites).** This is the feature that makes or breaks the vertical slice. Nine trigger types, each requiring different detection logic: - -| Trigger | Detection Complexity | Server System Required | -|---|---|---| -| `enter_location` | Low | Location transition event | -| `observe_npc` | Medium | LOS + entity identification | -| `hear_sound` | Medium | Sound range model (D-018) | -| `observe_anomaly` | **High** | Routine deviation detection | -| `post_conversation` | Low | Dialogue end event | -| `discover_evidence` | Medium | Knowledge graph state change | -| `witness_interaction` | **High** | Two-entity observation in LOS | -| `time_idle` | Low | Timer on no-input | -| `return_visit` | Medium | Location visit history | - -`observe_anomaly` and `witness_interaction` are the dangerous ones. `observe_anomaly` means "NPC is doing something outside their routine" — the server needs to know what "normal" looks like to detect "abnormal." This requires the routine system to track expected vs. actual behavior, which is a step beyond simple schedule execution. - -`witness_interaction` means "I see NPC A talking to NPC B" — requires tracking NPC-to-NPC interactions AND checking whether those interactions are in the observer's LOS. This is a second-order perception query. - -**Prerequisite evaluation** is the other risk. A prerequisite like: -```yaml -prerequisite: - entity: - target: "npc:kael-davan" - attribute: "routine_pattern" - condition: "deviation" - facts: - location.corridor_b7_restricted: KnowsOf -``` -...is a small query language. The server needs to evaluate arbitrary combinations of entity attribute checks + fact confidence checks + potentially boolean logic (AND/OR). Keep this dead simple for v0.1 — AND-only, no nesting, explicit conditions. The temptation to build a general-purpose query engine is scope death. - -*Estimate:* 8-12 dev-days for the full monologue pipeline (trigger detection + prerequisite evaluation + pool selection + pacing). The "pacing" part (how often monologue fires, cooldown between lines, priority when multiple lines qualify) is pure playtesting — budget 2-3 days of tuning time. - -**THE FRIEND arc (Kael for smuggler, Sera for detective).** This is the integration test for EVERYTHING: -- Knowledge graph contradiction detection (Sprint 3) -- Monologue trigger system (all 9 types exercise) -- Tell system (behavioral observation accumulation over time) -- Multi-phase dialogue shifts (D-028 all 4 layers) -- Spatial staging (NPC in specific place at specific time) -- Relationship state transitions (Friendly → PersonOfInterest) - -The risk isn't any individual system — it's the intersection. THE FRIEND arc requires all systems to work together correctly. A bug in knowledge decay timing means the contradiction window passes unnoticed. A bug in spatial staging means Kael is never in Corridor B-7 when the player is nearby. A bug in tell accumulation means the player has no behavioral evidence before the contradiction. - -*Mitigation:* THE FRIEND arc needs its own integration test — a scripted scenario that walks through the full 5-phase arc and validates each system fires correctly. This is D-030's CauseChain paying off: every knowledge event, every monologue trigger, every relationship state change gets provenance tracking, and the integration test can verify the causal chain matches expectations. - -*Estimate:* Server systems: 5-8 dev-days (contradiction detection + spatial staging + tell accumulation + FRIEND phase transitions). Content: probably the largest single content deliverable in v0.1 (70-100 lines per FRIEND, times 2 FRIENDs, all hand-authored). Client: relationship color shifts (D-033), dialogue phase UI cues. - -### Tier 4 — Schedule Killers (needs aggressive scoping or it takes over) - -**5 triangles with at least 1 fork each.** Each fork is a branching decision point. Each branch has consequences that ripple through NPCs, knowledge, and potentially other triangles. - -The math: 5 triangles × 1 fork × 2 branches × N consequences per branch. If consequences cascade across triangles, N grows fast. If Triangle 1's fork outcome changes NPC attitudes in Triangle 3, then Triangle 3's fork depends on Triangle 1's resolution, and you have dependency chains. - -*Scope control:* For v0.1, forks should be **terminal decisions** — they affect the triangle's own NPCs and change the player's knowledge, but they don't cascade into other triangles. Cross-triangle contamination is a v0.2 feature. This keeps each fork to 2-3 consequence entities, not 10-15. - -*Estimate:* If forks are self-contained: 2-3 dev-days for the fork/consequence system + 3-5 dev-days for content authoring 5 fork scenarios. If forks cascade: 8-12 dev-days for cascade resolution + testing. **Strongly recommend self-contained forks for v0.1.** - -**6 wow moments.** These aren't independent features — they're integration milestones. Each one is a "everything up to here works" gate: - -| Wow Moment | Systems Required | Risk | -|---|---|---| -| #1 Arrival | Ambiance + routines + opening monologue | Low | -| #2 Character's Eye | Monologue trigger + routine deviation detection | **Medium-High** | -| #3 FRIEND Contradiction | Full FRIEND arc + spatial staging + contradiction detection | **High** | -| #4 Divergence Reveal | Dual-lens content + relationship colors + monologue partitioning | Medium | -| #5 News Ticker | Ticker system + dual monologue reactions | **Medium** (ticker is new UI element) | -| #6 Quiet Moment | time_idle trigger + reflective monologue | Low | - -The dependency chain: #1 is achievable early. #6 is achievable early. #2 requires monologue system. #5 requires ticker + monologue. #4 requires knowledge graph + rendering. #3 requires everything. - -**#3 is the critical path.** If THE FRIEND contradiction doesn't work, the demo's emotional peak is missing. Everything should be prioritized to unblock #3. - -### Summary Risk Matrix - -| Feature | Risk Level | Primary Risk Factor | Mitigation | -|---|---|---|---| -| WASD + collision | Low | None significant | Already built | -| 3 social sites | Low | Art (not scope concern at v0.1) | Functional boxes | -| NPC routines | Low-Medium | Content authoring time | Start schedules early | -| Knowledge graph | Medium | Downstream dependency chain | Sprint 2 narrow scope holds | -| 2 playable characters | Medium | Content volume doubling | Content validation tooling | -| Context-sensitive interaction | Medium | Dialogue selection tuning | Line previewer CLI | -| Monologue system | **High** | Trigger detection + prerequisite evaluation | Simple AND-only prerequisites, defer complex triggers | -| THE FRIEND arc | **High** | Integration of all systems | Dedicated integration test, prioritize for critical path | -| 5 triangle forks | **Medium-High** | Cascade complexity | Self-contained forks, no cross-triangle effects in v0.1 | -| 6 wow moments | Varies | #3 is the critical path | Prioritize everything that unblocks #3 | - -**What will take longer than expected:** -1. **Monologue prerequisite tuning.** The gap between "prerequisites work" and "prerequisites feel right" is large. Content authors will write prerequisites that are too strict (nothing fires) or too loose (everything fires). Budget iteration time. -2. **Dialogue selection weighting.** Same tuning problem. Getting NPCs to say contextually appropriate things from a tagged pool requires weight iteration. -3. **Spatial staging for THE FRIEND.** Getting Kael into Corridor B-7 *when the player is nearby* without feeling scripted is a storyteller-level challenge compressed into one specific moment. -4. **Content conversion.** Transforming 17 NPC wiki profiles + 24 fact entries + 3 location descriptions + 5 triangles from prose markdown into structured YAML is manual labor. Each NPC file needs ~30 minutes of careful conversion. Budget 2-3 full days for the initial wiki → content conversion pass. - ---- - -## Topic 6: Cross-Team Ticket Splits - -The content pipeline creates work that spans all three teams (server, client, copy). Here's my proposed split for the major ticket categories. Each "ticket" below is a logical unit that should be one or two actual tickets. - -### Content Infrastructure (Sprint 3) - -| Ticket | Server | Client | Copy | -|---|---|---|---| -| Content directory structure | Create `content/` tree, `content.yaml` manifest | — | Populate initial files | -| Content loader (Phase 1-2) | `ContentRegistry`, YAML deserialization, entity spawn from content | — | — | -| Content loader (Phase 3-4) | Line pool indexing, hot-reload watcher | — | — | -| Content validation schemas | serde validation on load | — | JSON Schema files for YAML | -| Line previewer CLI | Build CLI: YAML → filtered line output | — | Test with real content | - -### Wiki → Content Conversion (Sprint 3) - -| Ticket | Server | Client | Copy | -|---|---|---|---| -| NPC profile conversion (17 NPCs) | Define `NpcProfile` serde struct | — | Convert wiki MD → YAML (17 files) | -| Location conversion (3 sites) | Define `LocationDef` serde struct | — | Convert wiki MD → YAML (3 files) | -| Fact catalog conversion | Already defined (`FactId`, `FactKnowledge`) | — | Split fact-catalog.md → 6 YAML files | -| Triangle definitions | Define `TriangleDef` serde struct | — | Write 5 triangle YAML files | -| Routine/schedule conversion | Define `ScheduleEntry` serde struct | — | Write schedules.yaml for 17 NPCs | - -### Monologue System (Sprint 3) - -| Ticket | Server | Client | Copy | -|---|---|---|---| -| Monologue trigger detection | 9 trigger type implementations | — | — | -| Monologue prerequisite evaluation | Knowledge graph query engine (simple AND-only) | — | — | -| Monologue line pool selection | Tag filtering + weighted selection | — | — | -| Monologue pacing/cooldown | Rate limiter, priority queue, cooldown timers | — | — | -| Monologue content authoring | — | — | Write monologue lines (2 chars × 3 locs + general) | -| Monologue display UI | — | Text panel, chime trigger, fade/scroll | — | -| Monologue chime audio | — | Audio event handler for monologue chime SFX | — | - -### Dialogue System (Sprint 3) - -| Ticket | Server | Client | Copy | -|---|---|---|---| -| Dialogue pool loader | YAML → indexed line pool, tag filtering | — | — | -| Dialogue selection algorithm | Access/trust hard filter + topic/mood weighted select | — | — | -| Dialogue content authoring | — | — | Write role-based dialogue (10+ roles × location) | -| Dialogue UI | — | Dialogue box, NPC name display, line rendering | — | - -### Interaction Model (Sprint 3) - -| Ticket | Server | Client | Copy | -|---|---|---|---| -| Proximity detection | Distance threshold check per tick | — | — | -| Interaction state machine | Idle → Prompt → InDialogue → Exit | — | — | -| Interaction prompt UI | — | "Press E to talk" / context-sensitive label | — | - -### THE FRIEND Arc (Sprint 3-4, cross-team) - -| Ticket | Server | Client | Copy | -|---|---|---|---| -| FRIEND phase transition system | Phase state machine, trigger evaluation | — | — | -| Contradiction detection | `Contradicted` KnowledgeState, spatial observation vs. expected location | — | — | -| Tell system accumulation | Behavior flag aggregation, tell detection events | — | — | -| FRIEND content (Kael) | — | — | 70-100 lines: dialogue + monologue + tells + contradiction | -| FRIEND content (Sera) | — | — | 70-100 lines: dialogue + monologue + tells + contradiction | -| Relationship color rendering | — | Entity color shifts per D-033 RelationshipState | — | -| FRIEND integration test | Test scenario: full 5-phase arc validation | — | Test content fixtures | - -### NPC Rendering + Routines (Sprint 3) - -| Ticket | Server | Client | Copy | -|---|---|---|---| -| NPC schedule execution | DayPhase → location lookup → pathfind → move | — | — | -| NPC routine deviation events | Expected vs. actual location tracking | — | — | -| NPC sprite/label rendering | — | Entity kind → sprite, name display from snapshot | — | -| NPC movement animation | — | Interpolated movement between tiles | — | - -### Cross-Cutting - -| Ticket | Server | Client | Copy | -|---|---|---|---| -| PC-as-NPC (other character exists) | NPC entity with PC profile data | NPC rendering (same as any NPC) | ~20-30 authored items | -| News ticker system | Ticker event generation | Ticker UI widget | Ticker text + dual monologue reactions | -| Smuggler lens parity | — | — | Smuggler attribute vocabulary + lens sections for all 17 NPCs | -| Hael → Naia Tamm rename | Update any hardcoded refs | — | Execute rename across all wiki + content files | - -### Dependency Chain - -``` -Content directory structure - └── Content loader (Phase 1-2) - ├── NPC profile conversion ──→ NPC schedule execution - ├── Location conversion - ├── Fact catalog conversion - └── Content loader (Phase 3-4) - ├── Dialogue pool loader ──→ Dialogue selection ──→ Dialogue UI - ├── Monologue trigger detection - │ └── Monologue prerequisite evaluation - │ └── Monologue line pool selection - │ └── Monologue pacing ──→ Monologue display UI - └── Triangle definitions ──→ Triangle fork system - -Proximity detection ──→ Interaction state machine ──→ Interaction prompt UI ──→ Dialogue UI - -Knowledge graph (Sprint 2) ──→ Contradiction detection ──→ FRIEND phase transitions - ──→ Monologue prerequisite evaluation - ──→ Tell system accumulation - -FRIEND content (copy) ──→ FRIEND integration test -Monologue content (copy) ──→ Monologue pacing tuning -Dialogue content (copy) ──→ Dialogue selection tuning -``` - -**Critical path to wow moment #3 (THE FRIEND contradiction):** -Knowledge graph → Contradiction detection → FRIEND phase transitions → Spatial staging (routine deviation) → Monologue trigger (observe_npc with deviation condition) → Monologue display → FRIEND content authored and loaded. - -Every block on this chain is either server or copy team work. Client only needs monologue display and relationship color rendering to support #3. **Server and copy are the bottleneck for the emotional peak of the demo.** - ---- - -## Summary - -1. **Format: YAML.** Content authors write it, serde reads it, generators produce it later. -2. **Structure: `global/` + `districts/`.** Vocabulary is global, instances are per-district. Generator-compatible from day one. -3. **Addressing: `canonical_id` in every file.** Maps to `StableId` at runtime via `ContentRegistry`. Deterministic assignment. -4. **Critical path: THE FRIEND arc.** Every technical risk converges on wow moment #3. Server-side systems (monologue triggers, prerequisite evaluation, contradiction detection, spatial staging) and copy-side content (FRIEND profiles, dialogue, monologue) are the two parallel tracks that must converge. -5. **Biggest schedule risk: content conversion + monologue tuning.** The system can be built, but making it *feel right* requires authored content and iteration time. Start the wiki → YAML conversion early so server engineers have real data to test against. diff --git a/docs/workshops/v01-content-scoping/round2-dudley.md b/docs/workshops/v01-content-scoping/round2-dudley.md deleted file mode 100644 index 974f037bc..000000000 --- a/docs/workshops/v01-content-scoping/round2-dudley.md +++ /dev/null @@ -1,787 +0,0 @@ -# Round 2 — Dudley (Server Developer) - -## 1. YAML Acceptance — Loader Adaptation - -Accepted. YAML is the content format for v0.1. The lead has spoken and Tyre's rationale is sound — content authors (Mellanie, Paula) need to write and read these files, and `serde_yaml` is mature enough for our needs. - -### What Changes in the Loader - -Almost nothing structurally. The `serde` derive macros work identically across formats — the Rust structs stay the same, only the deserializer call changes: - -```rust -// Round 1 (RON): -// let profile: NpcProfile = ron::from_str(&content)?; - -// Round 2 (YAML): -let profile: NpcProfile = serde_yaml::from_str(&content)?; -``` - -The 6-phase load sequence from Round 1 is format-agnostic. All phase ordering, validation rules, and resource creation remain identical. Specific adaptations: - -| Item | Round 1 (RON) | Round 2 (YAML) | Impact | -|------|---------------|----------------|--------| -| Manifest | `content/manifest.ron` | `content/content.yaml` | Filename only | -| NPC profiles | `.ron` files | `.yaml` files | Extension only | -| Dialogue/monologue | `.ron` files | `.yaml` files | Extension only | -| Multi-line text | Rust string escaping | YAML native `\|` / `>` blocks | Better for authors — no escaping | -| Validation | Serde-only | Serde + JSON Schema (Tyre's dual validation) | Strictly more validation | -| Dependency | `ron` crate | `serde_yaml` crate | Swap one dependency | - -The one genuine improvement: YAML's native multi-line text support (`|` for literal blocks) means dialogue and monologue text will be cleaner in the content files. No escaped newlines, no awkward string concatenation. Content authors benefit directly. - -### Cargo.toml Change - -```toml -# Add: -serde_yaml = "0.9" -# The ron crate stays for potential future use (RON converter per lead's decision) -``` - -### RON Converter - -Per the lead's decision, we build a RON converter. My recommendation: - -- **Location:** `tooling/content-converter/` — a small Rust binary, not part of the server -- **Direction:** YAML → RON only (content files are authored in YAML; if we ever want RON for hot-path loading, the converter produces it) -- **When it runs:** Build-time, optional. Not load-time — the server loads YAML directly. The converter is insurance for a hypothetical future where YAML parse speed matters (it won't for v0.1) -- **Priority:** Low. Build it when someone asks for it, not proactively - ---- - -## 2. Multi-Action Interaction Model - -### The Architecture: N Actions, 1 Client Selection - -The server computes ALL available actions for each nearby entity. The `InteractionOptions` struct from Round 1 already supports this. The v0.1 client selects the top-ranked action to display. The v0.2 client shows the full list. - -```rust -/// Available interactions for a nearby entity. -/// Server computes all; client displays based on version. -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct EntityInteractions { - /// StableId of the target entity - pub entity_id: u64, - /// Display name (knowledge-filtered — "Dock Worker" or "Kael Davan") - pub display_name: String, - /// All available actions, ordered by priority (highest first). - /// v0.1 client shows actions[0] only. - /// v0.2+ client shows all (radial menu, list, etc.) - pub actions: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct AvailableAction { - /// Action identifier used in PlayerAction::InteractWith - pub action_id: String, - /// What the action is - pub kind: ActionKind, - /// Display label for the client ("Talk", "Examine", "Ask about the schedule") - pub label: String, - /// Priority for v0.1 single-action selection (higher = shown first) - pub priority: u8, - /// Can this action be performed right now? - pub enabled: bool, - /// Why not? (shown as tooltip in v0.2+, ignored in v0.1) - pub disabled_reason: Option, -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] -pub enum ActionKind { - /// Study the entity without initiating contact. - /// Updates knowledge graph with behavioral observations. - Examine, - /// Initiate dialogue. Opens conversation state. - Talk, - /// Look at an environmental object. Returns description + knowledge grants. - ExamineObject, - /// Listen to a nearby NPC-NPC conversation. Passive — no social cost. - Overhear, -} -``` - -### Priority Ranking System - -The server determines action priority per context. This is where the "single context-sensitive action" behavior lives: - -```rust -/// Determine default action priority for a given entity and context. -/// Returns actions sorted by priority (highest first). -fn rank_actions( - target_kind: EntityKind, - observer_knowledge: &KnowledgeGraph, - target_stable_id: &StableId, - target_in_conversation: bool, - target_activity: &str, -) -> Vec { - let mut actions = Vec::new(); - - match target_kind { - EntityKind::Npc => { - // Examine is always available for NPCs in LOS - let examine_priority = if observer_knowledge - .entity_knowledge(target_stable_id) - .map(|ek| ek.known_attributes.contains_key("contradiction_flagged")) - .unwrap_or(false) - { - // Post-contradiction: Examine becomes high priority - // "Watch them more carefully" - 90 - } else { - // Default: Examine is secondary to Talk - 40 - }; - - actions.push(AvailableAction { - action_id: format!("examine_{}", target_stable_id.0), - kind: ActionKind::Examine, - label: "Observe".to_string(), - priority: examine_priority, - enabled: true, - disabled_reason: None, - }); - - // Talk: available if NPC is not sleeping, not in combat, not already - // in conversation with someone else - let talk_enabled = !target_in_conversation - && target_activity != "sleeping"; - - actions.push(AvailableAction { - action_id: format!("talk_{}", target_stable_id.0), - kind: ActionKind::Talk, - label: "Talk".to_string(), - priority: if talk_enabled { 50 } else { 10 }, - enabled: talk_enabled, - disabled_reason: if !talk_enabled { - Some("Busy".to_string()) - } else { - None - }, - }); - - // Overhear: available if NPC is in conversation with another NPC - if target_in_conversation { - actions.push(AvailableAction { - action_id: format!("overhear_{}", target_stable_id.0), - kind: ActionKind::Overhear, - label: "Listen".to_string(), - priority: 60, - enabled: true, - disabled_reason: None, - }); - } - } - EntityKind::Object => { - actions.push(AvailableAction { - action_id: format!("examine_obj_{}", target_stable_id.0), - kind: ActionKind::ExamineObject, - label: "Examine".to_string(), - priority: 50, - enabled: true, - disabled_reason: None, - }); - } - _ => {} - } - - // Sort by priority descending - actions.sort_by(|a, b| b.priority.cmp(&a.priority)); - actions -} -``` - -### How v0.1 and v0.2 Differ — Client Side Only - -| Behavior | v0.1 | v0.2+ | -|----------|------|-------| -| Actions computed | ALL (server computes full list) | ALL (same) | -| Actions sent to client | ALL (via `EntityInteractions.actions`) | ALL (same) | -| Actions displayed | `actions[0]` only — single prompt | All enabled actions — menu/radial | -| Player input | `Interact` → server applies `actions[0]` | `InteractWith(action_id)` → server applies specific action | -| Architecture change needed for v0.2 | **None on server.** Client reads more of the existing data. | Client UI change only | - -The key guarantee: **zero server-side changes for v0.2 multi-verb.** The server already sends everything. The client just reads more of what's already there. - -### PlayerAction Extension - -```rust -pub enum PlayerAction { - // ... existing movement variants ... - - /// v0.1: interact with nearest entity, server picks top action. - Interact, - - /// v0.2+: interact with specific entity using specific action. - /// Falls back to top action if action_id is None. - InteractWith { - target_id: u64, // StableId of target - action_id: Option, // specific action, or None for default - }, - - /// Select a dialogue topic during active conversation. - DialogueSelect { topic: String }, - - /// End the active conversation. - DialogueEnd, -} -``` - -For v0.1, the client sends `Interact`. The server resolves to the nearest entity and applies `actions[0]`. When v0.2 introduces multi-verb UI, the client sends `InteractWith { target_id, action_id }`. The server handles both — `Interact` is syntactic sugar for "find nearest, pick top action." - -### Stig's Question: IPC Message Format - -Stig asked what the state update looks like. The answer: **full text in the message, not IDs for client-side lookup.** This keeps the client thin and prevents information leakage. The `ObserverSnapshot` already carries everything the client needs. Interaction data rides the same channel: - -```rust -/// ObserverSnapshot v3 — adds interaction and dialogue data. -pub struct ObserverSnapshot { - pub version: u8, // 3 - pub tick: u64, - pub game_time: GameTime, - pub player_facing: FacingDirection, - pub entities: Vec, - pub visible_tiles: Vec, - - // v3 additions: - - /// Entities within interaction range with available actions. - /// Empty if no interactable entities are nearby. - pub nearby_interactions: Vec, - - /// Active dialogue state. None if not in conversation. - pub active_dialogue: Option, - - /// Monologue lines triggered this tick. Usually 0 or 1. - pub monologue: Vec, - - /// Overheard conversation fragments. Passive, proximity-based. - pub overheard: Vec, - - /// Current simulation speed (1.0 = normal, 0.5 = overlay, 0.0 = paused). - /// Client uses this to adjust animation/interpolation rates. - pub sim_speed: f32, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct ActiveDialogue { - pub npc_entity_id: u64, - pub npc_name: String, - pub npc_relationship_color: RelationshipState, - /// Current NPC line. None before first line / between lines. - pub current_line: Option, - /// Available topics the player can raise. Empty if conversation is NPC-led. - pub available_topics: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct DialogueLineDisplay { - pub line_id: String, - pub text: String, - pub mood: String, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct TopicOption { - pub topic_id: String, - pub label: String, - pub enabled: bool, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct MonologueDisplay { - pub line_id: String, - pub text: String, - pub trigger: String, - /// true = use urgent chime (observe_anomaly, discover_evidence) - pub urgent: bool, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct OverheardDisplay { - pub speaker_id: u64, - pub speaker_name: String, - pub fragment: String, -} -``` - -Everything the client needs to render is in the snapshot. The client never queries content files. The server is the single source of truth. - ---- - -## 3. Pause System — Tick Rate Modulation - -### The Model: SimulationSpeed Resource - -Currently `SimulationTime` has a boolean `paused` field. That's insufficient for 50% speed. I'll replace it with a speed multiplier model: - -```rust -/// Simulation speed states. -/// Determines how many ticks advance per real-time frame. -#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] -pub enum SimSpeed { - /// Normal speed: 1 tick per frame at target TPS (10 tps per D-031). - Normal, - /// Reduced speed: tick every other frame (50% speed). - /// Used when UI overlays are active (knowledge panel, dialogue). - Overlay, - /// Full pause: no ticks advance. - /// Spacebar toggle. Always available. - Paused, -} - -impl SimSpeed { - /// Returns the tick advance rate. - /// Normal = advance every frame. - /// Overlay = advance every 2nd frame. - /// Paused = never advance. - pub fn should_tick(&self, frame_counter: u64) -> bool { - match self { - SimSpeed::Normal => true, - SimSpeed::Overlay => frame_counter % 2 == 0, - SimSpeed::Paused => false, - } - } - - /// Serialized speed for client animation adjustment. - pub fn as_f32(&self) -> f32 { - match self { - SimSpeed::Normal => 1.0, - SimSpeed::Overlay => 0.5, - SimSpeed::Paused => 0.0, - } - } -} - -/// Resource tracking simulation speed and frame count. -#[derive(Resource, Debug, Clone)] -pub struct SimulationSpeed { - /// Current speed state. - pub speed: SimSpeed, - /// Frame counter for Overlay tick skipping. - pub frame_counter: u64, - /// Stack of speed modifiers. Highest priority wins. - /// When all modifiers are removed, returns to Normal. - speed_stack: Vec, -} - -#[derive(Debug, Clone)] -struct SpeedModifier { - source: SpeedSource, - speed: SimSpeed, - priority: u8, -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] -pub enum SpeedSource { - /// Spacebar toggle — highest priority, always wins. - PlayerPause, - /// Knowledge panel open. - KnowledgePanel, - /// Active dialogue with NPC. - Dialogue, -} -``` - -### State Machine - -``` - ┌──────────┐ - ┌──────→│ Normal │◄──────┐ - │ │ (1.0x) │ │ - │ └────┬─────┘ │ - │ │ │ - close overlay open overlay spacebar - │ │ │ - │ ┌────▼─────┐ │ - ├──────→│ Overlay │──────→│ - │ │ (0.5x) │ │ - │ └────┬─────┘ │ - │ │ │ - │ spacebar │ - │ │ │ - │ ┌────▼─────┐ │ - └───────│ Paused │───────┘ - │ (0.0x) │ - └──────────┘ -``` - -Rules: -1. **Spacebar always toggles full pause.** From Normal → Paused. From Overlay → Paused. From Paused → returns to whatever state was active before pause (Normal or Overlay). -2. **Opening knowledge panel or dialogue → Overlay (50%).** Multiple overlays don't stack — it's 50% whether you have one or three open. -3. **Closing all overlays → Normal.** But only if not explicitly paused by spacebar. -4. **Spacebar overrides everything.** It's the master switch. - -### Implementation: Modified advance_tick - -```rust -/// System: advance tick based on current simulation speed. -/// Replaces the current boolean-paused advance_tick. -pub fn advance_tick( - mut time: ResMut, - mut speed: ResMut, -) { - speed.frame_counter += 1; - - if speed.speed.should_tick(speed.frame_counter) { - time.tick += 1; - } -} - -/// System: process pause/speed PlayerActions. -pub fn process_speed_input( - mut speed: ResMut, - input_events: Res, - // ... other input handling -) { - // Spacebar pause toggle - // When paused by spacebar, restore previous speed on unpause - // Overlay open/close events modify the speed stack -} -``` - -### What the Client Needs to Know - -The `sim_speed: f32` field in ObserverSnapshot v3 tells the client: -- `1.0` → normal animation/interpolation -- `0.5` → halve animation rates, entities move at half speed visually -- `0.0` → freeze all animation, UI stays responsive - -The client doesn't manage pause state. It reads the speed from the snapshot and adjusts rendering accordingly. The server is authoritative. - -### Dialogue-Specific Pause Behavior - -When dialogue is active (player is talking to an NPC), simulation runs at Overlay speed (50%). This means: -- NPCs continue their routines at half speed — the world doesn't freeze when you talk -- Other NPCs can walk past during your conversation — you might miss something -- But it's slow enough that the player doesn't feel punished for engaging in dialogue - -If the player hits spacebar during dialogue, full pause. They can read at their own pace. Spacebar again resumes to Overlay (because dialogue is still active). - ---- - -## 4. FriendArc Phase Transitions — Triggers and Content Dependencies - -### Phase Transition State Machine - -``` - WARMTH ──────→ TRUST ──────→ DOUBT ──────→ CONFLICT - │ │ │ │ - │ auto (tick) │ knowledge │ observation │ knowledge + - │ │ threshold │ + monologue │ dialogue - │ │ │ │ - ▼ ▼ ▼ ▼ - "We're good" "I trust you" "Something's "I know what - wrong" you did" -``` - -### Phase-by-Phase: Triggers, Content, and What the Server Needs - -#### Phase 1: WARMTH → TRUST - -**Trigger:** Interaction count threshold + time elapsed. - -```rust -/// Transition from Warmth to Trust. -/// This is the "getting to know you" phase — automatic progression -/// as the player interacts with the FRIEND over time. -fn check_warmth_to_trust( - friend_arc: &FriendArc, - interaction_log: &InteractionLog, - time: &SimulationTime, -) -> bool { - let interactions_with_friend = interaction_log - .count_interactions(friend_arc.bonded_character, friend_arc.friend_entity); - let time_since_first = time.tick.saturating_sub( - interaction_log.first_interaction_tick( - friend_arc.bonded_character, friend_arc.friend_entity - ).unwrap_or(time.tick) - ); - - // Require both: enough interactions AND enough time. - // Prevents rushing through the arc by spam-talking. - interactions_with_friend >= 3 && time_since_first >= 600 // 1 game-hour -} -``` - -**Content required:** -- 5-8 dialogue lines for Warmth phase (casual, friendly, establishing rapport) -- 3-5 monologue lines for Warmth (positive: "Kael's reliable. Good to have someone you can count on.") -- Trust transition is silent — no dramatic moment. The player just notices the FRIEND is warmer - -**Server state change:** `FriendArc.phase = Trust`. No knowledge graph change. No visual change. The NPC's dialogue pool shifts to Trust-phase lines (gated by the `situation: [friend_trust]` tag). - -#### Phase 2: TRUST → DOUBT - -**Trigger:** Knowledge threshold — the player character learns specific facts that create tension. - -```rust -/// Transition from Trust to Doubt. -/// Requires the bonded character to accumulate suspicious knowledge. -/// NOT a single event — it's a gradual shift. -fn check_trust_to_doubt( - friend_arc: &FriendArc, - observer_kg: &KnowledgeGraph, -) -> bool { - // The character must know at least ONE of the doubt-triggering facts - // at KnowsOf or higher confidence. - let doubt_facts = &friend_arc.doubt_trigger_facts; - - doubt_facts.iter().any(|fact_id| { - observer_kg.fact_at_least(fact_id, KnowledgeConfidence::KnowsOf) - }) -} -``` - -**Content required for Kael (smuggler's FRIEND):** -- Doubt-triggering facts (defined in NPC profile): - - `"kael.schedule_inconsistency"` — Kael's routine doesn't fully match the posted schedule - - `"ring.internal_pressure"` — the smuggler learns the ring is under strain -- 5-8 dialogue lines for Trust phase (deeper, more personal, sharing more) -- 3-5 monologue lines for Doubt phase (questioning: "Kael left early again. Third time this rotation. Where does he go?") -- Tell acceleration: Kael's tells become more frequent in Doubt phase. The `tell_stage` counter advances, making tells more visible - -**Content required for Sera (detective's FRIEND):** -- Doubt-triggering facts: - - `"sera.avoidance_pattern"` — Sera consistently avoids Torek Lintar - - `"investigation.evidence_gap"` — evidence exists that should have been reported but wasn't -- Same line counts as Kael, detective-perspective - -**Server state change:** `FriendArc.phase = Doubt`. Tell stage advances (`tell_stage += 1`). Monologue pool shifts. No visual change yet — the entity color stays green (Friendly). The player should feel uneasy but not alarmed. - -#### Phase 3: DOUBT → CONFLICT - -**Trigger:** Direct observation of the contradiction. This is the critical moment — wow moment #3. - -```rust -/// Transition from Doubt to Conflict. -/// Requires DIRECT OBSERVATION of the contradiction. -/// This cannot be told to the player — they must SEE it. -fn check_doubt_to_conflict( - friend_arc: &FriendArc, - observer_kg: &KnowledgeGraph, -) -> bool { - // ALL contradiction facts must be known at KnowsDetails or higher. - // At least one must have source = DirectObservation. - let all_known = friend_arc.contradiction_facts.iter().all(|fact_id| { - observer_kg.fact_at_least(fact_id, KnowledgeConfidence::KnowsDetails) - }); - - // The discovery flag is set by the spatial staging system - // when the player observes the FRIEND in the wrong place. - all_known && friend_arc.contradiction_discovered -} -``` - -**How `contradiction_discovered` gets set — spatial staging:** - -This is the hardest part. The server must arrange for the FRIEND to be in a specific place at a specific time, and the player must be able to observe it. The simulation can't script this — it must create the opportunity and let the player find it. - -```rust -/// System: check if the bonded character observes the FRIEND -/// in a contradiction location during a contradiction window. -fn check_contradiction_observation( - friend_query: Query<(&FriendArc, &NpcRoutine, &TilePosition), With>, - observer_query: Query<(&KnowledgeGraph, &TilePosition), With>, - location_map: Res, - time: Res, - mut event_queue: ResMut, -) { - for (arc, routine, npc_pos) in friend_query.iter() { - if arc.phase != FriendPhase::Doubt { - continue; - } - - // Is the FRIEND currently at their contradiction location? - let at_contradiction = arc.contradiction_location.as_ref() - .map(|loc| location_map.contains_position(loc, npc_pos)) - .unwrap_or(false); - - // Is it the right time window? - let in_window = arc.contradiction_time_window.as_ref() - .map(|w| w.active_at(&time)) - .unwrap_or(true); // no time window = always active - - if !at_contradiction || !in_window { - continue; - } - - // Is the bonded character observing? - // (They must have LOS to the FRIEND's current position) - // The perception system handles LOS. We check if the bonded - // character has Direct confidence on the FRIEND. - for (obs_kg, _obs_pos) in observer_query.iter() { - if let Some(entry) = obs_kg.entity_knowledge(&arc.friend_stable_id) { - if entry.confidence == KnowledgeConfidence::Direct { - // The player character is looking at their FRIEND - // in the wrong place at the wrong time. - // This is wow moment #3. - - // Emit knowledge event for contradiction facts - // Emit monologue trigger (observe_npc with deviation) - // Set contradiction_discovered = true - } - } - } - } -} -``` - -**Content required for the contradiction moment:** -- **Kael:** Observed in Corridor B-7 (maintenance corridors) during shift transition, meeting unknown contact. The smuggler knows Kael has no reason to be there. - - Monologue line (urgent chime): "Kael? In Corridor B-7? During shift transition? He has no reason to be there. None that I know of." (`terminal_m_s_012` from Tyre's example) - - Knowledge grant: `"kael.secret_meetings": KnowsDetails` - - Knowledge grant: `"kael.restricted_corridor_visits": KnowsDetails` -- **Sera:** Observed avoiding Torek Lintar (turning away when he enters the bar). The detective recognizes the pattern. - - Monologue line (urgent chime): detective-equivalent — recognizing deliberate avoidance - - Knowledge grant: `"sera.avoidance_pattern": KnowsDetails` - -**Server state change:** `FriendArc.phase = Conflict`. `FriendArc.contradiction_discovered = true`. **RelationshipState shifts: Friendly → PersonOfInterest.** Entity color shifts green → amber (D-033, 0.5s fade). Tell stage maxes out. Dialogue pool shifts to Conflict-phase lines. - -This is the single most important moment in the vertical slice. State consistency requires: -1. Knowledge graph updated with contradiction facts -2. FriendArc phase advanced -3. RelationshipState changed -4. Monologue triggered (urgent) -5. Entity color change visible in next ObserverSnapshot - -All five must happen atomically within the same tick. I need to verify the tick order handles this correctly — knowledge event processing must complete before snapshot generation. - -#### Phase 4: CONFLICT (Terminal) - -**Trigger:** None — this is the final phase. The player is in Conflict with their FRIEND. - -**Content required:** -- 8-12 Conflict-phase dialogue lines (confrontation options, defensive NPC responses, the NPC's sympathetic motivation revealed) -- 5-8 Conflict-phase monologue lines (the character processing betrayal, re-evaluating past interactions) -- No clean resolution — D-034 mandates this. The conversation can happen, understanding can emerge, but the trust is broken - -**Server state:** `FriendArc.phase = Conflict`. RelationshipState stays PersonOfInterest (or shifts to Hostile if the confrontation goes badly). The arc is complete. - -### Revised FriendArc Component - -```rust -#[derive(Component, Debug, Clone, Serialize, Deserialize)] -pub struct FriendArc { - /// Which character this FRIEND is bonded to (StableId). - pub bonded_character: StableId, - /// StableId of this FRIEND NPC (for knowledge graph lookups). - pub friend_stable_id: StableId, - /// Current phase. - pub phase: FriendPhase, - - // --- Transition triggers --- - - /// Facts that trigger Doubt phase (any one sufficient). - pub doubt_trigger_facts: Vec, - /// Facts that constitute the full contradiction (all required for Conflict). - pub contradiction_facts: Vec, - /// Location where the contradiction occurs. - pub contradiction_location: Option, // canonical location ID - /// Time window for the contradiction (day phase + optional minute range). - pub contradiction_time_window: Option, - - // --- State tracking --- - - /// Tell visibility stage (0 = minimal, advances as phase progresses). - pub tell_stage: u8, - /// Has the bonded character directly observed the contradiction? - pub contradiction_discovered: bool, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct TimeWindow { - pub phase: DayPhase, - pub start_minute: Option, // within the phase - pub end_minute: Option, -} - -impl TimeWindow { - pub fn active_at(&self, time: &SimulationTime) -> bool { - if time.day_phase() != self.phase { - return false; - } - let tod = time.time_of_day_minutes(); - let phase_start = match self.phase { - DayPhase::Morning => 0, - DayPhase::Afternoon => 360, - DayPhase::Evening => 720, - DayPhase::Night => 1080, - }; - let start = phase_start + self.start_minute.unwrap_or(0); - let end = phase_start + self.end_minute.unwrap_or(360); - tod >= start && tod < end - } -} -``` - -### Content Summary — What I Need from Mellanie and Paula - -| FRIEND NPC | Phase | Lines Needed | Type | Blocker? | -|-----------|-------|-------------|------|----------| -| **Kael** | Warmth | 5-8 | dialogue (casual, friendly) | No — generic enough to synthesize | -| **Kael** | Warmth | 3-5 | monologue (positive, routine) | No | -| **Kael** | Trust | 5-8 | dialogue (personal, deeper) | Yes — needs character voice | -| **Kael** | Trust | 3-5 | monologue (warming, comfortable) | Yes | -| **Kael** | Doubt | 5-8 | dialogue (evasive, stressed) | Yes | -| **Kael** | Doubt | 3-5 | monologue (questioning, uneasy) | Yes | -| **Kael** | Conflict | 8-12 | dialogue (confrontation, revelation) | Yes — most critical | -| **Kael** | Conflict | 5-8 | monologue (processing, betrayal) | Yes | -| **Kael** | Contradiction | 1 | monologue (urgent, wow moment #3) | **CRITICAL** | -| **Sera** | (same counts) | ~35-46 | (same breakdown) | Same blockers | - -**Total per FRIEND NPC: ~35-46 authored lines minimum.** -**Total for both: ~70-92 lines.** - -This aligns with D-034's estimate of 70-100 per FRIEND. The breakdown by phase is what I need to test each transition independently. - -### Interaction Log Component - -I need a lightweight interaction tracking component to support the Warmth → Trust transition: - -```rust -/// Tracks interaction history between entities. -/// Used for FriendArc Warmth→Trust transition and future NOBODY promotion. -#[derive(Component, Debug, Clone, Serialize, Deserialize)] -pub struct InteractionLog { - /// (target_stable_id, tick) pairs. - /// BTreeMap for deterministic iteration. - pub interactions: BTreeMap>, -} - -impl InteractionLog { - pub fn new() -> Self { - Self { interactions: BTreeMap::new() } - } - - pub fn record(&mut self, target: StableId, tick: u64) { - self.interactions.entry(target).or_default().push(tick); - } - - pub fn count(&self, target: &StableId) -> usize { - self.interactions.get(target).map(|v| v.len()).unwrap_or(0) - } - - pub fn first_tick(&self, target: &StableId) -> Option { - self.interactions.get(target).and_then(|v| v.first().copied()) - } -} -``` - -This also becomes the foundation for NOBODY tier promotion in v0.2 — the same interaction counter that drives FriendArc Warmth→Trust will drive NOBODY→NOTICED. Building it now means zero rework later. - ---- - -## Summary of Round 2 Deliverables - -| Decision | Resolution | -|----------|-----------| -| **YAML format** | Accepted. `serde_yaml` replaces `ron` for content loading. RON converter in `tooling/` as low-priority insurance. | -| **Multi-action model** | Server computes ALL available actions per entity, ranked by priority. v0.1 client shows `actions[0]`. v0.2 client shows all. Zero server changes needed for v0.2. | -| **Pause system** | `SimSpeed` enum: Normal (1.0x), Overlay (0.5x), Paused (0.0x). Spacebar always toggles full pause. UI overlays trigger Overlay speed. Speed stack with priority resolution. | -| **FriendArc transitions** | 4-phase state machine with explicit triggers: Warmth (interaction count + time) → Trust (knowledge threshold) → Doubt (specific facts) → Conflict (direct observation of contradiction). Contradiction detection requires spatial staging system. | - -### Dependencies I'm Tracking - -1. **ObserverSnapshot v3** — Tyre needs to sign off on the protocol extension. I've proposed the full struct. Stig needs the `sim_speed` field and `nearby_interactions` / `active_dialogue` / `monologue` / `overheard` fields. -2. **FRIEND content packs** — Mellanie needs to produce phase-tagged dialogue and monologue lines per the breakdown above. These unblock integration testing of the FriendArc state machine. -3. **Contradiction spatial data** — Paula needs to specify the exact contradiction setup for Kael and Sera in the NPC profiles: which location, which time window, what the contradiction looks like when observed. -4. **FactId catalog** — Still the #1 blocker. I need the machine-readable fact vocabulary before I can build prerequisite evaluation. Gestalt and Paula produce this. diff --git a/docs/workshops/v01-content-scoping/round2-gestalt.md b/docs/workshops/v01-content-scoping/round2-gestalt.md deleted file mode 100644 index 05d4f2488..000000000 --- a/docs/workshops/v01-content-scoping/round2-gestalt.md +++ /dev/null @@ -1,422 +0,0 @@ -# Round 2 — Gestalt (Systems Design) - -*cracks knuckles* - -Four resolution tasks. Let me be honest about each. - ---- - -## Task 1: Canonical NPC Mapping (Definitive) - -The lead confirmed my mechanical mapping wins for v0.1. Paula's emotional/narrative reads become v0.2 annotations. But "winning" doesn't mean refusing to learn from the disagreements. I reviewed all 10 and changed my mind on 6 of them. - -### Changes from Round 1 (Where Paula Was Right) - -Let me be transparent about what I got wrong and why: - -| NPC | My R1 | Paula's R1 | Final R2 | Who Was Right | Why I Changed | -|-----|-------|-----------|----------|---------------|---------------| -| **Maret** (pattern) | SYSTEM | WITNESS | **WITNESS** | Paula | Maret's v0.1 function is defined by what she SAW, not her institutional role. The player (both characters) approaches Maret because she carries information. SYSTEM describes her job; WITNESS describes her story function. | -| **Maret** (motivation) | WITNESS | SKEPTIC | **SKEPTIC** | Paula | If pattern is WITNESS and motivation is WITNESS, there's no compositional tension. WITNESS+SKEPTIC = "she saw something AND she doubts" — the doubt makes her dangerous because she might ACT. Data-driven doubt IS skepticism. | -| **Resha** (motivation) | SKEPTIC | CIVILIAN | **CIVILIAN** | Paula | CATALYST+SKEPTIC implies deliberate questioning. CATALYST+CIVILIAN = "innocent disruption" — Resha doesn't INTEND to cause problems. The accidental quality makes the disruption more realistic and more dangerous (you can't negotiate with curiosity). | -| **Harek** (pattern) | GHOST | ANCHOR | **ANCHOR** | Paula | Harek is PHYSICALLY PRESENT. GHOST means absent power; Harek is at the bar playing cards. His leverage on Drin is indirect, but HE isn't absent. Paula's read: Harek embodies complacent contentment whose comfort accidentally creates a tool for others. The "unconscious lever" is more interesting than "invisible puppeteer." | -| **Drin** (pattern) | REMNANT | SYSTEM | **SYSTEM** | Paula | Paula nailed this: "The dock inspector IS the inspection system. His compromise means the system itself is corrupted." REMNANT requires historical depth a 40-year-old station doesn't have. Drin doesn't remember centuries of tradition — he remembers 5 years ago. That's not REMNANT-scale. SYSTEM+TURNCOAT = institutional rot. | -| **Sabel** (pattern) | THRESHOLD | GHOST | **GHOST** | Paula | Sabel is off-station with 1-2 brief visits. The player doesn't interact with Sabel enough for THRESHOLD mechanics (getting past a gatekeeper). The player learns about Sabel through others' references. That's GHOST — absent power shaping events through supply chain influence. | -| **Olin** (motivation) | SKEPTIC (dual) | CIVILIAN | **CIVILIAN** | Paula | Dropped dual designation. At Tier 3, Olin has 10-15 lines. Not enough content for SKEPTIC function. CIVILIAN is the safe tag — if Olin gets promoted to T2 in v0.2, the hidden motivation can be revealed. 1 pattern + 1 motivation per NPC, no exceptions. | - -### What I Kept (Where My Mechanical Read Holds) - -| NPC | Disagreement | My R1 | Final R2 | Why I'm Keeping It | -|-----|-------------|-------|----------|-------------------| -| **Voss** (motivation) | OPERATOR vs HANDLER | OPERATOR | **OPERATOR** | Voss RUNS the schedule. That's operating, not handling. HANDLER implies top-down pressure — Devra and Harek do that. Voss is middle management: competent, procedural, operating the machinery. The schedule IS his operation. | -| **Devra** (motivation) | HANDLER vs OPERATOR | HANDLER | **HANDLER** | Devra conveys Nils's strategy, manages external contacts, delivers escalation demands. That's pressure from above. She doesn't run day-to-day operations (Kael, Renn, Voss do). She manages the people who run things. | -| **Sess** (pattern) | ANCHOR vs NOBODY | ANCHOR | **ANCHOR** | NOBODY is deferred to v0.2. Tagging Sess as NOBODY means the tag does nothing in v0.1. ANCHOR at T3 = contentment as atmospheric texture. The bartender who sees everything and says nothing because his life is fine. v0.2 note: Sess could be retagged NOBODY if dynamic tier promotion activates. | - -### The Definitive v0.1 NPC Mapping - -| # | Name | Tier | Pattern | Motivation | Composition Read | -|---|------|------|---------|-----------|-----------------| -| 1 | **Kael Davan** | **T1** | **FRIEND** | **OPERATOR** | Trust anchor running ring cargo. Identity betrayal: "I was your friend AND your co-conspirator." | -| 2 | **Sera Venn** | **T1** | **FRIEND** | **WITNESS** | Trust anchor carrying unreported evidence. Concealment betrayal: "I was your friend AND I was hiding evidence." | -| 3 | **Naia Tamm** | **T1*** | **MIRROR** | **CIVILIAN** | Honest transparency, no secrets, uninvolved. "The one person not lying — surrounded by liars." | -| 4 | **Voss** | T2 | **SYSTEM** | **OPERATOR** | Institutional authority operating the schedule that enables smuggling. Corrupted machinery: "The system works — for the wrong people." | -| 5 | **Lera Sessik** | T2 | **ANCHOR** | **OPERATOR** | Contentment embodied, running a bar on willful ignorance. Profitable blindness: "Is this enough? Yes — if I don't look." | -| 6 | **Torek Lintar** | T2 | **CATALYST** | **CIVILIAN** | Spending disrupts equilibrium. Uninvolved, just living visibly. Accidental signal: "He doesn't know he's a liability." | -| 7 | **Devra** | T2 | **THRESHOLD** | **HANDLER** | Ring gatekeeper, manages operations from above. Obstacle with authority: "You go through her or you don't go." | -| 8 | **Maret Korr** | T2 | **WITNESS** | **SKEPTIC** | Accidentally observed discrepancies, doubts the numbers. Dangerous knowledge: "She saw something and she can't stop questioning it." | -| 9 | **Resha** | T2 | **CATALYST** | **CIVILIAN** | New hire forcing defensiveness with innocent questions. Accidental disruption: "She just asked. Everyone flinched." | -| 10 | **Drin** | **T2** | **SYSTEM** | **TURNCOAT** | Inspector whose compromise corrupts the institution. Loyalty shifting under coercion. Institutional rot: "The inspection system is broken because the inspector is broken." | -| 11 | **Renn** | T2 | **THRESHOLD** | **OPERATOR** | Courier controlling cargo flow. Physical gatekeeper: "Renn moves the product. Trace Renn, find the route." | -| 12 | **Pell** | T2 | **CATALYST** | **TURNCOAT** | Wavering member forcing potential crisis. Maximum instability: "When Pell breaks, everything moves." | -| 13 | **Harek** | T2 | **ANCHOR** | **HANDLER** | Complacent contentment whose comfort creates a tool. Unconscious lever: "Harek doesn't know his card games built a weapon." | -| 14 | **Sess** | T3 | **ANCHOR** | **CIVILIAN** | Quiet contentment behind the bar. Social wallpaper: "Sees everything, says nothing — because nothing's wrong with HIS life." | -| 15 | **Olin** | T3 | **CATALYST** | **CIVILIAN** | New arrival forcing evaluation. Ambiguous intent: "Friend or threat? The question IS the disruption." | -| 16 | **Sabel** | T3 | **GHOST** | **OPERATOR** | Off-station absent power running the supply chain. Distant machinery: "Sabel shapes events from elsewhere." | -| 17 | **Tav** | T3 | **SYSTEM** | **CIVILIAN** | Ring lookout following procedure. Lowest rung: "Tav watches the door. That's the whole job." | - -*Off-stage:* - -| NPC | Pattern | Motivation | Notes | -|-----|---------|-----------|-------| -| **Nils Davan** | **GHOST** | **HANDLER** | Absent authority applying pressure through intermediaries. | - -### Pattern Distribution (Final) - -| Pattern | Count | NPCs | Coverage | -|---------|-------|------|----------| -| FRIEND | 2 | Kael, Sera | Full (D-034 production level) | -| MIRROR | 1 | Naia Tamm | Full (T1 emotional depth) | -| ANCHOR | 3 | Lera, Harek, Sess | Full + sketch. Three versions of "is this enough?" | -| SYSTEM | 3 | Voss, Drin, Tav | Full + sketch. Institutional machinery (legit + criminal) | -| CATALYST | 3 | Torek, Resha, Pell | Full. Three disruption modes (accidental, innocent, deliberate) | -| THRESHOLD | 2 | Devra, Renn | Full. Access gatekeepers (organizational + physical) | -| WITNESS | 1 | Maret | Full. Data-driven information carrier | -| GHOST | 1+1 | Sabel (+Nils off-stage) | Light. Absent power through supply/authority | -| REMNANT | 0 | — | Correctly absent. 40-year station lacks historical depth. | -| NOBODY | 0 | — | Deferred to v0.2. Data ships (hidden fields in content). | - -8 of 9 patterns present. All 6 motivations present. - -### Motivation Distribution (Final) - -| Motivation | Count | NPCs | -|-----------|-------|------| -| OPERATOR | 5 | Kael, Voss, Lera, Renn, Sabel | -| CIVILIAN | 6 | Naia Tamm, Torek, Resha, Olin, Sess, Tav | -| HANDLER | 2+1 | Devra, Harek (+Nils off-stage) | -| WITNESS | 1 | Sera | -| TURNCOAT | 2 | Drin, Pell | -| SKEPTIC | 1 | Maret | - -CIVILIAN at 6/17 (35%) — matches D-029's noise floor requirement (~30% flat). OPERATOR at 5 reflects a logistics hub where everyone is RUNNING something. All 6 motivations represented. - -### Why This Mapping Creates Interesting Decisions - -**ANCHOR saturation (3):** Three different answers to "is this enough?" Lera: "Yes, if I don't look." Harek: "Yes, absolutely — pass me the cards." Sess: "Yes, and I'd rather you didn't disturb it." This isn't redundancy — it's the thematic floor the investigation disrupts. The player walks through contentment before contamination touches it. - -**SYSTEM × TURNCOAT (Drin):** The most mechanically productive composition in the set. The institution IS the character AND the character is betraying the institution. For the detective: crack the inspector, crack the system. For the smuggler: keep the inspector quiet, keep the system working for you. Same NPC, inverted interactions. That's the dual-lens proof. - -**CATALYST diversity (3 types):** Torek disrupts through SPENDING (accidental, financial signal). Resha disrupts through ASKING (innocent, social signal). Pell disrupts through WAVERING (deliberate, operational signal). Three types of disruption, three types of player assessment. The smuggler reads them as threats with different urgency levels. The detective reads them as leads with different reliability levels. - ---- - -## Task 2: Generic Key Architecture (The Bloat Question) - -The lead asks: *"If the original EntityKnowledge set was incomplete for the smuggler, are we doing this again for the administrator or the corporate tycoon?"* - -The answer is **no — if we design the keys correctly now.** - -### The Problem with Per-Archetype Keys - -My Round 1 proposal: 4 smuggler-specific keys (`exposure_risk`, `loyalty_assessment`, `cover_integrity`, `moral_weight`). If we repeat this for 8 archetypes: - -``` -8 archetypes × 4 unique keys = 32 archetype-specific keys -+ 14 shared keys -= 46 total keys (unsustainable) -``` - -Administrator needs `bureaucratic_leverage`, `regulatory_compliance`... -Merchant needs `market_position`, `asset_vulnerability`... -Every archetype spawns its own vocabulary. That's schema bloat AND content bloat (every NPC profile must have 46 fields). - -### The Solution: 4 Generic Perspective Keys - -Look at what my 4 smuggler keys actually represent at the ABSTRACT level: - -| Smuggler Key | Abstract Question | -|-------------|-------------------| -| `exposure_risk` | "How does this NPC threaten MY operational position?" | -| `loyalty_assessment` | "How reliably will this NPC act in MY interest?" | -| `cover_integrity` | "How well is the relevant deception holding?" | -| `moral_weight` | "How morally culpable is this NPC in MY judgment?" | - -These questions are UNIVERSAL. Every archetype asks them — just with different words: - -| Abstract Question | Smuggler | Detective | Administrator | Merchant | -|------------------|----------|-----------|--------------|----------| -| "How does this NPC threaten my position?" | "Will they expose the ring?" | "Will they obstruct my investigation?" | "Will they expose my corruption?" | "Will they undercut my deal?" | -| "How reliably will this NPC serve my interests?" | "Can I count on them in operations?" | "Will they testify/cooperate?" | "Will they vote with me?" | "Will they honor the contract?" | -| "How well is the deception holding?" | "Is their cover solid?" | "Is my informant still believable?" | "Does the public still buy it?" | "Does the competitor still trust me?" | -| "How culpable is this NPC?" | "How deep in the ring?" | "How guilty?" | "How corrupt?" | "How honest?" | - -**Same 4 questions. Same 4 keys. 8 archetypes.** - -### Proposed Generic Keys - -| Key Name | Value Enum | What It Stores | -|----------|-----------|---------------| -| `threat_to_position` | `"none"`, `"low"`, `"moderate"`, `"high"`, `"critical"` | Observer's assessment of how this NPC threatens the observer's operational security, institutional standing, or strategic position. | -| `reliability` | `"solid"`, `"dependable"`, `"uncertain"`, `"wavering"`, `"hostile"` | Observer's assessment of how predictably this NPC will serve the observer's interests. | -| `facade_status` | `"solid"`, `"thin"`, `"cracking"`, `"blown"`, `"N/A"` | Status of any active deception involving this NPC (their cover, the observer's cover, a shared front). N/A if no deception in play. | -| `moral_standing` | `"innocent"`, `"peripheral"`, `"complicit"`, `"compromised"`, `"willing"` | Observer's subjective moral assessment of this NPC within the observer's ethical framework. | - -### How Interpretation Works - -The key stores GENERIC data. The monologue system provides CHARACTER-SPECIFIC interpretation through D-032's hard partition (separate pools per character). - -**Same NPC, same keys, different character pools:** - -```yaml -# Smuggler monologue about Maret -- id: hub_m_031 - text: "Maret's been checking manifests again. She's going to notice something she can't un-notice." - character: smuggler - trigger: observe_npc - prerequisite: - target.known_attributes.threat_to_position: "high" - target.known_attributes.name: "Maret Korr" - -# Detective monologue about Maret -- id: hub_m_032 - text: "Korr looks worried. She processes manifests — if the numbers are off, she'd know." - character: detective - trigger: observe_npc - prerequisite: - target.known_attributes.threat_to_position: "high" - target.known_attributes.name: "Maret Korr" -``` - -Same key (`threat_to_position: "high"`), same NPC — but the smuggler reads it as "she's a risk to the operation" while the detective reads it as "she's a potential witness at risk." The interpretation lives in the monologue text, not in the key schema. - -### Why This Scales to 8 Archetypes Without Bloat - -| Archetype | threat_to_position means... | reliability means... | facade_status means... | moral_standing means... | -|-----------|---------------------------|---------------------|----------------------|------------------------| -| Smuggler | Exposure risk to the ring | Operational loyalty | Cover integrity | Innocent vs. complicit | -| Detective | Obstruction to investigation | Cooperation likelihood | Informant/cover status | Guilt level | -| Administrator | Political liability | Voting alignment | Public image coherence | Corruption level | -| Merchant | Competitive threat | Contract reliability | Deal integrity | Business ethics | -| Newcomer | Social danger | Friendliness | Acceptance facade | Community trustworthiness | -| Operator | Operations disruption | Team dependability | Mission cover | Professional ethics | -| Exile | Personal danger | Alliance reliability | Identity concealment | Threat vs. ally | -| Fixer | Client risk | Job reliability | Operation facade | How dirty | - -**Total EntityKnowledge keys: 18.** 14 shared + 4 generic perspective. Works for all 8 archetypes. No additional keys needed at v1.0. - -### Value Enum Design - -The enums are deliberately archetype-neutral: - -- `"solid"` / `"dependable"` / `"uncertain"` / `"wavering"` / `"hostile"` — these words work in ANY context. A smuggler reads "wavering" as "might turn on us." A detective reads "wavering" as "might cooperate if pressured." Same word, different operational meaning. - -- `"innocent"` / `"peripheral"` / `"complicit"` / `"compromised"` / `"willing"` — these work for any moral framework. A smuggler uses them to track guilt distance from the ring. An administrator uses them to track corruption distance from a scandal. The progression is the same. - -### How Content Authors Use This - -NPC profiles get a SINGLE set of character-perspective attributes, not per-archetype sections: - -```yaml -# In kael-davan.yaml, perspective section -perspectives: - smuggler: - threat_to_position: "low" # Kael is reliable (pre-contradiction) - reliability: "solid" # Trusted colleague - facade_status: "solid" # Cover holds (pre-contradiction) - moral_standing: "willing" # Fully committed ring member - detective: - threat_to_position: "moderate" # Kael handles cargo on suspicious shifts - reliability: "uncertain" # Unknown cooperativeness - facade_status: "solid" # Appears to be a normal dock worker - moral_standing: "complicit" # Connected to discrepancies (if known) -``` - -Content authors populate perspective values per character in the NPC YAML. The server loads these as initial `known_attributes` values for each character's knowledge graph. Values update through gameplay (Kael's `facade_status` shifts from `"solid"` to `"cracking"` when tells accumulate). - -### Addressing Paula's 8-Key Proposal - -Paula proposed all 8 smuggler attributes as new keys. My generic architecture maps her proposal: - -| Paula's Key | Maps To | Notes | -|-------------|---------|-------| -| `trust_read` | `trust_level` (existing) | Same key, context-dependent interpretation. Already works. | -| `exposure_risk` | `threat_to_position` (generic) | Renamed for archetype-neutrality. | -| `loyalty_assessment` | `reliability` (generic) | Renamed. | -| `leverage_held` | `secret_held` (existing) | Leverage IS secret knowledge. Same storage. | -| `social_debt` | Deferred to v0.2 | 30-minute session doesn't develop favor economy. | -| `moral_weight` | `moral_standing` (generic) | Renamed. | -| `cover_integrity` | `facade_status` (generic) | Renamed. | -| `loyalty_conflict` | Deferred to v0.2 | Inferable from `behavior_flags` + `reliability`. | - -**Result:** 2 existing keys reused + 4 generic keys created + 2 deferred. Total schema: 18 keys. Works for 8 archetypes. - ---- - -## Task 3: Self-Contained Triangle Forks (Confirmed) - -**I agree with Tyre's recommendation: self-contained forks for v0.1, no cross-triangle cascade.** - -But "self-contained" needs a precise definition, because there's a trap: - -### The Shared-NPC Problem - -Voss appears in BOTH Triangle 1 (Hub Power) and Triangle 2 (Worried Knowledge). If the smuggler escalates in Triangle 1, Voss gets more anxious. That anxiety is part of Voss's ENTITY STATE — it's stored in `behavior_flags`, `routine_pattern`, etc. If Triangle 2's fork reads Voss's entity state, then Triangle 1's decision HAS cascaded into Triangle 2. - -Is that a cross-triangle cascade? Technically yes. Should we prevent it? **No — that would require NPCs to have separate states per triangle, which is absurd.** - -### What "Self-Contained" Actually Means - -**Self-contained forks = independent decision state machines, shared NPC state.** - -| Allowed (v0.1) | Not Allowed (v0.2+) | -|----------------|---------------------| -| Each triangle has its own fork with its own trigger, decision, and outcome | Triangle 1's OUTCOME directly gates Triangle 2's FORK (if T1 escalates, T2 fork changes) | -| NPCs carry behavioral state across triangles (Voss's anxiety is visible everywhere) | Triangle forks modify other triangles' state machines (T1 pushes T2 from state A to state B) | -| Players OBSERVE cross-triangle effects through NPC behavior | Fork resolution in one triangle REQUIRES resolution of another | -| Monologue can reference NPC state from any source | The storyteller sequences forks based on other forks' outcomes | - -**In implementation:** - -``` -Triangle 1 Fork: - trigger: Devra delivers Nils's escalation demand - decision: smuggler chooses escalate/stabilize/mediate - outcome: modifies Voss.behavior_flags, Kael.behavior_flags - DOES NOT: modify Triangle 2's fork state - -Triangle 2 Fork: - trigger: detective notices Maret's manifest re-checking pattern - decision: detective approaches Maret or pressures Drin - outcome: modifies Maret.trust_level, Drin.cover_integrity - DOES NOT: depend on Triangle 1's resolution - -Shared state visible to both: - Voss.behavior_flags may contain "nervous" from T1 AND "overworked" from T2 - The player sees ALL of Voss's behavioral state regardless of which triangle produced it - Cross-triangle OBSERVATION is emergent — it's systems interacting, not scripted cascade -``` - -**Why this is right for v0.1:** - -1. **Testing scope**: Self-contained forks can be tested independently. Each triangle fork is a unit test. Cross-triangle cascade requires integration tests across all 5 triangles. - -2. **Content scope**: Each fork needs its own decision content (dialogue, monologue, consequences). 3 active forks × 3 choices each = 9 content branches. Adding cascade dependencies multiplies this combinatorially. - -3. **The emergent observation IS the payoff**: The player noticing that Voss is anxious in BOTH the hub (Triangle 1) and during manifest processing (Triangle 2) is an emergent connection. They're doing investigation — connecting dots across contexts. That's MORE interesting than scripted cascade, and it comes for free from shared NPC state. - -4. **v0.2 cascade path**: If we want Triangle 1's escalation to gate Triangle 2's timing in v0.2, the architecture supports it. The fork state machines are independent now; adding dependencies later is an additive change, not a rewrite. - -### Triangle Fork Summary (Final) - -| Triangle | Fork Type | Decision | Self-Contained? | -|----------|-----------|----------|-----------------| -| T1: Hub Power | **Active** | Smuggler: escalate/stabilize/mediate | YES — modifies Voss+Kael state, no T2 gate | -| T2: Worried Knowledge | **Active** | Detective: approach Maret / pressure Drin / wait | YES — modifies Maret+Drin state, no T1 gate | -| T3: Bar Tensions | **Passive** | No fork — ambiguity is permanent | N/A | -| T4: Worried Partner | **Active** | Both PCs: FRIEND contradiction paths A/B/C | YES — modifies Kael/Sera state, no other triangle gate | -| T5: Informant Question | **Passive** | No fork — tension observable, resolution post-session | N/A | - ---- - -## Task 4: Knowledge Panel Pause — Sim Speed Architecture - -**Lead decision: 50% sim speed when panel is open. Spacebar always pauses from anywhere.** - -### Why 50% Is Correct (Not 10%, Not Full Pause) - -Stig proposed 10%. Lead overruled to 50%. Here's the mechanical reasoning: - -| Speed | Effect | Problem | -|-------|--------|---------| -| 100% (no slow) | World runs at full speed while you read the knowledge panel | NPCs walk away while you're cross-referencing. Punishes information gathering. | -| 50% (lead's choice) | World runs at half speed | You can SEE NPCs moving slowly while you think. Creates tension: "Do I keep reading or close and follow?" That's an INTERESTING DECISION. | -| 10% (Stig's proposal) | World barely moves | No tension. Functionally equivalent to pause. If you're going to pause, just pause. 10% is a nothing-state. | -| 0% (full pause) | World stops | No tension. The knowledge panel becomes a reference tool, not a strategic moment. Removes the feeling of time pressure that makes investigation feel real. | - -**50% creates a micro-decision every time you open the panel:** "Is the information worth the time?" That's asymmetric information AS MECHANIC — even the player's attention is a scarce resource. - -### Sim Speed State Machine - -Two independent toggles, multiplicative: - -``` -effective_speed = if pause_override { 0.0 } else { base_speed × ui_modifier } -``` - -| Toggle | Controls | Values | -|--------|----------|--------| -| `ui_modifier` | Whether a UI overlay is open | `1.0` (no overlay) or `0.5` (knowledge panel open) | -| `pause_override` | Spacebar | `false` (not paused) or `true` (paused) | - -**State combinations:** - -| State | ui_modifier | pause_override | Effective Speed | Player Experience | -|-------|------------|---------------|----------------|-------------------| -| Normal play | 1.0 | false | **100%** | Full speed. NPCs move, routines advance. | -| Panel open | 0.5 | false | **50%** | Slow motion. NPCs drift. Time passes. Tension. | -| Paused (from normal) | 1.0 | true | **0%** | Full stop. World frozen. Read, think, plan. | -| Paused (from panel) | 0.5 | true | **0%** | Full stop. Panel still visible. No time pressure. | - -**Key behaviors:** -- **Spacebar always pauses.** From any state. No exceptions. This is accessibility AND good design. -- **Spacebar resumes to previous state.** If you paused from panel-open (50%), unpausing returns to 50%, not 100%. If you paused from normal play, unpausing returns to 100%. -- **Tab toggles panel.** Opening panel sets `ui_modifier = 0.5`. Closing panel sets `ui_modifier = 1.0`. Independent of pause state. -- **Dialogue: also 50%.** When dialogue is active (Talk interaction), the same `ui_modifier = 0.5` applies. NPCs who aren't in the conversation continue moving at half speed. This means other events can happen WHILE you're talking — the world doesn't freeze for your conversation. That's immersive sim design. - -### v0.2 Extension - -The multiplicative model is composable. Future UI states can define their own modifiers: - -| UI State | Modifier | Combined | -|----------|----------|----------| -| Knowledge panel | 0.5 | 0.5 | -| Dialogue | 0.5 | 0.5 | -| Panel + Dialogue? | 0.5 × 0.5 = 0.25 | 25% (both open simultaneously) | -| Cutscene | 0.0 | Full freeze (storyteller controls) | - -For v0.1, only panel and dialogue use 0.5. The system supports future states without redesign. - -### Implementation Note for Dudley - -The server tick rate doesn't change. The CLIENT requests a sim speed modifier. The server processes ticks at variable intervals: - -- Normal: 1 tick per 50ms (20 ticks/sec) -- 50%: 1 tick per 100ms (10 ticks/sec) -- Paused: 0 ticks (server queues but doesn't process) - -The server's tick processing is deterministic regardless of interval. Changing the interval changes PACING, not LOGIC. All systems (NPC routines, monologue triggers, tell accumulation) operate on tick count, not wall-clock time. A 50% slowdown means the same events happen — they just take twice as long in wall-clock time. - ---- - -## Cross-Reference: Addressing Tracking Doc Items - -A few items from Qatux's tracking that directly involve my assignments: - -### A-17: Self-contained triangle forks -**Confirmed.** See Task 3. Independent decision state machines, shared NPC state. Tyre was right. - -### D-04: Examine vs Talk -**Lead decided: conceptually separate, v0.1 ships single action.** I accept this. My 7-interaction model stands as the DESIGN TARGET. v0.1 implements it as context-sensitive single action (server knows about multiple actions per entity, client surfaces the best one). v0.2 adds multi-verb UI. The architecture must support both — that's Tyre and Dudley's task. - -### D-05: Knowledge Panel Pause -**Resolved.** See Task 4. 50% sim speed, spacebar override to full pause. Multiplicative model. - -### A-10: Dialogue files by location + role -**I validate this.** It aligns with D-035 (role-based, not NPC-based line assignment) and the generator model (templates define roles, NPCs fill roles). The file organization should be: -``` -districts/sova-transit/dialogue/ - hub-dock-worker.yaml # Role: dock worker, Location: hub - hub-supervisor.yaml # Role: supervisor, Location: hub - bar-owner.yaml # Role: bar owner, Location: bar - bar-regular.yaml # Role: bar regular, Location: bar - ... -``` -NPCs are assigned to roles at content load time. A line tagged `role: dock_worker` + `access: insider` fires for Kael (if smuggler has insider access to Kael) regardless of which NPC fills the dock_worker role. This is generator-compatible. - ---- - -## Summary of Changes from Round 1 - -| Item | Round 1 | Round 2 | Change Reason | -|------|---------|---------|---------------| -| Maret pattern | SYSTEM | **WITNESS** | Story function > job description | -| Maret motivation | WITNESS | **SKEPTIC** | Compositional tension (WITNESS+SKEPTIC > WITNESS+WITNESS) | -| Resha motivation | SKEPTIC | **CIVILIAN** | Innocent disruption > deliberate questioning | -| Harek pattern | GHOST | **ANCHOR** | Present contentment > absent power | -| Drin pattern | REMNANT | **SYSTEM** | Institutional role > nostalgia (station too young for REMNANT) | -| Sabel pattern | THRESHOLD | **GHOST** | Absent influence > present gatekeeper | -| Olin motivation | SKEPTIC (dual) | **CIVILIAN** | Dropped dual designation. 1 per NPC. | -| Smuggler keys | 4 smuggler-specific | **4 generic perspective** | `threat_to_position`, `reliability`, `facade_status`, `moral_standing` — works for all 8 archetypes | -| EntityKnowledge total | 18 (14+4) | **18 (14+4)** | Same count, generic names | -| Triangle forks | Self-contained (tentative) | **Self-contained (confirmed)** | Independent state machines, shared NPC state | -| Panel pause | Not addressed | **50% sim speed, spacebar override** | Multiplicative toggle model | diff --git a/docs/workshops/v01-content-scoping/round2-mellanie.md b/docs/workshops/v01-content-scoping/round2-mellanie.md deleted file mode 100644 index f1a16836f..000000000 --- a/docs/workshops/v01-content-scoping/round2-mellanie.md +++ /dev/null @@ -1,461 +0,0 @@ -# Round 2 — Mellanie (Copywriter) - -## v0.1 Content Scoping Workshop - ---- - -## Task 1: Canonical PC Voice Registers - -These are authoring specs, not narrative documents. Every monologue line I write gets checked against these parameters. If a line doesn't match the register, it gets cut. - ---- - -### Smuggler — Internal Voice Register - -**One-line summary:** Watches people, not systems. Thinks in fragments. Worries about friends the way a dock worker worries — practically, physically, with the knot in the stomach, not the word for it. - -#### Voice Parameters - -| Parameter | Value | Example | -|---|---|---| -| **Sentence length** | Short. Fragments welcome. Rarely more than 2 sentences per monologue fire. | "Kael's here. Good." | -| **Vocabulary** | Concrete, physical, sensory. Uses trade jargon (containers, manifests, shifts, routes) without explaining it. No institutional language. | "Recycled air and cargo lubricant." Not: "Standard atmospheric recycling." | -| **Emotional register** | Feeling-first, analysis second. Names the gut before the brain catches up. | "Starting to worry" before "something's off." | -| **Relationship mode** | First-name basis with everyone. Thinks relationally — people are defined by connection, not role. | "Kael" not "Davan." "Voss is tense" not "the shift supervisor seems agitated." | -| **Observation priority** | People > environment > objects. Notices body language before noticing cargo. | "Kael keeps checking his lattice" before "Container 4471 is still in temp." | -| **Operational thinking** | Present when thinking about the job. Time-aware, route-aware, schedule-aware. But always filtered through "is this safe for my people?" | "Transition window opens in fifty minutes. After that, twenty minutes of reduced oversight." | -| **Self-reference** | Rare. The smuggler thinks about others, not herself. When self-reference occurs, it's through physical sensation. | "My stomach dropped" not "I feel betrayed." | -| **Humor** | Dry, situational, understated. Dark when stressed. Never witty — that's a different register. | "Home sweet home" about a cargo bay. | -| **What she doesn't do** | Doesn't analyze systems. Doesn't use institutional vocabulary. Doesn't explain things to herself that she already knows. Doesn't monologue in paragraphs. | - -#### Voice Anchors (Reference Lines) - -These 5 lines define the boundaries. Every smuggler monologue line should feel like it could sit next to these without register collision. - -1. **Baseline warm:** *"Kael's already at the dock. Good. The day's better when he's on shift."* - — Short. Personal. Physical presence matters. - -2. **Operational:** *"Shift transition in thirty minutes. If Voss kept the schedule thin, the route's clear."* - — Time-specific. Practical. Other people's actions determine safety. - -3. **Concerned:** *"Kael keeps checking his lattice. Waiting for a message? Not like him to be jumpy."* - — Observation leads to interpretation. Interpretation is relational ("not like him"), not clinical. - -4. **Hurt:** *"He looked left. He always looks left when he's making something up. Two years I've known that tell. Kael is lying to me."* - — Personal history weaponized. The "two years" is the knife. Ends with a flat declaration, not a question. - -5. **Atmospheric:** *"Morning shift. Recycled air and cargo lubricant. Home sweet home."* - — Three fragments. Sensory detail. Irony through understatement. - -#### Anti-Patterns (What the Smuggler Does NOT Sound Like) - -- "I should investigate this anomaly further." (Too clinical. She'd think: "That's not right.") -- "The scheduling irregularity suggests systemic manipulation." (Institutional vocabulary. She'd think: "Voss changed the rotation again.") -- "I need to consider the implications of Kael's behavior for our operational security." (Analytical distance. She'd think: "What the hell is Kael doing?") -- "According to the manifest, container 4471 should weigh 240 kilograms." (Explaining what she already knows. She'd think: "4471's heavy. Too heavy.") - ---- - -### Detective — Internal Voice Register - -**One-line summary:** Categorizes first, feels second. Thinks in complete sentences. The institutional training runs in the background like an operating system — it never turns off, but sometimes the human overrides it. - -#### Voice Parameters - -| Parameter | Value | Example | -|---|---|---| -| **Sentence length** | Complete sentences, but not long ones. More structured than the smuggler. Occasional fragments for emphasis or snap judgments. | "Standard prefab, heavy foot traffic. Let's see what the shift change tells me." | -| **Vocabulary** | Institutional layer over plain speech. Professional terms leak in: "case file," "filing it," "noted," "flagged." Not technical jargon — investigative habit. | "Dock worker. Davan, K. Unremarkable on paper." The surname-comma-initial is institutional reflex. | -| **Emotional register** | Analysis-first, personal second. When personal breaks through, it's notable — a crack in the professional surface that signals emotional weight. | "She's not lying. But she's not telling me everything. Sera, what do you know?" — The first-name appeal at the end IS the emotion. | -| **Relationship mode** | Surname-first for targets and unknowns. First-name for allies and people he trusts. The shift from surname to first-name (or back) IS a relationship marker. | "Davan, K." early → "Kael" never (smuggler's FRIEND, not detective's). "Sera" always (detective's FRIEND). | -| **Observation priority** | Patterns > people > environment. Notices deviations from expected behavior before noticing the person. | "That's twice now" before "Sera leaves." The count matters more than the actor. | -| **Analytical thinking** | Automatic. Counts things, tracks frequencies, flags inconsistencies. Self-directs: "filing it," "noted," "coincidence?" These are internal bookkeeping prompts. | "Three times. Three excuses. That's data." | -| **Self-reference** | More common than the smuggler, but always through the professional lens. The detective monitors his own state as evidence. | "I'm reading too much into this" — self-aware about analytical bias. | -| **Humor** | Wry, observational. Appreciates irony at a distance. Can laugh at himself. Never cruel. | "Only place in this district that doesn't smell like freight lubricant." | -| **What he doesn't do** | Doesn't think in fragments (that's the smuggler). Doesn't use trade jargon he hasn't learned. Doesn't name-drop relationships he doesn't have. Doesn't express vulnerability directly — it leaks, he doesn't pour. | - -#### Voice Anchors (Reference Lines) - -1. **Clinical baseline:** *"Logistics hub. Standard prefab, heavy foot traffic. Let's see what the shift change tells me."* - — Categorize. Evaluate. Self-direct. Three operations in three sentences. - -2. **Pattern recognition:** *"That's the third time. Sera leaves when Torek arrives. Three different excuses, same result. That's not coincidence."* - — Counting is automatic. Conclusion is flat and declarative. No hedging. - -3. **Personal leak:** *"Good to see Sera. She always was the reliable one. At least someone in this district speaks my language."* - — First-name. Past tense ("always was") implies shared history. "My language" is institutional belonging. - -4. **Conflicted:** *"Same booth. Same warm smile. Same offer to buy me a drink. ...Everything except whatever she's not saying."* - — Repetition builds the pattern. The ellipsis is the human catching up to the analyst. The final clause is the knife. - -5. **Atmospheric:** *"Grain spirit and low conversation. Only place in this district that doesn't smell like freight lubricant."* - — Sensory but evaluative. The detective doesn't just notice smells — he catalogs them as data points. - -#### Anti-Patterns (What the Detective Does NOT Sound Like) - -- "Kael's here. Good." (Too terse. That's the smuggler. The detective would think: "Davan's on shift. Standard.") -- "I feel uneasy about Sera's behavior." (Direct emotional vocabulary. He'd think: "Something's off with Sera. Can't place it yet.") -- "This container has been tampered with, indicating smuggling activity." (Explaining the obvious. He'd think: "Weight's wrong. Noted.") -- "My heart sank when I saw the evidence." (Physical emotion — that's the smuggler's register. The detective: "Didn't want to see that. But there it is.") - ---- - -### Voice Register Comparison — Same Observation, Two Characters - -**Trigger: Seeing a container in temp storage overnight.** - -- **Smuggler:** *"That container's been in temp since yesterday. Someone forgot to process it, or someone's stalling."* - — Concrete. Two explanations, both practical. No judgment yet. - -- **Detective:** *"Container in overnight temp. Unusual for a hub this size — turnaround is normally sub-eight hours. Flag it."* - — Categorical. Quantified deviation. Self-directed action. - -**Trigger: Entering the bar.** - -- **Smuggler:** *"Lera's. Grain spirit and noise. Could use both right now."* - — Informal name. Sensory. Personal need. - -- **Detective:** *"The Last Shift. Same crowd as yesterday. Let's see who's NOT here tonight."* - — Official name. Pattern comparison. Investigative frame. - -**Trigger: Noticing Naia Tamm is upset.** - -- **Smuggler:** *"Naia looks rough today. Should check on her later."* - — First-name. Immediate concern. Plans to act. - -- **Detective:** *"Tamm seems distressed. Not her baseline. Something at home, or something she's heard?"* - — Surname. Clinical assessment. Hypothesizes cause. - -**Trigger: Hearing raised voices behind a door.** - -- **Smuggler:** *"Raised voices from the back room. Devra's in there. That's not a brokering call."* - — Identifies the person. Interprets through operational knowledge. - -- **Detective:** *"Arguing behind that door. The bartender didn't flinch. Either she's used to it or she knows what it is."* - — Notes the non-reaction. Third-party behavior is data. - ---- - -### Display Constraints (per Stig's R1 proposal) - -Adopting Stig's parameters as authoring constraints: - -| Constraint | Value | Implication for Writing | -|---|---|---| -| Max length | ~160 characters | Hard ceiling. Most lines should be 80-120. | -| Max visual lines | 2 | No three-line monologue. If it wraps to 3, cut it. | -| Display time | 4-6 seconds (length-adjusted) | Player reads at ~250 WPM = ~20-25 words in 5 seconds. Target: 15-25 words per line. | -| Fade behavior | Fade in/out | No abrupt text pops. Lines must read cleanly mid-fade. | -| Character tint | Smuggler: amber-white `#f0e0c8`, Detective: blue-white `#c8d8f0` | Voice must be distinguishable WITHOUT color — color confirms, doesn't create. | - -**The 25-word rule:** If a monologue line exceeds 25 words, it better be the most important line in the pool. Most lines should be 10-18 words. The authoring guide examples average 14 words. That's the target. - ---- - -## Task 2: THE FRIEND Content Pack — Kael Davan (Structure) - -### What's In the Pack - -The Kael Davan content pack is a single deliverable containing everything the engine needs to run THE FRIEND arc for the smuggler's path. It's also the benchmark — if this pack validates against the tag taxonomy, loads correctly, triggers appropriately, and sounds right, every subsequent content pack follows the same structure. - -### Pack Contents - -``` -content/ - districts/ - sova-transit/ - terminal/ - dialogue.yaml # Kael's dialogue lines at The Terminal (shared pool) - monologue-smuggler.yaml # Smuggler monologue at Terminal (includes Kael observations) - monologue-detective.yaml # Detective monologue at Terminal (includes Kael observations) - bar/ - dialogue.yaml # Kael's dialogue lines at The Last Shift - monologue-smuggler.yaml - monologue-detective.yaml - corridor/ - dialogue.yaml # Kael's dialogue lines in Corridor B-7 - monologue-smuggler.yaml - monologue-detective.yaml -``` - -**Note:** Kael's content lives inside location files, not a per-NPC file. Per D-035 and Tyre's directory design, dialogue is organized by location. Kael's lines appear in `terminal/dialogue.yaml` alongside other NPCs who speak at the Terminal. The `role: dock_worker` tag identifies which lines belong to Kael's template role. - -The pack is authored as a single document, then split into location files during content conversion. For authoring purposes, I'll write it as one file with location headers and deliver the split files. - -### Line Budget (Kael Davan) - -| Content Type | Lines | Location Split | -|---|---|---| -| **Kael dialogue** | | | -| Greetings (5 access tiers) | 5 | Terminal: 3, Bar: 2 | -| Shift/work talk (insider, peer) | 8 | Terminal: 6, Bar: 2 | -| Bar casual (peer) | 4 | Bar: 4 | -| Ring coordination (insider) | 6 | Terminal: 3, Corridor: 3 | -| Deflection/evasion (post-contradiction) | 6 | Terminal: 3, Bar: 2, Corridor: 1 | -| Confrontation responses | 4 | Terminal: 1, Bar: 1, Corridor: 2 | -| Hael references (casual, unprompted) | 3 | Terminal: 1, Bar: 2 | -| **Dialogue subtotal** | **36** | | -| | | | -| **Smuggler monologue about Kael** | | | -| Phase 1 — Comfort (warmth, baseline) | 4 | Terminal: 2, Bar: 2 | -| Phase 2 — First Crack (concern, tells) | 4 | Terminal: 3, Bar: 1 | -| Phase 3 — Contradiction (alarm, shock) | 3 | Corridor: 2, Terminal: 1 | -| Phase 4 — Confrontation aftermath (hurt, conflict) | 3 | Terminal: 1, Bar: 1, Corridor: 1 | -| Phase 5 — Contaminated trust (doubt over warmth) | 4 | Terminal: 2, Bar: 1, Corridor: 1 | -| **Smuggler monologue subtotal** | **18** | | -| | | | -| **Detective monologue about Kael** | | | -| Identification / first observation | 2 | Terminal: 2 | -| Behavioral observation (tells noted) | 3 | Terminal: 2, Bar: 1 | -| Suspicion / analytical escalation | 3 | Terminal: 2, Corridor: 1 | -| Informant potential assessment | 2 | Terminal: 1, Bar: 1 | -| **Detective monologue subtotal** | **10** | | -| | | | -| **Tell observation lines** | | | -| Lattice checking (first + repeat) | 2 | Terminal: 2 | -| Shortened interactions / evasive | 2 | Terminal: 1, Bar: 1 | -| Looks-left tell (casual + confirmation) | 2 | Bar: 1, Corridor: 1 | -| Spatial deviation (Corridor B-7) | 2 | Corridor: 2 | -| **Tell subtotal** | **8** | | -| | | | -| **Trust-gated lines** (Kael's deeper dialogue) | | | -| Insider: ring operational talk | 6 | Terminal: 4, Corridor: 2 | -| Insider: close colleague warmth | 4 | Terminal: 2, Bar: 2 | -| Secret: hints about wanting out (pre-contradiction, rare) | 3 | Bar: 2, Corridor: 1 | -| **Trust-gated subtotal** | **13** | | -| | | | -| **Unprompted lines** (Kael volunteers) | | | -| Early: offers information, warmth | 3 | Terminal: 2, Bar: 1 | -| Late: warnings, deflections | 3 | Terminal: 1, Bar: 1, Corridor: 1 | -| **Unprompted subtotal** | **6** | | -| | | | -| **PACK TOTAL** | **91** | | - -91 lines. Within the 70-100 range from D-034. The slight overcount gives me room to cut — better to write 91 and kill 10 weak ones than write 70 and wish I had more coverage. - -### Arc Phase Mapping to Triggers + Prerequisites - -This is the structural skeleton. Every line in the pack maps to one of these slots. - -#### Phase 1: Comfort (0-10 min, RelationshipState: Friendly) - -| Trigger | Prerequisite | Content Type | Count | -|---|---|---|---| -| `observe_npc` | `relationship_state: Friendly, subject: kael_davan` | Smuggler monologue: warmth | 2 | -| `observe_npc` | `relationship_state: Friendly, subject: kael_davan` | Smuggler monologue: routine fondness | 2 | -| `post_conversation` | `relationship_state: Friendly, subject: kael_davan` | Smuggler monologue: social comfort | 1 | -| NPC dialogue | `access: [insider, peer], trust: surface` | Kael greetings, shift talk | 8 | -| NPC dialogue | `access: [insider], trust: real` | Kael ring talk, colleague warmth | 6 | -| NPC dialogue (unprompted) | `access: [insider]` | Kael volunteers info | 2 | - -**Phase 1 total: ~21 lines.** Heavy on dialogue (establish Kael's voice), lighter on monologue (smuggler's comfortable, not reflective). - -#### Phase 2: First Crack (10-15 min, still Friendly, flags accumulating) - -| Trigger | Prerequisite | Content Type | Count | -|---|---|---|---| -| `observe_anomaly` | `behavior_flags: lattice_checking` | Smuggler monologue: mild concern | 2 | -| `post_conversation` | `behavior_flags: evasive` | Smuggler monologue: worry | 2 | -| `observe_npc` (detective) | `relationship_state: Known, subject: kael_davan` | Detective monologue: behavioral note | 2 | -| NPC dialogue | `access: [insider, peer], trust: surface` | Kael: shorter, deflective | 4 | -| Tell observation | `behavior_flags` gates | Tells: lattice, shortened interactions | 3 | - -**Phase 2 total: ~13 lines.** Tell observations ramp up. Dialogue gets clipped. Smuggler monologue shifts from fond to concerned. - -#### Phase 3: The Contradiction (15-20 min, Friendly -> PersonOfInterest) - -| Trigger | Prerequisite | Content Type | Count | -|---|---|---|---| -| `witness_interaction` | `relationship_state: Friendly, subject: kael_davan` | Smuggler monologue: shock/alarm (THE moment) | 2 | -| `observe_anomaly` | `contradiction_flagged: meeting_unknown_contact` | Smuggler monologue: processing | 1 | -| `observe_npc` (detective) | behavioral flags accumulating | Detective monologue: suspicion spike | 2 | -| Tell observation | `contradiction_flagged` | Spatial deviation tell | 2 | - -**Phase 3 total: ~7 lines.** Fewest lines, highest stakes. Every word carries maximum weight. The contradiction monologue is the most important line in the pack. - -#### Phase 4: Confrontation (20-25 min, PersonOfInterest) - -| Trigger | Prerequisite | Content Type | Count | -|---|---|---|---| -| `post_conversation` | `tell_observed: looks_left_when_lying` | Smuggler monologue: the tell confirmation | 2 | -| `post_conversation` | `relationship_state: PersonOfInterest` | Smuggler monologue: hurt/conflict | 1 | -| NPC dialogue | `access: [insider], trust: surface` | Kael: deflection, evasion | 6 | -| NPC dialogue | `access: [insider]` | Kael: confrontation responses | 4 | -| NPC dialogue (unprompted) | `access: [insider]` | Kael: warnings | 2 | -| Tell observation | `tell_observed` gate | Looks-left confirmation | 1 | - -**Phase 4 total: ~16 lines.** Dialogue-heavy — the confrontation is a conversation. Kael's evasion lines are the hardest to write because they must be plausible without being convincing. - -#### Phase 5: Contaminated Trust (25-30 min, PersonOfInterest, new equilibrium) - -| Trigger | Prerequisite | Content Type | Count | -|---|---|---|---| -| `observe_npc` | `relationship_state: PersonOfInterest, subject: kael_davan` + `contradiction_flagged` | Smuggler monologue: doubt over warmth | 3 | -| `return_visit` | `relationship_state: PersonOfInterest` | Smuggler monologue: location contamination | 1 | -| `time_idle` | `relationship_state: PersonOfInterest, subject: kael_davan` | Smuggler monologue: rumination | 1 | -| `observe_npc` (detective) | `secret_confidence: confirmed/suspected` | Detective monologue: informant potential | 2 | -| NPC dialogue | `access: [public], trust: surface` | Kael: surface normal (warmth locked out) | 4 | -| NPC dialogue | `access: [insider], trust: real` (if smuggler chose understanding path) | Kael: confession hints | 3 | -| Trust-gated: secret | Path A only | Kael: deeper truth | 2 | - -**Phase 5 total: ~16 lines.** The contamination lines are the ones where voice discipline matters most — same warmth, new subtext. "Same old Kael" lines where the smuggler hears what used to be comfort and now hears a question. - -### Cross-Phase Lines (Not Phase-Specific) - -| Content Type | Count | Notes | -|---|---|---| -| Detective identification/first observation | 2 | Fires before detective has context on Kael | -| Kael Hael references (casual, any phase) | 3 | Establish relationship before it's load-bearing | -| Kael bar casual (not phase-gated) | 4 | Social texture | -| Detective pattern-forming observations | 3 | Cumulative, phase-independent | -| Kael insider ring coordination | 4 | Operational dialogue, pre-contradiction | - -**Cross-phase total: ~16 lines.** - -### Phase Total Reconciliation - -| Phase | Lines | % of Pack | -|---|---|---| -| Phase 1: Comfort | 21 | 23% | -| Phase 2: First Crack | 13 | 14% | -| Phase 3: Contradiction | 7 | 8% | -| Phase 4: Confrontation | 16 | 18% | -| Phase 5: Contaminated Trust | 16 | 18% | -| Cross-phase | 16 | 18% | -| **Total** | **89** | ~98% (rounding) | - -Close to the 91 estimate. The 2-line gap is margin for lines that emerge during writing — there's always one observation or reaction that only becomes obvious while you're in the character's head. - -### Format (Sample YAML) - -Each line in the pack looks like this. Showing one per phase to demonstrate prerequisite progression: - -```yaml -# Phase 1: Comfort — smuggler sees Kael, no concerns -- id: terminal_m_010 - character: smuggler - trigger: observe_npc - prerequisite: - relationship_state: Friendly - subject: kael_davan - text: "Kael's already at the dock. Good. The day's better when he's on shift." - mood: [fond] - topic: [colleague] - situation: [shift_start] - access: [insider, peer] - trust: surface - tags: [kael, baseline, pre_contradiction] - notes: "Phase 1 warmth. Establishes the bond." - -# Phase 2: First Crack — smuggler notices tell -- id: terminal_m_011 - character: smuggler - trigger: observe_anomaly - prerequisite: - all: - - relationship_state: Friendly - subject: kael_davan - - known_attributes: - subject: kael_davan - key: behavior_flags - value_contains: lattice_checking - text: "Kael keeps checking his lattice. Waiting for a message? Not like him to be jumpy." - mood: [concerned] - topic: [colleague] - situation: [routine] - access: [insider] - trust: real - tags: [kael, tell, first_crack] - -# Phase 3: Contradiction — the moment -- id: corridor_m_010 - character: smuggler - trigger: witness_interaction - prerequisite: - relationship_state: Friendly - subject: kael_davan - text: "Kael? Down here? And that's — I don't know them. Not crew, not ring. Who the hell is that?" - mood: [concerned] - topic: [colleague] - situation: [observation] - access: [insider] - trust: real - tags: [the_friend, contradiction, kael, critical_moment] - notes: "THE CONTRADICTION. Sets contradiction_flagged. Green -> amber." - -# Phase 4: Tell confirmation — the knife -- id: corridor_m_011 - character: smuggler - trigger: post_conversation - prerequisite: - all: - - relationship_state: PersonOfInterest - subject: kael_davan - - known_attributes: - subject: kael_davan - key: tell_observed - value: looks_left_when_lying - text: "He looked left. Always looks left when he's making something up. Two years, Kael. I know your tells." - mood: [conflicted] - topic: [trust] - situation: [confrontation] - access: [insider] - trust: real - tags: [the_friend, kael, tell_confirmation] - -# Phase 5: Contaminated trust — the new normal -- id: terminal_m_015 - character: smuggler - trigger: observe_npc - prerequisite: - all: - - relationship_state: PersonOfInterest - subject: kael_davan - - known_attributes: - subject: kael_davan - key: contradiction_flagged - value: meeting_unknown_contact - text: "Same old Kael. Same jokes, same routine. ...What are you not telling me?" - mood: [conflicted] - topic: [colleague] - situation: [routine] - access: [insider] - trust: real - tags: [kael, the_friend, contaminated_trust] -``` - -### Dependencies Before I Can Write the Full Pack - -| Dependency | Owner | Status | Impact if Missing | -|---|---|---|---| -| Content directory structure confirmed | Tyre | Round 2 (expected) | I write the pack as a single doc and split later — not blocking | -| FactId catalog (smuggler path entries) | Gestalt / Paula | Gap 5 from tracking | I use authoring-guide FactIds as placeholders, replace when catalog lands | -| EntityKnowledge key resolution (4 vs 8 keys) | Gestalt / Paula | D-03 disagreement | I write prerequisites using the Round 1 key names, adapt to winner | -| Monologue display constraints | Stig | R1 proposal: ~160 char, 2-line, 4-6 sec | Adopted. Writing to these constraints now. | -| NPC pattern/motivation mapping finalized | Gestalt | Round 2 (lead awarded to Gestalt) | Doesn't change Kael's content — he's FRIEND+OPERATOR regardless | - -**None of these are hard blockers.** The biggest risk is FactId placeholder drift — if the final catalog changes `contraband.ring_exists` to `smuggling.ring_confirmed`, I have to search-replace across the pack. Manageable, but annoying at scale. I'd rather the catalog stabilizes before I author all 695 items. - -### Authoring Timeline - -**Kael pack (91 lines):** I can draft the full pack once this workshop closes. Dialogue lines require the most iteration (Kael's voice under pressure is tricky — evasive without sounding scripted). Monologue lines are faster (I've been living in both character registers for two workshops now). Tell lines are mechanical — they map directly to the wiki's tell system table. - -Estimate: full draft in one session. Review pass in a second. Revision after Gestalt validates tags and Dudley confirms prerequisites fire correctly. - -**Sera pack follows immediately.** Different contradiction mechanics (cumulative pattern vs. single observation), different voice (Sera's precision vs. Kael's brevity), same structure. Lessons from Kael's pack inform Sera's. - ---- - -### Note on the 695 Number - -Round 1 tracking (A-06) flags my 695 total as "needs validation from others." Let me be clear about what it is and isn't: - -- **695 is the authored floor.** Below this, the 30-minute session has gaps — locations without environmental text, NPCs without enough dialogue variation, monologue pools that repeat. -- **695 is not the generation-expanded total.** D-028 specifies a 4x generation pass for dialogue ("write 10, generate 40"). If we apply that to the ~350 dialogue lines, the engine sees ~1,400 dialogue lines. But the 350 are what I hand-write. -- **695 doesn't include content the engine generates.** Routine greetings, time-of-day variations, personality-trait transformations — those are generation-pass output, not authored input. - -The number to track is **695 authored items.** That's the scope. That's what I deliver. - ---- - -*Mellanie, Round 2. Voice registers defined, pack structure mapped, dependencies identified. Ready to write the benchmark.* diff --git a/docs/workshops/v01-content-scoping/round2-paula.md b/docs/workshops/v01-content-scoping/round2-paula.md deleted file mode 100644 index 3da7b3bd0..000000000 --- a/docs/workshops/v01-content-scoping/round2-paula.md +++ /dev/null @@ -1,367 +0,0 @@ -# Round 2 — Paula (Narrative & Political Depth) - -## Task 1: NPC Pattern/Motivation Mapping — v0.2 Emotional Layer - -Gestalt's mechanical mapping is canonical for v0.1. Accepted. - -But the versioned approach creates something valuable: **two analytical lenses on the same NPCs.** Gestalt maps from function ("What does this NPC do in the system?"). I map from meaning ("What does this NPC mean to the story?"). For v0.1, function drives implementation. For v0.2, meaning drives emotional depth expansion. - -Here's every disagreement annotated with what the v0.2 emotional layer adds: - -### Disagreement Resolution + v0.2 Notes - -| NPC | v0.1 (Gestalt) | v0.2 Layer (Paula) | What the v0.2 Layer Adds | -|-----|----------------|-------------------|--------------------------| -| **Voss** | SYSTEM + OPERATOR | SYSTEM + HANDLER | v0.1 Voss runs schedules (OPERATOR). v0.2 Voss manages people through scheduling authority — the resentment, the fear, the performative competence hiding real vulnerability. HANDLER unlocks Voss-specific monologue about being trapped between institutional role and criminal obligation. "I manage people. They just don't know who I'm managing them for." | -| **Devra** | THRESHOLD + HANDLER | THRESHOLD + OPERATOR | v0.1 Devra manages from above (HANDLER). v0.2 Devra runs the operation's machinery — she's the most competent person in the ring and knows it. OPERATOR unlocks content about Devra's ambition, her quiet belief she could run this better than Nils, her frustration at being the brain behind someone else's decisions. | -| **Maret** | SYSTEM + WITNESS | WITNESS + SKEPTIC | v0.1 Maret is the institutional scheduler who saw something (SYSTEM+WITNESS). v0.2 Maret doubts — not just "the numbers are off" but "the entire system I trusted is corrupt, and I'm complicit by filing clean reports." SKEPTIC unlocks Maret's crisis of institutional faith, the thing that makes her more than a data point for the detective. | -| **Resha** | CATALYST + SKEPTIC | CATALYST + CIVILIAN | v0.1 treats Resha's questions as genuine skepticism (SKEPTIC). v0.2 adds the tragedy: Resha is a CIVILIAN who accidentally became a CATALYST. She's not questioning the system — she's trying to learn it. The system is so broken that LEARNING it is disruptive. CIVILIAN unlocks content about Resha's bewilderment when people react to her innocent questions with fear. | -| **Harek** | GHOST + HANDLER | ANCHOR + HANDLER | v0.1 Harek shapes events through debt leverage (GHOST+HANDLER). v0.2 adds: Harek embodies contentment. He's the man who has enough, wants nothing more, and whose comfortable complacency created a tool for others without him meaning to. ANCHOR unlocks content about unconscious complicity — the "Is this enough?" question answered by someone who never thought to ask it, whose answer is "yes" while his comfort enables harm. | -| **Drin** | REMNANT + TURNCOAT | SYSTEM + TURNCOAT | v0.1 Drin remembers simpler times (REMNANT). v0.2 adds: Drin IS the inspection system. His compromise doesn't just corrupt a person — it corrupts the institutional process itself. SYSTEM unlocks content about institutional rot as metaphor: when the inspector is compromised, what does "inspection" even mean? | -| **Sess** | ANCHOR + CIVILIAN | NOBODY + CIVILIAN | v0.1 Sess embodies quiet contentment (ANCHOR). v0.2 adds: Sess is invisible — social wallpaper that the player walks past twenty times before realizing the bartender has seen everything. NOBODY unlocks dynamic tier promotion content for v0.2: the moment the player invests in Sess, the quiet contentment reveals itself as an observation post. | -| **Olin** | CATALYST + SKEPTIC | CATALYST + CIVILIAN | v0.1 gives Olin dual motivation (ambiguity). v0.2 resolves the ambiguity per playthrough: some seeds, Olin IS a skeptic (asking questions because they're probing). Other seeds, Olin is a civilian (asking questions because they genuinely need work). The randomized motivation resolution is a v0.2 generator feature. | -| **Sabel** | THRESHOLD + OPERATOR | GHOST + OPERATOR | v0.1 Sabel is the off-station gatekeeper (THRESHOLD). v0.2 adds: Sabel is absent power — the upstream force shaping local events. GHOST unlocks content about Sabel's indifference: Sabel doesn't care about Sova's people, only about the supply chain. If the operation burns, Sabel moves on. That coldness is narrative content for v0.2 (the player discovers the ring is disposable to its supplier). | -| **Tav** | SYSTEM + CIVILIAN | NOBODY + OPERATOR | v0.1 Tav follows ring lookout procedure (SYSTEM+CIVILIAN). v0.2 adds: Tav is peripheral, barely visible, the lowest rung. NOBODY unlocks tier promotion content — the player who notices Tav discovers a young person trapped in a role they barely understand, doing dangerous work because someone told them it mattered. | - -### What the v0.2 layer means for content planning - -The v0.2 layer adds **~30-50 authored lines per NPC** of emotional-depth content: expanded monologue pools, deeper dialogue gating, and pattern-specific interaction triggers (e.g., ANCHOR contentment dialogues, NOBODY promotion paths, GHOST influence chains). This is the "write 10, generate 40" Tier 2 expansion target. - -For now, Gestalt's v0.1 mapping governs implementation. My mapping governs the content roadmap. Both are correct — they describe different layers of the same characters. - ---- - -## Task 2: The Key Bloat Question — Generic Assessment Architecture - -The lead asks: "If the original EntityKnowledge set was incomplete for the smuggler, are we doing this again for the administrator or the corporate tycoon?" - -**The honest truth: No, but only if we name the keys correctly.** - -### The Problem With "Smuggler-Specific" Keys - -Gestalt proposed 4 new keys: `exposure_risk`, `loyalty_assessment`, `cover_integrity`, `moral_weight`. These are described as "smuggler-specific." But look at what they actually capture: - -| Key | What It Really Measures | Is This Smuggler-Specific? | -|-----|------------------------|---------------------------| -| `exposure_risk` | "How much does this NPC's behavior threaten my current interests?" | No. An administrator assesses exposure risk too — but it's political exposure, not operational. | -| `loyalty_assessment` | "Where does this NPC's loyalty lie relative to me?" | No. Every archetype navigates loyalty networks. | -| `cover_integrity` | "Is my position/identity intact around this person?" | No. An administrator's "cover" is their public reputation. A newcomer's "cover" is their attempt to blend in. | -| `moral_weight` | "How much moral cost do I carry in this relationship?" | No. Already generic. Every human feels guilt, complicity, or indifference. | - -These aren't smuggler keys. They're **role-perspective assessment keys** that every archetype uses with different semantics. - -### The Generic Architecture - -**Proposal: 6 role-perspective keys that work for all 8 archetypes.** Same keys, archetype-specific interpretation, zero per-archetype schema bloat. - -| Generic Key | Smuggler Interpretation | Detective Interpretation | Administrator | Newcomer | Merchant | -|------------|------------------------|------------------------|---------------|----------|----------| -| `risk_assessment` | Exposure of ring operations | Exposure of investigation | Exposure of political position | Vulnerability as an outsider | Exposure of trade relationships | -| `loyalty_assessment` | Loyal to the ring? | Cooperative with investigation? | Aligned with my faction? | Willing to help a newcomer? | Reliable trade partner? | -| `position_integrity` | Is my cover identity holding? | Is my authority respected? | Is my reputation intact? | Am I blending in? | Is my business relationship secure? | -| `moral_weight` | Guilt about complicity | Guilt about using people | Guilt about political compromises | Guilt about disrupting others | Guilt about exploiting information | -| `tell_observed` | Behavioral tell suggesting ring exposure | Behavioral tell suggesting concealment | Political tell (nervous in meetings) | Social tell (who's welcoming, who's not) | Commercial tell (price sensitivity, evasion) | -| `contradiction_flagged` | Behavior contradicts ring loyalty | Behavior contradicts claimed innocence | Behavior contradicts public stance | Behavior contradicts stated welcome | Behavior contradicts stated terms | - -**The values use the same enums.** `risk_assessment: "high"` means different things to different archetypes, but the schema is identical. The content authoring guide (the archetype brief, the voice register, the monologue prerequisite rules) provides the interpretation. The knowledge graph stores data; the content layer provides meaning. - -### Why This Works - -Let me complicate this by testing it against the hardest case. The **Insider** archetype (the community member, the person embedded in the social fabric). Does `risk_assessment` work? - -- Insider's `risk_assessment` of Kael: "How much does Kael's behavior threaten the community I'm part of?" Value: `"moderate"` — Kael's nervousness is unsettling but hasn't caused concrete harm yet. -- Insider's `loyalty_assessment` of Voss: "Where does Voss's loyalty lie — with the shift crew or with whoever's pressuring him?" Value: `"uncertain"` — Voss seems stressed but still functional. -- Insider's `position_integrity` assessment of themselves near the detective: "Does the detective's presence threaten my standing in the community?" Value: `"stressed"` — people are nervous, the community is pulling inward, and the insider's position as a trusted neighbor is complicated by anyone who cooperates with authorities. - -It works. Same keys. Different lens. Zero schema change. - -### What IS Archetype-Specific - -The archetype-specific content lives in three places, none of which are EntityKnowledge keys: - -1. **Monologue prerequisite interpretation.** The prerequisite `risk_assessment == "high"` triggers different monologue lines per archetype. The smuggler thinks: "Torek's spending is going to get us caught." The administrator thinks: "Torek's spending is drawing Commission attention to the district." Same trigger, different pool, same key. - -2. **Dual-lens section in NPC profiles.** Every NPC profile already has per-character lens sections. For 8 archetypes, this becomes an archetype-lens section per NPC — but that's content authoring, not schema work. And at 300-world scale, the generator produces these from archetype brief + NPC profile + composition rules. - -3. **Voice register.** The smuggler's internal voice is operational and terse. The detective's is analytical and institutional. An administrator's would be political and strategic. A newcomer's would be uncertain and observational. These registers shape how the same knowledge is expressed, not what knowledge exists. - -### The Practical Answer - -**For v0.1:** Rename Gestalt's 4 keys to the generic versions: - -| Current (Gestalt's v0.1) | Renamed (Generic) | Change Required | -|--------------------------|-------------------|-----------------| -| `exposure_risk` | `risk_assessment` | Rename in schema + content | -| `loyalty_assessment` | `loyalty_assessment` | No change — already generic | -| `cover_integrity` | `position_integrity` | Rename in schema + content | -| `moral_weight` | `moral_weight` | No change — already generic | - -2 renames. That's it. The v0.1 smuggler and detective content is authored against the generic keys. When v0.2 adds the Newcomer archetype, the Newcomer's knowledge graph uses the same 6 role-perspective keys with Newcomer-specific content. Zero schema changes. Zero key bloat. - -**For v0.2+:** `social_debt` and `loyalty_conflict` (Gestalt's deferred keys) should also be evaluated against this lens. `social_debt` generalizes cleanly (every archetype navigates obligations). `loyalty_conflict` may fold into `loyalty_assessment` + `behavior_flags` as Gestalt argued. That's a v0.2 decision. - -**Total key count per archetype: 20** (14 shared + 6 role-perspective). Same for smuggler, detective, administrator, merchant, newcomer, insider, fixer, exile. No per-archetype keys. No bloat. The schema scales to 8 archetypes without modification. - -### What SUSTAINS This Across 8 Archetypes - -The keys are the skeleton. The archetype brief is the muscle. Each archetype needs: - -1. A **voice register** (how their monologue sounds) -2. An **assessment framework** (what "risk" means to them, what "loyalty" means) -3. A **moral arc** (what their version of Comfort → Doubt → Reckoning → Compromise looks like) - -These are content documents, not schema changes. They live in the authoring guide, not the codebase. Mellanie writes them; Paula designs them; Gestalt validates that the mechanical triggers work. - -The smuggler moral arc (Comfort → Doubt → Reckoning → Compromise) is the prototype. Every archetype gets a 4-phase arc with the same structure and different content. The administrator's arc might be: Authority → Doubt → Reckoning → Adaptation. The newcomer's: Wonder → Doubt → Reckoning → Belonging-or-Departure. - -But the keys don't change. The keys are the infrastructure. The content is the building. - ---- - -## Task 3: Wiki Fix Execution Plan - -### Prioritized Execution Order - -The changes are ordered by dependency — later items reference earlier items' outputs. - -| Priority | Change | Files Affected | Content Status | Estimated Effort | -|----------|--------|---------------|----------------|-----------------| -| **P0-1** | Naia Tamm rename | 16 files | Cascade plan ready (Round 1). Content changes specified per-file. | ~2 hours (mechanical, but must be thorough) | -| **P0-2** | Nils Davan stub page | 1 new file + 3 cross-ref updates | Full draft ready (Round 1). | ~30 min | -| **P0-3** | Drin Tier 2 expansion | 1 file rewrite + index update | Full draft ready (Round 1). 7 new axes, voice sample, tell system. | ~1 hour | -| **P1-1** | Canonical name application | 10 NPC profile headers + index | Name table ready (Round 1). 3 names need Miri validation. | ~1 hour | -| **P1-2** | Triangle 1 escalation fork | index.md triangle section + Kael/Voss notes | 5-beat sequence designed (Round 1). Self-contained per D-INTERACT. | ~1 hour | -| **P2-1** | Smuggler-lens sections (all 17 NPCs) | 17 NPC profile files | Template designed (Round 1). Per-NPC content requires authoring. | ~8-10 hours | -| **P2-2** | PC-as-NPC profiles | 2 new files | Gap identified (Round 1). Content not yet drafted. | ~3-4 hours | -| **P2-3** | FactId catalog — smuggler entries | 1 file | Gap identified (Round 1). Entries not yet drafted. | ~2 hours | - -### P0-1: Naia Tamm Rename — Execution-Ready Content - -Below is the exact content change needed for each file. I'm specifying what to find and what to replace so this can be executed mechanically. - -#### File 1: `wiki/npcs/hael.md` → rename to `wiki/npcs/naia-tamm.md` - -Full rewrite of the file header and all internal references. Key structural changes: - -**Old header:** -```markdown -# Hael - -**Tier 2 NPC** | The Last Shift (Bar) | Mundane -``` - -**New header:** -```markdown -# Naia Tamm — THE MIRROR - -**Tier 1 (MIRROR) NPC** | The Last Shift (Bar) | Mundane -``` - -**Core Identity section changes:** -- `**Name**: Hael` → `**Name**: Naia Tamm` -- Add: `**Canonical ID**: krenn.naia-tamm` -- Add: `**Pattern**: MIRROR (no contradiction arc, no secret)` -- Add: `**Motivation**: CIVILIAN (v0.1 mechanical mapping)` - -**All internal "Hael" references** → "Naia Tamm" (formal) or "Naia" (casual/dialogue). The Krenn convention (D-036) is first-name-primary in social contexts, so dialogue and monologue use "Naia." Profile text and cross-references use "Naia Tamm." - -**Secret/Vulnerability section** — must be reframed for MIRROR pattern: -```markdown -### 2. Secret / Vulnerability - -**Surface secret**: None. Naia has no secrets. This is THE MIRROR's -defining trait. - -**Deep secret**: None. Naia Tamm is the one person in the district who -is exactly what she appears to be — a teacher worried about her partner. -The MIRROR's power is simplicity. When events drag Naia into the -conspiracy (through Kael's ring involvement, through Sera's concealment), -the damage is devastating precisely because Naia was genuine. - -**Vulnerability**: Emotional exposure. Naia's worry about Kael is visible, -exploitable, and honest. She has no defenses because she has no agenda. -The detective can cultivate Naia as a source without guilt — until the -consequences of that cultivation become apparent. -``` - -**Content requirements section** — update for MIRROR-specific depth: -```markdown -## Content Requirements (MIRROR — Tier 1 Emotional Depth) - -**~50-70 authored lines total** (no generation expansion): - -- **20-25 dialogue lines**: Bar greetings (3), Kael-related conversation - (8-10), Sera interaction (4-5), school/community (3-4), response to - bad news (3-5) -- **8-12 trust-gated lines**: Honest disclosures about Kael's behavior - changes, emotional confessions about the relationship, what Naia has - told Sera -- **5-8 unprompted lines**: Naia volunteers worry about Kael, asks - about Kael if the player has seen him, mentions school events -- **8-12 monologue lines per character**: - - Smuggler monologue about Naia: guilt (4-5 — "She doesn't know. - She can never know."), protectiveness (3-4), moral weight (2-3) - - Detective monologue about Naia: sympathy (3-4 — "The partner. - Worried. Doesn't know what I know."), source assessment (2-3), - moral cost of using her (3-4) -- **3-5 tell observation lines**: Visible stress, checking for Kael, - increased bar presence, confiding in Sera -- **NO contradiction discovery lines** — THE MIRROR has no contradiction. - The emotional payload comes from what happens TO Naia, not what Naia - hides. -``` - -**Cross-reference links at bottom:** -```markdown -**Cross-References:** [Kael Davan](kael-davan.md), [Sera Venn](sera-venn.md), -[Lera Sessik](lera-sessik.md) -``` - -#### File 2: `wiki/npcs/index.md` - -**Roster table row 9:** -- Old: `| 9 | Hael | Teacher (Kael's Partner) | Bar | Tier 2 | Mundane | Worried Partner |` -- New: `| 9 | **Naia Tamm** | Teacher (Kael's Partner) | Bar | **Tier 1 (MIRROR)** | Mundane | Worried Partner |` - -**Triangle 4 diagram (3 label changes):** -``` - Naia Tamm (Teacher, Kael's Partner) - / \ - worried about confides in friend - Kael's late nights, | - evasive answers | - | | - Kael (Dock Worker) <--friendship--> Sera (Commission Field Tech) -``` - -**Triangle 4 description text** — every "Hael" → "Naia Tamm" (formal) or "Naia" (in-character). Approximately 8 replacements. - -**Social site listing — The Last Shift:** -- Old: `- Hael (Teacher) — Kael's partner, worried` -- New: `- Naia Tamm (Teacher) — Kael's partner, worried` - -**Content Deliverables section:** -- Move Naia Tamm from "Tier 2" list to a new "Tier 1 (MIRROR)" subsection, or note the tier change explicitly. - -#### File 3: `wiki/index.md` - -**NPC listing:** -- Old: `- [Hael](npcs/hael.md) — Kael's partner (referenced)` -- New: `- [Naia Tamm](npcs/naia-tamm.md) — Kael's partner, THE MIRROR` - -Also move from "Tier 2" to a new bullet under Tier 1: -```markdown -- **Tier 1 (MIRROR):** - - [Naia Tamm](npcs/naia-tamm.md) — Kael's partner, teacher -``` - -#### File 4: `wiki/npcs/kael-davan.md` (~20+ replacements) - -This is the heaviest file. Every "Hael" becomes "Naia" in dialogue/monologue contexts and "Naia Tamm" in descriptive/profile contexts. Key sections: - -- **Axis 1 (Want), Secondary**: "Protect Hael (partner)" → "Protect Naia (partner)" -- **Axis 2 (Secret)**: "Hael doesn't know about the smuggling" → "Naia doesn't know about the smuggling" -- **Relationship 2 header**: "Hael (partner, teacher, civilian)" → "Naia Tamm (partner, teacher, civilian)" -- **Relationship 2 body**: All "Hael" → "Naia" (casual reference in relationship description) -- **Axis 4 (Tolerance)**: "Hael's increasing worry" → "Naia's increasing worry" -- **Axis 5 (Routine)**: "Home with Hael" → "Home with Naia" -- **Axis 6 (Information)**: "Hael's worry" → "Naia's worry", "Hael talked to Sera" → "Naia talked to Sera" -- **Axis 7 (Contentment)**: "guilt about lying to Hael" → "guilt about lying to Naia" -- **Voice sample**: "I'm fine, Hael" → "I'm fine, Naia" (Mood: Protective line) -- **Dual-lens notes**: All Hael references -- **Triangle 4 role notes**: All Hael references -- **Secret section**: All Hael references -- **Contradiction arc**: Multiple references throughout all 5 phases -- **Authoring notes**: "Hael references" → "Naia references" - -File link in cross-references: -- Old: `[Hael](hael.md)` (if present) -- New: `[Naia Tamm](naia-tamm.md)` - -#### File 5: `wiki/npcs/sera-venn.md` (~15 replacements) - -Same pattern as Kael. Key sections: -- **Axis 1 (Want), Secondary**: "Protect Hael" → "Protect Naia Tamm" -- **Relationship 2**: Full section rewrite — "Hael" → "Naia" / "Naia Tamm" -- **Axis 4, 5, 6, 7**: All Hael references -- **Tell system**: References to Hael observing Sera's avoidance -- **Voice sample**: "Hael was here earlier" → "Naia was here earlier" -- **Triangle 4 role notes**: All Hael references -- **Secret section**: All Hael references -- **Contradiction arc**: Hael references throughout -- **Authoring notes**: "Hael references" → "Naia references" - -#### Files 6-16: Lighter touch changes - -| File | Changes | -|------|---------| -| `wiki/npcs/lera-sessik.md` | Axis 6 info inventory: "Hael's worry about Kael" → "Naia Tamm's worry about Kael" | -| `wiki/npcs/maret-korr.md` | Axis 5 routine: "goes for Hael's company" → "goes for Naia's company" | -| `wiki/authoring/monologue-guide.md` | Any monologue examples referencing Hael | -| `wiki/locations/krenn-system/the-last-shift.md` | NPC presence list, social dynamics | -| `wiki/world/sova-transit-district.md` | NPC references | -| `wiki/factions/the-ring.md` | Kael vulnerability references | -| `wiki/knowledge/relationship-states.md` | Example entries | -| `wiki/knowledge/entity-attributes.md` | Example entries | -| `wiki/knowledge/fact-catalog.md` | FactId entries: `npc.hael.*` → `npc.naia_tamm.*`, `relationship.kael.hael` → `relationship.kael.naia_tamm` | -| `wiki/world/krenn-system.md` | Naming examples list: "Hael" → keep (it's a valid Krenn first name), but add "Naia" to the list if not present | -| `decisions/content.md` | D-034: "partner Hael" → "partner Naia Tamm". D-036: naming examples list update. | - -### P0-2: Nils Davan Stub — Execution-Ready Content - -The full stub page draft was provided in my Round 1 response. It's ready to write to `wiki/npcs/nils-davan.md`. - -**Cross-reference updates needed after creation:** - -| File | Change | -|------|--------| -| `wiki/npcs/index.md` | Add Nils to the Smuggling Ring social site listing. Add to roster table as off-stage NPC. | -| `wiki/index.md` | Add `[Nils Davan](npcs/nils-davan.md) — Ring coordinator (off-stage)` to NPC listing. | -| `wiki/npcs/kael-davan.md` | Add cross-reference link at bottom: `[Nils Davan](nils-davan.md)` | -| `wiki/npcs/voss.md` | Add cross-reference link | -| `wiki/npcs/devra.md` | Add cross-reference link | -| `wiki/npcs/renn.md` | Add cross-reference link | - -### P0-3: Drin Tier 2 Expansion - -Full 7-axis draft provided in Round 1. Gestalt confirms promotion (A-01 consensus). Execution: - -1. Rewrite `wiki/npcs/drin.md` from Tier 3 format to Tier 2 format using my Round 1 draft -2. Update `wiki/npcs/index.md` roster table: Tier 3 → Tier 2, update entanglement -3. Update `wiki/index.md`: Move Drin from Tier 3 listing to Tier 2 -4. Add Gestalt's v0.1 mapping to header: `**Pattern**: REMNANT | **Motivation**: TURNCOAT` - -### P1-1: Canonical Names - -Apply the name table from Round 1. **Three names need Miri validation** before applying: Drin Vassar, Sess Torin, Tav Lenn. Olin deliberately omits surname (narrative choice). Sabel deliberately omits surname (off-station character). - -### P1-2: Triangle 1 Escalation Fork - -**Important: Self-contained per Tyre's recommendation (confirmed by lead as D-INTERACT).** My Round 1 design included cross-triangle cascade (Path B feeding Triangle 2 via Maret). For v0.1, the fork must be self-contained. - -Revised Triangle 1 fork — self-contained version: - -The 5-beat structure stays the same, but Beat 5 consequences are resolved WITHIN Triangle 1: - -| Path | Self-Contained Consequence | What Does NOT Cascade | -|------|---------------------------|----------------------| -| **A (Back Voss)** | Nils is angry at Kael. Kael is frightened. Smuggler feels responsible. | Nils's anger does not trigger Pell's crisis (Triangle 5). | -| **B (Back Nils)** | Voss capitulates but is visibly rattled. Fourth manifest revision happens. | The manifest revision does NOT trigger Maret's discovery (Triangle 2). Maret discovers independently. | -| **C (Stay neutral)** | Nils acts unilaterally. Operation is sloppier. Smuggler's standing drops. | The sloppy operation does NOT make the detective's investigation easier. Detective's timeline is independent. | - -This keeps Triangle 1 testable in isolation while preserving the emotional weight of each choice. Cross-triangle cascade becomes a v0.2 feature when the storyteller can manage multi-triangle state. - -### Execution Dependencies - -``` -P0-1 (Naia Tamm rename) ─── no dependencies, start immediately -P0-2 (Nils stub) ─── no dependencies, start immediately -P0-3 (Drin expansion) ─── blocked by A-01 formalization (consensus confirmed) -P1-1 (Canonical names) ─── blocked by Miri validation (3 names) -P1-2 (Triangle 1 fork) ─── depends on P0-2 (Nils stub must exist first) -P2-1 (Smuggler-lens) ─── depends on key bloat resolution (Task 2 above) -P2-2 (PC-as-NPC) ─── depends on P2-1 (smuggler-lens template establishes format) -P2-3 (Smuggler FactIds) ─── depends on P2-1 -``` - -**P0-1 and P0-2 can start immediately and run in parallel.** I recommend these as the first Sprint 3 copy team commits. diff --git a/docs/workshops/v01-content-scoping/round2-si.md b/docs/workshops/v01-content-scoping/round2-si.md deleted file mode 100644 index 12339e11d..000000000 --- a/docs/workshops/v01-content-scoping/round2-si.md +++ /dev/null @@ -1,290 +0,0 @@ -# Round 2 — SI (Project Manager) -## Finalized Ticket List for v0.1 Content Scoping - -Incorporates: all 7 Round 1 responses, Qatux tracking doc, lead decisions (D-NPC, D-FORMAT, D-INTERACT, D-PAUSE). - ---- - -## 1. Lead Decisions — Impact on Tickets - -| Decision | Ticket Impact | -|----------|---------------| -| **D-NPC:** Gestalt's mechanical mapping wins for v0.1 | NEW-1 simplified: "apply Gestalt's mapping" (not resolve disagreements). Paula's emotional layer becomes v0.2 annotation. | -| **D-FORMAT:** YAML for content, RON converter available | Confirms C-series as YAML. Adds NEW-8: RON converter tool. | -| **D-INTERACT:** Single action for v0.1, multi-verb architecture underneath | NEW-7 reframed. Adds NEW-9 (server: InteractionOptions) + NEW-10 (client: extensible prompt). | -| **D-PAUSE:** Spacebar always pauses, overlays = 50% sim speed | Adds NEW-11 (server: tick rate scaling) + NEW-12 (client: pause state machine). | - ---- - -## 2. Round 1 Consensus — Impact on Tickets - -| Consensus Item | Ticket Impact | -|----------------|---------------| -| **A-01:** Drin promoted to Tier 2 | NEW-2 changes from "evaluation" to "execute promotion" — expand profile. | -| **A-02:** NOBODY deferred to v0.2 | No v0.1 ticket. Hidden data ships in NPC YAML files (handled by C-series). | -| **A-05:** ~200 monologue lines | Sizes NEW-4 at ~200 lines (~100 per character). | -| **A-06:** ~695 total authored items | Overall content scope validation. No new ticket, but informs sprint capacity. | -| **A-07:** 3 active + 2 passive triangles | Confirms A11 scope (Triangle 1 only needs fixing). T3/T5 need less work. | -| **A-11:** THE FRIEND is critical path | Confirms #261 → #297/#298 chain is the highest-priority dependency. | -| **A-12:** Client receives text from server | No client-side content loading tickets needed. Simplifies client scope. | -| **A-14:** PC-as-NPC confirmed for v0.1 | Validates B3, B5, NEW-6. | -| **A-15:** News ticker confirmed for v0.1 | #306 confirmed. Scope: ~20 headlines. | -| **A-17:** Self-contained triangle forks | Reduces C8 complexity (no cross-triangle cascade logic). | -| **Tyre: Line previewer CLI** | Adds NEW-13. | -| **Paula: 7 additional wiki gaps** | Gaps 1-5 already covered by existing tickets. Gap 6 (location smuggler detail) → folded into content conversion. Gap 7 (Harek triangle membership) → folded into NEW-1 mapping. | - ---- - -## 3. Existing Ticket Updates (Revised) - -| ID | Title | Action | Sprint Target | -|----|-------|--------|---------------| -| #368 | Knowledge vocabulary for v0.1 content | **Close** — wiki at `wiki/` is the delivered output | Sprint 2 (done) | -| #369 | Wiki Review Workshop Outputs (epic) | **Repurpose** as parent epic for all v0.1 content scoping tickets. Update description. | — | -| #301 | Wiki taxonomy and structure | **Assign to copy.** Downscope: Sova district structure only for v0.1. Full 500+ world taxonomy is generator-era. | Sprint 3 | -| #319 | Krenn System wiki entry | **Merge with A3.** Expanded: wiki page + seed.yaml reference implementation. Assign to copy. | Sprint 4 | -| #261 | Dual Lens Authoring Guide | **CRITICAL PATH ROOT.** Assign to copy. Owner: Paula. Blocks 9 downstream tickets. | Sprint 3 (P0) | -| #310 | Character voice speech patterns | **Subsume into B4** (smuggler voice card + moral arc). B4 is the larger ticket. Close #310 when B4 lands. | Sprint 3 (via B4) | -| #306 | News ticker / Meridian feed content | **Confirm scope:** ~20 dual-lens headlines. Assign to copy. | Sprint 4 | -| #326 | YAML content loader | **Assign to server.** Blocked by C1 + C2. | Sprint 4 | -| #86 | Core NPC components | **Already Sprint 3 server.** Dudley's ECS component list from Round 1 informs this. | Sprint 3 | -| #88 | Daily routine system | **Already Sprint 3 server.** Needs NPC routine YAML from content conversion. | Sprint 3 | - ---- - -## 4. Finalized New Ticket Proposals - -### Group A: Wiki Content Fixes (copy team) - -| ID | Title | Type | Priority | Sprint | Blocked By | Description | -|----|-------|------|----------|--------|------------|-------------| -| A1 | Apply canonical full names to all NPC wiki pages | task | medium | 3 | — | Apply Miri's 12 full names to NPC wiki pages. Update Core Identity blocks, environmental text references. | -| A2 | Rename Hael → Naia Tamm across all wiki files | task | medium | 3 | — | Find-and-replace across ~8 wiki files. Triangle 4 becomes Naia-Kael-Sera. | -| A6 | Add smuggler-perspective FactId progression text | task | high | 4 | B4 | Add smuggler-path text for all FactIds where smuggler starts at KnowsDetails or has different knowledge path. | -| A7 | Add smuggler-specific entity attributes to entity-attributes.md | task | high | 3 | — | Scope depends on Round 2 resolution of D-03 (Gestalt's 4 new + 2 repurposed vs Paula's 8 new). Add to wiki/knowledge/entity-attributes.md. | -| A8 | Standardize location shortcodes in monologue-guide.md | task | medium | 3 | — | Fix hub_m_ → terminal_m_ inconsistency. Add shortcode reference table. | -| A10 | Stub NPC profile for Nils Davan | task | medium | 3 | — | Off-stage profile: Core Identity, relationship to Kael, role in ring, known attributes. | -| A11 | Fix Triangle 1 (Hub Power) — Volume Escalation decision | story | high | 3 | A10 | Add smuggler decision fork: side with Nils (louder signal), side with Voss (tension), or split route (exposure). Self-contained — no cross-triangle cascade per A-17. | -| A12 | Create environmental text examples file | task | medium | 4 | A3/#319 | Bar menu, safety notice, news ticker cycle, corridor graffiti. Krenn-voiced. Needed for wow moment #1 (Arrival). | - -### Group B: Style Guides & Specs (copy team) - -| ID | Title | Type | Priority | Sprint | Blocked By | Description | -|----|-------|------|----------|--------|------------|-------------| -| B1 | NPC Authoring Style Guide | story | critical | 5 | A3, A4, A7, B2, B4 | Combined document: tier templates, authoring rules, regional culture, content pipeline. Reframed as generator specification — this IS the NPC generator input format. Most complex ticket; many blockers. | -| B2 | THE MIRROR pattern spec | story | high | 3 | — | Define honest-character NPC pattern. No contradiction arc, no secret. Tier 1 emotional depth. Naia Tamm is first instance. Output becomes generator template. | -| B3 | PC-as-NPC unified spec | story | high | 3 | A7 | Unified spec: starting knowledge graph, starting relationship map, reverse knowledge (bidirectional), orientation monologue, agency boundaries, authored relationship stubs, tell inversion. 9-step conversion checklist. | -| B4 | Smuggler voice card + moral arc spec | story | high | 3 | A7 | Two deliverables: (1) Smuggler voice card — paired examples with detective showing dual-lens register differences. (2) Smuggler moral arc — 4 phases (Comfort→Doubt→Reckoning→Compromise), smuggler-specific FactIds, monologue triggers. Subsumes #310 scope. | -| B5 | NPC-format briefs for both PCs — Concept A v0.1 | story | high | 4 | B3 | NPC-mode behavior scripts (5-7 routine entries each), reverse dual-lens notes, observation monologue (3-5 lines per character). ~20-30 authored items total. | - -### Group C: Content Directory & Schema (split teams) - -| ID | Title | Type | Priority | Sprint | Team | Blocked By | Description | -|----|-------|------|----------|--------|------|------------|-------------| -| C1 | Content directory structure design doc | story | high | 3 | copy | — | Document converged structure: `_meta/` + `_schema/` (infrastructure), `global/` + `districts/` (content). Canonical_id format. Mod overlay mechanics. District as atomic pack unit. Informs all content implementation. | -| C2 | Create content/ directory skeleton | task | high | 3 | server | C1 | Create directory tree with empty YAML stubs. `_meta/`, `_schema/`, `global/` (factions, technology, contraband, knowledge, enums, regions), `districts/sova-transit/` (district.yaml, npcs/, locations/, templates/, triangles/, lines/). | -| C3 | Content schema definitions (YAML Schema files) | story | high | 3 | server | C1 | Create `_schema/` with validation schemas: npc.schema.yaml (tier-conditional), location, faction, template, fact, dialogue, monologue, district, pool. | -| C4 | Create global/enums/ YAML files from D-035 | task | medium | 4 | server | C2 | Populate enums: situations (13), topics (9), moods (8), triggers (9), access-tiers (5), activities (new). | -| C5 | Create global/knowledge/entity-attributes.yaml | task | medium | 4 | server | C2 | Machine-readable entity attribute definitions. 14 detective + smuggler keys (count depends on D-03 resolution). | -| C6 | Create pools.yaml for v0.1 seed-time selection | task | medium | 4 | server | C2 | Sova single-candidate pools: friend_smuggler, friend_detective, bar_regulars, compromised_inspector, primary_contraband. Architecture supports N candidates. | -| C7 | Create template YAML files with role slot definitions | task | medium | 4 | server | C2 | 3 social sites: logistics-hub.yaml, bar.yaml, smuggling-ring.yaml. Role slots with count ranges, required flags, pool references, triangle constraints. | -| C8 | Create triangle YAML files for 5 v0.1 triangles | task | medium | 4 | server | C2 | 5 triangles. Self-contained forks (no cross-triangle cascade per A-17). Includes updated T1 with Volume Escalation. | -| C9 | Implement make validate-content CLI | story | high | 4 | server | C3 | Structural + tier-conditional validation. Reads _schema/, validates all YAML. v0.2: cross-reference validation. | -| C10 | Pre-commit FactId typo check | task | medium | 4 | ci | — | Grep-based pre-commit check validating FactId references against canonical facts.yaml. | - -### Group D: Design Specs - -| ID | Title | Type | Priority | Sprint | Team | Blocked By | Description | -|----|-------|------|----------|--------|------|------------|-------------| -| D2 | Seed configuration schema design | story | medium | 4 | server | — | Schema for what the randomizer produces at game-start: FRIEND selections, social site population, compromised NPC, contraband type. v0.1 has single-candidate pools but architecture must support N. | -| D4 | News ticker headline pool | task | medium | 4 | copy | — | ~20 dual-lens headlines for Meridian feed at Lera's. Freight data, politics, local infrastructure, sports, Commission advisories. Each works as dual-lens monologue trigger. | - -### Group NEW: Tickets from Round 1 + Round 2 - -| ID | Title | Type | Priority | Sprint | Team | Blocked By | Description | -|----|-------|------|----------|--------|------|------------|-------------| -| NEW-1 | Apply Gestalt's NPC pattern/motivation mapping | task | high | 3 | copy | — | Apply the canonical v0.1 mapping (Gestalt's Round 2 finalized table) to wiki and content files. 17 NPCs × (pattern + motivation). Includes Harek's structural role per Paula Gap 7. | -| NEW-2 | Drin Tier 2 profile expansion | task | medium | 3 | copy | NEW-1 | Drin confirmed Tier 2 (A-01). Expand wiki profile to full Tier 2 depth: all 10 profile axes, smuggler lens section, triangle membership formalized. | -| NEW-3 | Wiki → YAML content conversion (Sova NPCs) | story | high | 4 | copy | C1, C2, C3 | Convert 17 NPC wiki profiles to engine-readable YAML. Includes routine YAML layer (Paula Gap 3), triangle fork decision points (Gap 4), location smuggler detail (Gap 6). Tyre estimates 2-3 days. | -| NEW-4 | Monologue content pool — minimum viable (~200 lines) | story | high | 4 | copy | #261, B4 | ~100 lines per character. Categories: arrival observations, NPC routine commentary, environmental flavor, contradiction hints, idle reflections, tutorial/orientation. Follows Mellanie's authoring order (FRIEND packs first, then fill). | -| NEW-5 | v0.1 wow moment content checklist | task | high | 3 | copy | — | Map D-039's 6 wow moments to specific content deliverables + implementation tickets. Track completion. Acceptance: every moment has identified content + code backing it. | -| NEW-6 | PC-as-NPC content authoring | story | high | 5 | copy | B3, B5 | Author the actual lines: 5-7 routine entries per character, 3-5 observation monologue lines, reverse dual-lens notes. ~25 authored items (Mellanie's budget). | -| NEW-7 | v0.1 interaction verb spec | task | medium | 3 | copy | — | Document the 7 interaction types (A-04: Move, Look, Monologue, Examine Object, Examine NPC, Talk, Overhear). Define triggers, UI needs, server events per type. v0.1 surfaces single context-sensitive action; architecture supports N verbs. | - -### Group NEW-R2: Tickets from Lead's Round 2 Decisions - -| ID | Title | Type | Priority | Sprint | Team | Blocked By | Description | -|----|-------|------|----------|--------|------|------------|-------------| -| NEW-8 | YAML → RON converter tool | task | medium | 4 | server | C1 | Build-time converter: reads content YAML, emits RON. Lives in `tooling/`. Runs as make target (`make content-ron`). Not on critical path — engine consumes YAML in v0.1; RON is future-proofing. | -| NEW-9 | Multi-verb interaction architecture — server InteractionOptions | story | high | 3 | server | — | Server models N available actions per entity via `InteractionOptions` component. v0.1 client picks first/best; v0.2 client shows menu. Must not be throwaway. Includes ObserverSnapshot v3 extension for interaction data. | -| NEW-10 | Multi-verb interaction architecture — client extensible prompt | story | high | 3 | client | NEW-9 | Client-side interaction prompt designed for extensibility. v0.1: single context-sensitive E prompt. Architecture supports v0.2 multi-verb menu. Prompt system reads InteractionOptions from server state. | -| NEW-11 | Pause system — server tick rate scaling | story | medium | 3 | server | — | Tick rate supports 3 states: full speed (normal play), 50% speed (UI overlay open), 0% (spacebar pause). Server receives pause/speed commands from client. | -| NEW-12 | Pause system — client state machine | story | medium | 3 | client | NEW-11 | Client pause state machine: Normal → Overlay (50% speed, triggered by knowledge panel / dialogue) → Paused (spacebar from any state). Spacebar always overrides to full pause. | -| NEW-13 | Line previewer CLI | task | medium | 4 | server | C3, C9 | CLI tool to preview monologue/dialogue line selection for a given game state. Tyre's recommendation for content tuning. Lives in `tooling/`. Helps content authors test prerequisite logic without running the full game. | - ---- - -## 5. Sprint Plan - -### Sprint 3: Know (Copy Team — Content Foundation) - -**Goal:** Deliver the content specs and wiki fixes that unblock server implementation and content authoring. - -| Priority | Ticket | Title | Owner Hint | Effort | -|----------|--------|-------|------------|--------| -| **P0** | **#261** | **Dual Lens Authoring Guide** | **Paula** | **Large** | -| **P0** | **C1** | **Content directory structure design** | **Tyre/Gestalt** | **Medium** | -| P0 | A1 | Apply canonical full names | Paula | Small | -| P0 | A2 | Hael → Naia Tamm rename | Paula | Small | -| P0 | A7 | Smuggler entity attributes | Paula | Small | -| P1 | B2 | MIRROR pattern spec | Gestalt/Gore | Medium | -| P1 | B4 | Smuggler voice + moral arc (subsumes #310) | Gore/Mellanie | Medium | -| P1 | NEW-1 | Apply Gestalt's NPC pattern mapping | Gestalt | Small | -| P1 | NEW-5 | Wow moment content checklist | SI | Small | -| P1 | A10 | Nils Davan stub | Paula | Small | -| P1 | A11 | Triangle 1 fix | Gestalt/Paula | Medium | -| P2 | B3 | PC-as-NPC spec | Gestalt/Paula | Medium | -| P2 | A8 | Shortcode fix | Mellanie | Small | -| P2 | NEW-2 | Drin Tier 2 profile expansion | Paula | Small | -| P2 | NEW-7 | Interaction verb spec | Gestalt | Small | - -**Sprint 3 copy total: 15 tickets (2 P0, 6 P1, 5 P2, 2 small enough to parallelize)** - -### Sprint 3: Know (Server Team — Content-Adjacent, Proposed Additions) - -| Priority | Ticket | Title | Effort | -|----------|--------|-------|--------| -| P1 | C2 | Create content/ directory skeleton | Small | -| P1 | C3 | Content schema definitions | Medium | -| P1 | NEW-9 | Multi-verb interaction architecture — InteractionOptions | Medium | -| P2 | NEW-11 | Pause system — tick rate scaling | Small | - -### Sprint 3: Know (Client Team — Proposed Additions) - -| Priority | Ticket | Title | Effort | -|----------|--------|-------|--------| -| P1 | NEW-10 | Multi-verb interaction — extensible prompt | Medium | -| P2 | NEW-12 | Pause system — client state machine | Small | - -### Sprint 4 (Content Conversion + Authoring Begins) - -| Ticket | Title | Team | Blocked By | -|--------|-------|------|------------| -| NEW-3 | Wiki → YAML conversion (17 NPCs) | copy | C1, C2, C3 | -| C4 | Enum YAMLs from D-035 | server | C2 | -| C5 | Entity-attributes YAML | server | C2 | -| C6 | Pools YAML | server | C2 | -| C7 | Social site template YAMLs | server | C2 | -| C8 | Triangle YAMLs | server | C2 | -| C9 | validate-content CLI | server | C3 | -| C10 | Pre-commit FactId check | ci | — | -| A6 | Smuggler FactId progression text | copy | B4 | -| A12 | Environmental text examples | copy | A3/#319 | -| B5 | PC NPC-format briefs | copy | B3 | -| D4 | News ticker headlines (~20) | copy | — | -| #306 | News ticker content (align with D4) | copy | — | -| D2 | Seed configuration schema | server | — | -| NEW-8 | YAML → RON converter | server | C1 | -| NEW-13 | Line previewer CLI | server | C3, C9 | -| #326 | YAML content loader | server | C1, C2 | -| A3/#319 | Krenn brief + seed.yaml reference | copy | — | - -### Sprint 5+ (Content at Scale) - -| Ticket | Title | Team | Blocked By | -|--------|-------|------|------------| -| NEW-4 | Monologue content pool (~200 lines) | copy | #261, B4 | -| NEW-6 | PC-as-NPC content authoring (~25 items) | copy | B3, B5 | -| B1 | NPC Authoring Style Guide (generator spec) | copy | A3, A4, A7, B2, B4 | -| A4 | Regional style guide / seed.yaml template | copy | — | -| A9 | Thematic Question field (Tier 1 profiles) | copy | B2 | -| #297 | THE FRIEND: Kael content pack | copy | #261 | -| #298 | THE FRIEND: Sera content pack | copy | #261 | -| #190 | Workplace content pack | copy | #261 | -| #191 | Bar content pack | copy | #261 | -| #192 | Smuggling ring content pack | copy | #261 | - ---- - -## 6. Revised Dependency Chain - -``` -SPRINT 3 — Two Parallel Critical Chains -======================================== - -Chain 1: Content Authoring Pipeline ------------------------------------- -#261 (Dual Lens Guide) [P0, CRITICAL PATH ROOT] - ├── blocks B4 (Smuggler voice + moral arc) [Sprint 3] - │ ├── blocks A6 (Smuggler FactId text) [Sprint 4] - │ └── blocks NEW-4 (Monologue pool) [Sprint 5] - ├── blocks #297 (FRIEND: Kael) [Sprint 5] - ├── blocks #298 (FRIEND: Sera) [Sprint 5] - ├── blocks #299 (Opening hook: smuggler) [Sprint 5] - ├── blocks #300 (Opening hook: detective) [Sprint 5] - └── blocks #190, #191, #192 (Content packs) [Sprint 5] - -A7 (Smuggler attributes) [P0, Sprint 3] - ├── blocks B4 (Smuggler voice) [Sprint 3] - └── blocks B3 (PC-as-NPC spec) [Sprint 3] - └── blocks B5 (PC briefs) [Sprint 4] - └── blocks NEW-6 (PC-as-NPC authoring) [Sprint 5] - -Chain 2: Content Architecture Pipeline ---------------------------------------- -C1 (Content dir design) [P0, Sprint 3] - ├── blocks C2 (skeleton) [Sprint 3, server] - │ ├── blocks C4 (enums) [Sprint 4] - │ ├── blocks C5 (entity attrs) [Sprint 4] - │ ├── blocks C6 (pools) [Sprint 4] - │ ├── blocks C7 (templates) [Sprint 4] - │ ├── blocks C8 (triangles) [Sprint 4] - │ ├── blocks NEW-3 (wiki→YAML) [Sprint 4] - │ └── blocks #326 (YAML loader) [Sprint 4] - ├── blocks C3 (schemas) [Sprint 3, server] - │ ├── blocks C9 (validator) [Sprint 4] - │ ├── blocks NEW-3 (wiki→YAML) [Sprint 4] - │ └── blocks NEW-13 (line previewer) [Sprint 4] - └── blocks NEW-8 (RON converter) [Sprint 4] - -Independent Chains (Sprint 3) ------------------------------- -B2 (MIRROR spec) → A9 (Thematic Question) [Sprint 4] -A10 (Nils stub) → A11 (Triangle 1 fix) [Sprint 3] -NEW-9 (InteractionOptions, server) → NEW-10 (Extensible prompt, client) [Sprint 3] -NEW-11 (Tick rate scaling, server) → NEW-12 (Pause state machine, client) [Sprint 3] -``` - ---- - -## 7. Ticket Count Summary - -| Category | Count | Teams | -|----------|-------|-------| -| Wiki fixes (A-series) | 8 | copy | -| Style guides & specs (B-series) | 5 | copy | -| Content directory & schema (C-series) | 10 | copy (1), server (8), ci (1) | -| Design specs (D-series) | 2 | server (1), copy (1) | -| Round 1 new tickets (NEW 1-7) | 7 | copy | -| Round 2 new tickets (NEW 8-13) | 6 | server (4), client (2) | -| **Total new tickets** | **38** | copy (21), server (13), client (2), ci (1), + 1 epic update | -| Existing ticket updates | 10 | — | - -**Delta from Round 1:** +6 tickets (NEW-8 through NEW-13 from lead decisions), +2 server Sprint 3 additions (NEW-9, NEW-11), +2 client Sprint 3 additions (NEW-10, NEW-12). Removed: D3 (killed), A5 (deferred), D1 (deferred). Merged: A3 into #319, #310 into B4. - ---- - -## 8. Risks & Recommendations - -**Risk 1: #261 is still the critical path root.** Every content authoring ticket flows through it. If it slips even one sprint, the entire content pipeline delays. Recommend: assign Paula immediately, time-box to 5 working days, accept "good enough" over "perfect." - -**Risk 2: Sprint 3 copy team has 15 tickets.** That's a lot. But 7 are small tasks (A1, A2, A7, A8, A10, NEW-1, NEW-2) that can be parallelized. The real load is #261, C1, B2, B4, and A11. Recommend: Paula owns #261 + wiki fixes (A1, A2, A7, A10, NEW-2). Gestalt owns C1, NEW-1, B2, A11, NEW-7. Mellanie owns A8, B4. SI owns NEW-5. - -**Risk 3: Server team Sprint 3 is already heavy** (10 existing tickets). Adding C2, C3, NEW-9, NEW-11 is +4. Recommend: C2 and C3 are blocked by C1 anyway — they can start mid-sprint when C1 lands. NEW-9 and NEW-11 are independent and can begin immediately. - -**Risk 4: Content conversion (NEW-3) is a Sprint 4 bottleneck.** Tyre estimates 2-3 full days for 17 NPC conversions. This blocks the server from testing with real data. Recommend: start with the 3 Tier 1 NPCs (Kael, Sera, Naia) as soon as C2 lands, don't wait for all 17. - ---- - -*Proposals only — no tickets created. Awaiting lead approval.* -*Compiled by SI. Source: Round 1 tracking doc (Qatux), all 7 Round 1 responses, lead Round 2 decisions.* diff --git a/docs/workshops/v01-content-scoping/round2-stig.md b/docs/workshops/v01-content-scoping/round2-stig.md deleted file mode 100644 index a3a8b1a53..000000000 --- a/docs/workshops/v01-content-scoping/round2-stig.md +++ /dev/null @@ -1,375 +0,0 @@ -# Round 2 Response: Stig (UI Developer) -## v0.1 Content Scoping Workshop - ---- - -## Task 1: Single-Action Prompt Designed for Multi-Verb Extension - -The lead confirmed: v0.1 ships single-action. Multi-verb is v0.2. I need to design the prompt system so the upgrade path is clean — no throwaway architecture. - -### How it works in v0.1 - -The server sends an `InteractionOptions` payload per entity when the player enters interaction range. v0.1 format: - -``` -InteractionOptions { - entity_id: "kael_davan", - display_name: "Kael Davan", - primary: { verb: "Talk", keybind: "E" }, - secondary: null -} -``` - -The client renders: - -``` - [E] Talk - Kael Davan - [====] -``` - -One prompt. One key. The player approaches, reads, presses. Done. - -**For objects:** -``` -InteractionOptions { - entity_id: "manifest_terminal_03", - display_name: "Manifest Terminal", - primary: { verb: "Examine", keybind: "E" }, - secondary: null -} -``` - -Renders as: -``` - [E] Examine - Manifest Terminal - [====] -``` - -Same pattern. The verb changes. The keybind stays the same. The player learns one input: "E means interact." - -### How it extends to v0.2 (multi-verb) - -The server payload grows: - -``` -InteractionOptions { - entity_id: "kael_davan", - display_name: "Kael Davan", - primary: { verb: "Talk", keybind: "E" }, - secondary: { verb: "Observe", keybind: "F" }, - actions: [ - { verb: "Talk", keybind: "E" }, - { verb: "Observe", keybind: "F" } - ] -} -``` - -The client renders both: - -``` - [E] Talk [F] Observe - Kael Davan - [====] -``` - -**What changes in the client:** -- The prompt renderer reads `actions[]` instead of just `primary` -- Layout goes from single-label to horizontal label row -- Keybind display pluralizes - -**What does NOT change:** -- The prompt's position (world-space, entity-tracked) -- The fade behavior (proximity-triggered) -- The input routing (keybind → server action request) -- The overall visual language (bracket-key + verb) - -**The v0.1 client code:** - -```gdscript -# InteractionPrompt.gd - -func update_prompt(options: InteractionOptions) -> void: - if options == null: - hide() - return - - # v0.1: show primary action only - # v0.2: iterate options.actions[] for multi-label - _label.text = "[%s] %s" % [options.primary.keybind, options.primary.verb] - _name_label.text = options.display_name - - _target_entity = options.entity_id - show() -``` - -The `options.actions[]` field exists in the protocol from day one. The v0.1 client ignores it. The v0.2 client reads it. No protocol change needed. - -### Architectural notes for Dudley/Tyre - -The `InteractionOptions` should be part of the `ObserverSnapshot` update — not a separate message. When the player is near an entity, the snapshot includes the interaction payload. When they move away, it's `null`. The client never requests interaction options — they arrive passively as part of perception. - -This means the server's `InteractionResolver` system evaluates available actions every tick for entities in the player's interaction radius. In v0.1 that's a simple lookup (NPC → Talk, Object → Examine). In v0.2 it evaluates relationship state, knowledge, and context to determine the full action set. - -**For Gestalt's Examine-vs-Talk question:** The server models both verbs internally from v0.1 onward. It just surfaces only the primary one to the client. If the server determines that "Observe" is more relevant than "Talk" at a given moment (e.g., player has already talked to this NPC this shift, or NPC is currently in an anomalous state), the server can swap the primary. Single-action doesn't mean single-verb-forever — it means the server picks the best one. - ---- - -## Task 2: Pause System State Machine - -Three states. Clean transitions. No ambiguity. - -### States - -``` -RUNNING ← normal gameplay, full sim speed -OVERLAY_ACTIVE ← UI overlay open (knowledge panel, dialogue), 50% sim speed -PAUSED ← spacebar pause, 0% sim speed -``` - -### Transitions - -``` - [Tab] [Space] - RUNNING ──────────────> OVERLAY_ACTIVE ──────────────> PAUSED - ^ | | - | [Tab] | [Space] | - +────────────────────────+ | | - | | | - +─────────────────────────────────────+ | - | [Space] | - +─────────────────────────────────────────────────────+ -``` - -### Rules - -| Input | From RUNNING | From OVERLAY_ACTIVE | From PAUSED | -|-------|-------------|--------------------|-| -| **[Space]** | → PAUSED | → PAUSED | → previous state (RUNNING or OVERLAY_ACTIVE) | -| **[Tab]** (knowledge panel) | → OVERLAY_ACTIVE | → RUNNING (closes panel) | → PAUSED + OVERLAY_ACTIVE (panel opens, stays paused) | -| **[E]** (interaction/dialogue) | → OVERLAY_ACTIVE (if dialogue starts) | stays OVERLAY_ACTIVE | no effect | -| **[Esc]** | no effect | → RUNNING (closes overlay) | → previous state | - -**Key behaviors:** - -1. **Spacebar is king.** It always toggles to/from PAUSED. Period. No other input overrides spacebar. If the player is in dialogue and hits space, the game pauses with the dialogue still visible. - -2. **Overlay = 50% speed, not 0%.** When the knowledge panel is open, the world still breathes. NPCs still move (slowly). Time still passes (slowly). This prevents the knowledge panel from becoming a freeze-frame intelligence tool. The player can check their notes, but the world doesn't wait. - -3. **Spacebar from OVERLAY_ACTIVE goes to PAUSED, not RUNNING.** If I'm reading my knowledge panel and I want the world to stop completely, I hit space. I don't have to close the panel first. Conversely, hitting space from PAUSED with an overlay open returns to OVERLAY_ACTIVE (50% speed with panel still visible), not RUNNING. - -4. **Dialogue is an overlay.** When in conversation, sim runs at 50%. NPCs outside the conversation keep moving. This means: while you're talking to Kael, Sera might leave the bar. You could miss it. That's the game. If you want to freeze everything, pause. - -5. **Multiple overlays don't stack speed reductions.** If dialogue is active (50%) and the player opens the knowledge panel (also 50%), sim stays at 50%. Not 25%. - -### Implementation (client-side) - -```gdscript -# PauseManager.gd -enum SimState { RUNNING, OVERLAY_ACTIVE, PAUSED } - -var _state: SimState = SimState.RUNNING -var _pre_pause_state: SimState = SimState.RUNNING -var _active_overlays: int = 0 # count of open overlays - -func _input(event: InputEvent) -> void: - if event.is_action_pressed("pause"): # spacebar - _toggle_pause() - elif event.is_action_pressed("knowledge_panel"): # tab - _toggle_knowledge_panel() - -func _toggle_pause() -> void: - if _state == SimState.PAUSED: - _set_state(_pre_pause_state) - else: - _pre_pause_state = _state - _set_state(SimState.PAUSED) - -func _toggle_knowledge_panel() -> void: - if _knowledge_panel_open: - _close_knowledge_panel() - else: - _open_knowledge_panel() - -func _open_knowledge_panel() -> void: - _knowledge_panel_open = true - _active_overlays += 1 - if _state == SimState.RUNNING: - _set_state(SimState.OVERLAY_ACTIVE) - # if PAUSED, stay PAUSED — panel opens visually but sim doesn't resume - -func _close_knowledge_panel() -> void: - _knowledge_panel_open = false - _active_overlays -= 1 - if _active_overlays == 0 and _state == SimState.OVERLAY_ACTIVE: - _set_state(SimState.RUNNING) - -func _set_state(new_state: SimState) -> void: - _state = new_state - match new_state: - SimState.RUNNING: - Engine.time_scale = 1.0 - SimState.OVERLAY_ACTIVE: - Engine.time_scale = 0.5 - SimState.PAUSED: - Engine.time_scale = 0.0 -``` - -### Question for Dudley - -Does the server need to know about pause state? If the client sets `Engine.time_scale = 0.0`, does the server keep ticking and the client just stops rendering? Or does the client need to signal the server to pause its tick loop? - -For single-player (v0.1), I think the client controls this entirely. The server runs as a subprocess — if the client freezes its consumption of server ticks, the server's output buffer fills and it naturally stalls. But this depends on the IPC design. Dudley should confirm. - -For the 50% overlay speed: does the client request half-speed ticks from the server, or does it receive full-speed ticks and render every other one? I lean toward the client setting the tick request rate. Cleaner. - ---- - -## Task 3: Monologue Display Constraints (Confirmed) - -Mellanie needs hard numbers. Here they are. - -### Display constraints - -| Parameter | Value | Rationale | -|-----------|-------|-----------| -| **Max characters** | 160 | Two lines at ~80 chars/line at reference font size. Fits 40% viewport width. | -| **Max lines** | 2 | One breath. Monologue competes with gameplay — the player is moving, looking, deciding. Two lines is a glance. Three is a paragraph. | -| **Display duration (base)** | 4.0 seconds | Long enough to read 160 characters at comfortable pace (~40 chars/sec reading speed for on-screen text). | -| **Display duration (short, <80 chars)** | 3.0 seconds | Short lines don't need 4 seconds. Scale linearly. | -| **Display duration (urgent chime)** | 5.0 seconds | Anomaly observations deserve an extra beat. The player needs time to register that something changed. | -| **Fade in** | 0.3 seconds | Fast enough to not feel laggy. Slow enough to not pop. | -| **Fade out** | 0.5 seconds | Slightly slower than fade-in. The thought lingers. | -| **Interruption fade** | 0.15 seconds | When a new monologue replaces the current one, the old one exits fast. No collision. | -| **Cooldown between lines** | 2.0 seconds minimum | Two monologues back-to-back feel like a data dump. The gap is where the player absorbs. | -| **Max queue depth** | 1 | If two triggers fire simultaneously, the higher-priority one displays and the other is dropped. No stacking, no scroll-back. The character's mind moves on. | - -### Priority ordering (when two triggers fire at once) - -``` -1. observe_anomaly ← the game is telling you something important -2. witness_interaction ← the game is telling you something happened -3. discover_evidence ← you found something -4. post_conversation ← reaction to what just happened -5. hear_sound ← environmental awareness -6. observe_npc ← identification / emotional reaction -7. enter_location ← atmospheric -8. return_visit ← atmospheric -9. time_idle ← lowest — reflective, only when nothing else is happening -``` - -`observe_anomaly` always wins. If THE FRIEND's contradiction fires at the same time as an `enter_location` line, the contradiction shows. The atmospheric line is gone. The player will never know it existed. That's fine — the important thing happened. - -### What Mellanie should write to - -**Target:** 80-120 characters for most lines. 160 is the hard maximum — use it rarely. The best monologue lines are 40-80 characters. One punchy thought. - -Examples from the authoring guide, with character counts: - -- `"Morning shift. Recycled air and cargo lubricant. Home sweet home."` — 66 chars. Perfect. One line, one breath. -- `"Kael's here. Good — I was starting to worry."` — 47 chars. Even better. Fast, emotional. -- `"Dock worker Davan — lattice activity spiked. Three pings in two minutes. Expecting a message? Or checking for surveillance?"` — 124 chars. This pushes into line 2 but earns it — the detective's analytical voice needs the full thought. -- `"He looked left. He always looks left when he's making something up. Two years I've known that tell. Kael is lying to me."` — 121 chars. This is a climax moment. Two lines justified. - -**Rule of thumb:** If it fits on one line (~80 chars), it should be one line. Two lines are for moments that matter. - -### Font specification (for reference) - -Monologue text at reference resolution (1920x1080): -- **Font:** Clean sans-serif (Godot default or a custom face — Araminta's call) -- **Size:** 18-20px equivalent -- **Line height:** 1.4x -- **Max width:** 40% of viewport = ~768px at 1920 wide -- **At 18px, ~80 characters fit in 768px** with standard proportional font metrics - -This gives comfortable readability at typical viewing distance. Not tiny, not shouting. The text whispers. - -### Monologue during dialogue - -When a dialogue panel is active, monologue can still fire (e.g., `observe_anomaly` while in conversation). The monologue display shifts up to sit above the dialogue panel: - -``` -Normal state: -+------------------------------------------------------------------+ -| | -| GAME WORLD | -| | -| +--monologue----------------------------+ | -| | Kael's here. Good. | | -| +----------------------------------------+ | -| | -+------------------------------------------------------------------+ - -During dialogue: -+------------------------------------------------------------------+ -| | -| GAME WORLD | -| | -| +--monologue----------------------------+ | -| | That's not anyone from our rotation. | | -| +----------------------------------------+ | -+------------------------------------------------------------------+ -| KAEL DAVAN | -| "Just a friend. Don't worry about it." | -| [Continue] [End] | -+------------------------------------------------------------------+ -``` - -The monologue sits in the world layer. The dialogue sits in the HUD layer. They don't overlap. The player reads dialogue first (larger, centered, paneled), catches monologue peripherally (smaller, left, ghostly). Two voices — one external, one internal — simultaneously. - -This is critical for Wow Moment #3. The contradiction fires monologue WHILE the player might be in conversation. The internal "What the hell?" happens at the same moment as the external smooth deflection. The UI must support both without making the player choose which to read. - ---- - -## Responses to Round 1 Open Questions (Answered by Lead Decisions) - -### D-04 (Examine vs Talk) — Resolved - -Lead decision: conceptually separate, v0.1 ships single-action. Covered in Task 1 above. The server models both verbs; the client surfaces one. Extensible to multi-verb in v0.2 without protocol changes. - -### D-05 (Knowledge Panel Pause) — Resolved - -Lead decision: 50% sim speed for overlays, spacebar always pauses. Covered in Task 2 above. - -### Client text delivery — Resolved (A-12, proposed D-048) - -Server sends full text, client renders. Confirmed by lead and tracking doc. No local content loading on the client. - ---- - -## Updated UI Bill of Materials (incorporating Round 2 decisions) - -| System | Scenes | Scripts | Shaders | Priority | Notes | -|--------|--------|---------|---------|----------|-------| -| **Monologue renderer** | 1 | 1 | 0 | P0 | Fade, timing, priority queue, character tint | -| **Interaction prompt** | 1 | 1 | 0 | P0 | World-space tracking, single-action (extensible to multi) | -| **Dialogue panel** | 1 | 1 | 0 | P0 | Semi-transparent, text advance, exit handling | -| **Entity color system** | 0 | 1 | 1 | P0 | D-033 palette, 0.5s fade transitions | -| **Pause manager** | 0 | 1 | 0 | P0 | State machine: RUNNING / OVERLAY / PAUSED | -| **HUD bar** | 1 | 1 | 0 | P1 | Location + time phase. Placeholder text in v0.1 | -| **Minimap** | 1 | 1 | 1 | P1 | Insert-style, player dot + area bounds | -| **Knowledge panel** | 1 | 1 | 0 | P1 | Right-side overlay, People/Places/Observations | -| **News ticker** | 1 | 1 | 0 | P1 | World-space scrolling text on bar display entity | -| **Fog rendering** | 0 | 0 | 1 | P0 | Shared with server team (shadowcast → visual) | -| **TOTAL** | **7** | **9** | **3** | | | - -Reduced from 9 scenes to 7 (pause manager and entity colors don't need dedicated scenes). Added 1 shader (fog rendering confirmed as client-side). - ---- - -## Dependencies I'm Waiting On - -| From | What I Need | Blocks | -|------|-------------|--------| -| **Dudley** | IPC message format — specifically `ObserverSnapshot` structure for interaction options, monologue payloads, dialogue payloads. | Interaction prompt, dialogue panel, monologue renderer | -| **Dudley** | Pause architecture — does client control sim speed, or does it signal the server? | Pause manager | -| **Tyre** | `ObserverSnapshot` v3 protocol spec (Round 2 task for Tyre). | Everything that reads server state | -| **Araminta** | Font selection, diegetic styling direction for knowledge panel. | Knowledge panel visual treatment | -| **Mellanie** | First monologue content (even 5-10 lines) for integration testing. | Monologue renderer testing | - -I can build all UI scaffolding with mock data. But integration testing needs real payloads from the server and real text from Mellanie. The sooner those arrive, the sooner we know if the display constraints actually feel right at runtime. - ---- - -*Spacebar always pauses. Everything else fades in when needed and disappears when it's done.* diff --git a/docs/workshops/v01-content-scoping/round2-tracking.md b/docs/workshops/v01-content-scoping/round2-tracking.md deleted file mode 100644 index 5371daf17..000000000 --- a/docs/workshops/v01-content-scoping/round2-tracking.md +++ /dev/null @@ -1,594 +0,0 @@ -# Round 2 Tracking — Qatux (Documenter) -## v0.1 Content Scoping Workshop — CLOSING ROUND - -**Status:** All 7 responses received (Gestalt, Paula, Tyre, Dudley, Stig, Mellanie, SI). Workshop complete. -**Date:** 2026-02-12 - ---- - -## 1. Lead Decisions (Round 2 Brief) - -Four lead decisions were issued at the start of Round 2, resolving the major disagreements from Round 1: - -| ID | Decision | Round 1 Disagreement Resolved | -|----|----------|-------------------------------| -| **D-NPC** | Gestalt's mechanical mapping is canonical for v0.1. Paula's emotional/narrative layer becomes v0.2 annotations. | D-02 (10 of 17 NPC mapping disagreements) | -| **D-FORMAT** | YAML for content files. RON converter available as optional build-time tool. | D-01 (YAML vs RON) | -| **D-INTERACT** | Single context-sensitive action for v0.1. Multi-verb architecture modeled underneath from day one. | D-04 (Examine vs Talk: separate or combined) | -| **D-PAUSE** | Spacebar always pauses (0% speed). UI overlays (knowledge panel, dialogue) trigger 50% sim speed. 3-state system. | D-05 (Knowledge panel pause behavior) | - -**Additionally resolved by lead direction:** -- **D-03 (EntityKnowledge keys):** 16 total keys. 4 new generic role-perspective keys. `trust_read` merged into existing `trust_level`. `leverage_held` absorbs `secret_held`. `secret_confidence` renamed to `leverage_confidence`. (See Section 5.) -- **R2-06 (PC voice registers):** Assigned to Mellanie as Round 2 task. -- **R2-07 (Triangle fork cascade):** Self-contained forks confirmed. -- **R2-09 (ObserverSnapshot v3):** Assigned to Tyre as Round 2 task. - -**Closing round additions (post-Round 2 responses):** -- **Q-012 resolved:** 16 EntityKnowledge keys finalized (see Section 5). -- **Q-013 resolved:** Server-authoritative pause. Client is a dumb renderer. NEW-12 (client pause state machine) killed. -- **Q-016 resolved:** `actions[]` → `verbs[]` rename confirmed across server code, client code, YAML content, wiki docs, decision files. Folded into NEW-7. -- **Process rule:** No ticket merges across domain teams. Shared epics are fine; each team gets its own ticket with its own definition of done. - ---- - -## 2. Round 1 Disagreement Resolutions - -### D-02 Resolved: NPC Pattern/Motivation Mapping - -Gestalt reviewed all 10 disagreements from Round 1 and **changed his position on 6 of 10**, adopting Paula's reads. Both agents converged on a single canonical mapping. - -| NPC | Round 1 Gestalt | Round 1 Paula | Round 2 Final | Who Prevailed | Gestalt's Rationale for Change | -|-----|----------------|--------------|---------------|---------------|-------------------------------| -| **Maret** (pattern) | SYSTEM | WITNESS | **WITNESS** | Paula | Story function > job description | -| **Maret** (motivation) | WITNESS | SKEPTIC | **SKEPTIC** | Paula | WITNESS+SKEPTIC creates compositional tension | -| **Resha** (motivation) | SKEPTIC | CIVILIAN | **CIVILIAN** | Paula | Innocent disruption > deliberate questioning | -| **Harek** (pattern) | GHOST | ANCHOR | **ANCHOR** | Paula | Harek is physically present; contentment, not absent power | -| **Drin** (pattern) | REMNANT | SYSTEM | **SYSTEM** | Paula | Station too young for REMNANT; SYSTEM+TURNCOAT = institutional rot | -| **Sabel** (pattern) | THRESHOLD | GHOST | **GHOST** | Paula | Off-station = absent power, not gatekeeper | -| **Olin** (motivation) | SKEPTIC (dual) | CIVILIAN | **CIVILIAN** | Paula | Dropped dual designation; 1 pattern + 1 motivation per NPC | -| **Voss** (motivation) | OPERATOR | HANDLER | **OPERATOR** | Gestalt | Voss RUNS the schedule; middle management operating machinery | -| **Devra** (motivation) | HANDLER | OPERATOR | **HANDLER** | Gestalt | Devra conveys Nils's strategy; pressure from above | -| **Sess** (pattern) | ANCHOR | NOBODY | **ANCHOR** | Gestalt | NOBODY deferred to v0.2; ANCHOR at T3 = contentment as texture | - -**Paula's response:** Accepted the versioned approach. Annotated all 10 disagreement NPCs with v0.2 emotional layer descriptions. Each annotation specifies what content the v0.2 motivation/pattern unlocks (~30-50 lines per NPC). - -### D-01 Resolved: YAML Format - -**Dudley accepts YAML.** One-line change: `serde_yaml::from_str()` replaces `ron::from_str()`. Multi-line YAML blocks (`|`) improve author experience. RON crate retained for potential future use. - -### D-04 Resolved: Examine vs Talk - -**Converged on: conceptually separate, v0.1 ships single action.** The server models both verbs internally; priority resolution determines which surfaces as the `[E]` prompt. Post-contradiction, Examine can become primary (detective investigating a flagged NPC). The v0.2 client reads the full action list — no server changes needed. - -### D-05 Resolved: Pause System - -**3-state system adopted by all respondents.** Gestalt, Stig, and Dudley each independently designed compatible state machines. - ---- - -## 3. Definitive v0.1 NPC Mapping - -The canonical mapping, produced by Gestalt with 6 changes from Paula's input: - -| # | Name | Tier | Pattern | Motivation | Composition Read | -|---|------|------|---------|-----------|-----------------| -| 1 | **Kael Davan** | **T1** | **FRIEND** | **OPERATOR** | Trust anchor running ring cargo | -| 2 | **Sera Venn** | **T1** | **FRIEND** | **WITNESS** | Trust anchor carrying unreported evidence | -| 3 | **Naia Tamm** | **T1*** | **MIRROR** | **CIVILIAN** | Honest transparency, no secrets | -| 4 | **Voss** | T2 | **SYSTEM** | **OPERATOR** | Institutional authority operating the schedule | -| 5 | **Lera Sessik** | T2 | **ANCHOR** | **OPERATOR** | Contentment embodied, running a bar on willful ignorance | -| 6 | **Torek Lintar** | T2 | **CATALYST** | **CIVILIAN** | Spending disrupts equilibrium | -| 7 | **Devra** | T2 | **THRESHOLD** | **HANDLER** | Ring gatekeeper, manages operations from above | -| 8 | **Maret Korr** | T2 | **WITNESS** | **SKEPTIC** | Accidentally observed discrepancies, doubts the numbers | -| 9 | **Resha** | T2 | **CATALYST** | **CIVILIAN** | New hire forcing defensiveness with innocent questions | -| 10 | **Drin** | **T2** | **SYSTEM** | **TURNCOAT** | Inspector whose compromise corrupts the institution | -| 11 | **Renn** | T2 | **THRESHOLD** | **OPERATOR** | Courier controlling cargo flow | -| 12 | **Pell** | T2 | **CATALYST** | **TURNCOAT** | Wavering member forcing potential crisis | -| 13 | **Harek** | T2 | **ANCHOR** | **HANDLER** | Complacent contentment whose comfort creates a tool | -| 14 | **Sess** | T3 | **ANCHOR** | **CIVILIAN** | Quiet contentment behind the bar | -| 15 | **Olin** | T3 | **CATALYST** | **CIVILIAN** | New arrival forcing evaluation | -| 16 | **Sabel** | T3 | **GHOST** | **OPERATOR** | Off-station absent power running the supply chain | -| 17 | **Tav** | T3 | **SYSTEM** | **CIVILIAN** | Ring lookout following procedure | - -**Off-stage:** Nils Davan — GHOST + HANDLER - -**Distribution:** 8 of 9 patterns present (REMNANT correctly absent; NOBODY deferred to v0.2). All 6 motivations present. CIVILIAN at 6/17 (35%) matches D-029 noise floor (~30%). - ---- - -## 4. Key Architecture Convergences - -### 4.1 Multi-Verb Interaction Architecture - -Tyre, Dudley, and Stig independently produced compatible designs: - -| Agent | Contribution | Compatible? | -|-------|-------------|-------------| -| **Tyre** | `AvailableActions` per entity with priority-sorted `ActionOption` list; `ActionKind` enum; `InteractPrimary` vs `InteractWith` PlayerAction variants | Canonical design | -| **Dudley** | `EntityInteractions` with `AvailableAction` list; server-side `rank_actions()` priority system; `PlayerAction::InteractWith` for v0.2 | Compatible — naming differs, structure identical | -| **Stig** | `InteractionOptions` with `primary`/`secondary` fields; v0.2 extension reads `actions[]` array; world-space prompt renderer | Client-side compatible | - -**Minor naming divergence:** Tyre uses `AvailableActions`/`ActionOption`, Dudley uses `EntityInteractions`/`AvailableAction`. These are the same concept. - -**Lead confirmation (closing round):** `actions[]` → `verbs[]` rename confirmed. Scope: server code, client code, YAML content files, wiki docs, decision files. Folded into NEW-7 ticket description. - -**Key design principles (unanimous):** -- Server computes N available verbs per entity every tick -- v0.1 client shows only priority-0 verb (single `[E]` prompt) -- v0.2 client renders full list — no server changes needed -- Context-sensitive priority (post-contradiction: Examine rises above Talk) -- `InteractionOptions`/`AvailableActions` embedded in ObserverSnapshot, not separate message -- Server is authoritative; client never queries content files - -### 4.2 Pause System (3-State) - -| State | Speed | Trigger | All 3 Agree? | -|-------|-------|---------|-------------| -| **Normal** | 100% (1.0) | Default | Yes | -| **Overlay** | 50% (0.5) | Knowledge panel, dialogue | Yes | -| **Paused** | 0% (0.0) | Spacebar (always) | Yes | - -**Gestalt:** Multiplicative toggle model (`effective_speed = if pause_override { 0.0 } else { base_speed * ui_modifier }`). Multiple overlays don't stack (50% stays 50%). v0.2 extension: panel + dialogue could = 25%. - -**Stig:** GDScript `PauseManager` with `SimState` enum, `_pre_pause_state` tracking for resume, overlay count tracking. Spacebar from OVERLAY_ACTIVE goes to PAUSED (not RUNNING). Questions for Dudley: does server need pause signals, or does client control? - -**Dudley:** `SimSpeed` enum resource with `speed_stack` (priority-based). `SimSpeed::Overlay` ticks every 2nd frame. Server is authoritative over tick advancement. `sim_speed: f32` field in ObserverSnapshot tells client the current rate. - -**Resolved (closing round):** Server-authoritative pause. Tick rate is a server simulation concern. Client is a dumb renderer — it renders ObserverSnapshots at whatever rate the server sends them. Client sends a pause IPC command to the server; that's it. Stig's `PauseManager` GDScript is reduced to sending IPC commands and reading `sim_speed` from the snapshot for visual feedback. **NEW-12 (client pause state machine) killed** — client doesn't manage time. - -### 4.3 ObserverSnapshot v3 - -Tyre and Dudley independently produced v3 definitions. They are structurally identical: - -| Field | Tyre's Proposal | Dudley's Proposal | Status | -|-------|----------------|-------------------|--------| -| `sim_speed: f32` | Yes (default 1.0) | Yes | Agreed | -| `nearby_interactions` | `Vec` | `Vec` | Agreed (naming differs) | -| `active_dialogue` | `Option` | `Option` | Agreed | -| `monologue` | `Vec` | `Vec` | Agreed | -| `overheard` | `Vec` | `Vec` | Agreed (naming differs) | -| `knowledge_updates` | `Vec` | Not in Dudley's R2 snapshot | Tyre adds delta updates | -| `examine_result` | `Option` | Not in Dudley's R2 snapshot | Tyre adds | -| `ticker_headlines` | `Vec` | Not in Dudley's R2 snapshot | Tyre adds | - -**Wire size estimate (Tyre):** v3 adds ~50-1500 bytes per tick on top of v2's 2-8 KB. Total: ~2-10 KB/tick at 10 tps = 20-100 KB/s. Well within IPC budget. - -**Backward compatibility:** MessagePack serializes by field name. New fields use `#[serde(default)]`. v2 client reading v3 snapshot ignores unknown fields. v3 client reading v2 snapshot gets empty defaults. - -### 4.4 Content Directory + Schema - -Tyre produced the definitive directory tree and JSON Schema definitions: - -**Directory structure:** `content/content.yaml` (manifest) + `content/schema/` (JSON Schema files) + `content/global/` (facts, factions, enums, entity-schema) + `content/districts/sova-transit/` (npcs/, locations/, triangles/, dialogue/, monologue/, routines/). - -**Schemas defined:** -- `npc-profile.schema.json` — Full NPC profile with tier-conditional fields, pattern/motivation enums, axes, tells, access tiers, trust levels, friend_arc, triangle membership -- `dialogue-pool.schema.json` — Tagged dialogue lines per D-028/D-035. Role + location based, with access/trust/situation gating and knowledge_grants -- `monologue-pool.schema.json` — Character-partitioned (D-032). Trigger + prerequisite (AND-only) + priority + cooldown. 160 char max per Stig - -**Validation pipeline (3-tier):** -1. Authoring time: IDE with JSON Schema autocomplete -2. Build time (`make content-validate`): JSON Schema + cross-reference validation -3. Load time: serde_yaml deserialization + semantic validation (StableId assignment, relationship wiring) - -### 4.5 YAML + RON Converter - -| Aspect | Tyre | Dudley | Status | -|--------|------|--------|--------| -| Content format | YAML | YAML (accepted) | Agreed | -| RON converter location | `tooling/content-tools/` | `tooling/content-converter/` | Minor naming difference | -| When converter runs | Build-time optional | Build-time optional, low priority | Agreed | -| Development loading | YAML direct | YAML direct | Agreed | -| Production loading | RON cache preferred, YAML fallback | YAML (RON is insurance) | Agreed — YAML in v0.1, RON as future optimization | - -Tyre provides dual-format loader (~20 lines) with `load_with_cache()` fallback pattern. `content/.cache/` is gitignored. - ---- - -## 5. EntityKnowledge Keys — RESOLVED: 16 Keys - -Both Gestalt and Paula independently arrived at the same conclusion: **generic perspective keys, not per-archetype keys.** This resolves D-03 from Round 1. - -### Convergence (Round 2 Responses) - -| Point | Gestalt | Paula | Converged? | -|-------|---------|-------|-----------| -| Per-archetype keys are unsustainable | Yes (32 archetype-specific + 14 shared = 46 total) | Yes (same conclusion) | **Yes** | -| Generic keys work for all 8 archetypes | Yes | Yes | **Yes** | -| Interpretation lives in content, not schema | Yes (monologue pools provide character-specific meaning) | Yes (archetype brief + voice register + moral arc) | **Yes** | -| `social_debt` deferred to v0.2 | Yes | Accepts | **Yes** | -| `loyalty_conflict` deferred to v0.2 | Yes (inferable from `behavior_flags` + `reliability`) | Accepts | **Yes** | - -### Final Resolution (Closing Round Lead Decision) - -**16 total EntityKnowledge keys.** 12 existing shared keys + 4 new generic role-perspective keys. Key merges and renames applied: - -#### 4 New Role-Perspective Keys (observer→target, all archetypes) - -| Key | Value Enum | What It Stores | -|-----|-----------|---------------| -| `risk_assessment` | `none`, `low`, `moderate`, `high`, `critical` | How this NPC threatens the observer's position (exposure, obstruction, liability, competition — archetype-dependent) | -| `loyalty_assessment` | `solid`, `dependable`, `uncertain`, `wavering`, `hostile` | How predictably this NPC serves the observer's interests | -| `position_integrity` | `solid`, `thin`, `cracking`, `blown`, `N/A` | Status of active deception involving this NPC (cover, reputation, facade) | -| `moral_weight` | `innocent`, `peripheral`, `complicit`, `compromised`, `willing` | Observer's subjective moral assessment within their ethical framework | - -**Key names adopt Paula's naming** (`risk_assessment` over `threat_to_position`, `position_integrity` over `facade_status`). **Value enums adopt Gestalt's archetype-neutral vocabulary.** - -#### Key Merges and Renames - -| Action | Old | New | Rationale | -|--------|-----|-----|-----------| -| **Merge** | `trust_read` | `trust_level` (existing) | "Read is the action, level is the end state." Same key, per-character interpretation. | -| **Absorb** | `secret_held` | `leverage_held` (existing, renamed) | "Secret is a subtype of leverage." Value space expanded: secrets, debts, promises, obligations, compromising positions. | -| **Rename** | `secret_confidence` | `leverage_confidence` | Follows `secret_held` → `leverage_held` rename. | -| **Defer** | `social_debt` | v0.2 | 30-minute session doesn't develop favor economy. | -| **Defer** | `loyalty_conflict` | v0.2 | Inferable from `behavior_flags` + `loyalty_assessment`. | -| **Not added** | `tell_observed`, `contradiction_flagged` | — | Tracked in `behavior_flags` (existing). No 7th key needed. | - -#### Final Key Inventory (16 total) - -| # | Key | Category | New/Existing | -|---|-----|----------|-------------| -| 1 | `name` | Identity | Existing | -| 2 | `role` | Identity | Existing | -| 3 | `faction` | Identity | Existing | -| 4 | `species` | Identity | Existing | -| 5 | `location` | Spatial | Existing | -| 6 | `routine_pattern` | Behavioral | Existing | -| 7 | `trust_level` | Relational | Existing (absorbs `trust_read`) | -| 8 | `leverage_held` | Relational | Existing (renamed from `secret_held`, expanded value space) | -| 9 | `leverage_confidence` | Relational | Existing (renamed from `secret_confidence`) | -| 10 | `relationship_state` | Relational | Existing | -| 11 | `behavior_flags` | Behavioral | Existing (tracks tells + contradictions) | -| 12 | `known_associates` | Social | Existing | -| 13 | `risk_assessment` | **Role-perspective** | **NEW** | -| 14 | `loyalty_assessment` | **Role-perspective** | **NEW** | -| 15 | `position_integrity` | **Role-perspective** | **NEW** | -| 16 | `moral_weight` | **Role-perspective** | **NEW** | - -**This scales to all 8 archetypes without modification.** Interpretation lives in content (monologue pools, voice registers, archetype briefs), not schema. The smuggler reads `risk_assessment: "high"` as exposure risk; the detective reads it as obstruction risk; the administrator reads it as political liability. Same key, same enum, different meaning. - ---- - -## 6. FriendArc Phase Transitions (Dudley) - -Dudley produced the definitive 4-phase state machine with explicit trigger code: - -| Phase Transition | Trigger | Content Dependency | -|-----------------|---------|-------------------| -| **Warmth → Trust** | Interaction count (>=3) + time elapsed (>=600 ticks / 1 game-hour) | 5-8 casual dialogue + 3-5 positive monologue | -| **Trust → Doubt** | Knowledge threshold — observer learns a doubt-triggering fact at KnowsOf+ | 5-8 deeper dialogue + 3-5 questioning monologue | -| **Doubt → Conflict** | Direct observation of contradiction (`contradiction_discovered` flag) | **1 critical monologue line** (wow moment #3) + 8-12 confrontation dialogue | - -**Contradiction spatial staging:** Server schedules NPC routine deviation (Kael in Corridor B-7 during shift transition). The `check_contradiction_observation` system checks: (1) FRIEND at contradiction location, (2) within time window, (3) bonded character has Direct confidence (LOS). All 5 state changes must happen atomically within one tick: knowledge graph updated, FriendArc phase advanced, RelationshipState changed (Friendly → PersonOfInterest), monologue triggered (urgent), entity color shifted (green → amber). - -**Content required per FRIEND NPC:** ~35-46 authored lines minimum. Both FRIEND NPCs: ~70-92 lines. Aligns with D-034 estimate. - -**New component:** `InteractionLog` — BTreeMap tracking (target_stable_id, tick) pairs. Supports Warmth→Trust transition and future NOBODY tier promotion. - ---- - -## 7. PC Voice Registers (Mellanie) - -Mellanie produced canonical voice register specifications for both playable characters: - -### Smuggler — Internal Voice Register - -**One-line summary:** Watches people, not systems. Thinks in fragments. Worries about friends practically, physically, with the knot in the stomach. - -| Parameter | Value | -|-----------|-------| -| Sentence length | Short. Fragments welcome. Rarely >2 sentences. | -| Vocabulary | Concrete, physical, sensory. Trade jargon without explanation. | -| Emotional register | Feeling-first, analysis second. | -| Relationship mode | First-name basis. People defined by connection, not role. | -| Observation priority | People > environment > objects. | -| Self-reference | Rare. Through physical sensation, not emotional vocabulary. | -| Humor | Dry, situational, understated. Dark when stressed. | - -**5 voice anchors provided:** Baseline warm, Operational, Concerned, Hurt, Atmospheric. -**4 anti-patterns defined:** Too clinical, institutional vocabulary, analytical distance, explaining known facts. - -### Detective — Internal Voice Register - -**One-line summary:** Categorizes first, feels second. Thinks in complete sentences. Institutional training runs in the background. - -| Parameter | Value | -|-----------|-------| -| Sentence length | Complete but not long. More structured than smuggler. | -| Vocabulary | Institutional layer over plain speech. "Noted," "flagged," "filed it." | -| Emotional register | Analysis-first. Personal breaks through as notable cracks. | -| Relationship mode | Surname-first for targets. First-name for allies. The shift IS a marker. | -| Observation priority | Patterns > people > environment. Counts things, tracks frequencies. | -| Self-reference | More common, always through professional lens. | -| Humor | Wry, observational. Appreciates irony at a distance. | - -**5 voice anchors provided.** 4 comparison examples (same trigger, two characters) demonstrating voice distinctness. - -### Display Constraints (Mellanie confirms Stig's R1 proposal) - -| Constraint | Value | -|-----------|-------| -| Max length | ~160 characters (hard ceiling) | -| Target range | 80-120 characters (most lines), 40-80 (ideal) | -| Max visual lines | 2 | -| Word target | 10-18 words (14 average) | -| Display time | 4-6 seconds (length-adjusted) | -| Character tint | Smuggler: amber-white `#f0e0c8`, Detective: blue-white `#c8d8f0` | - ---- - -## 8. THE FRIEND Content Pack — Kael Davan (Mellanie) - -Mellanie mapped the complete Kael Davan content pack structure: - -| Content Type | Lines | Phase Distribution | -|-------------|-------|-------------------| -| Kael dialogue | 36 | Terminal: 17, Bar: 13, Corridor: 6 | -| Smuggler monologue about Kael | 18 | 5 phases (Comfort 4, First Crack 4, Contradiction 3, Confrontation 3, Contaminated Trust 4) | -| Detective monologue about Kael | 10 | Identification 2, Behavioral 3, Suspicion 3, Informant 2 | -| Tell observation lines | 8 | Lattice 2, Shortened 2, Looks-left 2, Spatial 2 | -| Trust-gated lines | 13 | Insider 6, Close colleague 4, Secret hints 3 | -| Unprompted lines | 6 | Early warmth 3, Late warnings 3 | -| **PACK TOTAL** | **91** | Within D-034 range (70-100) | - -**Phase distribution analysis:** -- Phase 1 (Comfort): 21 lines (23%) — heavy on dialogue, light on monologue -- Phase 2 (First Crack): 13 lines (14%) — tells ramp up -- Phase 3 (Contradiction): 7 lines (8%) — fewest lines, highest stakes -- Phase 4 (Confrontation): 16 lines (18%) — dialogue-heavy -- Phase 5 (Contaminated Trust): 16 lines (18%) — voice discipline critical -- Cross-phase: 16 lines (18%) - -**Sample YAML lines provided** for each phase demonstrating prerequisite progression. Format aligns with Tyre's `monologue-pool.schema.json`. - -**695 total validation (Mellanie clarifies):** 695 is the authored floor. Does not include generation-expanded output (D-028: "write 10, generate 40" for dialogue). Does not include engine-generated content (routine greetings, time-of-day variations). - ---- - -## 9. UI Specifications Confirmed (Stig) - -### Updated Bill of Materials - -| System | Scenes | Scripts | Shaders | Priority | -|--------|--------|---------|---------|----------| -| Monologue renderer | 1 | 1 | 0 | P0 | -| Interaction prompt | 1 | 1 | 0 | P0 | -| Dialogue panel | 1 | 1 | 0 | P0 | -| Entity color system | 0 | 1 | 1 | P0 | -| Pause manager | 0 | 1 | 0 | P0 | -| HUD bar | 1 | 1 | 0 | P1 | -| Minimap | 1 | 1 | 1 | P1 | -| Knowledge panel | 1 | 1 | 0 | P1 | -| News ticker | 1 | 1 | 0 | P1 | -| Fog rendering | 0 | 0 | 1 | P0 | -| **TOTAL** | **7** | **9** | **3** | | - -**Changes from Round 1:** Reduced from 9 scenes to 7. Added 1 shader (fog rendering). Pause manager added (P0, new in R2). - -### Monologue Display Parameters (Stig, confirmed by Mellanie) - -| Parameter | Value | -|-----------|-------| -| Max characters | 160 | -| Max lines | 2 | -| Base duration | 4.0s | -| Short duration (<80 chars) | 3.0s | -| Urgent chime duration | 5.0s | -| Fade in | 0.3s | -| Fade out | 0.5s | -| Interruption fade | 0.15s | -| Cooldown between lines | 2.0s minimum | -| Max queue depth | 1 (drop lower-priority) | - -**Priority ordering:** observe_anomaly (1) > witness_interaction (2) > discover_evidence (3) > post_conversation (4) > hear_sound (5) > observe_npc (6) > enter_location (7) > return_visit (8) > time_idle (9). - -**Critical UI interaction:** Monologue fires during dialogue (for wow moment #3). Monologue sits in world layer; dialogue sits in HUD layer. Two voices simultaneously — one external, one internal. - -### Interaction Prompt — Single-Action Extensible - -v0.1: `[E] Talk` / `[E] Examine` — single keybind, context-sensitive verb. -v0.2: `[E] Talk [F] Observe` — horizontal label row, same prompt position. - -The `verbs[]` field (renamed from `actions[]` per D-060) exists in the protocol from day one. The v0.1 client ignores it. The v0.2 client reads it. No protocol change needed. - ---- - -## 10. Ticket Analysis — Finalized (SI) - -### Lead Decision Impact on Tickets - -| Decision | Ticket Impact | -|----------|---------------| -| D-NPC | NEW-1 simplified to "apply Gestalt's mapping." Paula's layer → v0.2 annotation. | -| D-FORMAT | Confirms C-series as YAML. Adds NEW-8 (RON converter). | -| D-INTERACT | NEW-7 reframed. Adds NEW-9 (server InteractionOptions) + NEW-10 (client extensible prompt). | -| D-PAUSE | Adds NEW-11 (server tick rate scaling). ~~NEW-12 (client pause state machine)~~ **killed in closing round** — client is a dumb renderer. | - -### Final Ticket Count - -| Category | Count | Teams | -|----------|-------|-------| -| Wiki fixes (A-series) | 8 | copy | -| Style guides & specs (B-series) | 5 | copy | -| Content directory & schema (C-series) | 10 | copy (1), server (8), ci (1) | -| Design specs (D-series) | 2 | server (1), copy (1) | -| Round 1 new tickets (NEW 1-7) | 7 | copy | -| Round 2 new tickets (NEW 8-13) | 5 | server (4), client (1) | -| **Total new tickets** | **37** | **copy (21), server (13), client (1), ci (1)** | -| Existing ticket updates | 10 | — | - -**Delta from Round 1:** +5 tickets (NEW-8 through NEW-13 from lead decisions, minus NEW-12 killed in closing round). Removed: D3 (killed), A5 (deferred), D1 (deferred), NEW-12 (killed — client doesn't manage time). Merged: A3 into #319, #310 into B4. - -### Sprint 3 Allocation - -**Copy team (15 tickets):** -- P0: #261 (Dual Lens Guide, **critical path root**), C1 (Content directory design), A1 (canonical names), A2 (Naia Tamm rename), A7 (smuggler attributes) -- P1: B2 (MIRROR spec), B4 (smuggler voice + moral arc), NEW-1 (NPC mapping), NEW-5 (wow moment checklist), A10 (Nils stub), A11 (Triangle 1 fix) -- P2: B3 (PC-as-NPC), A8 (shortcode fix), NEW-2 (Drin expansion), NEW-7 (interaction verb spec) - -**Server team (4 additions):** C2 (directory skeleton), C3 (schemas), NEW-9 (InteractionOptions), NEW-11 (tick rate scaling) - -**Client team (1 addition):** NEW-10 (extensible prompt). ~~NEW-12 killed~~ — client sends pause IPC command; server manages tick rate. - -### Critical Path (Revised) - -Two parallel chains: - -**Chain 1 — Content Authoring:** -``` -#261 (Dual Lens Guide) [P0, ROOT] - -> B4 (Smuggler voice + moral arc) - -> A6 (Smuggler FactId text) [Sprint 4] - -> NEW-4 (Monologue pool ~200 lines) [Sprint 5] - -> #297 (FRIEND: Kael) [Sprint 5] - -> #298 (FRIEND: Sera) [Sprint 5] - -> #190, #191, #192 (Content packs) [Sprint 5] -``` - -**Chain 2 — Content Architecture:** -``` -C1 (Content dir design) [P0] - -> C2 (skeleton) + C3 (schemas) [Sprint 3] - -> C4-C8 (YAML population) [Sprint 4] - -> NEW-3 (wiki->YAML conversion) [Sprint 4] - -> #326 (YAML loader) [Sprint 4] - -> C9 (validator) [Sprint 4] -``` - -**Independent chains (Sprint 3):** -- A10 (Nils stub) → A11 (Triangle 1 fix) -- NEW-9 (InteractionOptions, server) → NEW-10 (extensible prompt, client) -- NEW-11 (tick rate scaling, server) — no client counterpart (client reads `sim_speed` from snapshot) - -### Risks (SI) - -1. **#261 remains critical path root.** Every content authoring ticket flows through it. Recommended: assign Paula, time-box 5 days. -2. **Sprint 3 copy team has 15 tickets.** 7 are small/parallelizable. Real load: #261, C1, B2, B4, A11. -3. **Server Sprint 3 already heavy** (10 existing + 4 new). C2/C3 blocked by C1 anyway. -4. **Content conversion (NEW-3) is Sprint 4 bottleneck.** Start with 3 Tier 1 NPCs as soon as C2 lands. - ---- - -## 11. Wiki Fix Execution Plan (Paula) - -Paula produced execution-ready content changes for each priority level: - -| Priority | Change | Files | Status | Effort | -|----------|--------|-------|--------|--------| -| P0-1 | Naia Tamm rename | 16 files | Exact per-file changes specified | ~2 hours | -| P0-2 | Nils Davan stub | 1 new + 3 cross-ref | Full draft ready | ~30 min | -| P0-3 | Drin Tier 2 expansion | 1 rewrite + index | Full draft ready | ~1 hour | -| P1-1 | Canonical names | 10 headers + index | Name table ready; 3 need Miri validation | ~1 hour | -| P1-2 | Triangle 1 escalation fork | index + 2 NPC notes | Self-contained version (v0.1) | ~1 hour | -| P2-1 | Smuggler-lens sections (17 NPCs) | 17 profiles | Template ready; per-NPC content needed | ~8-10 hours | -| P2-2 | PC-as-NPC profiles | 2 new files | Gap identified; not yet drafted | ~3-4 hours | -| P2-3 | FactId catalog smuggler entries | 1 file | Gap identified; not yet drafted | ~2 hours | - -**P0-1 and P0-2 can start immediately.** P0-3 blocked by A-01 formalization (consensus confirmed). P1-1 blocked by Miri validation (3 names). P1-2 depends on P0-2. - -**P1-2 (Triangle 1) — self-contained revision:** Cross-triangle cascade removed per D-INTERACT. Path B no longer triggers Maret's discovery. Path C no longer makes detective investigation easier. Emotional weight preserved within Triangle 1. - ---- - -## 12. Dependencies Matrix - -| Agent | Waiting On | From | Blocks | Status | -|-------|-----------|------|--------|--------| -| **Stig** | IPC message format (ObserverSnapshot v3 struct) | Dudley/Tyre | All client UI | Open | -| ~~**Stig**~~ | ~~Pause architecture decision~~ | ~~Dudley~~ | ~~Pause manager~~ | **Resolved** — server-authoritative | -| **Stig** | Font selection, diegetic styling | Araminta | Knowledge panel visual | Open | -| **Stig** | First monologue content (5-10 lines) | Mellanie | Monologue renderer testing | Open | -| **Dudley** | ObserverSnapshot v3 sign-off | Tyre | Protocol implementation | Open | -| **Dudley** | FactId catalog (machine-readable) | Gestalt/Paula | Prerequisite evaluation | Open | -| **Dudley** | FRIEND content packs (phase-tagged) | Mellanie | FriendArc integration testing | Open | -| **Dudley** | Contradiction spatial data (location, time window) | Paula | Spatial staging system | Open | -| **Mellanie** | Content directory confirmed | Tyre | File structure for packs | Open | -| **Mellanie** | FactId catalog stabilized | Gestalt/Paula | Prerequisite placeholders | Open | -| ~~**Mellanie**~~ | ~~EntityKnowledge key resolution~~ | ~~Lead~~ | ~~Prerequisite vocabulary~~ | **Resolved** — 16 keys, 4 role-perspective | -| **Paula** | Miri validation (3 NPC surnames) | Miri | Canonical name application | Open | - ---- - -## 13. Decisions Ready to Formalize - -### From Lead's Round 2 Decisions - -| Proposed ID | Decision | Source | -|-------------|----------|--------| -| D-049 | **YAML is the content file format for v0.1.** RON converter available as optional build-time tool in `tooling/`. Server loads YAML directly in development; RON cache is a production optimization. | D-FORMAT lead decision; Tyre design; Dudley acceptance | -| D-050 | **Gestalt's NPC pattern/motivation mapping is canonical for v0.1.** Paula's emotional/narrative layer becomes v0.2 annotations. Version-toggle approach: same NPCs, different analytical depth per version. | D-NPC lead decision; Gestalt definitive table; Paula versioned layer | -| D-051 | **v0.1 ships single context-sensitive action; multi-verb architecture modeled underneath.** Server computes N available actions per entity. v0.1 client shows priority-0 only. v0.2 client reads full list. No server changes for v0.2 multi-verb. | D-INTERACT lead decision; Tyre architecture; Dudley implementation; Stig client design | -| D-052 | **3-state pause system: Normal (100%), Overlay (50%), Paused (0%). Server-authoritative.** Spacebar always pauses from any state. UI overlays (knowledge panel, dialogue) trigger 50% speed. Multiple overlays don't stack below 50%. Spacebar resumes to pre-pause state. **Server controls tick rate; client is a dumb renderer.** Client sends pause IPC command to server. Client reads `sim_speed` from ObserverSnapshot for visual feedback. NEW-12 (client pause state machine) killed. | D-PAUSE lead decision + closing round resolution; Gestalt mechanical design; Dudley server SimSpeed authoritative | -| D-053 | **Self-contained triangle forks for v0.1.** Independent decision state machines, shared NPC state. No cross-triangle cascade. Players observe cross-triangle effects emergently through NPC behavior. v0.2 adds storyteller-managed cascade. | Gestalt confirmation; Tyre recommendation (R1); Paula revised Triangle 1 | -| D-054 | **ObserverSnapshot v3 protocol.** Extends v2 with: sim_speed, nearby_interactions, active_dialogue, monologue, overheard, knowledge_updates, examine_result, ticker_headlines. Backward compatible via serde defaults. Wire overhead ~50-1500 bytes/tick. | Tyre full definition; Dudley compatible definition | -| D-055 | **16 EntityKnowledge keys total. 4 new generic role-perspective keys: `risk_assessment`, `loyalty_assessment`, `position_integrity`, `moral_weight`.** All observer→target. `trust_read` merged into existing `trust_level`. `secret_held` renamed to `leverage_held` with expanded value space (secrets, debts, promises, obligations, compromising positions). `secret_confidence` renamed to `leverage_confidence`. `social_debt` and `loyalty_conflict` deferred to v0.2. `tell_observed` and `contradiction_flagged` tracked in existing `behavior_flags` — no dedicated keys. Scales to all 8 archetypes without schema changes. | Gestalt generic architecture; Paula generic architecture; closing round lead resolution | -| D-056 | **PC voice registers defined.** Smuggler: feeling-first, fragments, concrete/physical, first-name basis. Detective: analysis-first, complete sentences, institutional vocabulary, surname-first for targets. Both characters have 5 voice anchors, 4 anti-patterns, and 4 comparison examples. | Mellanie canonical specifications | -| D-057 | **Content directory structure: `content/` with `schema/`, `global/`, `districts/` top-level split.** JSON Schema validation at build time. Dialogue by location + role (not NPC). Monologue partitioned by character. `canonical_id` format: `npc:{slug}`, `loc:{district}:{location}`. | Tyre finalized tree + schema definitions | -| D-058 | **THE FRIEND content pack template: Kael Davan.** 91 lines across 5 arc phases + cross-phase. Pack validates tag taxonomy, load correctness, trigger appropriateness. Structure becomes template for all subsequent content packs. | Mellanie pack structure + sample YAML | -| D-059 | **Monologue display constraints.** 160 char max, 2-line max, 4-6s display time, 2s cooldown, queue depth 1 (drop lower priority), 9-level priority ordering with observe_anomaly highest. | Stig constraints; Mellanie adoption | -| D-060 | **`actions[]` renamed to `verbs[]` across all surfaces.** Scope: server code, client code, YAML content files, wiki docs, decision files. Folded into NEW-7 ticket description. | Closing round lead decision | -| D-061 | **No ticket merges across domain teams.** Shared epics are fine, but each team gets its own ticket with its own definition of done. | Closing round lead decision (process rule) | - -### From Round 1 (Carried Forward — Unchanged) - -| Proposed ID | Decision | Source | -|-------------|----------|--------| -| D-042 | Drin promoted from Tier 3 to Tier 2 | Round 1 consensus (A-01) | -| D-043 | THE NOBODY mechanic deferred to v0.2; hidden data ships in v0.1 | Round 1 consensus (A-02) | -| D-044 | v0.1 interaction model: 7 interactions (Move, Look, Monologue, Examine Object, Examine NPC, Talk, Overhear) | Round 1 consensus (A-04) | -| D-045 | v0.1 scope: add News ticker, PC-as-NPC, Time progression, Relationship state transitions to IN list | Round 1 consensus (A-14, A-15, A-16) | -| D-046 | v0.1 scope: add Inventory, Stealth, Combat, Player-facing save/load, Lattice modification to explicit OUT list | Gestalt (Round 1) | -| D-047 | v0.1 triangles: 3 active forks (T1, T2, T4), 2 passive tensions (T3, T5) | Round 1 consensus (A-07) | -| D-048 | Client receives all text from server via state updates; client does not load or evaluate content files | Round 1 consensus (A-12) | - ---- - -## 14. Open Items - -### Resolved in Closing Round - -| # | Item | Resolution | Decision | -|---|------|-----------|----------| -| Q-012 | EntityKnowledge generic key count: 4 vs 6 | **16 total keys.** 4 new role-perspective (`risk_assessment`, `loyalty_assessment`, `position_integrity`, `moral_weight`). `trust_read` → `trust_level` (merge). `secret_held` → `leverage_held` (absorb + expand). `secret_confidence` → `leverage_confidence` (rename). `tell_observed`/`contradiction_flagged` tracked in `behavior_flags`. No 7th key. | D-055 | -| Q-013 | Pause authority: client vs server | **Server-authoritative.** Client is a dumb renderer. Sends pause IPC command. Reads `sim_speed` from snapshot. NEW-12 killed. | D-052 (updated) | -| Q-016 | `actions[]` → `verbs[]` scope | **Confirmed across all surfaces:** server code, client code, YAML content, wiki docs, decision files. Folded into NEW-7. | D-060 | - -### Still Open - -| # | Item | Owner | Status | Priority | -|---|------|-------|--------|----------| -| Q-014 | 3 NPC surnames awaiting Miri validation: Drin Vassar, Sess Torin, Tav Lenn. | Miri | Blocked on world-building | Low | -| Q-015 | Interaction struct naming: `AvailableActions`/`ActionOption` (Tyre) vs `EntityInteractions`/`AvailableAction` (Dudley). Trivial — needs one canonical choice. | Tyre/Dudley | Sprint 3 implementation | Low | -| Q-017 | Mellanie's 695 authored items — validated by SI as scope input but not independently verified by other agents. | SI/Mellanie | Informational | Low | - ---- - -## 15. Workshop Summary - -### What This Workshop Produced - -1. **Canonical NPC mapping** — 17 NPCs with pattern + motivation, through collaborative resolution (Gestalt changed 6 of 10 positions based on Paula's arguments) -2. **Content architecture** — Full directory tree, 3 JSON Schema definitions, 3-tier validation pipeline, dual-format loader -3. **Interaction architecture** — Multi-verb server model with single-action client filter, extensible without server changes -4. **Pause system** — 3-state model with unanimous design convergence across 3 agents -5. **ObserverSnapshot v3** — Full protocol definition with backward compatibility, produced independently by 2 agents with structural agreement -6. **PC voice registers** — Canonical specifications for both characters with voice anchors, anti-patterns, and comparison examples -7. **FRIEND content pack template** — 91-line Kael Davan pack with phase-by-phase structure, prerequisite progression, and sample YAML -8. **FriendArc state machine** — 4-phase transitions with explicit trigger code and content dependencies -9. **Wiki fix execution plan** — 8 prioritized changes with per-file specifications for top-priority items -10. **37 new tickets + 10 updates** — Full Sprint 3-5 roadmap across copy, server, client, and CI teams (NEW-12 killed in closing round) - -### What Remains Unresolved - -- 3 NPC surnames awaiting Miri validation (Q-014) -- Interaction struct naming — trivial, resolved at implementation time (Q-015) -- 695 authored items scope validation (Q-017, informational) - -### Critical Path Unchanged - -**#261 (Dual Lens Authoring Guide) remains the single biggest blocker.** Blocks 9 downstream tickets. Recommended: assign Paula, Sprint 3 P0, time-box 5 days. - ---- - -*Qatux, Round 2 tracking (updated with closing round resolutions). For the record: all 7 Round 2 responses cataloged. 4 lead decisions implemented + 3 closing round resolutions (Q-012: 16 keys, Q-013: server-authoritative pause, Q-016: verbs[] rename confirmed). 10 Round 1 disagreements resolved (6 changed to Paula, 3 kept Gestalt, 1 deferred by design). 20 decisions ready to formalize (D-042 through D-061: 13 new from Round 2 + closing, 7 carried from Round 1). 37 new tickets proposed + 10 updates (NEW-12 killed). 3 minor items remain open. Workshop complete.* diff --git a/docs/workshops/v01-content-scoping/round2-tyre.md b/docs/workshops/v01-content-scoping/round2-tyre.md deleted file mode 100644 index 2a8165356..000000000 --- a/docs/workshops/v01-content-scoping/round2-tyre.md +++ /dev/null @@ -1,1154 +0,0 @@ -# Round 2 — Tyre (Technical Architect) -## v0.1 Content Scoping Workshop - -Four tasks from the lead. Let me work through them. - ---- - -## Task 1: Finalized Content Directory YAML Structure + Schema Snippets - -YAML confirmed. Here's the finalized structure with actual JSON Schema definitions for the core content types. These schemas are the contract between copy (authoring) and server (loading). - -### Final Directory Tree - -``` -content/ - content.yaml # Manifest: district list, content version, load order - schema/ # JSON Schema definitions for YAML validation - npc-profile.schema.json - location.schema.json - fact-catalog.schema.json - district.schema.json - dialogue-pool.schema.json - monologue-pool.schema.json - routine.schema.json - triangle.schema.json - global/ # District-independent vocabulary - facts/ - contraband.yaml - location.yaml - investigation.yaml - world.yaml - relationship.yaml - progress.yaml - factions/ - lattice-commission.yaml - syndics.yaml - the-ring.yaml - concord-assembly.yaml - guardians-of-autonomy.yaml - veil-institute.yaml - the-unbound.yaml - enums/ - situations.yaml # 13 situation values (D-035) - topics.yaml # 9 topic values - moods.yaml # 8 mood values - access-tiers.yaml # public, insider, authority, peer, hostile - trust-tiers.yaml # surface, real, secret - triggers.yaml # 9 monologue trigger types - patterns.yaml # 9 thematic patterns (System A) - motivations.yaml # 6 functional motivations (System B) - entity-schema/ - attributes.yaml # 14 canonical EntityKnowledge keys - districts/ - sova-transit/ - district.yaml - npcs/ - kael-davan.yaml - sera-venn.yaml - voss.yaml - lera-sessik.yaml - torek-lintar.yaml - devra.yaml - maret-korr.yaml - resha.yaml - naia-tamm.yaml - renn.yaml - pell.yaml - harek.yaml - drin.yaml - sess.yaml - olin.yaml - sabel.yaml - tav.yaml - locations/ - the-terminal.yaml - the-last-shift.yaml - maintenance-corridors.yaml - triangles/ - hub-power.yaml - worried-knowledge.yaml - bar-tensions.yaml - worried-partner.yaml - informant-question.yaml - dialogue/ - the-terminal/ - dock-worker.yaml - shift-supervisor.yaml - scheduler.yaml - new-hire.yaml - courier.yaml - the-last-shift/ - bar-owner.yaml - bartender.yaml - bar-regular.yaml - maintenance-corridors/ - ring-operative.yaml - monologue/ - smuggler/ - the-terminal.yaml - the-last-shift.yaml - maintenance-corridors.yaml - general.yaml - detective/ - the-terminal.yaml - the-last-shift.yaml - maintenance-corridors.yaml - general.yaml - routines/ - schedules.yaml -``` - -### Schema: Content Manifest - -```yaml -# content/content.yaml -version: "0.1.0" -districts: - - id: "sova-transit" - path: "districts/sova-transit" - enabled: true -``` - -### Schema: NPC Profile (`npc-profile.schema.json`) - -```json -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "title": "NpcProfile", - "description": "NPC content profile for The Settled Reach. Maps to server NpcBundle.", - "type": "object", - "required": ["canonical_id", "display_name", "short_name", "tier", "pattern", "motivation", "district", "axes", "initial_attributes"], - "properties": { - "canonical_id": { - "type": "string", - "pattern": "^npc:[a-z0-9-]+$", - "description": "Stable content address. Format: npc:{slug}" - }, - "display_name": { "type": "string", "minLength": 1 }, - "short_name": { "type": "string", "minLength": 1 }, - "tier": { "enum": [1, 2, 3] }, - "pattern": { - "enum": ["FRIEND", "MIRROR", "ANCHOR", "GHOST", "CATALYST", "THRESHOLD", "REMNANT", "SYSTEM", "NOBODY"] - }, - "motivation": { - "enum": ["HANDLER", "WITNESS", "TURNCOAT", "CIVILIAN", "OPERATOR", "SKEPTIC"] - }, - "district": { "type": "string" }, - "axes": { - "type": "object", - "required": ["want", "secret", "relationships", "tolerance", "routine", "information", "contentment"], - "properties": { - "want": { "type": "string" }, - "secret": { - "type": "object", - "required": ["surface"], - "properties": { - "surface": { "type": "string" }, - "deep": { "type": "string" } - } - }, - "relationships": { - "type": "array", - "items": { - "type": "object", - "required": ["target", "kind", "trust"], - "properties": { - "target": { - "type": "string", - "pattern": "^npc:[a-z0-9-]+$", - "description": "canonical_id of relationship target" - }, - "kind": { "type": "string" }, - "trust": { "type": "number", "minimum": 0.0, "maximum": 1.0 } - } - } - }, - "tolerance": { - "type": "object", - "required": ["current_stress", "threshold"], - "properties": { - "current_stress": { "type": "number", "minimum": 0.0, "maximum": 1.0 }, - "threshold": { "type": "number", "minimum": 0.0, "maximum": 1.0 } - } - }, - "routine": { - "type": "object", - "required": ["description"], - "properties": { - "description": { "type": "string" } - } - }, - "information": { - "type": "object", - "required": ["known_facts"], - "properties": { - "known_facts": { - "type": "array", - "items": { - "type": "string", - "pattern": "^[a-z_]+\\.[a-z_]+:(Suspects|KnowsOf|KnowsDetails)$", - "description": "Format: fact_id:ConfidenceLevel" - } - } - } - }, - "contentment": { "type": "number", "minimum": 0.0, "maximum": 1.0 } - } - }, - "personality": { - "type": "object", - "properties": { - "traits": { "type": "array", "items": { "type": "string" } } - } - }, - "tells": { - "type": "array", - "items": { - "type": "object", - "required": ["trigger", "behavior"], - "properties": { - "trigger": { "type": "string" }, - "behavior": { "type": "string" } - } - } - }, - "skills": { - "type": "object", - "properties": { - "set": { "type": "array", "items": { "type": "string" } }, - "combat_trained": { "type": "boolean", "default": false } - } - }, - "initial_attributes": { - "type": "object", - "required": ["role", "faction", "species"], - "properties": { - "role": { "type": "string" }, - "faction": { "type": "string" }, - "species": { "type": "string", "default": "human" }, - "routine_pattern": { "type": "string" } - }, - "description": "What a brand-new observer would learn about this NPC on first sight. Maps to EntityKnowledge.known_attributes." - }, - "access_tiers": { - "type": "object", - "properties": { - "default": { "enum": ["public", "insider", "authority", "peer", "hostile"] }, - "overrides": { - "type": "object", - "additionalProperties": { - "enum": ["public", "insider", "authority", "peer", "hostile"] - }, - "description": "canonical_id → access tier overrides" - } - } - }, - "trust_levels": { - "type": "object", - "additionalProperties": { - "enum": ["surface", "real", "secret"] - }, - "description": "canonical_id → trust tier" - }, - "friend_arc": { - "type": "object", - "properties": { - "character": { "enum": ["smuggler", "detective"] }, - "phases": { - "type": "array", - "items": { - "type": "object", - "required": ["name"], - "properties": { - "name": { "enum": ["warmth", "trust", "doubt", "conflict"] }, - "triggers": { "type": "array" } - } - } - }, - "contradiction": { - "type": "object", - "properties": { - "type": { "type": "string" }, - "location": { "type": "string" }, - "expected_location": { "type": "string" }, - "time_window": { "type": "string" } - } - } - }, - "description": "Only present for FRIEND pattern NPCs (Tier 1)" - }, - "triangle_membership": { - "type": "array", - "items": { - "type": "object", - "required": ["triangle_id", "role"], - "properties": { - "triangle_id": { "type": "string" }, - "role": { "type": "string" } - } - } - } - } -} -``` - -### Schema: Dialogue Pool (`dialogue-pool.schema.json`) - -```json -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "title": "DialoguePool", - "description": "Tagged dialogue line pool per D-028, D-035.", - "type": "object", - "required": ["role", "location", "lines"], - "properties": { - "role": { "type": "string", "description": "Template-defined role (not NPC name)" }, - "location": { - "type": "string", - "pattern": "^loc:[a-z0-9-]+:[a-z0-9-]+$" - }, - "lines": { - "type": "array", - "items": { - "type": "object", - "required": ["id", "text", "access", "trust", "situation"], - "properties": { - "id": { - "type": "string", - "pattern": "^[a-z_]+_d_[0-9]{3}$", - "description": "{location}_{d}_{###} per D-035" - }, - "text": { "type": "string", "maxLength": 300 }, - "access": { - "type": "array", - "items": { "enum": ["public", "insider", "authority", "peer", "hostile"] }, - "minItems": 1 - }, - "trust": { "enum": ["surface", "real", "secret"] }, - "situation": { - "type": "array", - "items": { - "enum": [ - "arrival", "shift_start", "shift_end", "shift_transition", - "bar_evening", "night_shift", "investigation", "confrontation", - "social", "alone", "emergency", "routine", "observation" - ] - }, - "minItems": 1 - }, - "topic": { - "type": "array", - "items": { - "enum": [ - "colleague", "routine", "cargo", "money", "trust", - "danger", "institution", "personal", "investigation" - ] - } - }, - "mood": { - "type": "array", - "items": { - "enum": [ - "fond", "comfortable", "worried", "suspicious", - "analytical", "conflicted", "concerned", "relieved" - ] - } - }, - "tags": { - "type": "array", - "items": { "type": "string" } - }, - "knowledge_grants": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type": { "enum": ["learn_fact", "learn_attribute", "update_relationship"] }, - "fact_id": { "type": "string" }, - "confidence": { "enum": ["Suspects", "KnowsOf", "KnowsDetails"] }, - "target": { "type": "string" }, - "key": { "type": "string" }, - "value": { "type": "string" } - } - }, - "description": "Knowledge updates that occur when this line is spoken to the player" - } - } - } - } - } -} -``` - -### Schema: Monologue Pool (`monologue-pool.schema.json`) - -```json -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "title": "MonologuePool", - "description": "Tagged monologue line pool per D-032, D-035. Hard-partitioned by character.", - "type": "object", - "required": ["character", "location", "lines"], - "properties": { - "character": { "enum": ["smuggler", "detective"] }, - "location": { "type": "string" }, - "lines": { - "type": "array", - "items": { - "type": "object", - "required": ["id", "text", "trigger"], - "properties": { - "id": { - "type": "string", - "pattern": "^[a-z_]+_m_[sd]_[0-9]{3}$", - "description": "{location}_m_{s|d}_{###}" - }, - "text": { - "type": "string", - "maxLength": 160, - "description": "~160 chars max, 2-line display per Stig's constraint" - }, - "trigger": { - "enum": [ - "enter_location", "observe_npc", "hear_sound", - "observe_anomaly", "post_conversation", "discover_evidence", - "witness_interaction", "time_idle", "return_visit" - ] - }, - "prerequisite": { - "type": ["object", "null"], - "properties": { - "facts": { - "type": "object", - "additionalProperties": { - "enum": ["Suspects", "KnowsOf", "KnowsDetails"] - }, - "description": "FactId → minimum confidence. ALL must be met (AND logic)." - }, - "entity": { - "type": "object", - "properties": { - "target": { "type": "string" }, - "attribute": { "type": "string" }, - "condition": { "type": "string" } - }, - "description": "Entity attribute check. AND with facts if both present." - }, - "relationship": { - "type": "object", - "properties": { - "target": { "type": "string" }, - "min_state": { - "enum": ["Unknown", "Known", "Friendly", "PersonOfInterest", "Hostile"] - } - } - } - }, - "description": "AND-only prerequisite. All specified conditions must be true. Null = always eligible." - }, - "topic": { - "type": "array", - "items": { "type": "string" } - }, - "mood": { - "type": "array", - "items": { "type": "string" } - }, - "tags": { - "type": "array", - "items": { "type": "string" } - }, - "priority": { - "type": "integer", - "minimum": 0, - "maximum": 10, - "default": 5, - "description": "Higher priority lines are preferred when multiple qualify. 0=lowest, 10=critical (wow moments)." - }, - "cooldown": { - "type": "integer", - "minimum": 0, - "description": "Minimum ticks before this line can fire again. 0 = no repeat." - }, - "dual_lens": { - "type": "object", - "description": "Authoring-only. Per-character notes for the content team." - }, - "notes": { - "type": "string", - "description": "Authoring-only. Author intent and context." - } - } - } - } - } -} -``` - -### Schema: Fact Catalog Entry - -```yaml -# content/global/facts/contraband.yaml -category: "contraband" -facts: - - fact_id: "contraband.ring_exists" - description: "A smuggling operation exists in the district" - discoverable_by: ["smuggler", "detective"] - progression: - Suspects: "Something's going on with the cargo schedules." - KnowsOf: "There's a smuggling operation running through the logistics hub." - KnowsDetails: "The ring moves unlicensed lattice components during shift transitions." - abstract: true # Never reaches Direct confidence - - - fact_id: "contraband.lattice_components" - description: "The specific contraband: unlicensed lattice components" - discoverable_by: ["smuggler", "detective"] - progression: - Suspects: "That container's marked as standard, but the mass is wrong." - KnowsOf: "Unlicensed lattice components. Aftermarket mods." - KnowsDetails: "Medical-grade neural lattice replacements plus enhanced capability mods." - Direct: "I'm looking at a crate of lattice components right now." - abstract: false # Can reach Direct if player sees contraband -``` - -### Schema: Schedule - -```yaml -# content/districts/sova-transit/routines/schedules.yaml -schedules: - - npc: "npc:kael-davan" - entries: - - phase: Morning - location: "loc:sova-transit:the-terminal" - tile: { x: 42, y: 18, z: 0 } - activity: "working" - - phase: Afternoon - location: "loc:sova-transit:the-terminal" - tile: { x: 45, y: 20, z: 0 } - activity: "working" - - phase: Evening - location: "loc:sova-transit:the-last-shift" - tile: { x: 80, y: 55, z: 0 } - activity: "drinking" - - phase: Night - location: "loc:sova-transit:residential" - tile: { x: 30, y: 70, z: 0 } - activity: "sleeping" - deviations: - - trigger: "friend_arc.doubt" - phase: Evening - override_location: "loc:sova-transit:maintenance-corridors" - override_tile: { x: 15, y: 8, z: -1 } - override_activity: "meeting_contact" - description: "Kael meets unauthorized contact during shift transition" -``` - -The `deviations` key is load-bearing for THE FRIEND arc. It tells the routine scheduler: "When the FRIEND arc reaches phase X, change Kael's evening location to Corridor B-7." This is how spatial staging works without scripting — the schedule system handles it as a conditional routine override. - -### Validation Pipeline (Finalized) - -``` -AUTHORING TIME (copy team) - └── Author writes YAML in content/ directory - └── IDE/editor with JSON Schema autocomplete (optional) - -BUILD TIME (make content-validate) - ├── JSON Schema validation: check YAML structure against schema files - ├── Cross-reference validation: - │ ├── All canonical_id references resolve to existing files - │ ├── All FactIds in prerequisites reference defined facts - │ ├── All relationship targets exist - │ ├── No duplicate canonical_ids across all files - │ └── Enum values match global/enums/ definitions - └── FAIL if any error — list all errors, don't stop at first - -LOAD TIME (server startup) - ├── serde_yaml deserialization: YAML → Rust structs - │ └── Type mismatch = load failure (serde catches schema drift) - ├── Semantic validation: - │ ├── StableId assignment (deterministic from sorted canonical_ids) - │ ├── Relationship wiring (canonical_id → StableId resolution) - │ └── FriendArc bonding (character reference → StableId) - └── FAIL FAST on any error — no partial loads -``` - ---- - -## Task 2: Multi-Verb Interaction Architecture - -The lead's decision: v0.1 ships single context-sensitive action, but the server models N available actions per entity from day one. Here's how. - -### Core Design: `AvailableActions` per Entity - -```rust -/// What a player can do with a nearby entity. -/// Server computes the full list every tick for entities in interaction range. -/// v0.1 client reads only the primary (priority 0). -/// v0.2 client renders all enabled actions as a verb menu. -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct AvailableActions { - /// StableId of the target entity - pub target_id: u64, - /// Display name (as known to this observer) - pub display_name: String, - /// All available actions, sorted by priority (0 = highest) - pub actions: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct ActionOption { - /// What this action does - pub kind: ActionKind, - /// Prompt text shown to the player: "Talk", "Observe", "Examine" - pub label: String, - /// Sort priority. 0 = primary action (v0.1 default). Lower = higher priority. - pub priority: u8, - /// Is this action currently available? - pub enabled: bool, - /// Why it's disabled (shown as tooltip in v0.2+) - pub disabled_reason: Option, -} - -/// Action types the player can perform on entities. -/// Extensible enum — new variants added in future versions. -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] -pub enum ActionKind { - // v0.1 actions - Talk, - ExamineNpc, - ExamineObject, - // v0.2+ actions (defined now, not surfaced) - // Trade, - // Give, - // Accuse, - // Follow, - // UseOn, -} -``` - -### Priority Resolution (Server-Side) - -The server computes priorities based on entity type, observer state, and game context. This is the "context-sensitive" logic: - -```rust -/// Determine available actions for a target entity given the observer's state. -/// Returns actions sorted by priority (0 = most relevant). -fn compute_actions( - target: &TargetInfo, - observer: &ObserverInfo, - game_state: &GameState, -) -> Vec { - let mut actions = Vec::new(); - - match target.entity_type { - EntityType::Npc => { - // Talk is available if NPC is interactable - if target.is_interactable && !target.is_hostile { - actions.push(ActionOption { - kind: ActionKind::Talk, - label: compute_talk_label(observer, target), - priority: 0, // default primary for NPCs - enabled: true, - disabled_reason: None, - }); - } - - // Examine is available if NPC is in LOS - if target.in_los { - let examine_priority = if observer.has_investigation_context(target) { - 0 // Detective with suspicion → Examine becomes primary - } else { - 1 // Normal → Examine is secondary - }; - actions.push(ActionOption { - kind: ActionKind::ExamineNpc, - label: "Observe".to_string(), - priority: examine_priority, - enabled: true, - disabled_reason: None, - }); - } - - // If NPC is hostile, Talk is disabled but visible - if target.is_hostile { - actions.push(ActionOption { - kind: ActionKind::Talk, - label: "Talk".to_string(), - priority: 1, - enabled: false, - disabled_reason: Some("Hostile".to_string()), - }); - } - } - - EntityType::Object => { - actions.push(ActionOption { - kind: ActionKind::ExamineObject, - label: compute_examine_label(target), - priority: 0, - enabled: true, - disabled_reason: None, - }); - } - } - - // Sort by priority, stable ordering for determinism - actions.sort_by_key(|a| a.priority); - actions -} - -/// Context-sensitive talk label. -/// Changes based on relationship state and investigation progress. -fn compute_talk_label(observer: &ObserverInfo, target: &TargetInfo) -> String { - match observer.relationship_to(target) { - RelationshipState::PersonOfInterest => "Question".to_string(), - RelationshipState::Hostile => "Confront".to_string(), - _ => "Talk".to_string(), - } -} -``` - -### How the Detective's Loop Works - -Gestalt's design: detective examines first (accumulate tells), talks later (use evidence). The priority system supports this naturally: - -1. **Default state:** Talk = priority 0, Observe = priority 1. Player approaches NPC, sees "[E] Talk". -2. **After knowledge graph flags PersonOfInterest:** `has_investigation_context()` returns true. Observe = priority 0, Talk (now labeled "Question") = priority 1. Player approaches flagged NPC, sees "[E] Observe". -3. **v0.1:** Client shows only priority 0. The context switch happens automatically. -4. **v0.2:** Client shows both. Player chooses. - -The key insight: **the context-sensitive switch IS the v0.2 multi-verb system operating with a filter.** No throwaway code. v0.2 removes the filter; the rest works. - -### PlayerAction Extension - -```rust -/// Semantic player actions — v3 protocol. -/// InteractPrimary is the v0.1 action (do whatever priority 0 says). -/// InteractWith is the v0.2 action (do a specific thing to a specific target). -#[derive(Debug, Clone, Serialize, Deserialize)] -pub enum PlayerAction { - // Movement (unchanged) - MoveNorth, - MoveSouth, - MoveEast, - MoveWest, - MoveNortheast, - MoveNorthwest, - MoveSoutheast, - MoveSouthwest, - - // Interaction (v3) - /// Do the primary (priority 0) action on the nearest interactable target. - /// v0.1 default. Maps to [E] key. - InteractPrimary, - /// Do a specific action on a specific target (v0.2+). - /// Target is StableId. Action is the ActionKind. - InteractWith { target_id: u64, action: ActionKind }, - /// Select a dialogue topic while in active conversation. - DialogueSelect { topic: String }, - /// End the current dialogue. - DialogueEnd, - /// Acknowledge/advance examine result text. - ExamineAdvance, - - // System (unchanged) - UsePerceptionMode(String), - Pause, - Unpause, -} -``` - -**Removed: the old `Interact` variant.** `InteractPrimary` replaces it with the same behavior but clearer semantics. `InteractWith` is defined now but v0.1 client never emits it. - -### Server-Side Pipeline - -``` -Player presses [E] - → Client sends InteractPrimary - → Server: find nearest interactable entity within range - → Compute AvailableActions for that entity - → Execute priority-0 action: - → ActionKind::Talk → enter dialogue state, run D-035 selection pipeline - → ActionKind::ExamineNpc → emit tell observation event, queue examine result text - → ActionKind::ExamineObject → emit examine event, queue description text - → Pack results into ObserverSnapshot v3 - → Client renders result (dialogue panel, examine text, monologue) -``` - ---- - -## Task 3: RON Converter - -### Architecture Decision - -**Dual-format loader with optional build-time compilation.** - -The server content loader supports both YAML and RON via serde. The format is determined by file extension. Content authors write YAML (human-friendly). An optional build step compiles YAML → RON for faster load times. - -### Where It Lives - -``` -server/src/content/ - loader.rs # Content loader — reads YAML or RON based on extension - schema.rs # Rust serde structs (NpcProfile, DialogueLine, etc.) - registry.rs # ContentRegistry: canonical_id → StableId mapping - validate.rs # Semantic validation (cross-references, enum checks) - -tooling/content-tools/ - Cargo.toml # Small Rust binary - src/ - main.rs # CLI: content-tools validate|compile|stats - compile.rs # YAML → RON compiler - validate.rs # Schema validation against JSON Schema - stats.rs # Content statistics (line counts, coverage) -``` - -### When It Runs - -| Context | What Happens | Format Loaded | -|---|---|---| -| **Development (hot-reload)** | Server loads YAML directly. File watcher detects changes, reloads. | YAML | -| **CI / `make content-validate`** | `content-tools validate` runs JSON Schema + serde checks. No format conversion. | YAML (validation only) | -| **Build / `make content-compile`** | `content-tools compile` reads all YAML, writes RON to `content/.cache/`. | YAML → RON | -| **Production / release** | Server loads from `content/.cache/*.ron` if present, falls back to YAML. | RON (preferred) or YAML | - -### Implementation - -The loader is format-agnostic. Approximately 20 lines handle the dual format: - -```rust -use std::path::Path; - -/// Load a content file, auto-detecting format from extension. -pub fn load_content(path: &Path) -> Result { - let bytes = std::fs::read(path)?; - match path.extension().and_then(|e| e.to_str()) { - Some("yaml" | "yml") => { - serde_yaml::from_slice(&bytes).map_err(ContentError::Yaml) - } - Some("ron") => { - ron::de::from_bytes(&bytes).map_err(ContentError::Ron) - } - _ => Err(ContentError::UnsupportedFormat(path.to_path_buf())), - } -} - -/// Load content with RON cache fallback. -/// Checks content/.cache/ for compiled RON first, falls back to YAML. -pub fn load_with_cache( - yaml_path: &Path, - cache_dir: &Path, -) -> Result { - // Try RON cache first - let ron_path = cache_dir.join( - yaml_path.with_extension("ron").file_name().unwrap() - ); - if ron_path.exists() { - return load_content(&ron_path); - } - // Fall back to YAML - load_content(yaml_path) -} -``` - -### Makefile Integration - -```makefile -content-validate: ## Validate content files against schemas - cargo run --manifest-path tooling/content-tools/Cargo.toml -- validate content/ - -content-compile: ## Compile YAML content to RON cache - cargo run --manifest-path tooling/content-tools/Cargo.toml -- compile content/ content/.cache/ - -content-stats: ## Print content statistics - cargo run --manifest-path tooling/content-tools/Cargo.toml -- stats content/ -``` - -### Why Not Build-Time Only? - -Dudley builds with fixture data while copy authors real content. If compilation is required, Dudley can't test until copy delivers YAML AND it gets compiled. Direct YAML loading removes that gate. The RON cache is a performance optimization, not a correctness requirement. - -The `content/.cache/` directory is gitignored. It's local build output, not source content. - ---- - -## Task 4: ObserverSnapshot v2 → v3 Protocol Extension - -### Protocol Evolution Strategy - -The snapshot already has a `version: u8` field. The protocol evolves by: - -1. Incrementing the version number -2. Adding new fields as `Vec` (empty = not present) or `Option` -3. Never removing or reordering existing fields -4. Client checks version, handles unknown fields gracefully - -MessagePack (rmp-serde) handles this naturally — it serializes fields by name, so adding fields doesn't break existing clients. A v2 client reading a v3 snapshot ignores unknown fields. A v3 client reading a v2 snapshot gets empty defaults for new fields. - -### v3 Snapshot Definition - -```rust -/// ObserverSnapshot v3 — extends v2 with interaction, dialogue, monologue, and speed data. -/// The ONLY data structure crossing the client-server boundary (D-020). -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct ObserverSnapshot { - /// Protocol version. v3 = 3. - pub version: u8, - /// Simulation tick when this snapshot was produced. - pub tick: u64, - /// Game time data for client HUD display (D-031). - pub game_time: GameTime, - /// Player character's facing direction for vision cone (D-015). - pub player_facing: FacingDirection, - - // --- v2 fields (unchanged) --- - /// All entities visible to the observer (filtered by LOS + vision cone). - pub entities: Vec, - /// Tiles visible to the observer for fog rendering. - pub visible_tiles: Vec, - - // --- v3 additions --- - - /// Current simulation speed multiplier. - /// 1.0 = normal, 0.5 = UI overlay slow-mo (D-PAUSE), 0.0 = paused. - #[serde(default = "default_sim_speed")] - pub sim_speed: f32, - - /// Entities within interaction range with available actions. - /// Empty if no interactable targets nearby. - #[serde(default)] - pub nearby_interactions: Vec, - - /// Active dialogue state. None if not in conversation. - #[serde(default)] - pub active_dialogue: Option, - - /// Monologue lines triggered this tick. - /// Usually 0-1 per tick. Multiple only if pacing allows it. - #[serde(default)] - pub monologue: Vec, - - /// Overheard conversation fragments (proximity-based, D-018). - #[serde(default)] - pub overheard: Vec, - - /// Knowledge panel updates (delta, not full state). - /// Only includes changes since last snapshot the client acknowledged. - #[serde(default)] - pub knowledge_updates: Vec, - - /// Examine result text (if player examined an entity/object this tick). - #[serde(default)] - pub examine_result: Option, - - /// News ticker headlines visible at current location. - /// Empty if not near a Meridian display. - #[serde(default)] - pub ticker_headlines: Vec, -} - -fn default_sim_speed() -> f32 { 1.0 } - -// --- v3 types --- - -/// Interactive entity within range. -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct NearbyInteraction { - /// StableId of the interactable entity. - pub entity_id: u64, - /// Display name as known to the observer. - pub display_name: String, - /// Available actions, sorted by priority (0 = primary). - pub actions: Vec, -} - -/// Re-exported from interaction module for wire format. -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct ActionOption { - pub kind: ActionKind, - pub label: String, - pub priority: u8, - pub enabled: bool, - #[serde(skip_serializing_if = "Option::is_none")] - pub disabled_reason: Option, -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] -pub enum ActionKind { - Talk, - ExamineNpc, - ExamineObject, -} - -/// Active dialogue state sent to client each tick during conversation. -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct ActiveDialogue { - /// StableId of the NPC in conversation. - pub npc_id: u64, - /// NPC display name. - pub npc_name: String, - /// Relationship color for the speaker name (D-033). - pub relationship_state: RelationshipState, - /// Current NPC line to display. None if waiting for player input. - pub current_line: Option, - /// Available topics the player can raise. Empty if no choices. - pub available_topics: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct DialogueLineDisplay { - pub line_id: String, - pub text: String, - pub mood: String, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct TopicOption { - pub topic_id: String, - pub label: String, - pub enabled: bool, -} - -/// Monologue line for client display. -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct MonologueDisplay { - pub line_id: String, - pub text: String, - pub trigger: String, - /// true for anomaly/contradiction observations → urgent chime (D-038). - pub urgent: bool, -} - -/// Overheard conversation fragment. -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct OverheardFragment { - /// StableId of the speaker (if known to observer). - pub speaker_id: Option, - /// Speaker name (if known). "Someone" if unknown. - pub speaker_name: String, - /// Fragment text — NOT the full line. What the listener could make out. - pub fragment: String, -} - -/// Knowledge panel delta update. -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct KnowledgeUpdate { - pub update_type: KnowledgeUpdateType, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub enum KnowledgeUpdateType { - /// Learned a new fact or upgraded confidence. - FactLearned { - fact_id: String, - confidence: String, - /// Human-readable description for the knowledge panel. - display_text: String, - }, - /// Learned something new about an entity. - AttributeLearned { - entity_id: u64, - entity_name: String, - key: String, - value: String, - }, - /// Relationship state changed. - RelationshipChanged { - entity_id: u64, - entity_name: String, - old_state: RelationshipState, - new_state: RelationshipState, - }, -} - -/// Result of examining an entity or object. -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct ExamineResult { - pub target_id: u64, - pub target_name: String, - /// Examine description text — what the character notices. - pub text: String, - /// Knowledge grants from the examination. - pub knowledge_updates: Vec, -} - -/// News ticker headline for Meridian display. -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct TickerHeadline { - pub headline_id: String, - pub text: String, - /// Does this headline trigger a monologue? Server handles trigger separately. - pub triggers_monologue: bool, -} -``` - -### Wire Size Estimate - -| Field | Typical v3 Size | Notes | -|---|---|---| -| v2 fields (entities, tiles) | ~2-8 KB | Already measured | -| sim_speed | 4 bytes | Float | -| nearby_interactions | ~50-200 bytes | 0-3 entities × 1-2 actions each | -| active_dialogue | ~100-300 bytes | Only during conversation | -| monologue | ~0-200 bytes | Usually 0-1 per tick | -| overheard | ~0-150 bytes | Rare | -| knowledge_updates | ~0-200 bytes | Delta, usually empty | -| examine_result | ~0-300 bytes | Only when examining | -| ticker_headlines | ~0-400 bytes | Only near Meridian display | -| **v3 overhead** | **~50-1500 bytes** | **On top of v2's 2-8 KB** | - -Total v3 snapshot: ~2-10 KB per tick. At 10 tps, that's 20-100 KB/s over the IPC bridge. Well within budget — localhost MessagePack serialization handles this trivially. Even network (future multiplayer) is fine. - -### What Stig Needs to Know - -**New fields the client should handle in v3:** - -| Field | Client Action | Priority | -|---|---|---| -| `sim_speed` | Display pause indicator if 0.0; dim edges if 0.5 | P0 | -| `nearby_interactions` | Show interaction prompt for `actions[0]` (priority 0 only in v0.1) | P0 | -| `active_dialogue` | Show dialogue panel with NPC name, line text, topic options | P0 | -| `monologue` | Show monologue text, fire chime (urgent flag → urgent chime) | P0 | -| `overheard` | Show as faded text near speaker position (world-space) | P1 | -| `knowledge_updates` | Update knowledge panel if open; flash minimap dot for new entities | P1 | -| `examine_result` | Show examine text in monologue-style display (same panel, different color?) | P0 | -| `ticker_headlines` | Render on world-space Meridian display entity | P1 | - -**Client protocol handling:** -``` -if snapshot.version >= 3: - process nearby_interactions → update interaction prompt - process active_dialogue → update dialogue panel - process monologue → queue monologue display - process overheard → queue overheard display - process knowledge_updates → update knowledge panel - process examine_result → show examine text - process ticker_headlines → update ticker display -``` - -v2 snapshots still work — all new fields have serde defaults (empty vecs, None optionals). - ---- - -## Summary - -1. **Content schemas finalized.** JSON Schema for NPC profiles, dialogue pools, monologue pools. The schema IS the contract between copy and server. Serde validates on load. Copy team can start writing YAML against these schemas immediately. - -2. **Multi-verb architecture designed.** `AvailableActions` per entity with priority-sorted `ActionOption` list. v0.1 client picks priority 0 (context-sensitive single action). v0.2 removes the filter and shows all options. No throwaway code — the full pipeline exists, only the client-side rendering is simplified for v0.1. - -3. **RON converter = dual-format loader + optional build-time compilation.** Loader supports both YAML and RON via serde. `tooling/content-tools` CLI provides `validate`, `compile`, `stats`. Development loads YAML directly (fast iteration). Production ships compiled RON in `.cache/`. ~20 lines of loader code, small CLI tool. - -4. **ObserverSnapshot v3 defined.** Adds interaction options, dialogue state, monologue lines, overheard fragments, knowledge deltas, examine results, ticker headlines, simulation speed. Wire overhead: ~50-1500 bytes per tick on top of v2. Backward compatible via serde defaults. Protocol version bumped to 3. - -Everything here is additive and backward-compatible. The architecture supports v0.1's single-action simplicity while being ready for v0.2's multi-verb expansion. No throwaway. diff --git a/docs/workshops/v01-content-scoping/si-ticket-changes.md b/docs/workshops/v01-content-scoping/si-ticket-changes.md deleted file mode 100644 index 2616e6558..000000000 --- a/docs/workshops/v01-content-scoping/si-ticket-changes.md +++ /dev/null @@ -1,295 +0,0 @@ -# v0.1 Content Scoping — Ticket List (Final) - -**Author:** SI (Project Manager) -**Source:** v0.1 Content Scoping Workshop (Rounds 1-2), Wiki Review Workshop (Round 2 ticket list superseded) -**Status:** Proposals only — awaiting lead approval before database creation - -**Corrections applied (closing round):** -1. C9 → Sprint 3 (same crate as C3) -2. #326 split into Phase 1 (Sprint 3) + Phase 2 (Sprint 4) -3. NEW-9 expanded: proximity detection + `verbs[]` -4. NEW-12 killed (pause is server-only; client sends IPC command) -5. NEW-10 stays separate from #240 (one ticket per team, no shared tickets) -6. NEW-14 added: UI microcopy -7. `verbs[]` rename folded into NEW-7 -8. #237 → #88 dependency added -9. A2 file count: ~16 files (Paula's full cascade) -10. A7 description: specific 4 new keys + 2 renames, 16 total -11. B2 acceptance criteria added -12. NEW-1: Gestalt-Paula synthesis (not Gestalt-only) -13. C1: mod-compatible conventions (no overlay implementation) -14. #86 ECS component list updated to workshop output - ---- - -## Existing Ticket Updates - -| ID | Title | Action | Sprint | -|----|-------|--------|--------| -| #368 | Knowledge vocabulary for v0.1 content | **Close** — wiki at `wiki/` is the delivered output. | Sprint 2 (done) | -| #369 | Wiki Review Workshop Outputs (epic) | **Repurpose** as parent epic for all v0.1 content scoping tickets. Update description to reflect this workshop's scope. | — | -| #301 | Wiki taxonomy and structure | **Assign to copy.** Downscope: Sova district structure only for v0.1. | Sprint 3 | -| #319 | Krenn System wiki entry | **Merge with A3.** Expanded: wiki page + seed.yaml reference implementation. Assign to copy. | Sprint 4 | -| #261 | Dual Lens Authoring Guide | **CRITICAL PATH ROOT.** Assign to copy, owner Paula. Blocks 9 downstream tickets. | Sprint 3 (P0) | -| #310 | Character voice speech patterns | **Subsume into B4.** Close #310 when B4 lands. | Sprint 3 (via B4) | -| #306 | News ticker / Meridian feed content | **Confirm scope:** ~20 dual-lens headlines. Assign to copy. | Sprint 4 | -| #326 | YAML content loader | **Split into two tickets.** Phase 1: loader skeleton + fixture data (Sprint 3, server, blocked by C1+C2+C3). Phase 2: real content loading (Sprint 4, server, blocked by C4-C8 + NEW-3). | Sprint 3 / 4 | -| #86 | Core NPC components | **Update ECS component list** to workshop output: ThematicPattern, FunctionalMotivation, FriendArc, ContentTier, AccessTierMap, TrustLevels, NpcRoutine, MoodState, TriangleMembership, InteractionLog. | Sprint 3 | -| #88 | Daily routine system | **Add dependency:** blocked by #237 (A* pathfinding). Needs NPC routine YAML from content conversion. | Sprint 3 | - ---- - -## New Tickets - -### A. Wiki Content Fixes (copy team) - -| ID | Title | Type | Pri | Sprint | Blocked By | Description | -|----|-------|------|-----|--------|------------|-------------| -| A1 | Apply canonical full names to all NPC wiki pages | task | med | 3 | — | Apply Miri's 12 full names to NPC wiki pages. Update Core Identity blocks, environmental text references (manifests, shift rosters, Commission kiosk). | -| A2 | Rename Hael → Naia Tamm across all wiki files | task | med | 3 | — | Phonetic collision fix (Kael/Hael). Find-and-replace across ~16 files (Paula's full cascade). Triangle 4 becomes Naia-Kael-Sera. Update all relationship references, triangle diagrams, cross-references. | -| A6 | Add smuggler-perspective FactId progression text | task | high | 4 | B4 | Add smuggler-path text for all FactIds where smuggler starts at KnowsDetails or has different knowledge path than detective. | -| A7 | Update entity-attributes.md — smuggler role-perspective keys | task | high | 3 | — | Add 4 new role-perspective keys: `risk_assessment`, `loyalty_assessment`, `position_integrity`, `moral_weight`. Rename `secret_held` → `leverage_held` (broader scope: secrets, debts, promises, obligations). Rename `secret_confidence` → `leverage_confidence`. Update `trust_level` description to absorb `trust_read` scope. All keys are observer→target. Total after update: 16 canonical keys. | -| A8 | Standardize location shortcodes in monologue-guide.md | task | med | 3 | — | Fix hub_m_ → terminal_m_ inconsistency. Canonical shortcodes: terminal, bar, corridor. Add shortcode reference table. Add situation overlap rules and mood exclusivity rules. | -| A10 | Stub NPC profile for Nils Davan (off-stage) | task | med | 3 | — | Minimal off-stage profile: Core Identity, relationship to Kael (siblings), role in ring (upstream pressure), known attributes by other NPCs. | -| A11 | Fix Triangle 1 (Hub Power) — Volume Escalation decision | story | high | 3 | A10 | Add smuggler decision fork: side with Nils (louder signal), side with Voss (internal tension), or split the route (new exposure surface). Each option cascades within T1 only — self-contained, no cross-triangle cascade (A-17). Includes Nils partial presence via lattice message (~5-8 lines). | -| A12 | Create environmental text examples file | task | med | 4 | A3/#319 | Create wiki/authoring/environmental-text-examples.md. 4 text types: bar menu, safety notice, news ticker cycle, corridor graffiti. Krenn-voiced with cultural notes + monologue pairings (smuggler + detective). Needed for wow moment #1 (Arrival). | - -### B. Style Guides & Specs (copy team) - -| ID | Title | Type | Pri | Sprint | Blocked By | Description | -|----|-------|------|-----|--------|------------|-------------| -| B1 | NPC Authoring Style Guide | story | crit | 5 | A3, A4, A7, B2, B4 | Combined document: tier templates (Paula), authoring rules (Mellanie conventions, Gestalt constraints, Ozzie anchor line), regional culture (Miri), content pipeline (Tyre). Reframed as generator specification — this IS the NPC generator input format. Most complex ticket; many blockers. | -| B2 | THE MIRROR pattern spec | story | high | 3 | — | Define honest-character NPC pattern. No contradiction arc, no secret, no tell. Tier 1 emotional depth. **v0.1 acceptance criteria:** Pattern definition with mechanical rules, content requirements (50-70 lines, 10-axis profile), tell system rules (MIRROR has none), Naia Tamm as reference implementation. Output becomes generator template. | -| B3 | PC-as-NPC unified spec | story | high | 3 | A7 | Unified spec: starting knowledge graph, starting relationship map, reverse knowledge (bidirectional — Gestalt's critical insight), orientation monologue (Ozzie's first 60 seconds), agency boundaries, authored relationship stubs (Gore's requirement), tell inversion. 9-step conversion checklist for content authors. v0.1 scope: 2 PC briefs (smuggler, detective). | -| B4 | Smuggler voice card + moral arc spec | story | high | 3 | A7 | Two deliverables: (1) Smuggler voice card — paired examples with detective showing dual-lens register differences. Thinks in people vs data, first names vs surnames, fragments vs complete sentences, Krenn substrate vocabulary. (2) Smuggler moral arc — 4 phases (Comfort→Doubt→Reckoning→Compromise), smuggler-specific FactIds, monologue triggers. Subsumes #310 (Character voice speech patterns). | -| B5 | NPC-format briefs for both PCs — Concept A v0.1 | story | high | 4 | B3 | When you play the smuggler, the detective exists as an NPC (and vice versa). NPC-mode behavior scripts (5-7 routine entries each), reverse dual-lens notes, observation monologue for PC seeing other-PC-as-NPC (3-5 lines per character). ~20-30 authored items total. | - -### C. Content Directory & Schema (split teams) - -| ID | Title | Type | Pri | Sprint | Team | Blocked By | Description | -|----|-------|------|-----|--------|------|------------|-------------| -| C1 | Content directory structure design doc | story | high | 3 | copy | — | Document converged structure: `_meta/` + `_schema/` (infrastructure, underscore prefix), `global/` + `districts/` (game content). Canonical_id format (`{system}.{station}.{district}.{type}.{slug}`). Mod-compatible directory conventions (no overlay implementation). District as atomic pack unit. Informs all content implementation. | -| C2 | Create content/ directory skeleton | task | high | 3 | server | C1 | Create directory tree with empty YAML stubs. `_meta/`, `_schema/`, `global/` (factions, technology, contraband, knowledge, enums, regions), `districts/sova-transit/` (district.yaml, npcs/, locations/, templates/, triangles/, lines/). | -| C3 | Content schema definitions (YAML Schema files) | story | high | 3 | server | C1 | Create `_schema/` with validation schemas: npc.schema.yaml (tier-conditional rules), location.schema.yaml, faction.schema.yaml, template.schema.yaml, fact.schema.yaml, dialogue.schema.yaml, monologue.schema.yaml, district.schema.yaml, pool.schema.yaml. | -| C4 | Create global/enums/ YAML files from D-035 | task | med | 4 | server | C2 | Populate enums: situations (13), topics (9), moods (8), triggers (9), access-tiers (5), activities (new — from Gestalt routine format + Miri cultural patterns). | -| C5 | Create global/knowledge/entity-attributes.yaml | task | med | 4 | server | C2 | Machine-readable entity attribute definitions. 16 canonical keys after A7 update (14 original, 4 new, 2 renamed). | -| C6 | Create pools.yaml for v0.1 seed-time selection | task | med | 4 | server | C2 | Sova single-candidate pools: friend_smuggler (kael-davan), friend_detective (sera-venn), bar_regulars, compromised_inspector, primary_contraband. Architecture supports N candidates; v0.1 has 1 each. | -| C7 | Create template YAML files with role slot definitions | task | med | 4 | server | C2 | 3 social sites: logistics-hub.yaml, bar.yaml, smuggling-ring.yaml. Each declares named role slots with count ranges, required flags, pool references, triangle constraints. | -| C8 | Create triangle YAML files for 5 v0.1 triangles | task | med | 4 | server | C2 | 5 triangles: hub-power (T1, active fork), worried-knowledge (T2, active fork), bar-tensions (T3, passive), worried-partner (T4, active fork), informant-question (T5, passive). Self-contained forks — no cross-triangle cascade (A-17). | -| C9 | Implement make validate-content CLI | story | high | 3 | server | C3 | Structural + tier-conditional content validation. Same crate as C3 schemas. Reads `_schema/` definitions, validates all YAML in `content/`. v0.1 scope: structural validation (required fields, type checks, enum matching) + tier-conditional rules. v0.2: cross-reference validation (FactId existence, NPC slug resolution). | -| C10 | Pre-commit FactId typo check | task | med | 4 | ci | — | Grep-based pre-commit check validating FactId references in YAML content files against canonical facts.yaml. Cheap v0.1 bridge until full cross-reference validation lands in C9 v0.2. | - -### D. Design Specs - -| ID | Title | Type | Pri | Sprint | Team | Blocked By | Description | -|----|-------|------|-----|--------|------|------------|-------------| -| D2 | Seed configuration schema design | story | med | 4 | server | — | Schema for what the randomizer produces at game-start: FRIEND selections, social site population, compromised NPC, contraband type, entanglement overrides. v0.1 has single-candidate pools but architecture must support N. Saved with game state. Location: runtime/ (not content/). Constrained by D-029 ratio (30/50/20). | -| D4 | News ticker headline pool | task | med | 4 | copy | — | ~20 dual-lens headlines for Meridian feed at Lera's. Mix: freight/commodity data, Assembly politics, local infrastructure, sports, Commission advisories. Each headline works as a dual-lens monologue trigger. | - -### NEW. Tickets from Workshop Rounds 1-2 - -| ID | Title | Type | Pri | Sprint | Team | Blocked By | Description | -|----|-------|------|-----|--------|------|------------|-------------| -| NEW-1 | Apply Round 2 NPC pattern/motivation mapping | task | high | 3 | copy | — | Apply the Round 2 finalized NPC pattern/motivation mapping (Gestalt-Paula synthesis) to wiki and content files. 17 NPCs × (pattern + motivation). Includes Harek's structural role formalization (Paula Gap 7). | -| NEW-2 | Drin Tier 2 profile expansion | task | med | 3 | copy | NEW-1 | Drin confirmed promoted to Tier 2 (A-01 consensus). Expand wiki profile to full Tier 2 depth: all 10 profile axes, smuggler lens section, triangle membership formalized for T2 and T5. | -| NEW-3 | Wiki → YAML content conversion (Sova NPCs) | story | high | 4 | copy | C1, C2, C3 | Convert 17 NPC wiki profiles to engine-readable YAML in content/districts/sova-transit/npcs/. Includes routine YAML layer (Paula Gap 3), triangle fork decision points (Gap 4), location smuggler detail (Gap 6). Must match schemas from C3. Tyre estimates 2-3 full days. | -| NEW-4 | Monologue content pool — minimum viable (~200 lines) | story | high | 4 | copy | #261, B4 | ~100 lines per character. Categories: arrival observations, NPC routine commentary, environmental flavor, contradiction hints, idle reflections, tutorial/orientation. Follows Mellanie's authoring order (FRIEND packs first, then fill to ~200). | -| NEW-5 | v0.1 wow moment content checklist | task | high | 3 | copy | — | Map D-039's 6 wow moments to specific content deliverables + implementation tickets. Track completion. Acceptance: every moment has identified content + code backing it. | -| NEW-6 | PC-as-NPC content authoring | story | high | 5 | copy | B3, B5, #297, #298 | Author the actual PC-as-NPC lines: 5-7 routine entries per character, 3-5 observation monologue lines, reverse dual-lens notes. ~25 authored items (Mellanie's budget). Blocked by FRIEND packs — must know who the characters ARE before writing how they appear as NPCs. | -| NEW-7 | v0.1 interaction verb spec + `verbs[]` terminology | task | med | 3 | copy | — | Document the 7 interaction types (A-04: Move, Look, Monologue, Examine Object, Examine NPC, Talk, Overhear). Define triggers, UI needs, server events per type. v0.1 surfaces single context-sensitive action; architecture supports N verbs via `verbs[]`. Includes wiki + decisions rename: "interaction" → "`verbs[]`" terminology where appropriate. Soft dependency for NEW-9. | - -### NEW-R2. Tickets from Lead Round 2 Decisions - -| ID | Title | Type | Pri | Sprint | Team | Blocked By | Description | -|----|-------|------|-----|--------|------|------------|-------------| -| NEW-8 | YAML → RON converter tool | task | med | 4 | server | C1 | Build-time converter: reads content YAML, emits RON. Lives in `tooling/`. Runs as make target (`make content-ron`). Not on critical path — engine consumes YAML in v0.1; RON is future-proofing for engine performance if needed. | -| NEW-9 | Proximity detection + multi-verb InteractionOptions (`verbs[]`) | story | high | 3 | server | — | Proximity detection system + server-side `InteractionOptions` component modeling N available actions per entity via `verbs[]`. Without proximity, InteractionOptions has no trigger. v0.1 client picks first/best verb; v0.2 client shows menu. Must not be throwaway. Includes ObserverSnapshot v2 → v3 protocol extension for interaction data. Soft dependency on NEW-7 (verb definitions). | -| NEW-10 | Interaction prompt — client extensible prompt system | story | high | 3 | client | NEW-9 | Client-side interaction prompt designed for extensibility. v0.1: single context-sensitive E prompt. Architecture supports v0.2 multi-verb menu. Prompt system reads `InteractionOptions` from server state. Separate from #240 (Player interaction system and dispatcher) — different team, different definition of done. | -| NEW-11 | Pause system — server tick rate scaling | story | med | 3 | server | — | Tick rate supports 3 states: full speed (normal play), 50% speed (UI overlay open — knowledge panel, dialogue), 0% (spacebar pause). Server receives pause/speed commands from client via IPC. | -| NEW-13 | Line previewer CLI | task | med | 4 | server | C3, C9 | CLI tool to preview monologue/dialogue line selection for a given game state. Lives in `tooling/`. Helps content authors test prerequisite logic without running the full game. Tyre's recommendation for content tuning. | -| NEW-14 | UI microcopy | task | med | 5 | client | Stig UI spec | ~50 strings: interaction prompt labels, knowledge panel labels, relationship state descriptors, HUD labels, tutorial text. Blocked by Stig's UI element specs from Sprint 3. | - ---- - -## Sprint Plan - -### Sprint 3: Know — Copy Team (Content Foundation) - -**Goal:** Deliver content specs and wiki fixes that unblock server implementation and content authoring. - -| Pri | Ticket | Title | Owner Hint | Effort | -|-----|--------|-------|------------|--------| -| **P0** | **#261** | **Dual Lens Authoring Guide** | **Paula** | **Large** | -| **P0** | **C1** | **Content directory structure design** | **Tyre/Gestalt** | **Medium** | -| P0 | A1 | Apply canonical full names | Paula | Small | -| P0 | A2 | Hael → Naia Tamm rename (~16 files) | Paula | Small | -| P0 | A7 | Smuggler role-perspective keys (16 total) | Paula | Small | -| P1 | B2 | MIRROR pattern spec + Naia reference impl | Gestalt/Gore | Medium | -| P1 | B4 | Smuggler voice + moral arc (subsumes #310) | Gore/Mellanie | Medium | -| P1 | NEW-1 | NPC pattern/motivation mapping (Gestalt-Paula synthesis) | Gestalt | Small | -| P1 | NEW-5 | Wow moment content checklist | SI | Small | -| P1 | A10 | Nils Davan stub | Paula | Small | -| P1 | A11 | Triangle 1 fix (Volume Escalation) | Gestalt/Paula | Medium | -| P2 | B3 | PC-as-NPC spec | Gestalt/Paula | Medium | -| P2 | A8 | Shortcode fix | Mellanie | Small | -| P2 | NEW-2 | Drin Tier 2 profile expansion | Paula | Small | -| P2 | NEW-7 | Interaction verb spec + `verbs[]` terminology | Gestalt | Small | - -**Copy Sprint 3 total: 15 tickets (5 P0, 6 P1, 4 P2)** - -### Sprint 3: Know — Server Team (Content-Adjacent Additions) - -| Pri | Ticket | Title | Effort | -|-----|--------|-------|--------| -| P1 | C2 | Content/ directory skeleton | Small | -| P1 | C3 | Content schema definitions | Medium | -| P1 | C9 | validate-content CLI (same crate as C3) | Medium | -| P1 | NEW-9 | Proximity detection + InteractionOptions (`verbs[]`) | Medium | -| P1 | #326-P1 | Content loader Phase 1 — skeleton + fixtures | Medium | -| P2 | NEW-11 | Pause system — tick rate scaling | Small | - -**Server Sprint 3 additions: 6 tickets (in addition to existing 10)** - -### Sprint 3: Know — Client Team (Additions) - -| Pri | Ticket | Title | Effort | -|-----|--------|-------|--------| -| P1 | NEW-10 | Interaction prompt — extensible prompt system | Medium | - -**Client Sprint 3 addition: 1 ticket** - -### Sprint 4: Content Conversion + Authoring Begins - -| Ticket | Title | Team | Blocked By | -|--------|-------|------|------------| -| NEW-3 | Wiki → YAML conversion (17 NPCs) | copy | C1, C2, C3 | -| C4 | Enum YAMLs from D-035 | server | C2 | -| C5 | Entity-attributes YAML | server | C2 | -| C6 | Pools YAML | server | C2 | -| C7 | Social site template YAMLs | server | C2 | -| C8 | Triangle YAMLs | server | C2 | -| C10 | Pre-commit FactId check | ci | — | -| A6 | Smuggler FactId progression text | copy | B4 | -| A12 | Environmental text examples | copy | A3/#319 | -| B5 | PC NPC-format briefs | copy | B3 | -| D4 | News ticker headlines (~20) | copy | — | -| #306 | News ticker content (align with D4) | copy | — | -| D2 | Seed configuration schema | server | — | -| NEW-4 | Monologue content pool (~200 lines) | copy | #261, B4 | -| NEW-8 | YAML → RON converter | server | C1 | -| NEW-13 | Line previewer CLI | server | C3, C9 | -| #326-P2 | Content loader Phase 2 — real content | server | C4-C8, NEW-3 | -| A3/#319 | Krenn brief + seed.yaml reference | copy | — | - -### Sprint 5+ (Content at Scale) - -| Ticket | Title | Team | Blocked By | -|--------|-------|------|------------| -| NEW-6 | PC-as-NPC content authoring (~25 items) | copy | B3, B5, #297, #298 | -| NEW-14 | UI microcopy (~50 strings) | client | Stig UI spec | -| B1 | NPC Authoring Style Guide (generator spec) | copy | A3, A4, A7, B2, B4 | -| A4 | Regional style guide / seed.yaml template | copy | — | -| A9 | Thematic Question field (Tier 1 profiles) | copy | B2 | -| #297 | THE FRIEND: Kael content pack | copy | #261 | -| #298 | THE FRIEND: Sera content pack | copy | #261 | -| #190 | Workplace content pack | copy | #261 | -| #191 | Bar content pack | copy | #261 | -| #192 | Smuggling ring content pack | copy | #261 | - ---- - -## Dependency Graph - -``` -SPRINT 3 — Three Parallel Chains -================================== - -Chain 1: Content Authoring Pipeline (copy) -------------------------------------------- -#261 (Dual Lens Guide) [P0, CRITICAL PATH ROOT] - ├─► B4 (Smuggler voice + moral arc) [Sprint 3] - │ ├─► A6 (Smuggler FactId text) [Sprint 4] - │ └─► NEW-4 (Monologue pool) [Sprint 4] - ├─► #297 (FRIEND: Kael) [Sprint 5] - │ └─► NEW-6 (PC-as-NPC authoring) [Sprint 5] - ├─► #298 (FRIEND: Sera) [Sprint 5] - │ └─► NEW-6 (PC-as-NPC authoring) [Sprint 5] - ├─► #299 (Opening hook: smuggler) [Sprint 5] - ├─► #300 (Opening hook: detective) [Sprint 5] - └─► #190, #191, #192 (Content packs) [Sprint 5] - -A7 (Smuggler attributes) [P0, Sprint 3] - ├─► B4 (Smuggler voice) [Sprint 3] - └─► B3 (PC-as-NPC spec) [Sprint 3] - └─► B5 (PC briefs) [Sprint 4] - └─► NEW-6 (PC-as-NPC authoring) [Sprint 5] - -Chain 2: Content Architecture Pipeline (server) -------------------------------------------------- -C1 (Content dir design) [P0, Sprint 3, copy] - ├─► C2 (skeleton) [Sprint 3, server] - │ ├─► C4 (enums) [Sprint 4] - │ ├─► C5 (entity attrs) [Sprint 4] - │ ├─► C6 (pools) [Sprint 4] - │ ├─► C7 (templates) [Sprint 4] - │ ├─► C8 (triangles) [Sprint 4] - │ ├─► NEW-3 (wiki→YAML) [Sprint 4, copy] - │ └─► #326-P2 (loader Phase 2) [Sprint 4] - ├─► C3 (schemas) [Sprint 3, server] - │ ├─► C9 (validator) [Sprint 3, server] - │ ├─► NEW-3 (wiki→YAML) [Sprint 4, copy] - │ └─► NEW-13 (line previewer) [Sprint 4] - ├─► #326-P1 (loader Phase 1) [Sprint 3, server] - └─► NEW-8 (RON converter) [Sprint 4] - -Chain 3: Interaction Pipeline (server + client) -------------------------------------------------- -NEW-7 (Verb spec) [Sprint 3, copy] ···soft···> NEW-9 -NEW-9 (Proximity + InteractionOptions) [Sprint 3, server] - └─► NEW-10 (Extensible prompt) [Sprint 3, client] - -Independent (Sprint 3) ------------------------- -B2 (MIRROR spec) ─► A9 (Thematic Question) [Sprint 4] -A10 (Nils stub) ─► A11 (Triangle 1 fix) [Sprint 3] -NEW-11 (Tick rate scaling) [Sprint 3, server] — no downstream blockers - -Existing Server Dependencies ------------------------------- -#237 (A* pathfinding) ─► #88 (Daily routine system) [both Sprint 3] -``` - ---- - -## Ticket Count - -| Category | Count | Teams | -|----------|-------|-------| -| Wiki fixes (A-series) | 8 | copy | -| Style guides & specs (B-series) | 5 | copy | -| Content directory & schema (C-series) | 10 | copy (1), server (8), ci (1) | -| Design specs (D-series) | 2 | server (1), copy (1) | -| Workshop tickets (NEW 1-7) | 7 | copy | -| Lead decision tickets (NEW 8-14, excl. killed NEW-12) | 6 | server (4), client (2) | -| **Total new tickets** | **38** | **copy (21), server (13), client (2), ci (1)** | -| Existing ticket updates | 10 | — | -| **Killed from Round 2** | **1** | NEW-12 (client pause — not a ticket) | - -*Note: count is 38, not 37 — NEW-14 (UI microcopy) was added in closing corrections. 38 original − 1 killed (NEW-12) + 1 added (NEW-14) = 38.* - ---- - -## Risks - -1. **#261 is the critical path root.** Blocks 9 tickets directly. If it slips one sprint, the entire content authoring pipeline delays into Sprint 5+. Recommend: assign Paula immediately, time-box to 5 working days. - -2. **Sprint 3 server team is heavy.** 10 existing tickets + 6 new content-adjacent additions = 16. Mitigation: C2, C3, C9, #326-P1 are all blocked by C1 (copy team) — they start mid-sprint. NEW-9 and NEW-11 are independent and can begin immediately. - -3. **Content conversion (NEW-3) is a Sprint 4 bottleneck.** Tyre estimates 2-3 full days for 17 NPC conversions. Blocks server from testing with real data. Recommend: start with 3 Tier 1 NPCs (Kael, Sera, Naia) as soon as C2 lands; don't wait for all 17. - -4. **#237 → #88 server dependency.** Pathfinding must land before routines. Both are Sprint 3. If #237 slips, NPC routines slip, which delays routine deviation detection (#243), which delays wow moment #2 (The Character's Eye). - ---- - -*Proposals only — no tickets created in database. Awaiting lead approval.* -*Compiled by SI. Source: v0.1 Content Scoping Workshop Rounds 1-2, lead closing corrections, Qatux tracking doc.* diff --git a/docs/workshops/v01-content-scoping/v01-content-scoping-workshop-brief.md b/docs/workshops/v01-content-scoping/v01-content-scoping-workshop-brief.md deleted file mode 100644 index 582855a4b..000000000 --- a/docs/workshops/v01-content-scoping/v01-content-scoping-workshop-brief.md +++ /dev/null @@ -1,227 +0,0 @@ -# Workshop Brief: v0.1 Content Scoping -## What Actually Ships in the Vertical Slice? - -**Project:** The Settled Reach (D-021) -**Date:** 2026-02-12 -**Called by:** Jeroen -**Prerequisite:** Wiki Review workshop established long-term content strategy (300-world generator model, cultural ingredients menu, three-system NPC architecture, Sacred/Profane/Middle Kingdom). This workshop applies that strategy to v0.1. -**Participants:** GESTALT, PAULA, TYRE, MELLANIE, STIG, DUDLEY + SI (tickets) + QATUX (documenter) - ---- - -## Context - -The Wiki Review workshop (4 rounds + lead interview) produced a comprehensive long-term content strategy documented in `docs/workshops/wiki-review/SUMMARY.md`. The key outcome: the full game targets 300 worlds populated by generators fed by style briefs. But **v0.1 is NOT a generator test. v0.1 is proof of the interaction model** — 1 district, hand-authored, proving that the player can touch the world and the world can touch back. - -The existing wiki (`wiki/`, 45 files, ticket #368) contains the content for Sova Transit District: 17 NPCs across 3 tiers, 5 triangles, 3 social sites, knowledge vocabulary (FactIds, entity attributes, relationship states), and an authoring guide. This content has known gaps and issues identified in Rounds 1-2 of the Wiki Review. - -**This workshop scopes and prioritizes the content work needed to ship v0.1.** - -**Key constraint:** v0.1 must be architecturally compatible with the 300-world future. Hand-authored Sova content becomes the benchmark output that generators must match. Every structure we create now is a generator template later. Don't build anything that only works for 1 district. - -**Design constraints from existing decisions:** -- D-005: Single-character perspective -- D-020: Godot 4 client + Rust/bevy_ecs server -- D-027: Smuggler + detective vertical slice, two-character proof -- D-034: THE FRIEND production-level NPC pattern (Kael, Sera) -- D-035: Monologue system with tagged prerequisites -- D-036: Krenn System / Sova Transit District setting -- D-037: Contraband types -- D-039: 6 wow moments in a 30-minute session -- D-041: Knowledge graph architecture -- Wiki Review: WASD direct control, context-sensitive interaction - ---- - -## Required Reading - -Before responding, read: -1. `docs/workshops/wiki-review/SUMMARY.md` — the long-term content strategy (essential context) -2. `docs/workshops/wiki-review/lead-interview.md` — lead's decisions on cultural ingredients, NPC composition, archetypes, randomization, scale -3. `wiki/index.md` — current wiki structure -4. `wiki/npcs/index.md` — NPC roster and triangles -5. `decisions/content.md` — D-028, D-034, D-035, D-036, D-037 -6. `decisions/scope.md` — D-027, D-039 - ---- - -## Topic 1: Wiki Fixes — Known Issues from Rounds 1-2 - -**What needs fixing in the existing wiki before it can drive implementation?** - -The Wiki Review identified these specific issues: - -### 1a. Hael → Naia Tamm rename -Unanimous decision. Resolves Kael/Hael sonic collision (T-03). Hael becomes Naia Tamm, following Krenn naming conventions. This NPC is also the first instance of THE MIRROR pattern — honest, no contradiction arc, no secret. - -- **Paula:** Execute the rename across all wiki files. Update relationship references, triangle diagrams, cross-references. -- **Mellanie:** Review Naia Tamm's voice — does she need voice samples now that she's a MIRROR (Tier 1 emotional depth)? - -### 1b. Smuggler lens parity -The wiki is detective-shaped. The smuggler perspective needs equal depth: -- Smuggler-specific NPC attributes: `trust_read`, `exposure_risk`, `loyalty_assessment`, `leverage_held`, `social_debt`, `moral_weight`, `cover_integrity`, `loyalty_conflict` -- Moral arc phases for smuggler: Comfort → Doubt → Reckoning → Compromise -- Every NPC profile needs a smuggler-lens section with the same depth as the detective-lens section - -- **Paula:** Propose the smuggler attribute vocabulary and add smuggler-lens sections to all NPC profiles. -- **Gestalt:** How do smuggler attributes map to EntityKnowledge keys in the knowledge graph? - -### 1c. Triangle 1 (Hub Power) strengthening -Weakest triangle. Smuggler role is passive. Needs a concrete fork — the Nils-vs-Voss escalation decision. -- Nils needs a stub wiki page at minimum -- The player needs a decision point, not just observation - -- **Gestalt:** Design the Triangle 1 fork. What does the smuggler decide? What does the detective observe? -- **Paula:** Write the Nils stub page. Define Triangle 1's escalation sequence. - -### 1d. Drin tier promotion -Drin is doing Tier 2 work (Triangle 2, Triangle 5, compromised by Harek) in a Tier 3 profile. - -- **Gestalt:** Should Drin be promoted to Tier 2? What are the mechanical implications? -- **Paula:** If promoted, expand the profile to full Tier 2 depth. - -### 1e. Full canonical names -Miri generated 12 Krenn-style names in Round 1. Apply them to NPCs currently using single names. - -- **Paula:** Apply Miri's names where appropriate. Check naming consistency. - -**Questions:** -1. **Paula:** Are there other wiki gaps not listed above? What did you discover during Round 1-2 review that still needs fixing? -2. **Gestalt:** Do any triangles need restructuring beyond Triangle 1? -3. **Mellanie:** Are the voice samples in Tier 1 profiles (Kael, Sera) distinct enough for monologue authoring? - ---- - -## Topic 2: v0.1 NPC Architecture - -**Which subset of the three-system NPC model ships in v0.1?** - -The long-term strategy defines three NPC systems: -- **System A:** 9 thematic patterns (FRIEND, MIRROR, ANCHOR, GHOST, CATALYST, THRESHOLD, REMNANT, SYSTEM, NOBODY) -- **System B:** 6 functional motivations (HANDLER, WITNESS, TURNCOAT, CIVILIAN, OPERATOR, SKEPTIC) -- **System C:** Composition rules (pattern x motivation per NPC) - -v0.1 has 17 NPCs across 3 tiers. Not all patterns and motivations need to be present. - -**Questions:** -1. **Gestalt:** Which patterns and motivations are REQUIRED for v0.1? Which can be deferred? Map the existing 17 NPCs to pattern + motivation assignments. -2. **Paula:** Do the existing NPC profiles already implicitly match patterns/motivations? Make the mapping explicit. -3. **Gestalt:** Does THE NOBODY ship in v0.1, or is dynamic tier promotion a v0.2 feature? If v0.1, which NPCs are NOBODYs? -4. **Dudley:** What server-side entity data does each pattern/motivation require? What's the ECS component design? - ---- - -## Topic 3: v0.1 Content Directory Structure - -**How does wiki content become engine-readable data?** - -The wiki (`wiki/`) is the authoring source. The engine needs content in a structured format the server can load. The directory structure must: -- Support the v0.1 content (1 district, hand-authored) -- Be architecturally compatible with the 300-world generator output (same schema, same addressing) -- Allow hot-reloading during development -- Support content validation - -**Questions:** -1. **Tyre:** Propose the `content/` directory structure for v0.1. What format — YAML? RON? How does it mirror the wiki structure? -2. **Tyre:** How does content addressing work? `canonical_id` per entity? How do wiki pages map to content files? -3. **Dudley:** What does the server content loader need? What's the load sequence? How does an NPC profile become a spawned entity? -4. **Gestalt:** What's per-district vs. global? Where does the FactId catalog live? Where do NPC profiles live? Where do triangle definitions live? -5. **Stig:** What does the client need from content files? NPC display names? Dialogue text? Location descriptions? What format makes client loading simple? - ---- - -## Topic 4: Interaction Model Basics for v0.1 - -**What's the minimum viable interaction for the vertical slice?** - -The Control & Interaction workshop will design the full system. But v0.1 needs SOMETHING — the player must be able to: -- Walk up to an NPC and initiate dialogue -- Receive monologue observations -- Examine objects/environment -- Overhear conversations (proximity-based) - -This topic scopes the v0.1 minimum, not the full design. - -**Questions:** -1. **Gestalt:** What's the minimum interaction set that proves the core loop? Walk + talk + observe + monologue? Or does v0.1 need more? -2. **Stig:** What UI elements does the minimum interaction model need? Interaction prompt? Dialogue box? Monologue display? Knowledge panel? -3. **Dudley:** What server events support the minimum interaction? Proximity triggers? Interaction requests? Dialogue state? -4. **Mellanie:** How much monologue content does v0.1 need? What's the minimum pool size before it feels repetitive? - ---- - -## Topic 5: v0.1 Scope Boundary - -**What's IN v0.1 and what's explicitly OUT?** - -v0.1 proves the interaction model. It does NOT prove generators, randomization, or cultural variety. Be ruthless about scope. - -**Candidates for IN:** -- WASD movement + collision -- Context-sensitive interaction (approach NPC → prompt → dialogue) -- Monologue system (tagged triggers, FactId prerequisites) -- Knowledge graph (player learns facts, relationships change) -- 2 playable characters (smuggler, detective) seeing same world differently -- THE FRIEND arc (Kael for smuggler, Sera for detective) -- 5 triangles with at least 1 fork each -- 6 wow moments (D-039) -- 3 social sites (Terminal, Last Shift, Maintenance Corridors) -- NPC routines (schedule-based movement) - -**Candidates for OUT (v0.2+):** -- THE NOBODY / dynamic tier promotion -- Archetype transitions -- Multiple FRIEND candidates per character -- Secondary contraband variation -- Gate network / multi-world -- Content generation / randomization -- Modding support - -**Questions:** -1. **Gestalt:** Is this IN/OUT split correct? Anything missing from IN that's essential for the 30-minute session? Anything in IN that's scope creep? -2. **Tyre:** What's the technical risk in the IN list? What might take longer than expected? -3. **Dudley:** What server features are blocked by content that doesn't exist yet? -4. **SI:** Map the IN list to tickets. What already has tickets? What needs new ones? - ---- - -## Topic 6: Ticket Generation - -**What implementation tickets come out of this workshop?** - -SI had a preliminary list of 28 tickets from Wiki Review Round 2, but the 300-world reframe makes some obsolete and creates new ones. - -**Expected ticket categories:** -- Wiki fixes (rename, smuggler lens, triangle strengthening, Drin promotion, canonical names) -- Content file creation (wiki → YAML/RON conversion for engine) -- Content directory structure setup -- Content loader implementation (server-side) -- Content validation schema -- Minimum interaction model (client UI elements) -- Monologue content pool (minimum viable) -- PC-as-NPC content (the other character exists as an NPC) - -**Questions:** -1. **SI:** Review the Round 2 ticket list (`docs/workshops/wiki-review/si-ticket-changes.md`). Which survive? Which are obsolete? What's new? -2. **SI:** Which tickets belong to Sprint 3 (Know) vs. later sprints? What's the dependency chain? -3. **Tyre:** What tickets should be split between server/client/copy teams? - ---- - -## Workshop Format - -**1-2 rounds.** - -**Round 1:** Topic responses. Each participant addresses their assigned questions with concrete proposals. Wiki fixes should include actual content (not just "we should fix this"). Directory structures should be actual file trees. Ticket proposals should have title, description, and team assignment. - -**Round 2:** Integration + ticket finalization. Resolve disagreements, finalize the IN/OUT boundary, produce the ticket list. SI creates tickets. Qatux documents decisions. - -## Expected Outputs - -- **Wiki fix list** with assignments and content ready to apply -- **NPC pattern/motivation mapping** for all 17 v0.1 NPCs -- **Content directory structure** with schema proposal -- **v0.1 interaction model minimum** — enough for Stig/Dudley to implement -- **Scope boundary document** — clear IN/OUT with rationale -- **Ticket list** — implementation tickets with team assignments and sprint targets -- **Decision amendments** — updates to existing decisions based on scoping diff --git a/docs/workshops/v01-content-scoping/workshop-outcomes.md b/docs/workshops/v01-content-scoping/workshop-outcomes.md deleted file mode 100644 index 196460f28..000000000 --- a/docs/workshops/v01-content-scoping/workshop-outcomes.md +++ /dev/null @@ -1,116 +0,0 @@ -# Workshop Outcomes: v0.1 Content Scoping - -**Workshop:** v0.1 Content Scoping -**Date:** 2026-02-12 -**Rounds:** 2 + closing round (lead resolutions) -**Participants:** Gestalt, Paula, Tyre, Mellanie, Stig, Dudley, Si, Qatux -**Facilitator:** Jeroen -**Documenter:** Qatux -**Status:** CLOSED — all recoverable decisions filed, tickets created -**Full notes:** `docs/workshops/v01-content-scoping/SUMMARY.md`, `si-ticket-changes.md` - ---- - -## What the Workshop Accomplished - -Applied the Wiki Review's long-term generator strategy to the immediate v0.1 hand-authored proof. Produced 20 decisions (D-042 through D-061), 38 new tickets, canonical NPC mapping for 17 characters, the 16-key EntityKnowledge specification, full content directory architecture, and a Sprint 3-5 roadmap. Tyre and Dudley independently produced structurally identical ObserverSnapshot v3 definitions without coordination — confirmed the architecture was sound. Lead issued 4 decisions resolving the major Round 1 disagreements between rounds, then resolved 3 remaining questions in a closing round. - -**Note on decision IDs:** Several IDs assigned at this workshop collided with later numbering. Genuinely new decisions identified in retrospect were filed as D-087 (content directory structure), D-089 (NPC canonical mapping method), D-091 (EntityKnowledge 16-key canonical set), Q-031 through Q-034. - ---- - -## Decisions Produced - -### From Round 1 Consensus (7) - -| ID | Decision | Domain | -|----|----------|--------| -| D-042 | Drin promoted from Tier 3 to Tier 2 | content.md | -| D-043 | THE NOBODY mechanic deferred to v0.2; hidden data ships in v0.1 content | scope.md | -| D-044 | v0.1 interaction model: 7 verbs (Move, Look, Monologue, Examine Object, Examine NPC, Talk, Overhear) | scope.md | -| D-045 | v0.1 scope IN: news ticker, PC-as-NPC, time progression, relationship state transitions | scope.md | -| D-046 | v0.1 scope OUT: inventory, stealth, combat, save/load, lattice modification | scope.md | -| D-047 | v0.1 triangles: 3 active forks (T1, T2, T4), 2 passive tensions (T3, T5) | content.md | -| D-048 | Client receives all text from server via state updates; client does not load content files | architecture.md | - -### From Round 2 + Closing (13) - -| ID | Decision | Domain | -|----|----------|--------| -| D-049 | YAML is the content file format for v0.1; RON is optional build-time optimization | architecture.md | -| D-050 | Gestalt's NPC pattern/motivation mapping canonical for v0.1; Paula's emotional layer becomes v0.2 annotations | content.md | -| D-051 | v0.1 ships single context-sensitive verb; multi-verb architecture modeled underneath | architecture.md | -| D-052 | 3-state pause: Normal (100%), Overlay (50%), Paused (0%); server-authoritative | architecture.md | -| D-053 | Self-contained triangle forks for v0.1; no cross-triangle cascade (v0.2) | content.md | -| D-054 | ObserverSnapshot v3: adds sim_speed, nearby_interactions, active_dialogue, monologue, overheard, knowledge_updates, examine_result, ticker_headlines | architecture.md | -| D-055 | 16 EntityKnowledge keys; 4 new role-perspective keys; trust_read merged into trust_level; secret_held → leverage_held | architecture.md | -| D-056 | PC voice registers: smuggler (feeling-first, fragments, physical); detective (analysis-first, complete sentences, institutional) | content.md | -| D-057 | Content directory: content/ with _schema/, global/, districts/ top-level split; JSON Schema validation at build time | process.md | -| D-058 | THE FRIEND content pack template: Kael Davan, 91 lines across 5 arc phases | content.md | -| D-059 | Monologue display: 160 char max, 2-line max, 4-6s display, 2s cooldown, queue depth 1, 9-level priority | architecture.md | -| D-060 | actions[] renamed to verbs[] across all surfaces | architecture.md | -| D-061 | No ticket merges across domain teams | process.md | - -### Retrospective Filings (ID collisions resolved) - -| ID | Decision | Domain | -|----|----------|--------| -| D-087 | Content directory structure (content/ split) | process.md | -| D-089 | Canonical NPC pattern/motivation mapping method | content.md | -| D-091 | EntityKnowledge 16-key canonical specification | architecture.md | - ---- - -## Open Questions Carried Forward - -| ID | Question | Status | -|----|----------|--------| -| Q-031 | NPC surnames for Drin, Sess, Tav awaiting Miri validation | Informational | -| Q-032 | Interaction struct naming: AvailableActions (Tyre) vs EntityInteractions (Dudley) | Resolved at implementation | -| Q-033 | 695 authored items: validated as scope input but not independently verified | Informational | -| Q-034 | Dialogue max-width: pixel value for 20% height / max-width constraint | Pending lead call | - -None blocked Sprint 3. - ---- - -## Tickets Created - -38 new tickets + 10 existing ticket updates. See `si-ticket-changes.md` for full list. - -**Teams:** copy (21), server (13), client (2), ci (1). - -**Critical path:** #261 (Dual Lens Authoring Guide) is the single biggest blocker — directly blocks 9 downstream tickets across the content pipeline. Five-day time-box recommended. - -| Series | Count | Domain | -|--------|-------|--------| -| A (Wiki content fixes) | 8 | copy | -| B (Style guides + specs) | 5 | copy | -| C (Content directory + schemas) | 10 | copy/server/ci | -| D (Design specs) | 2 | server/copy | -| NEW 1-7 (Workshop rounds) | 7 | copy | -| NEW 8-14 (Lead decisions, excl. killed NEW-12) | 6 | server/client | - -**Killed:** NEW-12 (client pause state machine — pause is server-authoritative, client sends IPC command only). - -**Sprint allocation:** Sprint 3 — foundations and specs. Sprint 4 — content conversion and authoring begins. Sprint 5+ — content at scale. - ---- - -## NPC Canonical Mapping (17 NPCs) - -The Gestalt-Paula synthesis produced the v0.1 canonical pattern/motivation mapping for all 17 Sova NPCs. This is the authoritative reference for content authoring. - -| Name | Tier | Pattern | Motivation | -|------|------|---------|-----------| -| Kael Davan | T1 | FRIEND | OPERATOR | -| Sera Venn | T1 | FRIEND | WITNESS | -| Naia Tamm | T1* | MIRROR | CIVILIAN | -| Voss, Lera, Torek, Devra, Maret, Resha, Drin, Renn, Pell, Harek | T2 | (varied) | (varied) | -| Sess, Olin, Sabel, Tav | T3 | (varied) | (varied) | - -Off-stage: Nils Davan — GHOST + HANDLER. - ---- - -*Compiled by Qatux. Source: `docs/workshops/v01-content-scoping/SUMMARY.md`, `si-ticket-changes.md`. Decisions in relevant `decisions/` domain files (D-042 through D-061, D-087, D-089, D-091). Open questions in `decisions/questions.md` (Q-031 through Q-034).*