Files
settled-reach/docs/design/opening-hook-content.md
T
jpmschweitzerandClaude Sonnet 4.6 266510c3d8 feat(content): populate knowledge fact catalogs for v0.1 transit district
Add machine-readable fact catalog YAML files for all knowledge categories.
Makes the check-fact-ids pre-commit hook validation functional.

New files: awareness.yaml, behavioral.yaml, knowledge.yaml, social.yaml
Populated: investigation.yaml, contraband.yaml, location.yaml,
           relationship.yaml, world.yaml, progress.yaml

50+ canonical fact IDs covering: smuggling ring operations, investigation
findings, behavioral patterns, situational awareness, location facts,
inter-NPC relationships, and social positioning. Character starting
confidence annotated per fact. Derived from knowledge-vocabulary-v01.md (#368).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-19 16:22:12 +01:00

18 KiB

Opening Hook Content Per Character

Ticket: #260 | Priority: High | Sprint: 12 Status: v0.1 Draft Owner: Paula Blocked by: #259 (First 5 minutes experience design — done) Source: docs/design/first-5-minutes-experience.md (systems + narrative design) Decisions referenced: D-032, D-035, D-039 (wow moment #1), D-053, D-064


Overview

This document specifies the authored content for each character's opening hook — the first 3-4 minutes of play, before any investigation or conspiracy elements appear. Content is organized by seed variant (A-D per character) and includes authored monologue lines, NPC dialogue cues, and diegetic objective setup.

Authoring note: this document provides design spec and reference lines. Final authored YAML files go in the appropriate monologue pools per D-032 and D-035.


1. Smuggler Opening Variants

Common Elements (All Variants)

All smuggler openings share:

  • Location: The Terminal (Logistics Hub), dock floor or entrance
  • Ambient: Station hum playing from frame 0; cargo machinery active in background
  • FRIEND: Kael Davan is the first significant NPC — established within 90 seconds regardless of variant
  • Voice register: Terse, sensory, first-name, operational-aware. No complete sentences unless they end in an operational note.

Opening Line Pool (enter_location, Terminal, no prerequisites)

These lines fire when the smuggler enters The Terminal at session start. 3-4 lines available; engine selects one based on seed variant.

- id: transit_m_s_open_001
  character: smuggler
  trigger: enter_location
  location: the-terminal
  text: "Morning shift. Recycled air and cargo lubricant. Home sweet home."
  mood: [content, routine]
  tags: [opening_hook, canonical_anchor]

- id: transit_m_s_open_002
  character: smuggler
  trigger: enter_location
  location: the-terminal
  text: "Span gate's been cycling all night. Can hear it in the walls."
  mood: [routine, aware]
  tags: [opening_hook]

- id: transit_m_s_open_003
  character: smuggler
  trigger: enter_location
  location: the-terminal
  text: "Floor smells like a ship's hold. Someone ran a heavy cargo last night. Not ours."
  mood: [routine, observant]
  tags: [opening_hook]

- id: transit_m_s_open_004
  character: smuggler
  trigger: enter_location
  location: the-terminal
  text: "Early shift crew's still clearing out. Good — gives us some runway before handoff."
  mood: [operational, content]
  tags: [opening_hook, variant_c_d]

Kael Sighting Lines (observe_npc, Kael, Phase 1 relationship)

These fire when the smuggler sees Kael on the dock floor. Critical FRIEND establishment lines.

- id: transit_m_s_open_010
  character: smuggler
  trigger: observe_npc
  target: npc:kael-davan
  prerequisites:
    relationship:
      target: npc:kael-davan
      state: friendly
  text: "Kael's already at the dock. Good. The day's better when he's on shift."
  mood: [content, fond]
  tags: [opening_hook, friend_phase_1, canonical_anchor]

- id: transit_m_s_open_011
  character: smuggler
  trigger: observe_npc
  target: npc:kael-davan
  prerequisites:
    relationship:
      target: npc:kael-davan
      state: friendly
  text: "There he is. Same spot, every morning for two years. Some things you can count on."
  mood: [fond, content]
  tags: [opening_hook, friend_phase_1]

Variant A: Quiet Morning

Initial condition: No deviations. Standard operational day. The run is scheduled for the transition window.

Opening state: Kael is at his station. Voss is present but not focused on the dock floor. Everything is calm.

Operational context line (observe_anomaly — schedule board):

- id: transit_m_s_open_020
  character: smuggler
  trigger: observe_anomaly
  location: the-terminal
  text: "Transition window opens in fifty minutes. Standard run — nothing complicated."
  mood: [operational, content]
  tags: [opening_hook, variant_a]

FRIEND Phase 1 dialogue cue (Kael, on approach): Kael greets the smuggler warmly. Asks about the weekend. Makes a dry comment about Voss's new clipboard system. Everything is normal.

Authored dialogue line for Kael (for content pack):

"There you are. Voss has a new form now — cargo intake manifest version four. Apparently version three had a column in the wrong place. The man has opinions about spreadsheets." access: [peer, insider], trust: surface, situation: [greeting, shift_start]


Variant B: Kael Is Late

Initial condition: Kael has not arrived at his expected time. His station is empty. The smuggler starts without their anchor.

Opening state: Dock floor has other workers but Kael's absence is visible. A small operational tension — where is he? — without any real alarm.

Absence lines (observe_npc, failed — Kael's station empty):

- id: transit_m_s_open_030
  character: smuggler
  trigger: observe_anomaly
  location: the-terminal
  text: "Kael's station is empty. He's always here before me. Maybe I was early."
  mood: [routine, mildly_concerned]
  tags: [opening_hook, variant_b]
  notes: "Phase 1 tell: Kael's routine is so established that absence is noted before alarm."

- id: transit_m_s_open_031
  character: smuggler
  trigger: time_idle
  location: the-terminal
  text: "Still no Kael. Probably caught something. He'd have sent a message if it were the run."
  mood: [mildly_concerned, operational]
  tags: [opening_hook, variant_b]
  notes: "Fires if player is near Kael's empty station for >60 seconds."

Kael arrival (late, within 5 minutes of session start): Kael arrives slightly disheveled, slightly out of breath. Brief explanation — nothing alarming, just late. But the explanation is slightly vague. This is the first hairline crack from the very start: Kael's lateness is the beginning of Phase 2 tells.

Authored dialogue line for Kael (late arrival):

"Yeah, yeah, I know. Had a thing. Don't give Voss a reason to look at the timestamp." access: [peer, insider], trust: surface, situation: [greeting] Notes: "a thing" is characteristically vague but reads as personal, not operational.


Variant C: Heat from Voss

Initial condition: Voss is monitoring the dock floor more closely than usual. Something has him on edge — Commission liaison spotted yesterday, or a scheduling discrepancy from last week that hasn't been explained.

Opening state: Kael is present but body language is professional-not-warm. Voss is visible and attentive. The usual operational openness is compressed.

Environmental read lines:

- id: transit_m_s_open_040
  character: smuggler
  trigger: observe_npc
  target: npc:voss
  text: "Voss is on the floor. Not his usual post. Something's up."
  mood: [aware, cautious]
  tags: [opening_hook, variant_c]

- id: transit_m_s_open_041
  character: smuggler
  trigger: observe_npc
  target: npc:voss
  text: "He's watching the floor. That's the third time he's passed that section. Something put him on edge."
  mood: [operational, cautious]
  tags: [opening_hook, variant_c]
  notes: "Fires after player has been on the dock floor for 2+ minutes."

Kael adjustment (operational caution):

Authored dialogue line for Kael (in variant C):

"Normal morning. Don't give him a reason to notice you." [Kael says this quietly, without looking directly at the smuggler] access: [insider], trust: real, situation: [shift_start]


Variant D: Container Held

Initial condition: Operational container 4471 has been in temp storage longer than routing protocol specifies. Not a crisis — a logistical anomaly that the smuggler needs to address.

Opening state: Everything looks normal, but the first interaction with the freight system surfaces a held container.

Container flag lines:

- id: transit_m_s_open_050
  character: smuggler
  trigger: observe_anomaly
  location: the-terminal
  text: "4471 is still in temp. That was supposed to move yesterday afternoon."
  mood: [operational, concerned]
  tags: [opening_hook, variant_d]

- id: transit_m_s_open_051
  character: smuggler
  trigger: observe_anomaly
  location: the-terminal
  text: "Scheduling held it. Voss's call. There's a reason, I just don't know it yet."
  mood: [operational, analytical]
  tags: [opening_hook, variant_d]
  notes: "Fires on approach to freight terminal display. Teaches the player that containers are trackable."

Kael conversation (operational problem-solving):

Authored dialogue line for Kael (variant D):

"I saw. Voss pulled it from the schedule. He'll explain or he won't. Just don't touch it until he does." access: [insider], trust: real, situation: [shift_start, investigation]


2. Detective Opening Variants

Common Elements (All Variants)

All detective openings share:

  • Starting location: Varies by variant (see below)
  • Ambient: Station hum playing; institutional feel — cleaner, more structured than the bar or corridors
  • Social temperature: No warm greetings. NPCs are polite and guarded.
  • Voice register: Complete sentences. Analytical. "Filing it." "Note it." "That's interesting."

Opening Line Pool (enter_location, no prerequisites)

Lines that fire when the detective enters their starting location. Selection based on seed variant.

- id: transit_m_d_open_001
  character: detective
  trigger: enter_location
  location: the-terminal
  text: "Sova Transit District. Third day on station. The briefing said routine compliance review."
  mood: [professional, observant]
  tags: [opening_hook, canonical_anchor]

- id: transit_m_d_open_002
  character: detective
  trigger: enter_location
  location: the-terminal
  text: "The briefing is always wrong about something."
  mood: [analytical, wry]
  tags: [opening_hook, canonical_anchor]
  notes: "Companion line to open_001 — these fire in sequence on Variant A/B/C."

- id: transit_m_d_open_003
  character: detective
  trigger: enter_location
  location: the-last-shift
  text: "The bar at 08:30. Sera suggested it. The district has its own rhythms — find them before imposing mine."
  mood: [professional, curious]
  tags: [opening_hook, variant_a_bar]

- id: transit_m_d_open_004
  character: detective
  trigger: enter_location
  location: the-terminal
  text: "Manifest discrepancies clustered around the freight hub. Start there. Watch the shift change."
  mood: [analytical, operational]
  tags: [opening_hook]

Sera Sighting Lines (observe_npc, Sera, Phase 1 relationship)

Critical FRIEND establishment for the detective.

- id: transit_m_d_open_010
  character: detective
  trigger: observe_npc
  target: npc:sera-venn
  prerequisites:
    relationship:
      target: npc:sera-venn
      state: friendly
  text: "Good to know Sera's here. At least someone in this district speaks my language."
  mood: [relieved, warm]
  tags: [opening_hook, friend_phase_1, canonical_anchor]

- id: transit_m_d_open_011
  character: detective
  trigger: observe_npc
  target: npc:sera-venn
  prerequisites:
    relationship:
      target: npc:sera-venn
      state: friendly
  text: "Sera. Same as always — looks like she grew up in a place like this. I'll get there."
  mood: [warm, mildly_isolated]
  tags: [opening_hook, friend_phase_1]

Variant A: Bar First (Warm Arrival)

Initial condition: Sera has been contacted ahead of time and suggested meeting at The Last Shift to brief the detective on the district.

Starting location: The Last Shift

Opening state: Sera is at her usual booth. The bar is opening for morning service — Lera is present but focused on setup. The bar is mostly empty.

Bar arrival line:

- id: transit_m_d_open_020
  character: detective
  trigger: enter_location
  location: the-last-shift
  text: "The bar at 08:30. Only place in this district that doesn't smell like freight lubricant. Marginally."
  mood: [wry, observant]
  tags: [opening_hook, variant_a]

Lera read (public NPC, establishing social texture):

- id: transit_m_d_open_021
  character: detective
  trigger: observe_npc
  target: npc:lera-sessik
  text: "Bar owner. Lera Sessik — Sera mentioned her. Watching me decide whether I'm going to be trouble. Fair assessment."
  mood: [observant, professional]
  tags: [opening_hook, variant_a]

Sera orientation dialogue cue: Sera gives a brief district overview — who the regulars are, what the Terminal is like, what to expect from the shift supervisors. This is the detective's social tutorial through their friend's eyes.

Authored dialogue line for Sera (opening orientation):

"The Terminal crew is tight. They've seen Commission before. Voss will give you what he's required to give you and nothing else. Maret's different — she worries about compliance more than the others. That might be useful." access: [peer], trust: real, situation: [social, investigation]


Variant B: Terminal First (Cold Arrival)

Initial condition: No pre-contact. The detective enters the Terminal directly.

Starting location: The Terminal entrance

Opening state: The dock floor is active. Dock workers register the Commission presence and adjust. Voss is visible and approaches.

Terminal read line:

- id: transit_m_d_open_030
  character: detective
  trigger: enter_location
  location: the-terminal
  text: "Logistics hub. Standard prefab, heavy foot traffic. Let's see what the shift change tells me."
  mood: [analytical, professional]
  tags: [opening_hook, variant_b]

Voss approach (first adversarial NPC):

- id: transit_m_d_open_031
  character: detective
  trigger: observe_npc
  target: npc:voss
  text: "There's the shift supervisor. Saw me come in. He's deciding whether to approach or wait. Approaching. Good — I was going to find him anyway."
  mood: [analytical, professional]
  tags: [opening_hook, variant_b]

Voss opening exchange (institutional friction):

Authored dialogue line for Voss (territorial greeting):

"Commission liaison. Right. I was told you'd be coming by. I've got the manifest copies from last quarter ready. Standard compliance package." access: [authority], trust: surface, situation: [greeting, investigation]

Detective response cue (not authored — player choice from dialogue options): Standard question options: "Thank you, I'll need those." / "Tell me about your shift crew." / [Observe without responding]


Variant C: Evidence in Hand

Initial condition: The detective has reviewed additional case file data overnight and arrives with two specific manifest discrepancies already flagged — container 4471 and one other.

Starting location: The Terminal, arriving at the manifest terminal directly

Opening state: The detective enters with a purpose they didn't have on day one. Something from the overnight analysis sharpened the investigation.

Investigative focus line:

- id: transit_m_d_open_040
  character: detective
  trigger: enter_location
  location: the-terminal
  text: "Container 4471. Three separate appearances in the anomaly cluster. Same container ID, different cargo entries. That's not clerical error."
  mood: [analytical, focused]
  tags: [opening_hook, variant_c]

- id: transit_m_d_open_041
  character: detective
  trigger: observe_anomaly
  location: the-terminal
  text: "The manifest terminal. Maret's territory. She processes the corrections here. I want to see what corrections look like in the unfiltered log."
  mood: [analytical, investigative]
  tags: [opening_hook, variant_c]

Variant D: Institutional Escort

Initial condition: A Commission compliance officer accompanies the detective for the first 10 minutes — standard procedure for new postings. The escort is Torek Lintar.

Starting location: Terminal entrance, arriving with Torek

Opening state: The district sees the badge + escort together. Social walls go up faster than normal. Torek is helpful but slightly evasive about district social dynamics.

Escort read lines:

- id: transit_m_d_open_050
  character: detective
  trigger: observe_npc
  target: npc:torek-lintar
  text: "Lintar. Commission compliance, four years on Sova. He'll know the social texture better than any case file."
  mood: [professional, curious]
  tags: [opening_hook, variant_d]

- id: transit_m_d_open_051
  character: detective
  trigger: observe_npc
  target: npc:torek-lintar
  text: "He's being helpful but steering me away from something. Not sure what yet. File it."
  mood: [analytical, suspicious]
  tags: [opening_hook, variant_d]
  notes: "Fires after 3+ minutes with Torek. The detective is already reading Torek as slightly off."

Torek orientation dialogue cue:

Authored dialogue line for Torek (escort mode):

"The Terminal's well-run. Voss has been here eight years — knows his people. Maret handles scheduling, she's thorough. Drin does inspections, solid record. You'll find it's a tight operation." access: [authority], trust: surface, situation: [social, investigation] Notes: The complimentary framing is slightly too smooth. The detective's monologue (open_051) flags this.


3. Cross-Character Notes for Content Authors

What both characters encounter in the first 3-4 minutes

Element Smuggler Detective
Station ambient Active from frame 0 Active from frame 0
Entity color landscape Green (Kael), teal (other known NPCs) Grey/teal (mostly Unknown/Known)
First NPC interaction Kael (warm, first-name) Voss or Sera (institutional or pre-established)
First insert use Schedule board (operational) Case file (investigative)
First monologue chime Within 15 seconds Within 15 seconds
Emotional tone Comfort in familiarity Alertness in unfamiliarity

What the opening must NOT do

  • Use the name "Kael" before the player has LOS to Kael (smuggler)
  • Use the surname "Davan" when the smuggler addresses Kael (always first-name)
  • Use the first name "Sera" before the detective has established visual contact
  • Reference operational facts the smuggler knows ("the ring") in any way that reads as exposition
  • Reference investigation facts the detective knows (manifest discrepancies) in opening lines before arriving at the manifest terminal
  • Have any NPC behave unexpectedly in the first 90 seconds — baseline must be established before deviation

Ticket #260 — Opening hook content per character. v0.1 scope. Unblocked by #259.