Files
settled-reach/docs/design/monologue-content-architecture.md
T
jpmschweitzerandClaude Fable 5 ca255dc16c chore(meta): cascade refocus — supersede v0.2 cluster, re-home backlog tree, capture workshop WIP
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>
2026-06-12 12:26:32 +02:00

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
D-016
D-032
D-034
D-035
D-041
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 facts
  • contraband.* — ring membership, cargo specifics
  • location.* — 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

  1. progress.* fact IDs — the progress knowledge 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 confirm progress.* fact_id format before #120 writes late-arc Investigation lines.

  2. 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.

  3. time_idle cooldown 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 (authored cooldown_ticks field), the schema needs updating before #120. Action: Gestalt to confirm.

  4. 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.