Governance: - D-166 amendment (2026-06-12): outside-in build order (geo → econ-on-world → building templates → door boundary contracts → NPC/interiors → gameplay); Phase 5 ramps in parallel once outsides are walkable (gate: T-962) - D-114/D-115/D-117/D-118/D-120 marked superseded by D-166 (inbound anchors fixed) - D-221 amended: milestones retired, cascade-hierarchy gating is canonical - Q-077/Q-068/Q-036 resolved (answered by events); Q-110 (scale anchoring) and Q-111 (live-econ coupling) opened from cascade grounding Ticket tree (147 stray backlog tickets dispositioned): - New parents: T-1036 (post-cascade gameplay parking), T-1037 (maintenance initiative) - Re-homed: 15 → Phase 4 (T-750), 30 → Phase 5 (T-749), 11 → Phase 6 (T-751), 21 → gameplay parking, 28 → maintenance; children follow their epics - Cancelled 12 administrative shells (mirror tickets, emptied pre-cascade umbrellas, v0.2 pivot shell T-603); T-9/T-28 closed done; T-745 in_progress - New grounded tickets T-1038..T-1044: inter-settlement road/rail graph, L3→L4 dispatch threading, river-channel-anchor bug, 64m landform-repeat bug, region seam blending, road-entry octants, drainage re-run fix Docs: - CLAUDE.md cascade paragraph updated to the amended rule - 20 v0.1-era docs/design files marked superseded with pointers; content-structure-canonical retitled (v0.2 label dropped) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
35 KiB
title, description, type, status, ticket, decision_refs, author, created, updated, superseded_by
| title | description | type | status | ticket | decision_refs | author | created | updated | superseded_by | |||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Monologue Content Architecture | Authoring contract for internal monologue: interpretive frames, five categories, trigger mappings, volume targets, and prerequisite design | design | superseded | #253 |
|
Mellanie | 2026-02-20 | 2026-02-20 | D-032 supersession note |
SUPERSEDED (2026-06-12, cascade-refocus sweep): superseded by D-032 supersession note (per-character pools deferred) + D-166 Phase 6 (monologue as a system, D-016, survives). Kept as historical record; do not build against it.
Monologue Content Architecture
Ticket: #253 Authors: Mellanie (primary), Paula (narrative review), Gestalt (KG validation) Date: 2026-02-20 Status: Draft v1.0 Decisions: D-016, D-032, D-034, D-035, D-041
Purpose
This document is the authoring contract for all internal monologue content in The Settled Reach. It defines:
- The interpretive frame each character applies to the same world
- The five monologue categories and what each does
- Which triggers map to which categories (and why)
- Volume targets for v0.1 by trigger type and location
- The prerequisite map system and how it gates lines from KG state
Every monologue line authored for this game — past, present, and future — should be writable against this spec without ambiguity. If the spec doesn't cover a case, that's a gap to resolve here before writing lines.
Cross-references:
- Voice Patterns — sentence-level execution (contractions, punctuation, sentence length)
- Dual Lens Authoring Guide — high-level character perspective framework
- Knowledge Vocabulary v0.1 — all prerequisite formats and fact IDs
- D-016: the four functions of internal monologue
- D-032: hard partition between character pools
- D-035: tag taxonomy including monologue-specific additions
1. Identity-Driven Interpretation Frame
The same event produces different monologue because the characters are different people, not because the system routes differently. The engine fires a witness_interaction trigger for both characters when they see Voss and Maret arguing. What they think about it depends on who they are.
This section defines the interpretive lens for each character. Every line should be writable from this frame. If you can't explain why this character would think this, in these terms, the line is wrong.
1.1 The Smuggler
What she cares about:
- Kael's loyalty and safety (he's the person she trusts most in the ring)
- The ring's operational security — routes, timing, who knows what
- The moral dimension: this is access, not weapons; she needs to believe it matters
- Naia's wellbeing (Kael's partner, the emotional stake beneath everything)
What she fears:
- Exposure — for herself, for Kael, for anyone she pulled into this
- Kael pulling away, changing, hiding something she can't protect him from
- The Commission finding the routes before she can clear the slate
- Her own judgment being wrong — that she's put good people in danger
What she feels responsible for:
- Every member of the ring she enabled or included
- Kael, specifically — his involvement is partly her
- The shipments and what they're used for; she has opinions about every cargo type
The interpretive consequence: The smuggler reads every situation for operational risk and personal loyalty. A sealed bay isn't interesting infrastructure — it's a threat vector or a cover. Torek pacing isn't distressing behavior — it's someone who might talk. Kael eating alone isn't a social signal — it's a break in a pattern she memorized for exactly this kind of moment.
What the smuggler doesn't notice: systemic patterns, documentation trails, jurisdictional implications, institutional relationships. She notices people, not processes.
1.2 The Detective
What he cares about:
- Institutional duty — the case, the evidence, the commission mandate
- Procedural integrity — how evidence is gathered matters, not just what it says
- Sera's reliability as a social anchor (the one person in the district who speaks his language)
- Getting to the actual truth, not just a closable case
What he fears:
- Personal cost compromising the case — particularly the Sera question (D-034)
- Being wrong about a core assumption after committing to it
- Institutional failure: the Commission missing something they should have caught
- Losing objectivity; his analytical frame is protective, and he knows it
What he feels responsible for:
- The investigation — what he sees, what he files, what he flags
- Not contaminating the case with personal relationships
- Doing the duty correctly even when the correct action is uncomfortable
The interpretive consequence: The detective reads every situation for evidentiary value and behavioral deviation from established baseline. The same sealed bay is a documentation anomaly, not a personal threat. Kael eating alone is a deviation from observed routine. Voss pacing is an elevated behavioral indicator. He files, he notes, he compares to baseline.
What the detective doesn't notice: interpersonal warmth (at baseline), intuitive risk, the moral weight of what the ring is doing. He notices patterns, not people — until Sera makes him notice a person, which is its own problem.
1.3 The Dual-Lens Test
Before writing any line, ask: could this line belong to either character? If yes, it's not specific enough.
| Same event | Smuggler | Detective |
|---|---|---|
| Voss changes the rotation | "Voss changed the rotation again. Third time this month. Covering something." | "Davan's rotation has shifted three times in thirty days. Pattern or coincidence?" |
| Kael eats alone | "Kael's eating alone today. He always eats with me." | "Davan, K. — not with his usual group. Worth monitoring." |
| Loading arm grinds | "Loading arm three is grinding again. Someone should file that." | "Loading arm three has a grind in its cycle. Maintenance deferred — budget, or negligence?" |
| Bay 4 sealed | "Bay three's been sealed off. Inspection, or something else?" | "Containers stacked to regulation height in most bays. Bay four is the exception." |
The smuggler makes it personal. The detective files it analytically. They're both right. Neither has the full picture.
2. Monologue Categories
D-016 defines four functions for internal monologue. This spec extends those into five authoring categories, each with distinct content goals, trigger affinities, and voice requirements.
2.1 Perception
D-016 function: Translating non-visual senses — things the camera can't show.
What it does: Converts audio/haptic/olfactory events into the character's voice. The player hears footsteps at the fog edge; the monologue tells them what that means to this character.
Primary trigger: hear_sound
Secondary trigger: enter_location (smell, air quality, ambient temperature on arrival)
Key rule: Perception lines interpret what the character senses, not what they conclude. Conclusion is Investigation. "Footsteps behind me. Two people, unhurried." is Perception. "That's not the usual patrol pattern." is Investigation.
Smuggler examples:
- "Footsteps behind me. Light. Someone I know."
- "Cargo lubricant and recycled air. Home sweet home."
- "The conveyor hums at a different pitch when it's loaded heavy. This one's heavy."
Detective examples:
- "Loading arm three has a grind in its cycle. Maintenance deferred."
- "Something in the air beyond the lubricant. Chemical, faint. Not standard freight residue."
- "Footsteps in the service corridor. Measured pace — not trying to be quiet."
2.2 Atmosphere
D-016 function: Character's running commentary on environment, mood, situation.
What it does: Establishes location identity, time of day, and the character's emotional register at that moment. These are the "color" lines — they don't advance investigation but they make the world feel inhabited.
Primary triggers: enter_location, time_idle, return_visit
Secondary triggers: witness_interaction (when the atmosphere is the point, not the content)
Key rule: Atmosphere lines are mostly unconditional — they fire regardless of what the player knows. They establish the baseline feel of a location. A location without atmosphere lines feels hollow.
Smuggler examples:
- "Morning shift. Recycled air and cargo lubricant. Home sweet home."
- "The freight bay looks better in the dark."
- "Quiet morning. Containers moving, nobody talking. I like it this way."
Detective examples:
- "Logistics hub. Standard prefab, heavy foot traffic. Let's see what the shift change tells me."
- "Only place in the district that doesn't smell like freight lubricant." [The Last Shift]
- "Back at the hub. Different shift, different faces. Same manifest board."
2.3 Tutorial
D-016 function: Diegetic hints — character thinks about what they might do. No UI popups.
What it does: Teaches mechanics and interactables through the character's voice. The character thinks "That terminal might have access logs" and the player learns that terminals are interactable. Everything the tutorial needs to convey, the character can plausibly think.
Primary triggers: discover_evidence, enter_location (first visit to a new space)
Secondary triggers: observe_anomaly (anomaly prompts consideration of action)
Key rule: Tutorial lines are almost always unconditional. They fire on first encounter, not on investigation depth. A player who already knows what a terminal does doesn't need the tutorial line again — the engine manages repetition via the cooldown system, but the content itself shouldn't gate on knowledge.
Smuggler examples:
- "Manifest board updates live. Container movement, weight, destination. Easy to check if you know what you're looking for."
- "The terminal's accessible from here. Useful."
- "That container's been in temp storage since yesterday. Someone put it there on purpose."
Detective examples:
- "Commission terminal access. That'll have import logs, weight discrepancies, anything flagged in the last thirty days."
- "The manifest board updates in real-time. Container movement, weight, destination. All logged."
- "Locked bay. Inspection record will show who authorized it."
Cross-character rule: Tutorial lines don't reference character-specific knowledge or relationships. They explain the world, not the case. If you find yourself writing a tutorial line that only one character would think, it's probably Investigation wearing a tutorial hat.
2.4 Observation
D-016 function: Character-specific commentary on NPCs — who they see, what they notice.
What it does: Produces NPC-specific monologue that reflects the character's relationship to that NPC and their current emotional register. This is where character voice does the most work — the same NPC looks completely different from each character's perspective.
Primary triggers: observe_npc, witness_interaction
Secondary triggers: post_conversation (observations from conversation, not Investigation conclusions)
Key rule: Observation lines read what the character sees. The emotional color comes from the relationship. A friendly NPC gets warm observation. A person_of_interest gets wary observation. A hostile NPC gets guarded observation.
Smuggler examples (Kael, progressive):
- Friendly baseline: "Kael's already at the dock. Good. The day's better when he's on shift."
- Early concern: "Kael's distracted today. Probably nothing."
- Person of interest: "Kael nodded at me across the bay. Same as always. Exactly the same as always."
Detective examples (Sera, progressive):
- Friendly baseline: "Venn, S. — already at the bar. At least someone speaks my language here."
- Early concern: "Sera's avoiding the corner near the window. She's usually over there."
- Person of interest: "Sera ordered the usual. Didn't look at me when I came in. That's new."
Named NPC coverage requirement: Every named NPC in a location needs at least 3 Observation lines per character who could plausibly observe them there, across the relationship arc (baseline, early concern, person_of_interest). FRIEND NPCs need 8-10.
2.5 Investigation
What it does: The character builds a mental case — connecting dots, forming hypotheses, processing what they've just learned. This is where the internal monologue becomes an unreliable narrator (D-016): the character reaches a conclusion that may be wrong.
Primary triggers: post_conversation, discover_evidence, observe_anomaly
Secondary triggers: time_idle (ruminative investigation — sitting with unresolved questions), witness_interaction (when the content of the interaction matters, not just the fact of it)
Key rule: Investigation lines are almost always prerequisite-gated. The character can't investigate what they don't know. A smuggler without knowledge of Kael's corridor meeting can't ruminate about it. The prerequisite map (Section 5) is how we gate these.
Smuggler examples (knowledge-gated):
suspects(investigation.kael_corridor_meeting): "Kael was in corridor B-7 last night. Off-shift. Off-route. That's not nothing."suspects(investigation.kael_unknown_contact): "Who was Kael talking to? Not anyone from our rotation. I'd know the face."direct(behavioral.kael_evasion): "He looked left before answering. He always looks left when he's lying."
Detective examples (knowledge-gated):
knows_of(investigation.kael_corridor_meeting): "Davan, K. — Corridor B-7, off-shift. Unregistered contact. Not a coincidence."suspects(behavioral.sera_avoidance): "She moved away from Lintar, T. immediately. Pre-existing avoidance pattern, or recent?"knows_details(investigation.manifest_discrepancy): "Container 4471. Wrong weight class, wrong routing, wrong time of day. Three deviations. That's data."
The unreliable narrator rule: Investigation lines can be wrong. The smuggler might conclude Voss is covering for himself when Voss is covering for someone else. The detective might file an observation as coincidence that isn't. The engine doesn't correct them. The monologue is character interpretation, not game truth.
3. Trigger → Category Mapping
One trigger can source multiple categories. The category is determined by what the line does, not which trigger fires it.
| Trigger | Primary Category | Secondary Category | Notes |
|---|---|---|---|
enter_location |
Atmosphere | Tutorial | First visit: tutorial. Return: atmosphere only. |
observe_npc |
Observation | Investigation | Post-discovery, Observation lines gain Investigation coloring. |
hear_sound |
Perception | Observation | If the sound is an identifiable NPC (recognized voice, steps), it's also Observation. |
observe_anomaly |
Observation | Investigation | Anomaly = deviation from known baseline → triggers Investigation query. Requires some prior knowledge. |
post_conversation |
Investigation | Observation | Processes what just happened. Reflection before action. |
discover_evidence |
Tutorial | Investigation | Tutorial for new interactable types. Investigation for case-relevant content. |
witness_interaction |
Observation | Investigation | Named pair interacting = Observation. Named pair + player knows one has a secret = Investigation. |
time_idle |
Atmosphere | Investigation | Short idle: ambient atmosphere. Long idle: ruminative Investigation if knowledge gates open. |
return_visit |
Atmosphere | Observation | "Something's different" — comparison to last visit. Observation of change. |
Not 1:1: A single observe_anomaly trigger can fire either an Observation line ("Torek's spending too much at Lera's. Someone's going to notice.") or an Investigation line ("Torek's spending too much at Lera's. Someone's going to notice." with a prerequisite linking it to ring finance). The difference is whether the line requires knowledge state to fire.
4. Volume Targets for v0.1
All volumes are per-character (D-032 hard partition). These are minimum targets for v0.1, not caps.
4.1 Per Trigger Per Location
| Trigger | Min lines per location per character | Notes |
|---|---|---|
enter_location |
5 | 3 unconditional, 2 knowledge-gated. Mix atmosphere/tutorial. |
time_idle |
4 | 2 unconditional (ambient), 2 knowledge-gated (investigation). |
observe_npc |
3 per named NPC present | Named NPCs only. Generic NPCs get 1 line ("New face at dock seven."). FRIEND NPCs: 8-10. |
hear_sound |
3 | 2 environmental, 1 NPC-identifying (conditionally). |
observe_anomaly |
4 | 2 unconditional (structural anomalies), 2 knowledge-gated (behavioral). |
witness_interaction |
3 per named pair | Named pairs (Voss+Maret, Kael+unknown). Generic: 1. |
post_conversation |
3 per named NPC | After each major NPC, across arc phases. |
discover_evidence |
2 per evidence type | Tutorial + 1 investigation variant. |
return_visit |
3 | 1 baseline, 2 knowledge-gated comparisons. |
4.2 Sprint 14 Minimum Deliverable (#120)
For Sprint 14, the minimum deliverable covers enter_location and time_idle across eight locations, two characters:
| Location | Characters | enter_location |
time_idle |
Total lines |
|---|---|---|---|---|
| The Terminal (hub) | Smuggler + Detective | 5+5 | 4+4 | 18 |
| The Last Shift (bar) | Smuggler + Detective | 5+5 | 4+4 | 18 |
| Maintenance Corridor A | Smuggler + Detective | 5+5 | 4+4 | 18 |
| Maintenance Corridor B | Smuggler + Detective | 5+5 | 4+4 | 18 |
| Smuggling Hold | Smuggler only | 5 | 4 | 9 |
| Commission Kiosk | Detective only | 5 | 4 | 9 |
| Transit Passage | Smuggler + Detective | 3+3 | 2+2 | 10 |
| Span Gate Approach | Smuggler + Detective | 3+3 | 2+2 | 10 |
Sprint 14 minimum total: ~110 lines. Full v0.1 (all triggers, all named NPCs) projects to ~320-380 lines across both characters.
4.3 FRIEND NPC Volume
FRIEND NPCs (Kael Davan for smuggler, Sera Venn for detective) require expanded coverage because they carry D-034's arc across multiple phases. These do not use generation expansion (D-034: "no generation expansion" applies here).
| Trigger | Kael (smuggler) | Sera (detective) | Notes |
|---|---|---|---|
observe_npc |
10 | 10 | Across 3 relationship phases: friendly / early concern / poi |
post_conversation |
8 | 8 | After major arc beats: warmth / evasion / confrontation |
observe_anomaly |
6 | 6 | Behavioral tells, pattern deviations |
witness_interaction |
4 | 4 | Named pair with FRIEND |
time_idle |
4 | 4 | Ruminative Investigation about FRIEND |
FRIEND total per character: ~32 lines. All gated except 3-4 baseline warmth lines.
5. Prerequisite Map Design
Monologue prerequisites gate lines on knowledge state. The prerequisite field (D-035) accepts three gate types: relationship, entity_attributes, and facts. These reflect what's queryable from the KG (D-041).
All prerequisite formats are defined in full in Knowledge Vocabulary v0.1. This section covers the design logic — which gate type to use when, and example mappings for common cases.
5.1 Gate Types
Relationship gates — use when the line's emotional register depends on the character's relationship to a specific NPC.
prerequisites:
relationship:
target: npc:kael-davan
state: friendly # unknown | known | friendly | person_of_interest | hostile
Use for: warmth lines (require friendly), suspicion lines (require person_of_interest), observation lines that assume prior contact.
Entity attribute gates — use when the line responds to a specific behavioral flag on an NPC.
prerequisites:
entity_attributes:
- entity: npc:kael-davan
key: behavior_flags
value: avoidance
Use for: tell-observation lines (requires tell_observed: true), avoidance pattern lines, behavioral contradiction lines.
Fact gates — use when the line requires knowledge of a world event or fact, not just a relationship.
prerequisites:
facts:
- fact_id: investigation.kael_corridor_meeting
min_confidence: suspects
Use for: investigation lines that connect dots, operational lines that require ring knowledge, awareness lines about other characters.
Compound gates — AND logic. All conditions must be true. Use sparingly — most lines need one gate type. Compounds are for late-arc lines where relationship depth AND specific knowledge must both be present.
prerequisites:
relationship:
target: npc:kael-davan
state: person_of_interest
facts:
- fact_id: investigation.kael_unknown_contact
min_confidence: suspects
5.2 Common Prerequisite Patterns
These are recurring patterns across the monologue pools. Write these before the edge cases.
Baseline (no prerequisite):
- Arrival atmosphere lines
- Generic environmental perception lines
- Tutorial lines for interactables
- Generic NPC presence lines for unnamed NPCs
Ring awareness (smuggler-specific):
facts:
- fact_id: knowledge.ring_routing_knowledge
min_confidence: knows_details
Gates: lines about specific routes, container timings, next drops.
Detective presence (smuggler):
facts:
- fact_id: awareness.detective_presence
min_confidence: knows_of
Gates: lines about the detective, caution lines when detective is visible.
Kael's corridor meeting (both characters, different emotional color):
facts:
- fact_id: investigation.kael_corridor_meeting
min_confidence: suspects
Smuggler: worry, confusion, loyalty strain. Detective: evidentiary interest, pattern notation.
Kael's unknown contact:
facts:
- fact_id: investigation.kael_unknown_contact
min_confidence: suspects
Smuggler: "Not anyone from our rotation." Detective: "Unregistered contact. Worth investigating."
Kael behavioral tell (post-conversation):
facts:
- fact_id: behavioral.kael_evasion
min_confidence: direct
Gates: the tell-recognition line ("He looked left before answering"). Requires Direct confidence — player witnessed this themselves.
Sera avoidance pattern (detective-specific):
entity_attributes:
- entity: npc:sera-venn
key: behavior_flags
value: avoidance
Gates: detective's observation that Sera is avoiding someone or something.
Manifest discrepancy (detective):
facts:
- fact_id: investigation.manifest_discrepancy
min_confidence: knows_of
Gates: investigative lines connecting container weight anomalies to the ring.
FRIEND trust-contamination (both characters, highest priority):
relationship:
target: npc:kael-davan # or npc:sera-venn
state: person_of_interest
facts:
- fact_id: investigation.kael_corridor_meeting # or behavioral.sera_avoidance
min_confidence: suspects
Gates: the knife-twist lines that mark the moment trust begins to curdle. These are the emotional core of the FRIEND arc.
5.3 Priority Field
Lines with prerequisites should carry a priority field (1-10, default 5). Higher priority wins when multiple eligible lines compete for the same trigger slot.
Priority guidelines:
- Unconditional atmosphere: 3-5
- Generic NPC observation: 4
- Named NPC observation (no prerequisite): 5-6
- Knowledge-gated investigation: 6-8
- FRIEND arc lines (knowledge-gated): 7-9
- FRIEND trust-contamination (highest stakes): 9-10
The priority system ensures that when the player has uncovered something significant, the monologue fires the most relevant line rather than a generic arrival comment.
5.4 KG Expressibility
Gestalt validates that all prerequisite conditions in authored content are queryable from the KG. The design constraint: if the prerequisite references a fact_id or entity attribute, that fact_id must exist in a content/global/knowledge/*.yaml file.
New prerequisite patterns that reference fact_ids not currently in the vocabulary must be added to the knowledge vocabulary document before the lines using them can be marked complete.
Fact categories available for prerequisites:
investigation.*— case facts (corridor meeting, unknown contact, manifest discrepancy)knowledge.*— ring operational facts (routing, cargo types)awareness.*— situational awareness (detective presence, Commission activity)behavioral.*— observed behavioral patterns (kael_evasion, sera_avoidance)social.*— relationship network factscontraband.*— ring membership, cargo specificslocation.*— spatial facts (who was where, when)progress.*— narrative progress gates (first conversation with FRIEND, confrontation attempted)
6. Authoring Notes
6.1 Category-to-Tag Mapping
Monologue lines use freeform tags (D-035 selection tag) for filtering and tooling. The category system above maps to tag conventions:
| Category | Recommended tags |
|---|---|
| Perception | environmental, perception, sensory |
| Atmosphere | arrival, atmospheric, ambient, operational |
| Tutorial | tutorial, orientation, interactable |
| Observation | npc, [npc-name], tell, behavior |
| Investigation | investigation, contraband, caution, friend-arc, contradiction |
FRIEND arc lines always include friend-arc tag. This enables filtering for arc-coherence review.
6.2 Display Constraints
All monologue lines display in the z-layer 7 overlay (D-049). Hard constraints from voice patterns spec:
- Max characters: ~160
- Max visual lines: 2
- Target word count: 10-25 words (smuggler avg 10, detective avg 13)
- Display time: 4-6 seconds, length-adjusted
- Must be self-contained: Each line reads independently; no setup line required
6.3 Review Responsibilities
| Review gate | Who | What they check |
|---|---|---|
| Voice consistency | Mellanie | Every line matches voice-patterns.md. Contraction test, name test, length targets. |
| Narrative coherence | Paula | FRIEND arc lines and friend-arc tagged content honor D-034 arc structure. Kael/Sera arcs are internally consistent. |
| KG expressibility | Gestalt | All prerequisite fact_ids exist in knowledge vocabulary. Compound gates are achievable from KG state. Priority values are reasonable. |
Mellanie is final authority on voice. Paula is final authority on arc coherence. Gestalt is final authority on KG expressibility. No line that fails any review is shippable.
7. Open Questions for Sprint 14
-
progress.*fact IDs — theprogressknowledge category covers narrative milestones (first Kael conversation, confrontation attempted). These are needed for some late-arc gating but the fact_ids aren't fully defined yet. Action: Gestalt to confirmprogress.*fact_id format before #120 writes late-arc Investigation lines. -
Span Gate Approach atmosphere — the span gate approach location is in the Sprint 14 minimum list but no NPC profiles exist there. Atmosphere and Perception lines only; no Observation lines. Paula's answer (2026-02-20): No named NPC routines bring characters to the span gate approach in normal play. This is a transitional space — liminal, between home and away. Monologue here should reflect that liminality: the smuggler thinks about what she's leaving behind or returning to; the detective thinks about what the arrival is telling him. The span gate approach is where internal monologue speaks to the gap between worlds, not to specific NPCs. Author 3 unconditional Atmosphere lines per character (arrival version + departure version + idle version), no Observation lines needed.
-
time_idlecooldown handling — the engine prevents the same line firing twice within a session. The spec assumes this is handled engine-side. If the cooldown is content-layer (authoredcooldown_ticksfield), the schema needs updating before #120. Action: Gestalt to confirm. -
Witness_interaction pair detection — the trigger fires when two NPCs interact near the player. Does the trigger pass which two NPCs are interacting, so the line pool can filter for
[npc-a, npc-b]tagged lines? If not, witness_interaction lines can't target specific pairs. Action: Dudley/Gestalt to confirm trigger payload before #120 writes witness_interaction lines.
9. Gestalt — KG Expressibility Validation (2026-02-20)
Overall assessment: The prerequisite map is expressible from KG state. All referenced fact_id categories exist in the knowledge vocabulary. One naming error, one duplicate in the vocabulary, and two open questions requiring server-side confirmation before #120 can write gated lines.
Validated fact_id references
All prerequisite patterns from Section 5.2 verified against content/global/knowledge/*.yaml:
| Fact ID in doc | Status | Notes |
|---|---|---|
investigation.kael_corridor_meeting |
✅ EXISTS | Shared ID, both characters |
investigation.kael_unknown_contact |
✅ EXISTS | Shared ID |
behavioral.kael_evasion |
✅ EXISTS | Smuggler only, direct confidence |
behavioral.kael_behavioral_change |
✅ EXISTS | Smuggler only (Paula's Phase 2 gate) |
behavioral.sera_avoidance |
⚠️ NAMING ERROR | Actual ID is behavioral.sera_avoidance_pattern — doc must use the full name or lines won't load |
behavioral.sera_topic_deflection |
✅ EXISTS | Both characters |
knowledge.ring_routing_knowledge |
✅ EXISTS | Smuggler only, Background-level (knows_details) |
awareness.detective_presence |
✅ EXISTS | Smuggler only |
investigation.manifest_discrepancy |
✅ EXISTS | Shared; detective starts at suspects (Background) |
Action required (Mellanie): Every authored line using behavioral.sera_avoidance as a prerequisite must be corrected to behavioral.sera_avoidance_pattern before content validation will pass.
KG vocabulary issue: duplicate fact_id
investigation.drin_inspection_pattern appears twice in content/global/knowledge/investigation.yaml with slightly different descriptions. This is a vocabulary error that will cause undefined behavior when the fact is queried. Action: Qatux to deduplicate and merge descriptions in the knowledge vocabulary.
Open question resolutions
OQ from Section 7, item 3 — time_idle cooldown handling: CONFIRMED as content-layer. The monologue schema already has cooldown as an integer field per line (minimum ticks before refiring). Authors set this in YAML. No schema update needed. Atmosphere lines: cooldown: 300 (roughly 5 minutes at 60 ticks/second). Investigation lines: cooldown: 600. FRIEND arc lines that should fire once and not again: cooldown: 99999.
OQ from Section 7, item 4 — witness_interaction trigger payload: NOT YET CONFIRMED. The trigger needs to pass which two NPCs are interacting so pool queries can filter for named-pair lines. If the trigger doesn't provide this, witness_interaction lines can't target Kael+unknown or Voss+Maret specifically — they'd have to fire generically. Action: Dudley to confirm trigger payload before #120 writes witness_interaction lines. Do not author named-pair witness_interaction lines until this is confirmed.
Priority field review
Priority guidelines from Section 5.3 are mechanically sound. The selection pipeline uses priority as a tiebreaker when multiple eligible lines compete for one trigger slot. Values are reasonable. One note: "FRIEND trust-contamination" lines tagged 9-10 will always win when eligible — authors must make sure these only fire when the KG state is correct, or they'll dominate every trigger slot during that arc phase. Keep the prerequisite gates tight (compound gates with both relationship + fact conditions are the right call for 9-10 priority lines).
Prerequisite map validation: APPROVED with the behavioral.sera_avoidance_pattern naming fix required before ship.
8. Paula — Narrative Review (2026-02-20)
Overall assessment: The architecture is sound and coherent with THE FRIEND arc. All critical design constraints (D-032 hard partition, D-034 no generation expansion, D-016 four functions) are correctly applied. No blocking issues.
Specific notes:
1. FRIEND arc prerequisite patterns (Section 5.2) — approved with one clarification:
The FRIEND trust-contamination pattern correctly identifies the emotional core lines. One addition: the intermediate phase (Phase 2 — early concern, before contradiction is confirmed) needs its own prerequisite pattern. These are the lines that sit between baseline warmth and the knife-twist — the "probably nothing" lines that retroactively become ominous. Suggested gate:
# Phase 2 "early concern" gate — not yet contradiction, but off-baseline
facts:
- fact_id: behavioral.kael_behavioral_change # or behavioral.sera_topic_deflection
min_confidence: suspects
# Do NOT add relationship: person_of_interest — that would gate them too late.
# These lines must fire while the relationship is still Friendly.
These lines are the most valuable in the FRIEND arc — they only land correctly on second playthrough, when the player knows what they missed. Mellanie: please author at least 3 per FRIEND NPC in this intermediate gate range.
2. Identity-driven interpretation frame (Section 1.1/1.2) — approved: The "what she fears" and "what she feels responsible for" axes correctly anchor the FRIEND arc. Kael's betrayal lands as devastating for the smuggler because she feels responsible for his ring involvement. Sera's concealment lands as devastating for the detective because it costs him the one thing that wasn't institutional. The section captures this well.
3. Observation line examples (Section 2.4) — minor authoring gap:
The examples for Phase 3 person_of_interest observation ("Kael nodded at me across the bay. Same as always. Exactly the same as always.") don't show the prerequisite that makes them fire at the right time. In the YAML, these need:
prerequisite:
relationship:
target: npc:kael-davan
state: person_of_interest
Without this gate, they'll fire too early and spoil the contradiction. Not a doc issue — it's an authoring reminder for #120.
4. THE FRIEND arc coherence across the two characters:
One verification needed before #120 ships: the FRIEND arc observation lines for the other character (smuggler's monologue about Sera, detective's monologue about Kael) need to be internally consistent with what each character would plausibly know. The smuggler sees Sera as Commission presence — her observation lines about Sera should be cautious, not warm. The detective sees Kael as "Davan, K." until late in the arc — his observation lines about Kael should maintain surname-first register throughout, even at person_of_interest. The emotional weight is different, not the naming convention.
5. Open question #2 answered — see above in Section 7.
Status: Narrative review complete. Document approved for #120 authoring to proceed.