chore(docs): remove content-converter and content-ron Makefile target
The YAML→RON converter and its make target are v0.1 artifacts superseded by the v0.2 RON-first generator pipeline. content-ron/ was already gitignored; this removes the tool that generated it. Closes #667. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,150 +0,0 @@
|
||||
# Base Text Authoring Guide — The Settled Reach
|
||||
**Ticket:** #645
|
||||
**Author:** Mellanie
|
||||
**Status:** canonical
|
||||
**Last updated:** 2026-03-13
|
||||
|
||||
---
|
||||
|
||||
## Purpose
|
||||
|
||||
Base text is the culture-neutral semantic layer that every NPC line must have. It serves two purposes simultaneously:
|
||||
|
||||
1. **LLM seed** — the culture injector uses it as input. The better the base text, the better the voiced output.
|
||||
2. **Fallback** — when "AI-Enhanced Dialogue" is off or pre-voicing hasn't caught up, the player sees the base text directly. It must be functional and readable on its own.
|
||||
|
||||
This guide establishes the quality bar for all base text and documents failure modes to avoid.
|
||||
|
||||
---
|
||||
|
||||
## The quality bar (three tests)
|
||||
|
||||
Before committing a base text line, ask three questions:
|
||||
|
||||
1. **Does this show a moment, not a category?**
|
||||
A category tells you *what kind of thing* the NPC does. A moment shows you *a specific instance* of doing it.
|
||||
- Category: `"tends crops in the field"` — you know the role, not the person
|
||||
- Moment: `"works back along a crop row with a hoe, stopping twice to pull weeds by the root before moving on"` — you see a specific action sequence
|
||||
|
||||
2. **Could you picture a specific person doing this?**
|
||||
If the line could appear in a stock photo caption, it needs specificity. Add the HOW or the small physical detail that anchors it.
|
||||
|
||||
3. **Would you be okay if this were the only text the player ever sees?**
|
||||
The voice pipeline may not be available. The base text is not a draft — it is the default experience for players below spec or with AI-Enhanced Dialogue disabled. Author it to that bar.
|
||||
|
||||
---
|
||||
|
||||
## Failure modes and fixes
|
||||
|
||||
### 1. Category verb (`"tends"`, `"checks"`, `"monitors"`, `"manages"`)
|
||||
|
||||
These describe a role, not an action. Replace with a physical verb sequence.
|
||||
|
||||
| Below bar | At bar |
|
||||
|---|---|
|
||||
| `"tends rows of low-growing crops"` | `"works back along a crop row, stopping to pull weeds by the root"` |
|
||||
| `"checks seedling trays"` | `"crouches over seedling trays and pinches back a leggy stem that grew sideways"` |
|
||||
| `"monitors the loading floor"` | `"stands at the mezzanine rail watching a forklift angle into a tight bay"` |
|
||||
|
||||
Fix: replace the category verb with the specific physical action that *constitutes* the checking or tending.
|
||||
|
||||
### 2. Quality modifier instead of specific action
|
||||
|
||||
Phrases like `"with practiced ease"`, `"with no wasted motion"`, `"efficiently"` are editorial commentary. The reader is told a quality instead of shown it.
|
||||
|
||||
| Below bar | At bar |
|
||||
|---|---|
|
||||
| `"lifts a crate of produce onto a flatbed with practiced ease"` | `"lifts a crate of produce onto the flatbed in one motion and reaches for the next before it settles"` |
|
||||
| `"swaps a panel module with practiced speed and no wasted motion"` | `"swaps a panel module in under a minute, tools back in the pouch before the cover is latched"` |
|
||||
|
||||
Fix: remove the modifier. Show the efficiency through the action sequence itself — specificity creates the impression.
|
||||
|
||||
### 3. Universal gesture (no character information)
|
||||
|
||||
Some gestures apply to anyone anywhere — wiping sweat, yawning, stretching. These are placeholder movements. Replace with something that shows role, circumstance, or cultural habit.
|
||||
|
||||
| Below bar | At bar |
|
||||
|---|---|
|
||||
| `"wipes sweat from her forehead with the back of a gloved hand"` | `"pulls a glove off with her teeth to wipe her face, pulls it back on without looking"` |
|
||||
| `"stretches"` | `"straightens up and rolls her neck once before kneeling back down"` |
|
||||
|
||||
Fix: find the physical quirk that's specific to this role, this body, this situation.
|
||||
|
||||
### 4. "Corporate-speak" / institutional passive
|
||||
|
||||
Lines that sound like they belong in a procedure manual. The NPC is a person, not a process.
|
||||
|
||||
| Below bar | At bar |
|
||||
|---|---|
|
||||
| `"initiates task completion protocol"` | `"gets back to sorting the manifests"` |
|
||||
| `"performs routine inspection of the facility perimeter"` | `"walks the fence line at a measured, unhurried pace"` |
|
||||
|
||||
Fix: use plain present tense and a physical verb. If you can hear a robot saying it, rewrite it.
|
||||
|
||||
---
|
||||
|
||||
## Lines you must NOT change
|
||||
|
||||
**`Factual`-type lines** are protected. These are lines bearing:
|
||||
- Specific numbers or quantities: `"fourteen crates in bay seven"`
|
||||
- Causal chains: `"the pressure dropped when the coupling failed"`
|
||||
- Denial statements: `"I don't know anything about that"`
|
||||
|
||||
Factual lines bypass the LLM entirely (D-138: `ContentType::Factual`). The pipeline serves them as exact base text. Do not elevate them — precision is their quality.
|
||||
|
||||
If you're unsure whether a line is Factual: if it contains a number, a named quantity, a specific event chain, or a denial with named content, treat it as protected.
|
||||
|
||||
---
|
||||
|
||||
## Cultural neutrality requirement
|
||||
|
||||
Base text must not contain culture-specific vocabulary. The culture injectors add that layer at voicing time. Base text is the semantic skeleton.
|
||||
|
||||
**What to avoid:**
|
||||
- Krenn oath vocabulary: `"void take it"`, `"blood and void"` — these go in voice_examples, not base text
|
||||
- Culture-specific greetings or farewells
|
||||
- Slang that implies a particular register
|
||||
|
||||
**Test:** Could this base text be voiced convincingly in *any* culture? If the answer is yes, it's culturally neutral. If not, strip the culture-specific markers.
|
||||
|
||||
---
|
||||
|
||||
## Volume guidance
|
||||
|
||||
Each role should have 15–25 on-shift behaviors plus 5–10 off-shift / social site behaviors. This gives the generator enough variety across a session without repetition. Roles with narrower activity ranges (security, militia) can have fewer.
|
||||
|
||||
---
|
||||
|
||||
## Elevation checklist (per line)
|
||||
|
||||
Before committing, run through:
|
||||
|
||||
- [ ] Physical verb sequence, not category verb
|
||||
- [ ] No quality modifiers — show efficiency through action, not through adjective
|
||||
- [ ] Character information visible (not a universal gesture)
|
||||
- [ ] No institutional/passive language
|
||||
- [ ] Culturally neutral (no culture-specific vocabulary)
|
||||
- [ ] Not a Factual-type line (no numbers, denials, or causal chains to preserve)
|
||||
- [ ] Reads as a complete, legible observation on its own
|
||||
|
||||
---
|
||||
|
||||
## Examples from the Krenn zones (reference)
|
||||
|
||||
These lines passed elevation review (Sprint 26):
|
||||
|
||||
**Strong — moment-specific, role-grounded:**
|
||||
- `"kneels at the base of a struggling plant and parts the soil with two fingers"`
|
||||
- `"threads a wire through a conduit clip and bites the insulation back with her teeth"`
|
||||
- `"keeps a junior worker between herself and the inspection team as the inspectors pass through"`
|
||||
- `"trades a quick look with a colleague when the foreman walks by"`
|
||||
- `"leans back on a stool and tracks a browser who has checked the same display twice without committing"`
|
||||
|
||||
**Strong — off-shift texture:**
|
||||
- `"sits with boots off under the table, socked feet flat on the floor"`
|
||||
- `"refills a neighbor's cup from her own jug without being asked"`
|
||||
- `"buys a round for the table and returns to her seat before anyone can thank her"`
|
||||
|
||||
---
|
||||
|
||||
*Last review: Sprint 26, base text elevation pass (#645). Apply this standard to all new zone RON files.*
|
||||
@@ -1,296 +0,0 @@
|
||||
# Cultural Generation Guide — The Settled Reach
|
||||
**Ticket:** #189
|
||||
**Author:** Miri
|
||||
**Status:** canonical
|
||||
**Last updated:** 2026-02-19
|
||||
|
||||
---
|
||||
|
||||
## Purpose
|
||||
|
||||
This guide provides the framework for generating culturally consistent content in The Settled Reach. Every named district, NPC, and piece of authored dialogue reflects a specific cultural context. This guide codifies how to derive that context from first principles so that any content author — writing a dockworker or a station administrator, a bar greeting or a confrontation line — can produce work that feels like it belongs.
|
||||
|
||||
The Sova Transit District in the Krenn System is the first concrete instance of this framework. All examples in this guide are drawn from Sova. Subsequent settings use the same framework applied to different parameters.
|
||||
|
||||
---
|
||||
|
||||
## Part 1: The Framework — Five Dimensions of Cultural Context
|
||||
|
||||
Every location in The Settled Reach has cultural context along five dimensions. These are not rigid categories — they blend and interact. But knowing them for a setting before writing a single line of dialogue prevents inconsistency.
|
||||
|
||||
### Dimension 1: Reach Position
|
||||
|
||||
**Range:** Core → Mid-Reach → Frontier → Deep Frontier
|
||||
|
||||
This determines the age of institutions, the density of infrastructure, and the relationship between residents and authority.
|
||||
|
||||
| Position | Infrastructure | Institutional Presence | Resident Attitude to Authority | Setting Feel |
|
||||
|---|---|---|---|---|
|
||||
| **Core** | Mature, well-maintained | Heavy. Commission offices, Concord representatives, Syndic headquarters | Deferential-to-compliant. Authority is a daily reality. | Corporate. Managed. Politics visible. |
|
||||
| **Mid-Reach** | Functional, mixed-era | Moderate. Commission terminals, periodic visits, field investigators | Pragmatic-to-skeptical. Authority exists but isn't everywhere. | Working. Lived-in. Rules enforced selectively. |
|
||||
| **Frontier** | Sparse, improvised | Light. Syndic representatives, occasional Commission audit | Independent-to-resistant. Authority is a distant abstraction. | Improvised. Tight-knit. Self-reliant. |
|
||||
| **Deep Frontier** | Minimal | Nominal or none | Sovereign. Authority is whatever the community enforces. | Harsh. Communal. Rules of necessity. |
|
||||
|
||||
**Sova Transit District:** Mid-Reach. Commission presence is intermittent — enough to maintain order, not enough to catch everything. The district's residents are pragmatic about authority: they comply when observed, continue as normal when not.
|
||||
|
||||
---
|
||||
|
||||
### Dimension 2: Economic Base
|
||||
|
||||
**Range:** Freight → Resource Extraction → Manufacturing → Service → Research → Mixed
|
||||
|
||||
Economic base determines daily rhythms, vocabulary, and the social pressures that create narrative stakes.
|
||||
|
||||
| Economic Base | Daily Rhythm | NPC Concerns | Social Pressure | Narrative Hook |
|
||||
|---|---|---|---|---|
|
||||
| **Freight** | Span gate schedules. Shift rotations. Cargo waves. | Manifests, container counts, shift assignments, dock schedules. | Wages stable but tight. Extra income tempting. | Manifest discrepancy. Smuggling access. |
|
||||
| **Resource Extraction** | Mining shifts. Equipment maintenance cycles. | Equipment reliability, extraction quotas, safety protocols. | Dangerous work, irregular income, company-town dynamics. | Workplace accident cover-up. Union pressure. |
|
||||
| **Manufacturing** | Production cycles. Quality control. | Production quotas, supply chains, quality flags. | Line work monotony, automation anxiety, middle-management tension. | Sabotage. Corporate espionage. |
|
||||
| **Service** | Tourist/commercial traffic. | Tips, regulars, reputation management. | Income dependent on traffic volume. Reputation fragile. | Blackmail. Theft. Information sale. |
|
||||
| **Research** | Project deadlines. Funding cycles. | Research progress, institutional politics, publication credit. | Competitive, status-driven, secrecy around results. | Data theft. Fabrication. Factions. |
|
||||
|
||||
**Sova Transit District:** Freight primary. The span gate transit schedule structures everything. NPC routines, the ring's operational calendar, and social patterns (when the bar fills, when corridors are quiet) all derive from freight rhythm.
|
||||
|
||||
---
|
||||
|
||||
### Dimension 3: Settlement Age and Character
|
||||
|
||||
**Range:** New Colony (< 20 years) → Established (20-80 years) → Mature (80-200 years) → Old (200+ years)
|
||||
|
||||
Settlement age determines architectural character, generational memory, and whether residents think of themselves as pioneers or locals.
|
||||
|
||||
| Age | Architecture | Cultural Identity | Generational Memory | Relationship to Origin |
|
||||
|---|---|---|---|---|
|
||||
| **New Colony** | Prefab, temporary-feeling. Little personalization. | Identity still forming. People compare everything to where they came from. | Recent. First-generation. Stories of the journey. | Strong nostalgia for origin system. |
|
||||
| **Established** | Prefab base showing modification. Layers visible. Some personalization, some institutional standardization. | Local identity forming but not solid. Mix of origin-cultures. | Mixed. Parents remember old places; children only know here. | Ambivalent. Here is home, but parents' memories linger. |
|
||||
| **Mature** | Mixed construction eras clearly visible. Original structure heavily modified. Strong local character in older sections. | Distinct local identity. People think of themselves as "from here." | Distant. The origin is history, not memory. | Local pride. Skepticism of core-system assumptions. |
|
||||
| **Old** | Accretive. Original construction may be invisible under layers. Idiosyncratic. | Deeply rooted identity. History is ambient. | Institutional. Stories are embedded in place-names and customs. | The origin system is foreign. "We are our own thing." |
|
||||
|
||||
**Sova Transit District:** Established-to-Mature. The district is ~40 years old on a station settled ~180 years ago. The district itself shows layered construction — prefab base, retrofitted sections, personalized details. Local identity is present but not deep. Workers think of themselves as Sova people, not Krenn people; but they don't have the rootedness of a settlement in its third or fourth generation.
|
||||
|
||||
---
|
||||
|
||||
### Dimension 4: Cultural Reference Point
|
||||
|
||||
The cultural reference point is the system of origin for the majority population, combined with how many generations of local drift have occurred.
|
||||
|
||||
This determines:
|
||||
- **Naming conventions** — how names sound, what they reference, whether family names matter
|
||||
- **Social norms** — eye contact, titles, how trust is established
|
||||
- **Relationship to technology** — whether lattice use is stigmatized, normalized, or a source of pride
|
||||
- **Attitudes toward the Commission** — reverence, compliance, resentment, or active evasion
|
||||
|
||||
**Krenn System Cultural Profile (established, working-class mid-Reach):**
|
||||
|
||||
- **Names:** Compact, consonant-heavy, first-name-primary in social contexts. Family names exist but are used formally (official documents, institutional contexts, introductions to strangers). Nicknames common among colleagues. Off-system names (longer vowels, different consonant clusters) stand out subtly but aren't cause for suspicion — just quietly noted.
|
||||
|
||||
- **Social norms:**
|
||||
- Eye contact is normal during conversation, brief during passing. Sustained eye contact from a stranger reads as challenge or authority.
|
||||
- Physical contact minimal — a hand on the shoulder is significant. A handshake is formal.
|
||||
- Complaining is fine. Complaining to the person you're complaining about is not.
|
||||
- Mind your business is the unspoken rule. People don't ask intrusive questions; they don't volunteer information they haven't been asked for. This makes the detective's investigation harder and the smuggler's operation safer.
|
||||
- Trust is established through repeated small interactions over time, not through declarations.
|
||||
|
||||
- **Technology attitudes:** Lattice use is unreflective — ubiquitous, taken for granted, the way breathing is taken for granted. Checking your lattice overlay in conversation is rude but common. The Unbound (those without lattices) are a known category — treated with mild curiosity and zero hostility. Nobody makes a fuss about it. Augmented lattice (institutional or premium) carries subtle status markers — people notice, don't comment.
|
||||
|
||||
- **Commission attitude:** Pragmatic compliance. The Commission regulates neural lattice technology; that regulation affects everyone, constantly. Workers find it mildly onerous (recertification requirements, software update mandates, firmware flags on aftermarket accessories). The Commission isn't hated — it's just the reality of living in the Reach. Like weather.
|
||||
|
||||
---
|
||||
|
||||
### Dimension 5: Institutional Ecosystem
|
||||
|
||||
Every location has a set of institutions that structure daily life. Understanding which institutions are present, which are visible, and which are resented tells you how NPCs talk about authority, rules, and power.
|
||||
|
||||
**Core institutions across the Reach:**
|
||||
|
||||
| Institution | Role | Local Manifestation |
|
||||
|---|---|---|
|
||||
| **Concord Assembly** | Reach-wide legislature | Background. Distant. Appears in news tickers. Not visible on the ground. |
|
||||
| **Lattice Commission** | Neural tech regulation | Kiosks, certification terminals, field investigators. The most visible institutional presence in most districts. |
|
||||
| **Syndics** | Commercial entities, freight and resource management | The actual employers of most working-class NPCs. Contracts, shipping manifests, wage structures. |
|
||||
| **Meridian** | Information network | Ambient. The infrastructure everyone uses without thinking about. Dead spots are notable. |
|
||||
| **Station Administration** | Local governance | Immediate authority. Maintenance schedules, district regulations, housing allocation. |
|
||||
| **Medical Services** | Re-embodiment and healthcare | Presence varies by wealth. Clinics in working districts, full services in affluent ones. |
|
||||
|
||||
**Sova Transit District institutional profile:**
|
||||
- Syndic logistics consortium: the main employer, highly visible in daily operations
|
||||
- Station Administration: present through maintenance schedules, posted notices, the occasional administrator in the corridors
|
||||
- Lattice Commission: intermittent. A kiosk in the logistics hub lobby, field investigators who visit quarterly (usually)
|
||||
- Medical clinic: small, basic. Re-embodiment services require transfer to the main station medical center
|
||||
- Meridian: strong coverage in institutional spaces (hub, bar), degraded in older sections, minimal in maintenance corridors
|
||||
|
||||
---
|
||||
|
||||
## Part 2: Derived Guidelines — From Framework to Content
|
||||
|
||||
### 2.1 Naming Conventions
|
||||
|
||||
Naming conventions follow from Dimension 4 (Cultural Reference Point). The table below captures the Krenn System standard, which serves as the v0.1 model.
|
||||
|
||||
**Krenn System naming rules:**
|
||||
- **First names:** 1-2 syllables, consonant-forward, no double vowels in typical form. Examples: Kael, Voss, Drin, Lera, Torek, Maret, Naia, Sera, Nils, Kosse, Pael, Tev, Ren, Resha, Harek, Sess, Devra.
|
||||
- **Family names:** 1-2 syllables, similar phoneme pattern. Examples: Davan, Lintar, Sessik, Korr.
|
||||
- **Social usage:** First name in most contexts. "Supervisor Voss" for institutional address. Full name only in formal or hostile contexts.
|
||||
- **Nicknaming:** Common among colleagues. A name like "Renn" might be short for something nobody uses.
|
||||
- **Off-system names:** Slightly softer vowels, longer syllable count, different consonant clusters. Example: Olin, Sabel. These stand out quietly — the detective's lattice may flag them as non-Krenn-origin before the detective consciously registers why.
|
||||
|
||||
**IP check:** Krenn names are constructed to feel plausibly human-future without mapping to any existing franchise. They are NOT Hamilton Commonwealth names (conspicuously contemporary English, which is Hamilton's signature device). They are NOT Banks Culture names (often whimsical or elaborate). They are NOT Firefly or Star Wars (no Earth-ethnic-name echoes). They suggest cultural drift across 180 years of mid-Reach settlement.
|
||||
|
||||
---
|
||||
|
||||
### 2.2 Economic Vocabulary
|
||||
|
||||
Economic base (Dimension 2) determines the vocabulary of daily life. Workers in a freight hub speak differently from workers in a mining operation or a research station. This vocabulary should permeate every NPC's dialogue — not as jargon dumps, but as the ambient language of their daily reality.
|
||||
|
||||
**Sova Transit District — Freight Economic Vocabulary:**
|
||||
|
||||
See companion document: **Sova Texture Appendix (#302)** for the full slang glossary.
|
||||
|
||||
Core vocabulary patterns for freight:
|
||||
- Work = "shift" (not "rotation," not "duty," not "tour")
|
||||
- The gate = "the gate" casually, "the span gate terminal" institutionally — never "the span gate" in casual speech
|
||||
- Cargo containers = "containers" or "cans" (informal) — never "pods"
|
||||
- Cargo manifests = "manifests" (precise), "paperwork" (dismissive), "the file" (when being evasive)
|
||||
- Credits = "marks" in casual conversation (a Krenn System local usage)
|
||||
- Off-shift time = "off-book" among the ring; just "after" for civilians ("see you after")
|
||||
- Lattice communication = "pinging" (sending), "a ping" (notification)
|
||||
|
||||
---
|
||||
|
||||
### 2.3 Social Rhythms and Norms
|
||||
|
||||
The freight rhythm (span gate schedules, shift rotations) structures social life. Content authors should use these rhythms as temporal anchors for dialogue and monologue.
|
||||
|
||||
**Sova Transit social rhythm:**
|
||||
|
||||
| Time | Activity | Social Atmosphere |
|
||||
|---|---|---|
|
||||
| 0600-0800 | Morning shift change | High traffic, business-focused, brief greetings |
|
||||
| 0800-1200 | Morning freight cycle | Focused work, minimal social interaction |
|
||||
| 1200-1400 | Midday break | Break room social time, bar has light lunch trade |
|
||||
| 1400-1600 | Afternoon freight cycle | Quieter, post-lunch pace |
|
||||
| 1600-1800 | Evening shift change | Second major transition, people heading to or from |
|
||||
| 1800-2200 | Peak bar hours | The Last Shift fills up. Main social time of the day. |
|
||||
| 2200-0200 | Late night | Bar quiet (late regulars only). Corridors quieter. Ring operations typical timing. |
|
||||
| 0200-0600 | Deep night | Minimal staffing. Maintenance windows. Skeleton shift. |
|
||||
|
||||
---
|
||||
|
||||
### 2.4 Relationship to Authority
|
||||
|
||||
Dimension 3 (Reach Position) determines how NPCs speak about, around, and to authority figures. This affects dialogue at every trust tier.
|
||||
|
||||
**Sova Transit — Authority Relationship Patterns:**
|
||||
|
||||
| NPC Type | To Commission directly | About Commission (behind back) | To institutional-tagged stranger |
|
||||
|---|---|---|---|
|
||||
| Flat NPC (civilian) | Cooperative, neutral. Answers questions. Doesn't volunteer. | "They do their job. Just don't want them doing *my* job." | Polite. Slightly more careful with word choice. Watches for cues. |
|
||||
| Triangle NPC (mundane) | Cooperative. Slightly more nervous if personally concerned. | "They'll always find something to flag if they look hard enough." | Normal, with an undercurrent of evaluation: are they relevant to me? |
|
||||
| Entangled NPC (ring) | Carefully cooperative. Prepared answers. Nothing extra. | "Commission pokes around twice a year and finds nothing because they don't know where to look." | Alert. Measures words. Changes topics smoothly. |
|
||||
|
||||
---
|
||||
|
||||
### 2.5 Technology Integration
|
||||
|
||||
Lattice use is unreflective for most NPCs — it's background, like breathing. Content should treat lattice references the way people treat phone references: incidentally, in passing, without ceremony.
|
||||
|
||||
**Correct treatment:**
|
||||
> "I pinged you twice. Did you sleep through your lattice?"
|
||||
|
||||
**Wrong treatment (over-technological):**
|
||||
> "I sent a message through the neural lattice communication network to your personal lattice implant."
|
||||
|
||||
**Wrong treatment (under-technological):**
|
||||
> "I tried to call you." *(This isn't the Reach — people don't "call." They "ping.")*
|
||||
|
||||
The exception: NPCs under stress or in unusual circumstances may reference their lattice more explicitly — "I checked three times, it's not in the manifest" — where the precision itself signals anxiety.
|
||||
|
||||
---
|
||||
|
||||
## Part 3: Scaling Beyond v0.1
|
||||
|
||||
The Krenn System instance demonstrates the framework. Future settings apply the same five dimensions with different parameters. The cultural output — naming conventions, vocabulary, social norms, authority attitudes — follows from the parameters, not from free-form invention.
|
||||
|
||||
**Quick-generation checklist for a new district:**
|
||||
|
||||
1. **Reach Position:** Core / Mid-Reach / Frontier / Deep Frontier
|
||||
→ Determines institutional density and authority attitude
|
||||
|
||||
2. **Economic Base:** Freight / Extraction / Manufacturing / Service / Research / Mixed
|
||||
→ Determines daily rhythm and vocabulary domain
|
||||
|
||||
3. **Settlement Age:** New / Established / Mature / Old
|
||||
→ Determines architectural character and cultural rootedness
|
||||
|
||||
4. **Cultural Reference Point:** Which system of origin? How many generations of local drift?
|
||||
→ Determines naming conventions and social norms
|
||||
|
||||
5. **Institutional Ecosystem:** Which institutions are present, how visibly?
|
||||
→ Determines how NPCs relate to authority
|
||||
|
||||
From these five inputs, the following outputs are derivable for any new setting:
|
||||
- Naming conventions (with example names)
|
||||
- Economic vocabulary (10-15 terms)
|
||||
- Social rhythm (daily time anchors)
|
||||
- Authority relationship patterns (flat/triangle/entangled × authority figure)
|
||||
- Technology integration register (how casually lattice is referenced)
|
||||
|
||||
**When a new setting is created:** Write a cultural profile following this guide and add it to `docs/wiki/cultural-groups/`. Tag it with the relevant star system. Link from the district entry in the wiki.
|
||||
|
||||
---
|
||||
|
||||
## Part 4: The Dual Lens Principle — Culture Serves Asymmetry
|
||||
|
||||
Every cultural detail in The Settled Reach exists to serve asymmetric information. Culture is not decoration — it's the medium through which two characters experience the same world differently.
|
||||
|
||||
**What this means in practice:**
|
||||
|
||||
The same cultural detail should mean something different to the smuggler and the detective:
|
||||
|
||||
| Cultural Detail | Smuggler Reads It As | Detective Reads It As |
|
||||
|---|---|---|
|
||||
| "Mind your business" norm | Operational cover. Nobody asks, nobody knows. | Investigative friction. People won't volunteer. |
|
||||
| First-name social culture | Social camouflage. Insider by default. | Access challenge. Have to earn first names. |
|
||||
| Lattice pings as communication | Ring coordination. Off-Meridian pings are clean. | Evidence trail. Pings log to Meridian (mostly). |
|
||||
| Bar as social heart | Safe social space. Home territory. | Intelligence gathering venue. |
|
||||
| Commission presence intermittent | The gap in oversight is the operational window. | The jurisdictional gap is also my investigative constraint. |
|
||||
| Span gate schedule as daily rhythm | The operational calendar. Timing is everything. | Investigation timeline. Window when oversight is thinnest. |
|
||||
|
||||
**Authoring instruction:** When writing any cultural detail — a sign, a greeting, a social norm — ask: what does the smuggler see, and what does the detective see? If the answer is identical, the detail is decorative. If the answers differ, the detail is load-bearing.
|
||||
|
||||
---
|
||||
|
||||
## Appendix: v0.1 Named Characters — Krenn System Consistency Check
|
||||
|
||||
All named characters in the Sova Transit District, with naming convention validation:
|
||||
|
||||
| Name | Convention Check | Role | Notes |
|
||||
|---|---|---|---|
|
||||
| Kael Davan | Krenn standard | Dock worker, ring member, smuggler's FRIEND | Full name used in formal contexts |
|
||||
| Sera Venn | Krenn standard | Commission field tech, detective's FRIEND | "Venn" slightly softer than typical Krenn surname — deliberate: she's institutional, slightly apart |
|
||||
| Lera Sessik | Krenn standard | Bar owner, The Last Shift | "Lera's" informal name. Never Lera Sessik to regulars. |
|
||||
| Torek Lintar | Krenn standard | Dock inspector, compromised | Full name used when the detective runs his file |
|
||||
| Voss | Krenn standard | Logistics supervisor | Single name in social use. Probably Voss-something officially. |
|
||||
| Drin | Krenn standard | Maintenance tech, flat NPC | Single name. Been here long enough nobody uses a surname. |
|
||||
| Maret Korr | Krenn standard | Freight scheduler, ring-adjacent | "Korr" is direct Krenn standard |
|
||||
| Naia | Krenn standard | Kael's partner (mentioned, not primary) | Brief, soft — contrast to Kael |
|
||||
| Nils | Krenn standard | Bar regular (mentioned) | |
|
||||
| Kosse | Krenn standard | Station name / character reference | |
|
||||
| Pael | Krenn standard | Maintenance tech, flat NPC (Sprint 12: #307) | |
|
||||
| Tev | Krenn standard | Lookout/runner, flat NPC (Sprint 12: #307) | |
|
||||
| Ren | Krenn standard | Drifter, flat NPC (Sprint 12: #307) | "Ren" is earlier-established; "Renn" is the courier variant from Round 2 mapping |
|
||||
|
||||
**Off-system characters (deliberate naming deviation):**
|
||||
|
||||
| Name | Deviation | Role | Purpose of Deviation |
|
||||
|---|---|---|---|
|
||||
| Resha | Softer vowel pattern | New hire | Implies off-system origin — explains why they ask too many questions |
|
||||
| Sabel | Different phoneme cluster | Ring fence/buyer, external contact | External contact should sound external |
|
||||
|
||||
**IP check:** All Krenn names validated against Hamilton (Contemporary English — cleared), Banks (whimsical/elaborate — cleared), Reynolds (Dutch/Germanic — cleared), Simmons (Greek/Latin register — cleared), Morgan (Anglo-American register — cleared). No franchise overlap found.
|
||||
|
||||
---
|
||||
|
||||
*This guide is a living document. As new settings are established, update the scaling examples. As cultural decisions are refined through gameplay testing, update the social norm descriptions. The framework is the constant; the instances are the evidence.*
|
||||
|
||||
*Miri — Sprint 12*
|
||||
@@ -1,385 +0,0 @@
|
||||
# Culture Authoring Guide — The Settled Reach
|
||||
**Ticket:** #653
|
||||
**Author:** Mellanie
|
||||
**Status:** canonical
|
||||
**Last updated:** 2026-03-13
|
||||
|
||||
---
|
||||
|
||||
## Purpose
|
||||
|
||||
Every NPC in The Settled Reach is voiced through their culture. The voice pipeline (D-138) uses a culture profile as its primary LLM prompt — the culture injector is the single biggest determinant of how an NPC sounds. Culture files are authored once and used thousands of times across every generated NPC in that system.
|
||||
|
||||
This guide explains how to author a new culture RON file from scratch. The target: one experienced author can produce a complete, Spike-validated culture profile in approximately one working day.
|
||||
|
||||
Three reference cultures exist in `content/global/`:
|
||||
- `culture-krenn.ron` — Mid-Reach, freight, working-class pragmatic (the Spike 1/2 reference)
|
||||
- `culture-vael.ron` — Core-adjacent, administrative/research, institutional-formal
|
||||
- `culture-osse.ron` — Deep Frontier, extraction industry, terse-utilitarian
|
||||
|
||||
---
|
||||
|
||||
## Step 1: Establish the cultural parameters (30 minutes)
|
||||
|
||||
Before writing a single word of the RON file, answer these five questions from `docs/design/cultural-generation-guide.md`:
|
||||
|
||||
1. **Reach Position:** Core / Mid-Reach / Frontier / Deep Frontier
|
||||
→ Determines authority attitude, institutional density, Commission presence
|
||||
|
||||
2. **Economic Base:** Freight / Extraction / Manufacturing / Service / Research / Mixed
|
||||
→ Determines daily vocabulary, rhythms, what NPCs care about
|
||||
|
||||
3. **Settlement Age:** New (< 20 yr) / Established (20-80 yr) / Mature (80-200 yr) / Old (200+ yr)
|
||||
→ Determines rootedness, architectural character, whether "here" is home
|
||||
|
||||
4. **Heritage Root:** Frost / Tide / Iron / Dust / Stone / Vine / Salt
|
||||
→ Determines spatial grammar and social privacy model (D-104/D-105)
|
||||
|
||||
5. **Institutional Ecosystem:** Which institutions are visibly present? Which are resented?
|
||||
|
||||
Write these down before you open a RON file. They are the source of truth for everything that follows.
|
||||
|
||||
---
|
||||
|
||||
## Step 2: Define the voice register (10 minutes)
|
||||
|
||||
Derive the voice register from your five parameters. Ask:
|
||||
|
||||
- How does authority feel here? (Collegial / Distant / Resented / Absent)
|
||||
- What is the cost of saying too much? (Social / Physical / Legal / None)
|
||||
- What earns trust here? (Credential / Shared risk / Repeated interaction / Demonstrated skill)
|
||||
- What is the cultural mode of emotional expression? (Understatement / Direct / Suppressed / Public)
|
||||
|
||||
Write a one-sentence register description. This becomes `speech.register` in the RON.
|
||||
|
||||
**Examples:**
|
||||
| Culture | Register |
|
||||
|---|---|
|
||||
| Krenn | direct, minimal pleasantries, gets to the point |
|
||||
| Vael | complete sentences, institutional framing, measured, precise |
|
||||
| Osse | terse, functional, equipment vocabulary, economy of language |
|
||||
|
||||
---
|
||||
|
||||
## Step 3: Author the naming conventions (15 minutes)
|
||||
|
||||
Naming conventions follow from Reach position + settlement age + economic base:
|
||||
|
||||
| Parameter | Naming tendency |
|
||||
|---|---|
|
||||
| Core, old settlement | Polysyllabic, family-name-primary, formal phonemes |
|
||||
| Mid-Reach, mature | Mixed — 1-2 syllables, either name primary depending on sub-culture |
|
||||
| Frontier, new | Short, work-derived, first-name-only or work-name |
|
||||
| Extraction industry | Often functional; legal names exist but aren't used |
|
||||
| Administrative | Family names primary; given names reserved |
|
||||
|
||||
**IP check rule:** All names must be checked against:
|
||||
- Hamilton (Contemporary English given names — avoid)
|
||||
- Banks (Whimsical/elaborate — avoid)
|
||||
- Reynolds Firefly (Earth-ethnic echoes — avoid)
|
||||
- Simmons (Greek/Latin — avoid overt register matches)
|
||||
|
||||
Generate 25-35 given names and 15-20 family names. The generator needs variety across playthroughs.
|
||||
|
||||
---
|
||||
|
||||
## Step 4: Author the voice persona (60 minutes — the core work)
|
||||
|
||||
The `voice_persona` field is the LLM instruction that shapes all re-voiced output for NPCs from this culture. This is where one working day of authoring matters most.
|
||||
|
||||
### Structure (6-block format, ~200-250 tokens total)
|
||||
|
||||
```
|
||||
PERSONA: You are a [Culture] [role type].
|
||||
|
||||
[BLOCK 1 — REGISTER, ~25 tokens]
|
||||
State the register style, why it exists, one distinguishing marker.
|
||||
|
||||
[BLOCK 2 — CULTURAL CONTEXT, ~25 tokens]
|
||||
One sentence: what shaped this culture's voice. The social or environmental fact.
|
||||
|
||||
[BLOCK 3 — VOCABULARY, ~40 tokens]
|
||||
Exclamations: [closed list — ONLY these expressions. No invented variants.]
|
||||
Greetings: [closed list]
|
||||
Address conventions: [family-name-primary, first-name-only, etc.]
|
||||
|
||||
[BLOCK 4 — VALUES, ~20 tokens]
|
||||
Two core values as behavioral instructions. "You do X." not "This culture values X."
|
||||
|
||||
[BLOCK 5 — NOT-LIST, ~20 tokens]
|
||||
2-3 exclusions SPECIFIC to this culture. (Universal NIs cover global constraints.)
|
||||
Start with: "Do not use..."
|
||||
|
||||
[BLOCK 6 — EXAMPLE PAIRS (~70-80 tokens): go in voice_examples field, not here]
|
||||
```
|
||||
|
||||
### The NEVER: block — most important element
|
||||
|
||||
**Format:** The NEVER: block is a separate, explicitly labeled section at the END of the persona string. It must not be embedded as a numbered instruction.
|
||||
|
||||
```
|
||||
[positive instructions 1-8]\n\nNEVER: [3-5 explicit negatives defining what this culture does NOT sound like]
|
||||
```
|
||||
|
||||
**Why it matters:** Spike 2 finding — explicit NEVER: blocks are critical for voice quality. Without them, the LLM defaults to register-neutral generic output. The numbered instructions alone are insufficient. The NEVER: section must be visually and structurally distinct — not "8. Do not use..." but a labeled block after the numbered list.
|
||||
|
||||
The not-list prevents register leakage. Write it by asking: what does this culture NEVER sound like?
|
||||
|
||||
| Culture | NEVER block content |
|
||||
|---|---|
|
||||
| Krenn | Corporate/institutional language, effusive or polished register, deference to unearned rank, family names in casual use, verbosity |
|
||||
| Vael | Void-adjacent exclamations (frontier register), casual contractions, sentence fragments, direct emotional expression, physical labor as value ground |
|
||||
| Osse | Institutional framing or courtesy protocols, formal complete sentences, Commission-world vocabulary, Core-system exclamations, elaboration where a number suffices |
|
||||
|
||||
The NEVER: content must be culture-specific. Global constraints (no religious language, no Earth references) go in the universal RULES const — do not repeat them per-culture.
|
||||
|
||||
### Writing the persona instructions
|
||||
|
||||
Use second-person imperative: "Be direct." not "This culture is direct."
|
||||
|
||||
Each numbered instruction should target a DIFFERENT speech dimension so trait modifiers can stack cleanly:
|
||||
- Instruction 1 → delivery style (brevity, formality)
|
||||
- Instruction 2 → cultural context (why they speak this way)
|
||||
- Instruction 3 → address conventions (name usage)
|
||||
- Instruction 4 → emotional register (how feelings appear in speech)
|
||||
- Instruction 5 → institutional framing (how authority is referenced)
|
||||
- Instruction 6 → exclamation vocabulary (closed, explicit list)
|
||||
- Instruction 7 → trust signal (how the culture verifies credibility)
|
||||
- Instruction 8 → not-list (what this voice never does)
|
||||
|
||||
**Test before committing:** Read the persona out loud. Can you imagine an NPC responding to you from this profile? Would a speaker from this culture be clearly distinct from Krenn if you heard both without labels?
|
||||
|
||||
---
|
||||
|
||||
## Step 5: Author voice examples (20 minutes)
|
||||
|
||||
Write 3-5 `(input, output)` example pairs for the `voice_examples` array.
|
||||
|
||||
**Input:** A culture-neutral semantic description of an action (same as base text format)
|
||||
**Output:** That action rendered in the culture's voice
|
||||
|
||||
Example pairs are the model's pattern anchors — small LLMs are pattern matchers before instruction-followers. The examples matter as much as the instructions.
|
||||
|
||||
**Rules for example pairs:**
|
||||
1. Cover the range: neutral, positive relationship, refusal/deflection, high-affect
|
||||
2. Output should be short (1-2 sentences). Long outputs lose the pattern.
|
||||
3. Each output must be recognizably THIS culture — read them side by side with Krenn examples. They should sound like different people.
|
||||
4. Do not use real NPC names in examples — use generic role references
|
||||
|
||||
### Cross-cultural contrast test
|
||||
|
||||
Before finalizing examples, run this test. Take the same three base-text inputs and write outputs in Krenn, Vael, and Osse voices. If the outputs are hard to distinguish, the culture persona needs sharpening.
|
||||
|
||||
**Example inputs for the test:**
|
||||
- "declines to answer a question about an overnight run"
|
||||
- "acknowledges a colleague's greeting while continuing to work"
|
||||
- "thanks a colleague for covering a shift"
|
||||
|
||||
| Input | Krenn | Vael | Osse |
|
||||
|---|---|---|---|
|
||||
| Declines question | "Look, that's not mine to say." | "I'm not in a position to speak to that. You'd want to refer to the relevant operations log." | "Not my section. Ask Grek." |
|
||||
| Acknowledges greeting | "Hey. Yeah. Catch you at shift end." | "Harthen. Good. I'll be with you in a moment." | "Doss. Yeah." |
|
||||
| Thanks colleague | "Appreciated. See you at handoff." | "That was well handled. I've noted it." | "Solid. Owe you one." |
|
||||
|
||||
If all three rows sound similar, the culture personas need work.
|
||||
|
||||
---
|
||||
|
||||
## Step 6: Author occasional injections (15 minutes)
|
||||
|
||||
`occasional_injections` are cultural vocabulary or speech patterns that should appear occasionally but not always — oath vocabulary, institutional references, equipment ground truth. The composition engine handles frequency; the author specifies what and when.
|
||||
|
||||
**Fields:**
|
||||
- `kind` — a string identifier (e.g., `"oath"`, `"protocol_cite"`, `"equipment_ground"`)
|
||||
- `clause` — the LLM instruction when this injection fires
|
||||
- `example` — `Some((input, output))` showing correct usage, or `None`
|
||||
- `frequency` — float 0.0–1.0 (how often the composition engine fires this injection)
|
||||
- `suppress_on_tells` — tells that should suppress this injection (e.g., oath suppressed when Guarded)
|
||||
|
||||
**Frequency guidelines:**
|
||||
- 0.25 — Krenn oath vocabulary (appears in ~1 in 4 high-affect contexts)
|
||||
- 0.20 — Vael protocol citation (appears occasionally in procedural exchange)
|
||||
- 0.15 — Osse equipment ground (appears in work-adjacent contexts)
|
||||
|
||||
Start with one injection per culture. More can be added after Spike validation confirms the base persona is clean.
|
||||
|
||||
---
|
||||
|
||||
## Step 7: Author the tell-tone table (15 minutes)
|
||||
|
||||
Each culture profile should include a tell-tone table mapping each `TellCategory` to how that tell expresses in this culture's register. This table is not in the RON file — it's authoring documentation used when tell-context injectors are written.
|
||||
|
||||
Include this table in a comment block in the RON file header, or maintain it separately in the culture's authoring notes.
|
||||
|
||||
**Format:**
|
||||
|
||||
| TellCategory | How it reads in this culture |
|
||||
|---|---|
|
||||
| Nervous | [culture-specific description] |
|
||||
| Angry | [culture-specific description] |
|
||||
| Friendly | [culture-specific description] |
|
||||
| Guarded | [culture-specific description] |
|
||||
| RoutineDeviation | [culture-specific description] |
|
||||
|
||||
**Design principle (from D-138):** Humans are humans first. Universal baseline (phenomenon-class behavior) is always readable across cultures. Cultural flavor is conditional and additive — the LLM adds cultural texture only if it doesn't significantly change the information conveyed. Per-culture tell-tone tables are optional enrichment.
|
||||
|
||||
---
|
||||
|
||||
## Step 8: Validate and commit
|
||||
|
||||
```bash
|
||||
tooling/validate-ron content/global/culture-{id}.ron culture
|
||||
```
|
||||
|
||||
A passing validation confirms:
|
||||
- All required fields are present and correctly typed
|
||||
- Trait names are valid enum values
|
||||
- RON syntax is correct
|
||||
|
||||
After validation, the culture profile is ready for Spike 1 prompt testing. Human review of voiced output is required before the culture goes into baked content.
|
||||
|
||||
---
|
||||
|
||||
## Tell-tone reference tables
|
||||
|
||||
### Krenn tell-tone table
|
||||
|
||||
| TellCategory | Krenn-inflected tonal register |
|
||||
|---|---|
|
||||
| Nervous | Answers run shorter than usual. Eyes stay on task. Nothing's wrong — just things to do. |
|
||||
| Guarded | Direct past the point of directness. Closes conversation paths fast without being unfriendly. |
|
||||
| Friendly | One beat more than the exchange needed. A word of warmth lands casually, not performed. |
|
||||
| Angry | Steady. Even. The kind of steady that takes effort. Not hostile — just flat in a way that doesn't feel natural for Krenn. |
|
||||
| RoutineDeviation | Unhurried. Unremarkably normal. Like nothing's worth noticing. |
|
||||
|
||||
### Vael tell-tone table
|
||||
|
||||
| TellCategory | Vael-inflected tonal register |
|
||||
|---|---|
|
||||
| Nervous | Sentences become over-complete — more formal than the situation warrants. Qualifications multiply. "As I understand it" appears where it wasn't needed. |
|
||||
| Guarded | Responses are brief and technically correct. Every question answered with only what was asked. Institutional framing appears even in informal exchange. |
|
||||
| Friendly | Slightly less formal than baseline — a given name used where a family name would normally appear. The exchange closes with a word of genuine regard. |
|
||||
| Angry | Register becomes precisely correct — almost pedantically so. The effort to maintain composure shows as over-precision. |
|
||||
| RoutineDeviation | Procedures are cited where they wouldn't normally be. A person who deviates from routine anchors to institutional language as cover. |
|
||||
|
||||
### Osse tell-tone table
|
||||
|
||||
| TellCategory | Osse-inflected tonal register |
|
||||
|---|---|
|
||||
| Nervous | Words get shorter. Already-minimal speech contracts to one-word answers and physical acknowledgment. The silence between words lengthens. |
|
||||
| Guarded | Assessment framing appears: "Why do you need to know?" — stated or implied. Eye contact shifts from reading-the-room to reading-you specifically. |
|
||||
| Friendly | Slightly more than the exchange needed — an extra beat, an unrequested detail, a "good shift" that lands with more weight. Not warm, just more. |
|
||||
| Angry | Everything slows down. Deliberate. Responses accurate, closed, no opening for follow-up. |
|
||||
| RoutineDeviation | The opposite of nervous: unusually conversational. When someone is off-routine on purpose, they over-normalize by saying more than usual. |
|
||||
|
||||
---
|
||||
|
||||
## Checklist: culture profile complete?
|
||||
|
||||
- [ ] Five parameters documented (Reach Position, Economic, Age, Heritage Root, Institutions)
|
||||
- [ ] Register statement authored and distinctive
|
||||
- [ ] 25+ given names, 15+ family names, phoneme pattern consistent
|
||||
- [ ] `family_name_used_socially` accurately reflects the culture
|
||||
- [ ] Voice persona: 8 numbered instructions, ~200-250 tokens
|
||||
- [ ] Explicit `NEVER:` block at end of persona string (separate from numbered instructions)
|
||||
- [ ] NEVER block content is culture-specific (not repeating universal constraints)
|
||||
- [ ] Cross-cultural contrast test passed (Krenn/Vael/Osse comparison)
|
||||
- [ ] 3-5 voice examples authored, range covered
|
||||
- [ ] At least 1 occasional injection with suppression logic
|
||||
- [ ] Tell-tone table authored (5 TellCategories)
|
||||
- [ ] `tooling/validate-ron content/global/culture-{id}.ron culture` passes
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
## Addendum: Behavior Modifiers (#634)
|
||||
|
||||
*Added Sprint 26. Applies to all culture files after the composable behavior engine (#633) ships.*
|
||||
|
||||
### What behavior_modifiers does
|
||||
|
||||
The composable behavior engine assembles observable behavior strings from two parts:
|
||||
|
||||
```
|
||||
BehaviorPrimitive.action + BehaviorModifier.clause → assembled behavior string
|
||||
```
|
||||
|
||||
Example:
|
||||
- Action: `"moves freight containers"`
|
||||
- Modifier: `"without wasted motion"` (Krenn, `work_pace`)
|
||||
- Result: `"moves freight containers without wasted motion"`
|
||||
|
||||
A culture provides a pool of modifier clauses. When the engine assembles a behavior, it looks for a modifier whose `category` matches the primitive's `modifier_hint` string. If no match exists, it falls back to any modifier in the pool. If no modifiers exist at all, the action text is used as-is.
|
||||
|
||||
**Modifier clauses must grammatically trail any action text.** They are appended with a space. Test by mentally substituting different action verbs: does the clause still read naturally?
|
||||
|
||||
### BehaviorContext: when to use each tag
|
||||
|
||||
Every `BehaviorPrimitive` carries a `context` field that gates when it is eligible for selection. The composition engine filters by context before modifier selection.
|
||||
|
||||
| Context | Use for | Example action |
|
||||
|---------|---------|----------------|
|
||||
| `OnShift` | Physical task execution, work-site behaviors, role-specific routines | "checks a manifest against a handheld scanner", "guides a freight container into position" |
|
||||
| `OffDuty` | Break-room behaviors, personal downtime, non-work physical states | "slumps into a break room chair and stares at nothing", "unwraps a meal packet standing at the counter" |
|
||||
| `Social` | Social-site behaviors (bars, cantinas, communal spaces) — may overlap with OffDuty but specifically at a social venue | "nurses a drink at the end of the bar", "trades short words with a neighbor" |
|
||||
| `Any` | Behaviors valid in any context — ambient, universal physical states | "rubs the back of their neck", "pauses and looks at nothing for a moment" |
|
||||
|
||||
**Decision rule:**
|
||||
- If the behavior only makes sense on a work site → `OnShift`
|
||||
- If the behavior only makes sense in a break room or personal space → `OffDuty`
|
||||
- If the behavior specifically happens at a social venue → `Social`
|
||||
- If the behavior could appear anywhere → `Any`
|
||||
- When unsure, prefer `Any` over a specific context — you can always narrow later
|
||||
|
||||
### Modifier category vocabulary (the contract)
|
||||
|
||||
These seven categories define the interface between primitives (Mellanie, role-action templates) and modifiers (culture authors). A primitive's `modifier_hint` must use one of these strings for a culture modifier to match it.
|
||||
|
||||
| Category | What it inflects | Example modifier (Krenn) |
|
||||
|---|---|---|
|
||||
| `work_pace` | Speed and intensity of physical task execution | "without wasted motion" |
|
||||
| `physical_manner` | Body language and movement quality during tasks | "without looking up from the task" |
|
||||
| `social_signal` | Brief acknowledgments made during or between tasks | "with a short nod" |
|
||||
| `task_completion` | How tasks are finished, wrapped up, or handed off | "and moves on" |
|
||||
| `environmental_scan` | Awareness or vigilance while in a space | "with one eye still on the floor" |
|
||||
| `offduty_posture` | Body language and social stance when off-shift | "without making a show of it" |
|
||||
| `authority_response` | Behavior when supervisors or authority figures are present | "at the same pace as before" |
|
||||
|
||||
**The fallback is safe but less targeted.** A primitive with no `modifier_hint` gets a random modifier from the full culture pool. This still produces culturally inflected output — just without category precision. Prefer leaving `modifier_hint` unset over using an incorrect category string.
|
||||
|
||||
### Authoring behavior_modifiers for a new culture
|
||||
|
||||
**Minimum:** 2 modifiers for each of the 7 categories = 14 modifiers total. Fewer categories will still work (fallback to any), but full coverage ensures every action type gets the right cultural texture.
|
||||
|
||||
**Process:**
|
||||
1. For each category, ask: *How does this culture DISTINCTIVELY express this dimension?*
|
||||
- Not "how does any person do this" but "what is the cultural tell for this culture specifically?"
|
||||
2. Write the clause as a short trailing phrase (4-8 words). Test: does it read naturally after "moves freight containers ___"?
|
||||
3. Avoid clauses that are too action-specific — they need to trail any verb, not just one type
|
||||
4. Run `tooling/validate-ron content/global/culture-{id}.ron culture` to confirm syntax
|
||||
|
||||
**Three-culture contrast for modifiers** (same as voice persona contrast test):
|
||||
|
||||
| Category | Krenn | Vael | Osse |
|
||||
|---|---|---|---|
|
||||
| work_pace | "without wasted motion" | "with practiced deliberation" | "at extraction pace" |
|
||||
| physical_manner | "without ceremony" | "with institutional correctness" | "tool already in hand" |
|
||||
| social_signal | "with a short nod" | "with a measured acknowledgment" | "with a word or a look" |
|
||||
| task_completion | "and moves on" | "with the relevant entry already updated" | "gear stowed before moving on" |
|
||||
| environmental_scan | "with one eye still on the floor" | "aware of who is observing" | "pressure and exits both in range" |
|
||||
| offduty_posture | "without making a show of it" | "maintaining composed reserve" | "with one ear still on the work floor" |
|
||||
| authority_response | "at the same pace as before" | "with appropriate professional deference" | "without a change in pace" |
|
||||
|
||||
If your new culture's modifiers would fit in any of the existing columns above without sounding different — the culture needs more work before modifiers are authored.
|
||||
|
||||
### Updated checklist
|
||||
|
||||
Add these items to the culture profile checklist:
|
||||
|
||||
- [ ] `behavior_modifiers` array populated with at least 2 clauses per category (14 minimum)
|
||||
- [ ] Each clause tested: grammatically trails "moves freight containers ___" and "checks a manifest ___"
|
||||
- [ ] Three-culture contrast check: modifiers are clearly distinct from Krenn, Vael, and Osse
|
||||
- [ ] `tooling/validate-ron` still passes after adding modifiers
|
||||
|
||||
*Addendum: Sprint 26, #634 (composable behavior content). Category vocabulary established jointly by Gestalt (culture modifiers) and Mellanie (behavior primitives). Add new categories only by agreement between both sides — unmatched categories silently fall back to any modifier.*
|
||||
@@ -1,750 +0,0 @@
|
||||
# Dual Lens Authoring Guide
|
||||
|
||||
**v0.1 Content Design Document** | Blocks: 11 downstream tickets | Status: Draft
|
||||
**Author:** Mellanie (Copywriter) + Paula (Narrative & Political Depth)
|
||||
**Date:** 2026-02-12
|
||||
|
||||
---
|
||||
|
||||
## Document Purpose
|
||||
|
||||
This guide defines how content authors write for two playable characters experiencing the same world through different perspectives. Every dialogue line, monologue line, and NPC profile must work for BOTH the smuggler AND the detective. Same world. Two lenses. Zero shared monologue lines. Maximum narrative divergence from minimal content duplication.
|
||||
|
||||
**Critical Dependencies:**
|
||||
- D-027: Vertical slice — smuggler + detective two-character proof
|
||||
- D-028: Dialogue architecture — tagged line pools with four relational layers
|
||||
- D-032: Separate monologue pools per character (hard partition, non-negotiable)
|
||||
- D-034: THE FRIEND — production-level NPC pattern
|
||||
- D-035: Converged tag taxonomy for dialogue and monologue line pools
|
||||
|
||||
---
|
||||
|
||||
## Chapter 1: Core Identity + Emotional Starting State
|
||||
|
||||
### Who Is The Smuggler?
|
||||
|
||||
**Occupation:** Logistics worker, Sova Transit District Freight Terminal ("The Terminal")
|
||||
**Ring Position:** Mid-level operator. Handles physical cargo routing, knows the schedule windows, manages dock-side coordination.
|
||||
**Time in Ring:** ~2 years. Comfortable with the work. Good at it.
|
||||
**Lattice Tier:** Baseline (standard civilian-grade, no augmentation)
|
||||
|
||||
**What They Know At Session Start:**
|
||||
- The ring exists. Who's in it: Nils (coordinator), Kael (closest colleague, ring member), Voss (shift supervisor, takes a cut), Renn (courier), and 2-3 others.
|
||||
- The routes: freight bay → service corridor → temp storage → bar back room.
|
||||
- The cargo: unlicensed lattice components, medical-grade neural replacements diverted from Syndic supply chains. They don't look too closely at the sealed containers.
|
||||
- The schedule: shift transitions create 20-minute oversight gaps. The operation runs during these windows.
|
||||
- The stakes: if caught, it's a Commission offense. Years in detention. But the money helps, the team is solid, and it's felt manageable for two years.
|
||||
|
||||
**What They Don't Know:**
|
||||
- The detective is investigating (unless playing detective path and the smuggler has been flagged).
|
||||
- Kael is trying to exit the ring. Meeting unknown contacts. Lying to the smuggler.
|
||||
- Sera (Commission field tech) has flagged manifest discrepancies and is sitting on unreported evidence.
|
||||
- The full upstream supply chain (knows cargo comes from off-station contact Sabel, doesn't know Syndic connections).
|
||||
- How much Naia (Kael's partner) suspects. How much danger the ring is actually in.
|
||||
|
||||
**Emotional Baseline:**
|
||||
- **Comfortable-tense.** Not happy, not miserable. The smuggler is managing a life with two faces: legitimate dock worker (public) and ring operator (hidden). The cognitive load is constant but bearable. The money eases the financial pressure that makes station life tight for most workers. The team feels like family — shared risk creates trust.
|
||||
- **Loyal to people, not institutions.** First-name basis with everyone. Thinks relationally: Kael is "my shift partner," not "dock worker Davan." Voss is "tense today," not "the shift supervisor is agitated." Institutions (Commission, Concord, Syndic) are distant, abstract, often adversarial.
|
||||
- **Operational thinking mode.** Time-aware, route-aware, schedule-aware. Worries about exposure: "Is Torek's spending too visible?" "Did Maret notice that manifest discrepancy?" "Is the detective going to connect Kael to the irregularities?"
|
||||
- **Protectiveness over the team.** Would cover for Kael even at personal cost. Would warn Voss if something looked wrong. The ring isn't just work — it's the people the smuggler eats lunch with, drinks with, trusts.
|
||||
|
||||
---
|
||||
|
||||
### Who Is The Detective?
|
||||
|
||||
**Occupation:** Commission investigator, assigned to Sova Transit District for manifest irregularity investigation
|
||||
**Assignment Duration:** New arrival. Session start is early in the investigation (first week).
|
||||
**Lattice Tier:** Standard professional (Commission-grade diagnostic tools, analytical overlays, not investigative-tier augmentation)
|
||||
|
||||
**What They Know At Session Start:**
|
||||
- There are manifest discrepancies tied to Sova Transit District freight operations. Containers logged but not reconciled with incoming manifests. Pattern suggests smuggling.
|
||||
- Names from case files: Voss (shift supervisor), Maret (freight scheduler), Drin (dock inspector). Persons of interest, not confirmed suspects.
|
||||
- Sova Transit District social geography: The Terminal (logistics hub), The Last Shift (bar, social nexus), maintenance corridors (off-books access routes).
|
||||
- Institutional context: The previous Commission liaison rotated out 3 months ago. Current Commission presence is minimal (Sera Venn, field tech, not an investigator).
|
||||
- Sera Venn is a pre-existing contact. Same institutional background, transferred to Sova a year ago. Reliable. The detective's one friendly face in the district.
|
||||
|
||||
**What They Don't Know:**
|
||||
- Who the ring members are (Nils, Kael, Renn, etc. — names without context).
|
||||
- The smuggler's identity. If the smuggler is in the ring, the detective doesn't know yet.
|
||||
- Kael is trying to exit the ring. Sera is sitting on unreported evidence. Naia is worried about Kael and has confided in Sera.
|
||||
- The social web connecting everyone. Who's loyal to whom. Who's protecting whom. Who's compromised and how.
|
||||
- How embedded the ring is in the district's economic immune system. The detective reads it as criminal enterprise. Doesn't yet understand it as community survival mechanism.
|
||||
|
||||
**Emotional Baseline:**
|
||||
- **Professional-cautious.** The detective is trained to observe, analyze, withhold judgment until evidence accumulates. But they're also human — isolation in an unfamiliar community, reliance on Sera for social grounding, awareness that non-cooperation is the district default.
|
||||
- **Analytical habit.** Counts things. Tracks frequencies. Flags inconsistencies. Self-directs: "filing it," "noted," "coincidence?" Internal bookkeeping runs in background. The institutional training doesn't turn off.
|
||||
- **Institutional frame.** Thinks in terms of evidence, patterns, leverage. Surnames before first names for targets. "Davan, K." not "Kael." The shift from surname to first-name IS a relationship marker.
|
||||
- **Moral position.** The detective believes in the work. Smuggling isn't victimless — unlicensed lattice components can cause neural degradation, medical-grade replacements diverted from Syndic supply chains mean someone else doesn't get the replacement they need. The ring is breaking the law. The investigation is justified. But the detective is also starting to see the grey: Kael isn't a cartel boss, he's a dock worker who said yes once and kept saying yes. Complexity accumulates.
|
||||
|
||||
---
|
||||
|
||||
### Starting State Comparison
|
||||
|
||||
| Dimension | Smuggler | Detective |
|
||||
|-----------|----------|-----------|
|
||||
| **Knowledge of the ring** | Insider. Knows who, what, when, where. Operational detail. | Suspects. Has data anomalies, no confirmed names. Investigative frame. |
|
||||
| **Relationship to NPCs** | Personal. First-name basis. History, trust, loyalty. | Clinical. Surname-first. Categorizes by role and behavior. |
|
||||
| **Emotional orientation** | Protective. Worries about people. "Is Kael okay?" | Analytical. Worries about patterns. "Why is Kael nervous?" |
|
||||
| **Lattice capability** | Baseline. No enhanced perception, no analytical overlays. | Professional. Diagnostic access, pattern recognition tools. |
|
||||
| **Social position** | Insider. Belongs. Everyone knows the smuggler. | Outsider. Institutional authority resented by the community. |
|
||||
| **Moral framing** | Pragmatic complicity. "We're careful. We take care of our own." | Institutional clarity. "This is a crime. There are victims." |
|
||||
| **What threatens them** | Exposure (being caught, losing the team). | Failure (case goes cold, ring stays hidden). |
|
||||
|
||||
---
|
||||
|
||||
## Chapter 2: The Dual-Lens Rule
|
||||
|
||||
### The Core Test
|
||||
|
||||
Every content piece — dialogue line, monologue line, NPC profile axis — must work for BOTH characters. Ask:
|
||||
|
||||
1. **Does this line make sense if the smuggler experiences it?**
|
||||
2. **Does this line make sense if the detective experiences it?**
|
||||
3. **Does this line reveal something different to each character?**
|
||||
4. **Is the access tier correct for both characters?**
|
||||
5. **Does this line advance at least one character's emotional arc?**
|
||||
|
||||
If the answer to 1 or 2 is "no," the line is broken. If the answer to 3 is "no," the line isn't dual-lens — it's just generic.
|
||||
|
||||
---
|
||||
|
||||
### Three Types of Dual-Lens Difference
|
||||
|
||||
**Type 1: Access Difference**
|
||||
The smuggler hears a line the detective doesn't (or vice versa) because of `access` tier filtering.
|
||||
|
||||
*Example:*
|
||||
```yaml
|
||||
- id: terminal_d_044
|
||||
role: dock_worker
|
||||
text: "Container 4471 sat in temp storage overnight. Scheduling backed up again."
|
||||
access: [public, peer]
|
||||
trust: surface
|
||||
situation: [shift_start]
|
||||
dual_lens:
|
||||
smuggler: "Operational context — part of the ring pipeline. 'Backed up' is cover language."
|
||||
detective: "Anomaly — overnight exceeds standard procedure. Flag for investigation."
|
||||
```
|
||||
|
||||
Both characters can hear this line (`public` + `peer` both accessible). But the smuggler ALSO hears ring-specific operational dialogue that the detective never accesses:
|
||||
|
||||
```yaml
|
||||
- id: terminal_d_045
|
||||
role: dock_worker
|
||||
text: "4471's routed for transfer at 14:30. Voss kept the window clear."
|
||||
access: [insider]
|
||||
trust: real
|
||||
situation: [shift_transition]
|
||||
dual_lens:
|
||||
smuggler: "Confirmation — the route is active, Voss is cooperating."
|
||||
detective: "Never hears this line. Doesn't have insider access."
|
||||
```
|
||||
|
||||
**Type 2: Interpretation Difference**
|
||||
Both characters hear the same NPC dialogue, but their monologue reactions interpret it differently.
|
||||
|
||||
*Shared dialogue line:*
|
||||
```yaml
|
||||
- id: bar_d_033
|
||||
role: bartender
|
||||
text: "Sera left early. Headache, she said."
|
||||
access: [public]
|
||||
trust: surface
|
||||
```
|
||||
|
||||
*Smuggler monologue reaction:*
|
||||
```yaml
|
||||
- id: bar_m_051
|
||||
character: smuggler
|
||||
trigger: post_conversation
|
||||
text: "Sera's gone. Good — one less Commission presence in the room."
|
||||
mood: [relieved]
|
||||
```
|
||||
|
||||
*Detective monologue reaction:*
|
||||
```yaml
|
||||
- id: bar_m_052
|
||||
character: detective
|
||||
trigger: post_conversation
|
||||
prerequisite:
|
||||
known_attributes:
|
||||
subject: sera_venn
|
||||
key: behavior_flags
|
||||
value_contains: avoidance_pattern
|
||||
text: "Second time Sera's left when Torek arrived. Coincidence?"
|
||||
mood: [suspicious]
|
||||
```
|
||||
|
||||
Same dialogue. Smuggler reads it as relief (less oversight). Detective reads it as a behavioral tell (avoidance pattern forming).
|
||||
|
||||
**Type 3: Emotional Weight Difference**
|
||||
The relationship history creates different emotional stakes for the same observation.
|
||||
|
||||
*Observation trigger:* Kael checking his lattice for the third time in ten minutes.
|
||||
|
||||
*Smuggler monologue:*
|
||||
```yaml
|
||||
- id: terminal_m_011
|
||||
character: smuggler
|
||||
trigger: observe_anomaly
|
||||
prerequisite:
|
||||
relationship_state: Friendly
|
||||
subject: kael_davan
|
||||
text: "Kael keeps checking his lattice. Waiting for a message? Not like him to be jumpy."
|
||||
mood: [concerned]
|
||||
topic: [colleague]
|
||||
```
|
||||
|
||||
*Detective monologue:*
|
||||
```yaml
|
||||
- id: terminal_m_042
|
||||
character: detective
|
||||
trigger: observe_anomaly
|
||||
prerequisite:
|
||||
relationship_state: Known
|
||||
subject: kael_davan
|
||||
text: "Dock worker Davan — lattice activity spiked. Expecting a message? Or checking for surveillance?"
|
||||
mood: [analytical]
|
||||
topic: [investigation]
|
||||
```
|
||||
|
||||
Same behavior. Smuggler worries about a friend ("Not like him"). Detective analyzes a subject ("Dock worker Davan"). Emotional weight is asymmetric.
|
||||
|
||||
---
|
||||
|
||||
### Tag Implications
|
||||
|
||||
The dual-lens rule is enforced through the tag taxonomy (D-035). Here's how tags create different content surfaces from the same pool:
|
||||
|
||||
**`access` Tag — Hard Filter (D-028 Layer 1)**
|
||||
|
||||
| Access Tier | Who Gets It | Smuggler Example | Detective Example |
|
||||
|-------------|-------------|------------------|-------------------|
|
||||
| `public` | Everyone | Bar greeting, shift small talk | Commission procedural questions |
|
||||
| `peer` | Known or Friendly relationship | Coworker gossip, shift complaints | Institutional background sharing (Sera to detective) |
|
||||
| `insider` | Friendly relationship only | Ring operational talk, close confidences | Never unlocked for ring NPCs (detective is outsider) |
|
||||
| `authority` | Detective only, works at Unknown/Known/PersonOfInterest | Institutional leverage questions | Smuggler never has authority access |
|
||||
| `hostile` | Hostile relationship only | Threats, final warnings | Post-cover-blown confrontation |
|
||||
|
||||
**Critical rule:** When Kael transitions from Friendly to PersonOfInterest (THE FRIEND contradiction), `insider` and `peer` lines LOCK OUT. The smuggler still sees Kael, still interacts with Kael, but the warm operational dialogue disappears. That absence IS the emotional payload.
|
||||
|
||||
**`trust` Tag — Hard Filter (D-028 Layer 3)**
|
||||
|
||||
Within each access tier, `trust` further filters content:
|
||||
|
||||
| Trust Level | What It Gates |
|
||||
|-------------|--------------|
|
||||
| `surface` | Safe topics, social norms, what anyone would say |
|
||||
| `real` | Honest opinions, unguarded speech, actual feelings |
|
||||
| `secret` | Dangerous knowledge, confessions, things that create leverage |
|
||||
|
||||
A line tagged `access: [insider], trust: secret` is the deepest content — only available to the smuggler, only when Kael is Friendly, only when trust has been earned through repeated interaction.
|
||||
|
||||
**`character` Tag — Hard Partition (D-032)**
|
||||
|
||||
Monologue pools are completely separate. The smuggler's monologue pool lives in `monologue-smuggler.yaml`. The detective's pool lives in `monologue-detective.yaml`. **No shared lines.** This is non-negotiable.
|
||||
|
||||
Same trigger, different pool. That's how mirror moments work without either pool knowing about the other.
|
||||
|
||||
---
|
||||
|
||||
### Authoring Workflow
|
||||
|
||||
When writing a line:
|
||||
|
||||
1. **Write the line.** Concrete, in the speaker's voice.
|
||||
2. **Check both readings.** Document the dual-lens split in the `dual_lens` field:
|
||||
```yaml
|
||||
dual_lens:
|
||||
smuggler: "How the smuggler interprets this."
|
||||
detective: "How the detective interprets this."
|
||||
```
|
||||
3. **Verify neither reading breaks.** If the line only works for one character, use a different `access` tier or rely on character-specific monologue to recontextualize.
|
||||
4. **Tag correctly.** The `access`, `trust`, `situation`, `mood`, and `topic` tags must express the dual-lens difference mechanically.
|
||||
|
||||
---
|
||||
|
||||
## Chapter 3: Access Tier Mapping
|
||||
|
||||
### Per-NPC Access Mapping
|
||||
|
||||
How each character relates to key NPCs at session start:
|
||||
|
||||
| NPC | Smuggler Access | Detective Access | Shift Path (Smuggler) | Shift Path (Detective) |
|
||||
|-----|----------------|------------------|---------------------|----------------------|
|
||||
| **Kael Davan (THE FRIEND)** | `insider`, `peer` | `public` → `authority` (if flagged) | `insider` → locked out (post-contradiction, PersonOfInterest) | `public` → `authority` (investigation progresses) |
|
||||
| **Sera Venn (THE FRIEND)** | `public` (Commission, wary) | `peer` → `authority` (post-contradiction) | No shift (smuggler doesn't develop relationship) | `peer` → `authority` (trust breaks, PersonOfInterest) |
|
||||
| **Voss (shift supervisor)** | `insider` (colleague, knows smuggler is ring) | `authority` | `insider` → `hostile` (if cover blown) | `authority` → `peer` (if detective earns trust) |
|
||||
| **Lera Sessik (bar owner)** | `insider` (bar regular, ring-aware) | `public` → `peer` (repeat visits) | No major shift | `public` → `peer` (regular status, 3-4 visits) |
|
||||
| **Naia Tamm (Kael's partner)** | `peer` (through Kael) | `public` → `peer` (through Sera) | `peer` → `hostile` (if Naia learns truth about ring) | `public` → `peer` (Sera introduction) |
|
||||
| **Torek Lintar (bar regular)** | `insider` or `peer` (depends on whether smuggler knows Torek's ring connection) | `public` | No shift | `public` → `authority` (if financial tells flagged) |
|
||||
| **Maret Korr (freight scheduler)** | `insider` (hub colleague) | `authority` | No major shift | `authority` → `peer` (if Maret cooperates) |
|
||||
| **Drin Rosta (dock inspector)** | `insider` (hub colleague, smuggler knows Drin is compromised) | `authority` | `insider` → `hostile` (if Drin turns informant) | `authority` (detective can pressure via gambling debt) |
|
||||
|
||||
---
|
||||
|
||||
### Access Tier Shift Paths (Per Social Site)
|
||||
|
||||
**The Terminal (Logistics Hub)**
|
||||
|
||||
| Character | Starting Tier | Likely Shift | Trigger | Content Requirement |
|
||||
|-----------|--------------|--------------|---------|---------------------|
|
||||
| Smuggler | `insider` + `peer` | `insider` → `hostile` | Cover blown — seen with detective, ring member reports suspicion | Dialogue lines for "former colleague now enemy" tone. Monologue lines for paranoia, betrayal. |
|
||||
| Detective | `authority` | `authority` → `peer` | Earns trust by keeping a minor infraction quiet, helping with a non-smuggling problem | Dialogue lines for "institutional authority softening to personal rapport." Monologue shift from clinical to sympathetic. |
|
||||
|
||||
**The Last Shift (Bar)**
|
||||
|
||||
| Character | Starting Tier | Likely Shift | Trigger | Content Requirement |
|
||||
|-----------|--------------|--------------|---------|---------------------|
|
||||
| Smuggler | `insider` (regular) | `insider` → `hostile` | Social contamination from hub (ring turns on smuggler) | Bar dialogue shifts from warm to cold. Lera stops saving the smuggler's seat. Torek stops buying rounds. |
|
||||
| Detective | `public` | `public` → `peer` | Repeated visits (3-4), becomes a regular, earns Lera's respect | Greeting dialogue warms. Sera introduces detective to regulars. Access to bar gossip unlocks. |
|
||||
|
||||
**The Ring (Smuggling Operations)**
|
||||
|
||||
| Character | Starting Tier | Likely Shift | Trigger | Content Requirement |
|
||||
|-----------|--------------|--------------|---------|---------------------|
|
||||
| Smuggler | `insider` + `peer` | `peer` → `hostile` | Suspected of cooperation with detective, unauthorized contact (like Kael) | Ring dialogue becomes interrogative. Nils questions loyalty. Operational info stops flowing. |
|
||||
| Detective | `public` (doesn't know ring exists) | `public` → `hostile` | Stumbles into ring awareness — NPCs react defensively | Immediate evasion. Doors close. No access to insider content, but NPCs' defensive behavior is itself evidence. |
|
||||
|
||||
---
|
||||
|
||||
### What Access Tier Shifts Mean for Content Packs
|
||||
|
||||
Every content pack must support:
|
||||
1. **Starting state dialogue** — the baseline access tier per character
|
||||
2. **Shifted state dialogue** — the most likely tier transition per character
|
||||
3. **Monologue that tracks the shift** — the character's internal reaction to changed access
|
||||
|
||||
Example from Kael content pack:
|
||||
|
||||
*Starting state (Friendly, insider access):*
|
||||
```yaml
|
||||
- id: terminal_d_120
|
||||
role: dock_worker
|
||||
text: "Container 4471 is flagged. I'll reroute it during shift transition."
|
||||
access: [insider]
|
||||
trust: real
|
||||
situation: [shift_transition]
|
||||
notes: "Ring operational talk. Only smuggler hears this."
|
||||
```
|
||||
|
||||
*Shifted state (PersonOfInterest, insider locked out):*
|
||||
```yaml
|
||||
- id: terminal_d_121
|
||||
role: dock_worker
|
||||
text: "Shift's running smooth today. No issues."
|
||||
access: [public]
|
||||
trust: surface
|
||||
situation: [shift_start]
|
||||
notes: "Post-contradiction. Kael is surface-normal. The warmth is gone. The insider content is locked."
|
||||
```
|
||||
|
||||
*Smuggler monologue tracking the shift:*
|
||||
```yaml
|
||||
- id: terminal_m_122
|
||||
character: smuggler
|
||||
trigger: post_conversation
|
||||
prerequisite:
|
||||
relationship_state: PersonOfInterest
|
||||
subject: kael_davan
|
||||
text: "Same old Kael. Same jokes, same routine. ...What are you not telling me?"
|
||||
mood: [conflicted]
|
||||
topic: [colleague]
|
||||
notes: "Phase 5: Contaminated trust. Every normal interaction is now suspicious."
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Chapter 4: Divergence Escalation Curve
|
||||
|
||||
The vertical slice is 30 minutes. Divergence between the smuggler and detective experiences escalates over time. Here's the minute-by-minute curve:
|
||||
|
||||
### Minutes 0-10: Minimal Divergence
|
||||
|
||||
**Shared Experience:**
|
||||
- Both characters enter the same locations (The Terminal, The Last Shift).
|
||||
- Both see the same NPCs moving through their routines.
|
||||
- Both hear similar `public`-tier dialogue (greetings, small talk, shift schedules).
|
||||
- Both experience the same sensory atmosphere (station hum, cargo machinery, recycled air).
|
||||
|
||||
**Minimal Differences:**
|
||||
- Monologue voice is different (smuggler: casual, relational; detective: analytical, institutional).
|
||||
- NPC greetings vary by recognition (smuggler gets "There you are" from Kael; detective gets "Can I help you?" from Voss).
|
||||
- The smuggler's monologue references operational context ("shift transition in thirty minutes"). The detective's monologue references investigative context ("manifest discrepancies tied to this hub").
|
||||
|
||||
**Player Experience:**
|
||||
The two characters feel similar. The world is shared. The voice is different, but the content overlap is high. This is intentional — it establishes the baseline before divergence accelerates.
|
||||
|
||||
---
|
||||
|
||||
### Minutes 10-20: Growing Divergence
|
||||
|
||||
**Access Tiers Start to Differ:**
|
||||
- The smuggler hears `insider` dialogue from Kael, Voss, Lera. Ring operational talk. Close colleague warmth.
|
||||
- The detective hears `authority` dialogue from Maret, Drin, Voss. Institutional leverage questions. Evasive answers.
|
||||
- The smuggler's `peer` access to bar regulars unlocks gossip, complaints, social texture. The detective is still `public` at the bar — polite but distant.
|
||||
|
||||
**Monologue Pools Diverge:**
|
||||
- The smuggler's monologue starts tracking operational risk: "Torek's spending is too visible." "Maret's been quiet lately — did she notice something?"
|
||||
- The detective's monologue starts tracking behavioral tells: "Dock worker Davan — lattice activity spiked." "Voss deflected when I asked about overnight containers."
|
||||
|
||||
**NPCs Respond Differently:**
|
||||
- Kael is warm to the smuggler (Friendly relationship), clinical to the detective (Unknown or Known).
|
||||
- Sera is warm to the detective (Friendly, pre-existing contact), wary to the smuggler (Commission presence).
|
||||
- Lera is protective of regulars around the detective (defensive), casual with the smuggler (insider).
|
||||
|
||||
**Player Experience:**
|
||||
The same room. Different colors. Different names. Different monologue. The player who's played both paths starts to notice: "Wait, I didn't hear that line as the detective." The asymmetry is becoming visible.
|
||||
|
||||
---
|
||||
|
||||
### Minutes 20-30: Maximum Divergence
|
||||
|
||||
**Completely Different Internal Experiences:**
|
||||
|
||||
**Smuggler (navigating ring crisis):**
|
||||
- Kael's contradiction discovered. The FRIEND arc is in Phase 3-4 (shock, confrontation).
|
||||
- Monologue is emotionally loaded: hurt, betrayal, protectiveness, fear of exposure.
|
||||
- Access to `insider` content at The Terminal and bar. Operational dialogue about shift windows, container routing, risk management.
|
||||
- Relationship stakes are personal: "Kael is lying to me. What do I do? Confront? Protect? Report to Nils?"
|
||||
|
||||
**Detective (uncovering evidence):**
|
||||
- Sera's contradiction discovered. The FRIEND arc is in Phase 3-4 (pattern confirmed, question asked).
|
||||
- Monologue is analytically loaded: suspicion, professional conflict, moral cost of using Sera's concealment.
|
||||
- Access to `authority` content at The Terminal. Institutional leverage. Maret might cooperate. Drin might turn.
|
||||
- Relationship stakes are institutional: "Sera knows something. Do I press? Report her? Protect her?"
|
||||
|
||||
**Zero Overlap in Emotional Journey:**
|
||||
- The smuggler is inside a community facing internal betrayal.
|
||||
- The detective is outside a community trying to crack it open.
|
||||
- The same events (Kael's nervousness, Sera's avoidance, Torek's spending) mean completely different things to each character.
|
||||
|
||||
**Player Experience:**
|
||||
"I was only seeing HALF of this." The replay reveals a completely different game. Not just "I knew different things" — "I cared about different things." The divergence is total.
|
||||
|
||||
---
|
||||
|
||||
### Content Authoring Implications
|
||||
|
||||
| Minutes | Dialogue Overlap | Monologue Overlap | NPC Behavior Overlap | Content Requirement |
|
||||
|---------|-----------------|-------------------|---------------------|---------------------|
|
||||
| 0-10 | ~80% | 0% (separate pools) | ~90% (same routines) | Heavy `public` dialogue, light `insider`/`authority` |
|
||||
| 10-20 | ~50% | 0% | ~70% (NPCs start reacting differently) | Balanced `public`/`insider`/`authority`, access tier shifts begin |
|
||||
| 20-30 | ~30% | 0% | ~50% (relationships diverged) | Heavy `insider` (smuggler) and `authority` (detective), THE FRIEND arcs at peak |
|
||||
|
||||
---
|
||||
|
||||
## Chapter 5: Authoring Checklist
|
||||
|
||||
Before submitting a line, ask:
|
||||
|
||||
### Question 1: Does this line make sense if the smuggler hears it?
|
||||
|
||||
**Test:** Read the line aloud. Imagine the smuggler — a dock worker who's been on Sova for years, knows the ring from inside, thinks in operational terms, worries about people. Does this line sound like something an NPC would say TO a smuggler? Or does it assume the listener is an outsider / authority figure?
|
||||
|
||||
**Common failures:**
|
||||
- NPC explains basic station layout to the smuggler (the smuggler already knows).
|
||||
- NPC uses institutional vocabulary the smuggler wouldn't recognize ("manifest reconciliation protocol" instead of "the paperwork doesn't match").
|
||||
- NPC is defensive or evasive without cause (why would Kael be evasive with his closest colleague unless something's wrong?).
|
||||
|
||||
**Fix:** Rewrite the line for insider context. Or tag it `access: [authority, public]` so the smuggler never hears it.
|
||||
|
||||
---
|
||||
|
||||
### Question 2: Does this line make sense if the detective hears it?
|
||||
|
||||
**Test:** Read the line aloud. Imagine the detective — a Commission investigator, new to the district, analytical training, institutional frame, no prior relationships except Sera. Does this line sound like something an NPC would say TO a detective? Or does it assume the listener already belongs to the community?
|
||||
|
||||
**Common failures:**
|
||||
- NPC uses in-group slang or references without explanation (the detective doesn't have the context yet).
|
||||
- NPC is too warm / too trusting (why would Voss share operational details with an investigator?).
|
||||
- NPC volunteers sensitive information unprompted (people don't do that to authorities they don't trust).
|
||||
|
||||
**Fix:** Rewrite the line for outsider context. Or tag it `access: [insider, peer]` so the detective never hears it.
|
||||
|
||||
---
|
||||
|
||||
### Question 3: Does this line reveal something different to each character?
|
||||
|
||||
**Test:** If both characters hear this line, do they interpret it differently? Does the smuggler's monologue reaction differ from the detective's? If both characters hear "Container 4471 sat in temp storage overnight," does one read it as operational routine and the other as procedural anomaly?
|
||||
|
||||
**Common failures:**
|
||||
- The line is purely informational with no interpretive space ("The bar opens at 15:00" — both characters just learn the hours).
|
||||
- The line is so specific to one character's context that the other character's hearing it feels wrong.
|
||||
- The dual-lens difference isn't meaningful — both characters react the same way.
|
||||
|
||||
**Fix:** Add subtext. Create interpretive ambiguity. Or split the line into two versions (one `insider`, one `public`) that say similar things with different connotations.
|
||||
|
||||
---
|
||||
|
||||
### Question 4: Is the access tier correct for both characters?
|
||||
|
||||
**Test:** Check the `access` tag. If it includes `insider`, can the detective reach that tier with this NPC? (Usually no — the detective is an outsider to the ring.) If it includes `authority`, does the smuggler have authority leverage over this NPC? (Usually no — the smuggler is peer-level.)
|
||||
|
||||
**Common failures:**
|
||||
- Line tagged `access: [public, insider]` — both characters hear it, but the insider-specific content makes no sense to the detective.
|
||||
- Line tagged `access: [authority]` — detective gets institutional leverage questions, but the NPC's answer assumes peer relationship.
|
||||
- No `access` tag (defaults to `public`) — line contains sensitive information that should be tier-gated.
|
||||
|
||||
**Fix:** Be explicit. If the line only works for one character, tag it `access: [insider]` or `access: [authority]` exclusively. If it works for both, tag `access: [public, peer]` and test both readings.
|
||||
|
||||
---
|
||||
|
||||
### Question 5: Does this line advance at least one character's emotional arc?
|
||||
|
||||
**Test:** Does this line move a relationship forward? Deepen trust, reveal a contradiction, escalate tension, provide comfort, create doubt? Or is it purely functional (greeting, filler, repetition)?
|
||||
|
||||
**Common failures:**
|
||||
- Line is generic social lubricant ("Nice weather today" — there's no weather on a station).
|
||||
- Line repeats information the character already has ("Kael works at the dock" — the smuggler knows this).
|
||||
- Line doesn't connect to any NPC axis (Want, Secret, Relationship, Tolerance) or triangle tension.
|
||||
|
||||
**Fix:** Every line should serve character, relationship, or narrative. If it doesn't, cut it or replace it with a line that does. Content budget is finite. No filler.
|
||||
|
||||
---
|
||||
|
||||
## Chapter 6: THE FRIEND Specification
|
||||
|
||||
### The Pattern
|
||||
|
||||
Each playable character has one "FRIEND" NPC — a production-level complex character that exercises every content and systems pipeline at full depth. THE FRIEND is the emotional centerpiece of v0.1 and carries D-027 success criterion #3 ("player names an NPC they felt conflicted about").
|
||||
|
||||
**THE FRIEND follows a reusable pattern:**
|
||||
|
||||
| Element | Requirement |
|
||||
|---------|-------------|
|
||||
| **Relationship phases** | 3+ phases with distinct monologue registers (comfort → doubt → conflict) |
|
||||
| **Observable contradiction** | Discoverable through observation, not told through dialogue |
|
||||
| **Sympathetic motivation** | THE FRIEND isn't evil — their concealment comes from care or fear |
|
||||
| **No clean resolution** | Every choice (confront, ignore, exploit, protect) has consequences |
|
||||
| **Dual-lens resonance** | The other character's playthrough recontextualizes THE FRIEND's behavior |
|
||||
| **Triangle integration** | THE FRIEND's contradiction connects to at least one triangle |
|
||||
| **Tell progression** | 3+ observable behavioral changes the monologue system flags |
|
||||
| **Dialogue shift** | Pre-discovery and post-discovery dialogue pools feel different |
|
||||
|
||||
---
|
||||
|
||||
### Smuggler's FRIEND: Kael Davan
|
||||
|
||||
**Who:** Dock worker, Sova Transit District Logistics Hub. The smuggler's closest colleague. Ring member. Handles physical cargo routing.
|
||||
|
||||
**Surface Presentation (Minutes 0-10):**
|
||||
Warm, reliable, slightly sardonic. Greets the smuggler with genuine affection. Talks about shift schedules, complains about Voss, asks about the smuggler's 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 both the legitimate side and the ring side. The smuggler trusts Kael because they've shared risk for two years.
|
||||
|
||||
**The Contradiction:**
|
||||
The smuggler sees Kael in the restricted maintenance corridor (Corridor B-7) talking to someone the smuggler doesn't recognize. Late. Off-shift. The person leaves before the smuggler gets close.
|
||||
|
||||
Smuggler monologue: *"That's Kael. But who's he talking to? I don't know that face."*
|
||||
|
||||
This is NOT the detective. This is someone from outside the ring's known network. Kael has a side arrangement the smuggler doesn't know about.
|
||||
|
||||
**The Shift Arc (Triangle 4: The Worried Partner)**
|
||||
|
||||
Kael is at the center of Triangle 4 (Naia-Kael-Sera). His partner Naia is worried about his late nights. Naia has confided in Sera (Commission field tech, the detective's FRIEND). Kael is oblivious to the anxiety he's causing. The unknown contact is someone offering to help Kael exit the ring — to protect Naia. Kael is trying to get out. But from the smuggler's perspective, any unauthorized contact is a security breach.
|
||||
|
||||
| Phase | Timing | Smuggler Observes | Monologue Register | Tell |
|
||||
|-------|--------|------------------|-------------------|------|
|
||||
| **Phase 1: 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 — baseline comfortable |
|
||||
| **Phase 2: First Crack** | 10-15 min | Kael checks lattice more often. Excuses himself from lunch early. | Mild concern: *"Kael's distracted today. Probably nothing."* | Behavioral: increased lattice checking, shortened interactions |
|
||||
| **Phase 3: The Contradiction** | 15-20 min | Corridor B-7. Unknown contact. Spatial deviation. | 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 |
|
||||
| **Phase 4: Confrontation** | 20-25 min | Smuggler asks. Kael deflects: "Just a thing. Don't worry about it." He's lying. | Betrayal crystallizing: *"He looked left before answering. He always looks left when he's making something up."* | Dialogue: evasion, subject change, the tell confirmed |
|
||||
| **Phase 5: Contaminated Trust** | 25-30 min | Everything looks normal again. But the smuggler is watching. | Conflicted: *"Same old Kael. Laughing at the same jokes. ...What are you not telling me?"* | Emotional: every warm interaction is now suspicious |
|
||||
|
||||
**RelationshipState Transition:**
|
||||
`Friendly` (green) → `PersonOfInterest` (amber) at Phase 3 contradiction discovery.
|
||||
|
||||
**Access Tier Shift:**
|
||||
`insider` + `peer` dialogue locks out at Phase 3. Kael still talks to the smuggler, but the warmth is gone. Only `public` + `surface` lines remain. That absence IS the narrative.
|
||||
|
||||
**Content Requirements:**
|
||||
~70-100 authored lines (no generation expansion):
|
||||
- 25-35 dialogue lines (greetings, shift talk, bar casual, ring coordination, deflection, confrontation responses)
|
||||
- 15-20 trust-gated lines (insider ring talk, close colleague warmth, secret-tier hints about wanting out)
|
||||
- 5-8 unprompted lines (Kael volunteers info early, warnings/deflections late)
|
||||
- 10-15 monologue lines (smuggler about Kael: warmth, concern, contradiction discovery, post-confrontation, contaminated trust)
|
||||
- 10-15 monologue lines (detective about Kael: identification, behavioral observation, suspicion, informant potential)
|
||||
- 5-8 tell observation lines (lattice checking, distraction, looks-left tell, spatial deviation)
|
||||
- 3-5 contradiction discovery lines (Corridor B-7 moment from multiple angles)
|
||||
|
||||
---
|
||||
|
||||
### Detective's FRIEND: Sera Venn
|
||||
|
||||
**Who:** Commission field technician, off-duty bar regular. The detective's pre-existing contact in the district. Same institutional background. Transferred to Sova a year ago. The detective's social anchor.
|
||||
|
||||
**Surface Presentation (Minutes 0-10):**
|
||||
Competent, slightly wry, comfortable in the district. When the detective visits the bar, Sera waves them over. Easy rapport. Fills in background — who the regulars are, what the district's like. The detective's guide to an unfamiliar place.
|
||||
|
||||
**What the Detective Knows:**
|
||||
Sera is reliable. She transferred for routine work after a stressful posting elsewhere. She doesn't have skin in the smuggling game. She's the detective's safe harbor.
|
||||
|
||||
**The Contradiction:**
|
||||
Sera always leaves when Torek Lintar arrives at the bar. Always. Three times in a row. Different excuses each time. "Early shift tomorrow." "Headache." "Need to check something at the kiosk."
|
||||
|
||||
Detective monologue: *"That's the third time Sera's left when Torek walked in. That's not coincidence."*
|
||||
|
||||
**The Shift Arc (Triangle 4: The Worried Partner)**
|
||||
|
||||
Sera is at the other node of Triangle 4. Naia (Kael's partner) confides in Sera about Kael's late nights. Sera — being a Commission tech with system access — ran an unofficial compliance check on Kael's work patterns. She found manifest discrepancies. She knows something is wrong. She hasn't reported it because Naia is her friend, and reporting would mean Kael gets investigated, possibly arrested, and Naia's life falls apart. Sera is sitting on unreported evidence. She avoids Torek because Torek is ring-adjacent, and she doesn't want to be seen near him while concealing what she knows.
|
||||
|
||||
| Phase | Timing | Detective Observes | Monologue Register | Tell |
|
||||
|-------|--------|-------------------|-------------------|------|
|
||||
| **Phase 1: Trust** | 0-10 min | Sera is warm, informative, helpful. Shares district intel freely. | Professional + personal warmth: *"Good to see Sera. She always was the reliable one."* | None — baseline comfortable |
|
||||
| **Phase 2: Background Data** | 10-15 min | Sera mentions Naia (Kael's partner) as "a friend." Naia joins them once. Genuine rapport. | Noting: *"Sera's connected here. Good. She knows the locals."* | Social: Sera has relationships outside institutional channels |
|
||||
| **Phase 3: The Pattern** | 15-20 min | Third departure when Torek arrives. Three different excuses. Same result. | Suspicion activating: *"That's the third time. Three excuses, one result. That's data."* | Behavioral: avoidance pattern, excuse variety, timing correlation |
|
||||
| **Phase 4: The Question** | 20-25 min | Detective asks about Torek. Sera tenses. Deflects: "He's just loud. I don't like loud drunks." | Professional analysis + personal conflict: *"She's not lying. But she's not telling me everything."* | Dialogue: controlled deflection, topic change, re-establishing warmth quickly |
|
||||
| **Phase 5: Contaminated Trust** | 25-30 min | Sera continues being helpful. Maybe MORE helpful — compensating. | Analytical doubt: *"Still the same Sera. Still reliable. ...But reliable about what?"* | Emotional: detective's observation lines shift from trusting to evaluating |
|
||||
|
||||
**RelationshipState Transition:**
|
||||
`Friendly` (green) → `PersonOfInterest` (amber) at Phase 3 pattern confirmation.
|
||||
|
||||
**Access Tier Shift:**
|
||||
`peer` dialogue available at Phase 1-2. At Phase 3, `authority` dialogue unlocks (detective can press institutional leverage questions). `peer` warmth remains but is contaminated.
|
||||
|
||||
**Content Requirements:**
|
||||
~70-100 authored lines (no generation expansion):
|
||||
- 25-35 dialogue lines (bar greetings, district orientation, Naia conversation, institutional discussion, deflection about Torek, confrontation responses)
|
||||
- 15-20 trust-gated lines (peer-tier institutional background, secret-tier hints about what she found)
|
||||
- 5-8 unprompted lines (Sera volunteers district background early, steers away from sensitive areas late)
|
||||
- 10-15 monologue lines (detective about Sera: trust/relief, pattern observation, contradiction discovery, post-confrontation)
|
||||
- 10-15 monologue lines (smuggler about Sera: institutional categorization, avoidance notation, cautious assessment)
|
||||
- 5-8 tell observation lines (avoidance pattern x3, topic deflection, overcompensation helpfulness, extended kiosk time)
|
||||
- 3-5 contradiction discovery lines (third departure from multiple angles)
|
||||
|
||||
---
|
||||
|
||||
### Why THE FRIEND Works Narratively
|
||||
|
||||
**Kael's 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 (protocol breach). Kael's motivation is sympathetic (protecting family). No clean answer. That's the conflict.
|
||||
|
||||
**Sera's contradiction isn't "Sera is corrupt."**
|
||||
The contradiction is "Sera is 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 the detective might understand. The question becomes: do I report Sera? Use what she knows? Confront and risk losing my only ally?
|
||||
|
||||
**Dual-Lens Resonance:**
|
||||
The smuggler who's played the detective path knows the investigation is closing in — Kael's exit attempt reads differently (not betrayal, desperation). The detective who's played the smuggler path knows why Sera is protecting Naia — Sera's silence reads differently (not corruption, loyalty).
|
||||
|
||||
---
|
||||
|
||||
## Chapter 7: Voice Signature
|
||||
|
||||
### 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. | *"Kael's here. Good."* |
|
||||
| **Vocabulary** | Concrete, physical, sensory. Trade jargon (containers, manifests, shifts, routes) without explaining. 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. People 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 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. Filtered through "is this safe for my people?" | *"Transition window opens in fifty minutes."* |
|
||||
| **Self-reference** | Rare. Thinks about others, not herself. When it occurs, through physical sensation. | *"My stomach dropped"* not *"I feel betrayed."* |
|
||||
| **Humor** | Dry, situational, understated. Dark when stressed. Never witty. | *"Home sweet home"* about a cargo bay. |
|
||||
|
||||
**What the smuggler 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 should feel like it could sit next to these:
|
||||
|
||||
1. **Baseline warm:** *"Kael's already at the dock. Good. The day's better when he's on shift."*
|
||||
2. **Operational:** *"Shift transition in thirty minutes. If Voss kept the schedule thin, the route's clear."*
|
||||
3. **Concerned:** *"Kael keeps checking his lattice. Waiting for a message? Not like him to be jumpy."*
|
||||
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."*
|
||||
5. **Atmospheric:** *"Morning shift. Recycled air and cargo lubricant. Home sweet home."*
|
||||
|
||||
#### 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. More structured than the smuggler. Occasional fragments for emphasis. | *"Standard prefab, heavy foot traffic. Let's see what the shift change tells me."* |
|
||||
| **Vocabulary** | Institutional layer over plain speech. Professional terms: "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. | *"She's not lying. But she's not telling me everything. Sera, what do you know?"* The first-name appeal IS the emotion. |
|
||||
| **Relationship mode** | Surname-first for targets and unknowns. First-name for allies and trusted. The shift 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 before noticing the person. | *"That's twice now"* before *"Sera leaves."* The count matters more than the actor. |
|
||||
| **Analytical thinking** | Automatic. Counts, tracks, flags. Self-directs: "filing it," "noted," "coincidence?" Internal bookkeeping. | *"Three times. Three excuses. That's data."* |
|
||||
| **Self-reference** | More common than the smuggler, but always through professional lens. Monitors 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 the detective 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."*
|
||||
2. **Pattern recognition:** *"That's the third time. Sera leaves when Torek arrives. Three different excuses, same result. That's not coincidence."*
|
||||
3. **Personal leak:** *"Good to see Sera. She always was the reliable one. At least someone in this district speaks my language."*
|
||||
4. **Conflicted:** *"Same booth. Same warm smile. Same offer to buy me a drink. ...Everything except whatever she's not saying."*
|
||||
5. **Atmospheric:** *"Grain spirit and low conversation. Only place in this district that doesn't smell like freight lubricant."*
|
||||
|
||||
#### Anti-Patterns (What the Detective Does NOT Sound Like)
|
||||
|
||||
- *"Kael's here. Good."* (Too terse. That's the smuggler. The detective: *"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 — smuggler's register. 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."*
|
||||
- **Detective:** *"Container in overnight temp. Unusual for a hub this size — turnaround is normally sub-eight hours. Flag it."*
|
||||
|
||||
**Trigger:** Entering the bar.
|
||||
|
||||
- **Smuggler:** *"Lera's. Grain spirit and noise. Could use both right now."*
|
||||
- **Detective:** *"The Last Shift. Same crowd as yesterday. Let's see who's NOT here tonight."*
|
||||
|
||||
**Trigger:** Noticing Naia Tamm is upset.
|
||||
|
||||
- **Smuggler:** *"Naia looks rough today. Should check on her later."*
|
||||
- **Detective:** *"Tamm seems distressed. Not her baseline. Something at home, or something she's heard?"*
|
||||
|
||||
**Trigger:** Hearing raised voices behind a door.
|
||||
|
||||
- **Smuggler:** *"Raised voices from the back room. Devra's in there. That's not a brokering call."*
|
||||
- **Detective:** *"Arguing behind that door. The bartender didn't flinch. Either she's used to it or she knows what it is."*
|
||||
|
||||
---
|
||||
|
||||
## Conclusion
|
||||
|
||||
The dual-lens rule is simple: **one world, two perspectives, zero shared monologue lines.** Every content piece must work for both characters. The smuggler sees home and sees betrayal. The detective sees a crime scene and sees moral complexity. Same NPCs. Same locations. Completely different games.
|
||||
|
||||
Write for the voice. Tag for the system. Test for both lenses. Cut ruthlessly.
|
||||
|
||||
That's the job.
|
||||
|
||||
---
|
||||
|
||||
**End Dual Lens Authoring Guide v0.1**
|
||||
@@ -1,100 +0,0 @@
|
||||
# Line ID Authoring Guide
|
||||
|
||||
**Decision:** D-084 (dual-namespace line ID scheme)
|
||||
**Resolves:** Q-028 (collision-resistant IDs for auto-generated NPCs)
|
||||
**Ticket:** #544
|
||||
|
||||
---
|
||||
|
||||
## The Short Version
|
||||
|
||||
- **Role pool lines:** Use `{role-slug}_d_{###}` — e.g., `dock-worker_d_001`. These lines are shared by all NPCs with that role. This is the default for all auto-generated NPC content.
|
||||
- **Named NPC lines:** Use `{npc-slug}_d_{###}` — e.g., `kael-davan_d_001`. Unchanged from current practice.
|
||||
- **Instance-specific lines (rare):** Use `{role-slug}-{counter}_d_{###}` — e.g., `dock-worker-07_d_001`. Only needed when a specific generated NPC needs content different from the role pool.
|
||||
|
||||
---
|
||||
|
||||
## How Line IDs Work
|
||||
|
||||
A line ID identifies **content**, not speaker. The speaker is identified by their `StableId` in the history log. So `dock-worker_d_001` being said by 40 different dock workers is correct: the log records `(StableId: 12, dock-worker_d_001)`, `(StableId: 37, dock-worker_d_001)`, etc. No collision.
|
||||
|
||||
This means the role pool approach already handles most cases — the "collision problem" is mainly a concern for the rare case where you want a specific generated NPC to say something *different* from others of the same role.
|
||||
|
||||
---
|
||||
|
||||
## Namespace Reference
|
||||
|
||||
### Named NPC lines (Tier 1 and Tier 2 authored NPCs)
|
||||
|
||||
```
|
||||
Format: {npc-slug}_{content-type}_{###}
|
||||
Example: kael-davan_d_001 (Kael's dialogue line 1)
|
||||
sera-venn_d_015 (Sera's dialogue line 15)
|
||||
pc-smuggler_m_s_001 (Smuggler monologue line 1)
|
||||
```
|
||||
|
||||
File location: One file per NPC (e.g., `dialogue/maintenance-corridors/kael-davan.yaml`)
|
||||
|
||||
Numbering: Sequential within the file. Gaps are acceptable (deleted lines leave permanent gaps). Never reuse a number.
|
||||
|
||||
---
|
||||
|
||||
### Role pool lines (auto-generated NPCs, Tier 3 flat, Tier 2 mundane)
|
||||
|
||||
```
|
||||
Format: {role-slug}_{content-type}_{###}
|
||||
Example: dock-worker_d_001 (any dock worker, dialogue line 1)
|
||||
bar-regular_d_008 (any bar regular, dialogue line 8)
|
||||
transit-worker_d_003 (any transit worker, dialogue line 3)
|
||||
```
|
||||
|
||||
File location: One file per role-at-location (e.g., `dialogue/the-terminal/dock-worker.yaml`)
|
||||
|
||||
These lines are shared by **all instances** of the role. Write them to suit any dock worker, not a specific one.
|
||||
|
||||
---
|
||||
|
||||
### Instance-specific lines (opt-in, rare)
|
||||
|
||||
Use only when the generation system has flagged a specific NPC as needing content that differs from the role pool. Examples: a generated dock worker who is also a triangle member with a specific tell; a generated bar regular who witnessed a specific event.
|
||||
|
||||
```
|
||||
Format: {role-slug}-{zero-padded counter}_{content-type}_{###}
|
||||
Example: dock-worker-07_d_001 (instance 7 of dock-worker role, line 1)
|
||||
bar-regular-02_d_005 (instance 2 of bar-regular role, line 5)
|
||||
```
|
||||
|
||||
The counter (01, 02, ... N) is assigned by the generation system in world-seed-deterministic order. The NPC's generated profile file will tell you which counter to use.
|
||||
|
||||
File location: Same directory as the role pool file, separate file with instance slug as name (e.g., `dialogue/the-terminal/dock-worker-07.yaml`)
|
||||
|
||||
---
|
||||
|
||||
## Quick Decision Guide
|
||||
|
||||
| Situation | ID format to use |
|
||||
|-----------|------------------|
|
||||
| Named authored NPC (Kael, Sera, Voss...) | `{npc-slug}_d_{###}` |
|
||||
| Lines any dock worker can say | `dock-worker_d_{###}` |
|
||||
| Lines any bar regular can say | `bar-regular_d_{###}` |
|
||||
| Generated NPC with specific triangle role | `{role-slug}-{counter}_d_{###}` |
|
||||
| Generated NPC who's just background | `{role-slug}_d_{###}` — no instance ID needed |
|
||||
|
||||
---
|
||||
|
||||
## Schema Compatibility
|
||||
|
||||
The existing ID regex `^[a-z][a-z0-9-]*_[dme]_\d{3}$` accepts all three formats. No schema change is required. The content validator (`make validate-content`) checks for duplicate IDs across all files in a district.
|
||||
|
||||
---
|
||||
|
||||
## Numbering Rules
|
||||
|
||||
1. Start at `001`, increment by 1 for each new line.
|
||||
2. Never reuse a number, even if a line is deleted. Gaps are fine.
|
||||
3. Lines within a single file have a contiguous prefix — `dock-worker_d_001` through `dock-worker_d_042`, etc.
|
||||
4. Cross-file: `kael-davan.yaml` at the terminal and `kael-davan.yaml` at maintenance corridors both use the `kael-davan_d_###` namespace. Continue numbering from where the other file left off (check the existing files first, use a fresh sequence if the NPC is new to a location).
|
||||
|
||||
---
|
||||
|
||||
*D-084 — authored by Gestalt, Sprint 18*
|
||||
@@ -1,480 +0,0 @@
|
||||
# Monologue Voice Guide: Trait, Background, and Mood Modifiers
|
||||
|
||||
**Ticket:** #121
|
||||
**Authors:** Paula (narrative framing), Mellanie (example lines — see Section notes)
|
||||
**Gestalt:** validate mood → delivery mappings are mechanically coherent
|
||||
**Date:** 2026-02-20
|
||||
**Status:** Draft — narrative framing complete; Mellanie to supply example lines per section
|
||||
|
||||
**Cross-references:**
|
||||
- [Monologue Content Architecture](monologue-content-architecture.md) — the authoring contract this document extends
|
||||
- [Voice Patterns](voice-patterns.md) — sentence-level execution (contractions, punctuation, sentence length)
|
||||
- [Dual Lens Authoring Guide](dual-lens-authoring-guide.md) — Chapter 7 (base voice registers)
|
||||
- D-024: NPC triangle model — PersonalityTraits list (10 axes)
|
||||
- D-035: tag taxonomy — mood enum (8+1 moods)
|
||||
|
||||
---
|
||||
|
||||
## Document Purpose
|
||||
|
||||
This document answers one question: **given that both characters have established voice registers, what happens to those registers when we vary personality traits, character backgrounds, and mood states?**
|
||||
|
||||
The monologue architecture defines *what* characters think about. The voice patterns spec defines *how* they write sentences. This document defines the *inflection layer* — how the same thought sounds different from a Cautious smuggler versus a Bold one, from a character with Guardian background versus Worker background, in an Anxious moment versus a Content one.
|
||||
|
||||
The goal is not separate scripts per trait/background/mood. The goal is a **transformation guide**: a set of rules that let Mellanie take a base line and render it correctly for any combination of modifiers, without writing from scratch.
|
||||
|
||||
---
|
||||
|
||||
## Chapter 1: Base Voice Registers — The Narrative Framing
|
||||
|
||||
The voice-patterns.md spec describes the mechanics of each character's voice. This chapter explains *why* those mechanics exist — the psychological and experiential logic that makes the voice real. Understanding the "why" allows you to make correct decisions when the spec doesn't cover an edge case.
|
||||
|
||||
### 1.1 The Smuggler: Concrete Cognition
|
||||
|
||||
The smuggler's voice is not the result of low intelligence or limited vocabulary. It's the result of two years of professional survival in a context where abstract thinking is dangerous.
|
||||
|
||||
When you're running contraband through a logistics hub, you can't afford to think in categories — you think in specifics. Not "this situation is getting risky" but "Voss changed the rotation and Kael's not answering his lattice." Abstract framing makes patterns invisible. Concrete framing catches the deviation.
|
||||
|
||||
The smuggler's internal voice is trained, not natural. She developed it. It served her. The short sentences and fragments aren't lack of complexity — they're the mental habit of someone who learned to think in real-time decision points. "Kael's late. Wrong. Move." Three thoughts, three beats, three potential action triggers. Abstract cognition is a liability she's edited out.
|
||||
|
||||
**The emotional truth beneath the voice:** She cares about people first. Operations second. Institutions never. The concrete voice maps onto this: she sees people, not systems. She notices Kael is distracted before she notices the manifest is wrong. The world is a network of relationships, and her monologue is live monitoring of that network.
|
||||
|
||||
**What this means for trait and mood modifiers:** When trait or mood modifiers inflect the smuggler's voice, they do so within this framework. A Bold smuggler is still concrete-first — she just acts on partial information faster. An Anxious smuggler is still relational — she just cycles through the network faster, checking and rechecking. The base is immovable. The modifiers inflect it.
|
||||
|
||||
### 1.2 The Detective: Analytical Cognitive Frame
|
||||
|
||||
The detective's voice is institutional training running as an operating system. He was taught to externalise his cognition — to turn observations into filed reports, to name patterns as data, to treat emotional reactions as information to be processed rather than feelings to be felt.
|
||||
|
||||
This is not coldness. It's self-protection. Investigators who let themselves feel first make bad decisions. The detective learned that lesson somewhere — we don't know where, but it's in the bone. The analytical frame is a tool he uses so well he's forgotten it's a tool. Except when Sera makes him forget.
|
||||
|
||||
The longer sentences and complete syntactic structures aren't pretension. They're habits of evidence: a complete sentence has a subject, verb, and object, which means it has an agent, an action, and a consequence. The detective's brain naturally produces complete sentences because incomplete sentences don't file well.
|
||||
|
||||
**The emotional truth beneath the voice:** He cares about doing the work correctly. Not because he's a rule-follower (he'd bend a rule if the evidence demanded it), but because he believes the correct process produces the correct result. When Sera introduces doubt into that belief, the whole framework shudders. His fear isn't being wrong about a fact — it's discovering that correct process produced an unjust outcome, and having no language for what comes next.
|
||||
|
||||
**What this means for trait and mood modifiers:** Detective trait modifiers inflate or compress the analytical frame. A Compassionate detective lets the personal break through the professional more easily. A Ruthless detective turns the analytical frame into a weapon — identifies leverage faster, doesn't dwell on moral weight. Mood modifiers thin or thicken the professional veneer. The base is the analyst. The modifiers determine how much of the person shows through.
|
||||
|
||||
---
|
||||
|
||||
## Chapter 2: Personality Trait Modifiers
|
||||
|
||||
D-024 defines 10 personality traits across 5 opposing pairs. These modify the *delivery* of monologue, not the *content*. The same base line should be writable in any trait version. The trait changes the sentence-level texture: hedging vs. assertion, relational vs. operational framing, question vs. declaration.
|
||||
|
||||
**Authoring note:** Traits come in pairs. An NPC (or player character) has values along the axis — a 3-point scale: Trait A (strong), Trait A (mild), Neutral, Trait B (mild), Trait B (strong). For monologue, we write for the strong expression of each trait. Mild expressions are interpolations that Mellanie can derive.
|
||||
|
||||
---
|
||||
|
||||
### 2.1 Cautious ↔ Bold
|
||||
|
||||
**The axis:** How much information does the character need before acting (or thinking forward to action)?
|
||||
|
||||
**Cautious — transformation logic:**
|
||||
A Cautious character qualifies her observations before she acts on them. She notices things in the same order as a neutral character, but she checks her own conclusions. She hedges internally. She is not less intelligent — she is more aware that she might be wrong.
|
||||
|
||||
- Declarations become conditionals: "That's Kael's route" → "That looks like Kael's route"
|
||||
- Observations become questions: "Something's off" → "Something might be off"
|
||||
- Concern arrives earlier and stays longer (more re-checking)
|
||||
- The voice is slower, more tentative
|
||||
|
||||
**How this inflects each character:**
|
||||
- *Cautious smuggler:* More checking, more revisiting. Sees the same deviation, holds the conclusion longer before committing. Her concern accumulates quietly rather than crystallizing fast. Phrases like "probably," "maybe," "could be" appear more. She doesn't voice suspicion until she's sure — then she's very sure.
|
||||
- *Cautious detective:* Qualifies his filings. "Unusual behavior" becomes "behavior that may deviate from baseline." He is extremely careful about premature conclusions. His analytical questions multiply before resolving. This character is hard to rattle because he expects to be uncertain.
|
||||
|
||||
**Bold — transformation logic:**
|
||||
A Bold character acts on partial information. She names the conclusion before she has the evidence. She's often right — bold cognition built on competence. But she's also capable of committing to a wrong read and holding it too long.
|
||||
|
||||
- Questions become declarations: "Something might be off" → "Something's off"
|
||||
- Hedges disappear: "That looks like Kael's route" → "That's Kael's route"
|
||||
- Concern arrives fast and crystallizes immediately
|
||||
- The voice is faster, more assertive, shorter latency between observation and conclusion
|
||||
|
||||
**How this inflects each character:**
|
||||
- *Bold smuggler:* She names it. Fast. Doesn't wait for confirmation. Her operational thinking has a "move first, verify later" quality. Lines are shorter, more declarative, fewer qualifiers.
|
||||
- *Bold detective:* His analytical sentences become more assertive. Fewer conditionals. He "flags" things as facts before he's confirmed them. This character is easier to manipulate through his own confidence.
|
||||
|
||||
**Mellanie — write 2-3 example rewrite pairs per character (base line → Cautious version, base line → Bold version). Reference the voice anchors from voice-patterns.md Chapter 7 as the base.**
|
||||
|
||||
---
|
||||
|
||||
### 2.2 Honest ↔ Deceptive
|
||||
|
||||
**The axis:** How accurately does the character represent observations — to themselves, in their own internal voice?
|
||||
|
||||
**Honest — transformation logic:**
|
||||
An Honest character's monologue is self-correcting. She catches her own spin and revises it. She doesn't lie to herself to feel better. This makes her monologue have a characteristic pattern: initial reaction, then correction.
|
||||
|
||||
- Self-correction appears: "Kael's fine. — No. He's not fine."
|
||||
- Less motivated reasoning: she acknowledges evidence she doesn't want to see
|
||||
- The voice is slightly more uncomfortable with its own conclusions
|
||||
- She doesn't minimize things that scare her
|
||||
|
||||
**Deceptive — transformation logic:**
|
||||
A Deceptive character's internal voice shows motivated reasoning. She rationalizes what she wants to be true. She notices threatening evidence and then explains it away. This is not dishonest *about others* — it's dishonest with herself.
|
||||
|
||||
- Conclusions favor the preferred reading: "Kael's meeting someone I don't know. Probably work."
|
||||
- Dismissal appears quickly after observation: "Could be nothing. Probably is nothing."
|
||||
- She notices the tell and then chooses not to follow it
|
||||
- The voice has a self-soothing quality, particularly under threat
|
||||
|
||||
**How this inflects each character:**
|
||||
- *Honest smuggler / Honest detective:* Harder on themselves. The self-correction pattern creates vulnerability — they see things they don't want to see and say so.
|
||||
- *Deceptive smuggler / Deceptive detective:* The internal voice becomes unreliable in a new way (D-016 establishes the unreliable narrator function — this makes it more pronounced). They rationalize the FRIEND contradiction longer. The player has to read against the grain.
|
||||
|
||||
**Mellanie — write 2-3 example rewrite pairs: same observation, Honest version vs. Deceptive version.**
|
||||
|
||||
---
|
||||
|
||||
### 2.3 Compassionate ↔ Ruthless
|
||||
|
||||
**The axis:** How much does concern for others' wellbeing inflect the character's internal assessment?
|
||||
|
||||
**Compassionate — transformation logic:**
|
||||
A Compassionate character's first read of a situation is through the lens of what it means for people she cares about. She identifies the person most likely to be hurt before she identifies the operational implication.
|
||||
|
||||
- People-first sequencing: observation of person → emotional assessment → operational conclusion
|
||||
- Concern is named: "Naia looks exhausted. Something's wrong at home."
|
||||
- She personalizes abstract threats: not "ring security is compromised" but "Kael could get caught"
|
||||
- Moral weight is felt quickly and stays present
|
||||
|
||||
**Ruthless — transformation logic:**
|
||||
A Ruthless character assesses utility before empathy. She notices a threat and immediately calculates how to neutralize it, including through people. This is not cruelty — it's a habit of assessment that puts operational outcome first.
|
||||
|
||||
- Utility assessment appears early: "Kael's behavior is risky. If he cracks, he takes the route with him."
|
||||
- Moral weight is noted and set aside: "He might not deserve this. Doesn't matter right now."
|
||||
- People are resources first: "Maret's nervous. That's usable."
|
||||
|
||||
**How this inflects each character:**
|
||||
- *Compassionate smuggler:* Most Naia-and-Kael-focused. Her FRIEND arc lines emphasize relationship cost over operational cost. She confronts Kael later because she keeps hoping he'll explain.
|
||||
- *Ruthless smuggler:* Calculates exposure fast. Cuts contact with Kael earlier once he's flagged. Sees Naia's distress as a data point about Kael's reliability, not as a human problem.
|
||||
- *Compassionate detective:* The Sera question hits harder and sooner. He identifies the personal cost before the institutional obligation.
|
||||
- *Ruthless detective:* Uses Sera's knowledge instrumentally. The friendship is real, but usable.
|
||||
|
||||
**Mellanie — write 2 example rewrite pairs per character: the same FRIEND-arc moment in Compassionate vs. Ruthless voice.**
|
||||
|
||||
---
|
||||
|
||||
### 2.4 Curious ↔ Incurious
|
||||
|
||||
**The axis:** Does the character lean into questions they can't immediately answer, or redirect to what they know?
|
||||
|
||||
**Curious — transformation logic:**
|
||||
A Curious character asks more internal questions, including questions she can't answer. She sits with open threads longer. She generates hypotheses and lets them hang.
|
||||
|
||||
- Questions multiply before resolving: "What was Kael doing there? Who was that? Is the route changing? Is Nils moving the window?"
|
||||
- The voice has more speculative energy — she follows the thread
|
||||
- She notices more at the margins: background details, things that don't connect yet
|
||||
- Open-endedness is comfortable
|
||||
|
||||
**Incurious — transformation logic:**
|
||||
An Incurious character categorizes and moves on. She notices, files, and redirects to the actionable. Open questions without operational payoff are dead weight.
|
||||
|
||||
- Questions resolve fast or don't appear: "That's wrong." Not "Is that wrong? Why?"
|
||||
- The voice is more efficient, less ruminative
|
||||
- She notices less at the margins — processes what's relevant
|
||||
- Ambiguity is uncomfortable; she resolves it one way or another and moves
|
||||
|
||||
**Mellanie — write 1-2 example rewrite pairs: same observation, Curious vs. Incurious voice.**
|
||||
|
||||
---
|
||||
|
||||
### 2.5 Social ↔ Reclusive
|
||||
|
||||
**The axis:** How much does the character define situations through social relationships vs. environmental or operational facts?
|
||||
|
||||
**Social — transformation logic:**
|
||||
A Social character's monologue is populated. She mentions people when she could just mention actions. She frames operations through the network.
|
||||
|
||||
- People are named when not necessary: "The route's clear. Kael cleared it."
|
||||
- She reads absence: "Where's Renn today? He's always here at this hour."
|
||||
- Mood-reads appear: "Voss is different today. Tired, or something else."
|
||||
|
||||
**Reclusive — transformation logic:**
|
||||
A Reclusive character's monologue is depopulated. People appear when they're directly relevant. The environment and operation carry more weight.
|
||||
|
||||
- Operations are mentioned without actors: "Route's clear." Not "Kael cleared the route."
|
||||
- Absence of people is comfortable: she doesn't notice it
|
||||
- The environment gets more attention: she describes the space, the sounds, the texture
|
||||
|
||||
**Mellanie — write 1-2 example rewrite pairs: same moment, Social vs. Reclusive voice.**
|
||||
|
||||
---
|
||||
|
||||
## Chapter 3: Background-Dependent Phrasing
|
||||
|
||||
Character background (selected at game start) shapes three things in monologue: the idioms and references the character uses, the assumptions they make about institutions and authority, and how they frame the moral dimension of what's happening in Sova Transit District.
|
||||
|
||||
Three backgrounds for v0.1:
|
||||
|
||||
| Background | Core assumption | Relationship to institutions |
|
||||
|-----------|----------------|------------------------------|
|
||||
| **Guardian** | Institutions serve the powerful; collective protection requires network | Distrust of Commission; network solidarity as primary value |
|
||||
| **Senator** | Systems can be worked; leverage and process are the tools | Works within institutions while managing them; political capital logic |
|
||||
| **Worker** | Survival in tight margins; coworker loyalty is the only reliable thing | Neither trusts institutions nor fights them; accepts them as weather |
|
||||
|
||||
---
|
||||
|
||||
### 3.1 Guardian Background
|
||||
|
||||
**Narrative framing:** Someone with Guardian background has, at some point, been in a network that operated outside or against institutional authority — Guardians of Autonomy, community mutual aid, or simply lived experience of Commission overreach in their origin system. They think in terms of *who protects whom* and *who's watching*. They're not necessarily political; they may have absorbed these values experientially without ideological labels.
|
||||
|
||||
**How it inflects the smuggler:**
|
||||
The ring's activities are, to a Guardian-background smuggler, a natural extension of the protective network logic she already believes in. She doesn't see herself as a criminal — she sees herself as part of a system that serves people the regulated system won't. This changes how she frames the ring's cargo: medical lattice components aren't contraband, they're access. The Commission's regulation is a monopoly problem, not a safety protection.
|
||||
|
||||
Her monologue references network solidarity: "We look after our own" is a value, not just a statement. When the network is threatened (Kael's situation), her response is to protect, not to report. The Commission is not a solution to her problems — it's the problem with different uniforms.
|
||||
|
||||
Idiom signals: phrases that imply collective or mutual protection ("we look after our own," "this keeps us safe," "not their business"), references to surveillance as adversarial ("they're watching the corridors closer"), reflexive Commission-skepticism ("another Commission inspection" carries more weight, more contempt).
|
||||
|
||||
**Mellanie — write 2 examples:** (a) Guardian-background smuggler entering The Terminal on a normal morning; (b) Guardian-background smuggler seeing the detective for the first time.
|
||||
|
||||
**How it inflects the detective:**
|
||||
A Guardian-background detective is in a structurally uncomfortable position: she believes in a community's right to self-determination but is employed by the institution that overrides it. She may have unexamined tension between her institutional role and her network values. Her internal voice sometimes catches itself applying institutional logic and stops — not from disloyalty, but from the habit of checking whether what she's doing serves people or just process.
|
||||
|
||||
This creates a more nuanced reading of the ring: she notices earlier that it isn't weaponry, that the people running it aren't villains, that the moral picture is complicated. The analytical frame doesn't disappear — it processes the evidence correctly — but the conclusion "this is a crime" arrives with more friction than for a default-background detective.
|
||||
|
||||
Idiom signals: slight Commission-skepticism applied to her own role, instinct toward community protection over prosecution, "who does this actually hurt?" appears as an internal question earlier in the arc.
|
||||
|
||||
**Mellanie — write 2 examples:** (a) Guardian-background detective walking through The Terminal for the first time; (b) Guardian-background detective after a confrontation with Voss that didn't land.
|
||||
|
||||
---
|
||||
|
||||
### 3.2 Senator Background
|
||||
|
||||
**Narrative framing:** Senator background means exposure to Concord Assembly political culture — either through family, prior work, or a posting in an administrative center. This character thinks in terms of leverage, political capital, and institutional process as tools to be used. They believe in systems (not naively — they've seen how they work), they communicate strategically, and they think about consequences in terms of how they're recorded and remembered.
|
||||
|
||||
**How it inflects the smuggler:**
|
||||
A Senator-background smuggler is an unusual animal. She ended up on Sova with this background for reasons that suggest a fall — political family, bad posting, something that deposited her in freight work. She still thinks in political terms. The ring is, to her, a structure with power dynamics that can be managed. She assesses Nils as a faction leader, Voss as a compromisable middle manager, Kael as an uncertain ally. She has more framework for navigating institutional pressure than the default smuggler.
|
||||
|
||||
Her monologue carries strategic calculation that the default smuggler doesn't have: "If Nils moves against us, who has leverage over Nils?" She names power structures. She's more comfortable with authority figures because she spent time being one or adjacent to one.
|
||||
|
||||
Idiom signals: political vocabulary deployed in operational context ("who holds the leverage here," "what does this cost us politically," "that's a favor spent"), more awareness of chain of command, comfort with complexity and multiple-move thinking.
|
||||
|
||||
**Mellanie — write 2 examples:** (a) Senator-background smuggler reading a tense moment between Voss and Nils; (b) Senator-background smuggler deciding whether to warn Kael about the detective.
|
||||
|
||||
**How it inflects the detective:**
|
||||
A Senator-background detective is most at home in the Commission's formal institutional structure. He knows how to work the process because he's seen political process at close range. He's less likely to be frustrated by bureaucratic obstacles and more likely to use them as tools. He's also more aware of how investigations can be used politically — and more careful to distinguish between evidence that serves justice and evidence that serves someone's career.
|
||||
|
||||
This can work two ways: he's more sophisticated about when to file and when not to, and he's more aware that the ring is a political problem as well as a criminal one. The Syndic connections in the ring's supply chain are visible to him as political economy, not just logistics.
|
||||
|
||||
Idiom signals: references to political process ("that'll go on record," "who is this actually going to serve"), awareness of institutional optics, formal courtesy in internal voice (he holds standards in private that mirror public institutional expectations).
|
||||
|
||||
**Mellanie — write 2 examples:** (a) Senator-background detective receiving unhelpful cooperation from Maret (deflection, formal compliance); (b) Senator-background detective realizing Sera has evidence she hasn't reported.
|
||||
|
||||
---
|
||||
|
||||
### 3.3 Worker Background
|
||||
|
||||
**Narrative framing:** Worker background is the default — or close to it. Born and raised in the working logistics economy of a station or freight hub. Grew up with shift schedules, margin pressure, and coworker bonds as primary social fabric. Institutions are not enemies (the Guardian stance) or tools (the Senator stance) — they're weather. You work around them when you can, you deal with them when you can't, and you don't waste energy on ideology about them.
|
||||
|
||||
**How it inflects the smuggler:**
|
||||
The Worker-background smuggler is the closest to the spec as written — she *is* the baseline. The ring isn't an ideological project; it's a response to economic conditions. The moral dimension is simple: this is what keeps people fed. She doesn't dress it up. She doesn't philosophize about Commission regulation. She just runs the job.
|
||||
|
||||
Her monologue about the ring's cargo is practical, not moral: "Medical components. That's for people who need lattice work they can't afford." She's not celebrating it. She's explaining it to herself, briefly, and moving on. She's the character most likely to be genuinely conflicted when the ring puts people she knows at risk — because she joined for community, and the community is now in danger.
|
||||
|
||||
Idiom signals: shift-economy references ("that's a week's pay gone"), physical work vocabulary, coworker solidarity language that's practical not sentimental ("you cover for your people"), no ideological framing.
|
||||
|
||||
**Mellanie — write 2 examples:** (a) Worker-background smuggler after a long shift where nothing went wrong (genuine relief in mundane form); (b) Worker-background smuggler finding out about Kael's corridor meeting.
|
||||
|
||||
**How it inflects the detective:**
|
||||
A Worker-background detective is a less common institutional profile — someone who came up from the logistics world, or the adjacent working community of a station, and then entered Commission work. This creates the most dramatic read of the Sova Transit District: he *knows* what this world looks like from inside. The community's distrust of him isn't abstract — he grew up in a community that had this relationship with Commission investigators.
|
||||
|
||||
His analytical frame is the same, but its application produces a different emotional texture. He reads Voss not just as a shift supervisor but as someone managing his people in a system that gives them no margin. He reads the ring not just as a crime but as what people do when the legal option doesn't work. He's not excusing it — but he's explaining it to himself in ways a Senator-background detective wouldn't.
|
||||
|
||||
Idiom signals: working vocabulary that leaks through the institutional frame ("another form to fill out" with genuine frustration), more personal reads on community behavior, faster comprehension of coworker loyalty dynamics.
|
||||
|
||||
**Mellanie — write 2 examples:** (a) Worker-background detective entering The Terminal and recognizing it as a place he knows in his bones; (b) Worker-background detective having a moment of sympathy for Kael that he then has to file away.
|
||||
|
||||
---
|
||||
|
||||
## Chapter 4: Mood Modifiers
|
||||
|
||||
The 8+1 moods from D-035 (`neutral`, `anxious`, `frustrated`, `content`, `suspicious`, `warm`, `hostile`, `focused`) are line-selection tags and delivery expectations. They work together: a line tagged `mood: anxious` is preferred when the character's current mood state is Anxious, and it is *authored to sound anxious*.
|
||||
|
||||
Mood modifiers are **not separate line pools.** They are a) selection weights that surface mood-appropriate lines, and b) authoring constraints on how lines in a given mood register should feel. The goal is not that the player is explicitly told "you're anxious now" — it's that anxious-mood lines surface when they should and sound anxious when they play.
|
||||
|
||||
### 4.1 The Core Principle: Mood Inflects Register
|
||||
|
||||
Each mood bends the character's voice toward a version of itself. The base register (Chapter 1) doesn't change. The mood is an adjective applied to that register, not a replacement for it.
|
||||
|
||||
| Mood | Smuggler inflection | Detective inflection |
|
||||
|------|-------------------|---------------------|
|
||||
| `neutral` | Baseline. Dry warmth. Measured. | Baseline. Professional. Structured. |
|
||||
| `anxious` | Goes smaller and faster. More questions. Physical sensation surfaces. | Goes shorter and more personal. Contractions increase. Self-directs. |
|
||||
| `frustrated` | Goes flat. Sarcasm. "Of course." | Sardonic understatement. Cold. |
|
||||
| `content` | Warms, expands slightly. More humor. | Structured satisfaction. Humor surfaces. |
|
||||
| `suspicious` | Narrows. More observation of specific people. Hypotheses pile up. | Files faster. More quantification. "Coincidence?" frequency increases. |
|
||||
| `warm` | More name-drops. Affectionate observations. Longer people-reads. | First-name register expands beyond Sera. More personal disclosure. |
|
||||
| `hostile` | Edges. Fewer words about the hostile object. Watchful. | Clinical distance increases. Dehumanizing label (surname-only). |
|
||||
| `focused` | Strips down. Only the current task. Environmental and NPC data pruned ruthlessly. | Most structured voice. Near-mechanical. Labels and flags only. |
|
||||
|
||||
---
|
||||
|
||||
### 4.2 Mood Modifier Details
|
||||
|
||||
**`neutral` — baseline delivery**
|
||||
|
||||
Both characters at their natural resting state. Not happy, not stressed. Working. This is the voice that carries most of the game's content. Lines tagged `neutral` or untagged should default to this register.
|
||||
|
||||
Key authoring note: Neutral smuggler is NOT flat or bland — she has dry warmth and laconic humor. Neutral detective is NOT cold — he has professional engagement and occasional wry observation. "Neutral" means the voice is itself, not that the voice is suppressed.
|
||||
|
||||
**`anxious` — compression and acceleration**
|
||||
|
||||
The threat or uncertainty feels present. The character's cognitive bandwidth is partially occupied by monitoring something they can't resolve.
|
||||
|
||||
- *Smuggler:* Sentences get shorter. Questions pile up. Physical sensation surfaces ("Hands are cold." / "Stomach's tight."). Humor disappears. First names become clipped. The operational countdown appears as a comfort mechanism — counting what she can control.
|
||||
- *Detective:* Contractions multiply. Complete sentences break up. Self-monitoring appears ("I'm too close to this."). The analytical questions become self-directed rather than case-directed. Physical sensation barely surfaces but does: "Need to focus."
|
||||
|
||||
Lines tagged `mood: anxious` should feel compressed. Not panicked — the characters are experienced — but alert in a way that presses on the surface of the text.
|
||||
|
||||
**`frustrated` — controlled deflation**
|
||||
|
||||
Something isn't working. The block is structural, not threatening.
|
||||
|
||||
- *Smuggler:* Flat declarations. Sarcastic understatement. "Of course." / "Great." Dark humor returns — she goes wry under frustration. Names get blamed: "Voss did it again." Swearing surfaces (mild — the character swears, but not obscenely).
|
||||
- *Detective:* Sardonic compression. Dismissive shorthand: "Standard." meaning the opposite. The institutional frame holds but it fits uncomfortably. He doesn't swear; frustration surfaces as brittle patience.
|
||||
|
||||
Lines tagged `mood: frustrated` should feel like controlled flat. Both characters have learned not to waste anger — they spend it in specific, pointed ways.
|
||||
|
||||
**`content` — expansion and warmth**
|
||||
|
||||
Things are working. The current moment is manageable or even good.
|
||||
|
||||
- *Smuggler:* Slight expansion — still short, but more generous. More humor. First names carry warmth. Environmental description picks up (she actually notices the space when she's not scanning for threats). "Home sweet home" is a content line.
|
||||
- *Detective:* More complete and elegant sentences. Humor surfaces without prompting. The analytical frame fits comfortably — it's doing its job. Fewer corrective self-directives.
|
||||
|
||||
Lines tagged `mood: content` are the hardest to write because they need to feel genuinely good without being saccharine. The character's voice remains itself; it just sits in it more easily.
|
||||
|
||||
**`suspicious` — narrowing and intensification**
|
||||
|
||||
Something's off. The character's attention is directing toward a specific object or pattern.
|
||||
|
||||
- *Smuggler:* More NPC-specific observation. Questions multiply around the specific person or thing. Hedges fall off — she trusts her read. Operational contingency thinking activates: "If that's what I think it is, then..."
|
||||
- *Detective:* Filing rate increases. "Coincidence?" appears more. He cross-references against baseline more explicitly. The analytical questions become hypotheses rather than open threads.
|
||||
|
||||
Lines tagged `mood: suspicious` should feel *directed*. The suspicion has an object — even if the character can't name it yet. The voice narrows toward whatever is generating the suspicion.
|
||||
|
||||
**`warm` — relational softening**
|
||||
|
||||
The character is in a moment of genuine positive connection. This is not `content` (good situation) — this is specifically warm *toward someone*.
|
||||
|
||||
- *Smuggler:* More name-drops with positive color. People-reads are generous and long. She notices when someone seems well, not just when they seem off. Humor becomes inclusive rather than dry. She might express something like affection, obliquely.
|
||||
- *Detective:* First-name register expands beyond Sera — he might first-name someone he normally surnames if the moment calls for it. Personal disclosure is slightly more available. The analytical frame softens: he observes without immediately filing.
|
||||
|
||||
Lines tagged `mood: warm` are most visible in the detective because they represent a departure from his baseline. For the smuggler, warmth is closer to her baseline; the lines should be a slightly more saturated version of her natural register.
|
||||
|
||||
**`hostile` — clinical or defensive reduction**
|
||||
|
||||
The relationship to the hostile object is adversarial. The character is managing threat.
|
||||
|
||||
- *Smuggler:* Less said, more watched. She goes quiet around the hostile object — mentions them tersely, observations are monitoring-reads rather than social-reads. "Nils walked past." Period. No color.
|
||||
- *Detective:* Dehumanizing label returns even for NPCs who have previously graduated to first-name in his monologue. "Venn, S." instead of "Sera" signals the relationship has turned. Analytical lines about the hostile object are more clinical.
|
||||
|
||||
Lines tagged `mood: hostile` should feel like distance enforced deliberately. Neither character becomes cruel — cruelty requires emotional investment. The hostile register is managed withdrawal.
|
||||
|
||||
**`focused` — operational reduction**
|
||||
|
||||
The character is executing a task. Everything not relevant is stripped out.
|
||||
|
||||
- *Smuggler:* The operational countdown is at maximum. Times, routes, names in task-relevant order. Environmental texture disappears. People are reduced to their role in the current operation. She's not cold — she's locked in.
|
||||
- *Detective:* The analytical frame at its most mechanical. Labels only. No editorial. "Terminal. Commission access. Logging in." He strips his voice to the minimum that keeps the investigation moving.
|
||||
|
||||
Lines tagged `mood: focused` should feel efficient to the point of austerity. For the smuggler especially, this is the mode that feels most competent — she's at her best when she's locked in.
|
||||
|
||||
---
|
||||
|
||||
### 4.3 Mood-as-Selection-Weight (Technical Note for Gestalt)
|
||||
|
||||
The mood tags on monologue lines function as selection weights in the engine:
|
||||
|
||||
1. The simulation produces a current `mood_state` for the player character (server-side, from the mood system in #323)
|
||||
2. The line selection system applies a weight bonus to lines tagged with the matching mood
|
||||
3. Lines tagged `mood: [neutral]` or untagged are always eligible; lines tagged with specific moods are preferred when the mood matches
|
||||
|
||||
**The same base line should NOT be re-authored per mood.** A smuggler entering The Terminal does not need 9 `enter_location` variants (one per mood). The system should:
|
||||
- Select from the available `enter_location` pool
|
||||
- Apply mood-weight bonuses to lines with the matching mood tag
|
||||
- Ensure at least 1-2 lines per trigger/location have each major mood tagged
|
||||
|
||||
For FRIEND arc content specifically, mood-specific variants are most valuable at crisis beats (Phase 3-4 of the arc), where the emotional register shifts dramatically and the mood state is predictable. Authors should prioritize mood-tagging for:
|
||||
- Post-contradiction observation lines (likely `suspicious` or `anxious`)
|
||||
- Post-confrontation post-conversation lines (likely `warm` → `hostile` transition zone)
|
||||
- Contaminated trust time_idle lines (likely `suspicious` + `warm` collision)
|
||||
|
||||
---
|
||||
|
||||
## Chapter 5: Modifier Combination Logic
|
||||
|
||||
Traits, backgrounds, and moods interact. Some combinations have emergent properties:
|
||||
|
||||
**High coherence combinations** (reinforce each other):
|
||||
- Cautious + Guardian background: more second-guessing of institutional solutions, more checking of network alternatives
|
||||
- Bold + Ruthless: decisive and instrumental — the fastest decision-maker, for better or worse
|
||||
- Compassionate + Worker background: the character who most viscerally feels the human cost of what's happening to Kael and Naia
|
||||
- Suspicious mood + Curious trait: questions multiply exponentially — the character follows every thread simultaneously
|
||||
|
||||
**High tension combinations** (create internal conflict):
|
||||
- Honest + Deceptive situation (character who can't self-lie encountering a situation where she needs to): the monologue catches itself mid-rationalization and overrides it
|
||||
- Ruthless + warm mood: the warmth is visible and slightly uncomfortable — the character senses she's letting her guard down, notes it
|
||||
- Senator background + Worker background idioms (where the character's formation bleeds through the professional veneer): the occasional shift vocabulary surfaces in otherwise formal speech
|
||||
|
||||
**FRIEND arc special case:**
|
||||
Trait and background modifiers should be considered especially carefully for lines in the FRIEND arc. The same arc beat — "Kael met someone I don't know" — produces dramatically different emotional readings depending on trait combination:
|
||||
|
||||
| Trait | Smuggler's first-move internal response to the Kael contradiction |
|
||||
|-------|------------------------------------------------------------------|
|
||||
| Cautious | Checks herself: "Maybe it's nothing. There could be a work reason." (sits with it longer) |
|
||||
| Bold | Names it immediately: "That's a breach. Kael met someone unauthorized." |
|
||||
| Compassionate | Worries about Kael first: "What's he gotten himself into?" |
|
||||
| Ruthless | Calculates exposure: "How much does this contact know?" |
|
||||
| Honest | Won't minimize: "He was there. That wasn't anyone we know." |
|
||||
| Deceptive | Minimizes: "Kael's allowed his own contacts. It's fine." (not fine) |
|
||||
|
||||
These aren't separate arc paths — they're the same arc with different pacing and emotional texture. A Cautious smuggler reaches the confrontation later. A Bold one gets there faster and possibly too fast. The arc is the same. The voice is not.
|
||||
|
||||
---
|
||||
|
||||
## Appendix: Background Phrasing Quick Reference
|
||||
|
||||
For Mellanie — a vocabulary guide per background to use when writing example lines:
|
||||
|
||||
**Guardian background idioms:**
|
||||
- "Looking out for your people" / "covering for each other" (protection network language)
|
||||
- References to Commission as "them," surveillance as a threat
|
||||
- Collective pronouns where others might use "I": "we don't report things like this"
|
||||
- Suspicion of institutional solutions: "who does that actually serve?"
|
||||
|
||||
**Senator background idioms:**
|
||||
- "On record" / "that goes on record" / "recorded as"
|
||||
- Leverage vocabulary: "what does that cost us," "who holds the note on that"
|
||||
- Chain-of-command awareness: "above Nils" / "below Voss on that"
|
||||
- Process language: "formally," "through channels," "the filing on that says"
|
||||
|
||||
**Worker background idioms:**
|
||||
- Shift-economy references: "that's a week's difference," "shift schedule says"
|
||||
- Practical solidarity: "you cover your people," "that's what you do"
|
||||
- Acceptance of conditions: "that's how the station runs" (not resigned — just realistic)
|
||||
- Concrete physical references: "the smell of cargo lubricant," "my feet ache"
|
||||
|
||||
---
|
||||
|
||||
*Narrative framing complete as of 2026-02-20. Mellanie to supply example lines for all section prompts marked "Mellanie — write X examples." Gestalt to validate mood → delivery mappings in Chapter 4 for mechanical coherence with server-side mood system (#323).*
|
||||
|
||||
---
|
||||
|
||||
## Gestalt — Mood → Delivery Validation (2026-02-20)
|
||||
|
||||
**Status: RESOLVED — schema renamed Sprint 14 to match voice guide vocabulary.**
|
||||
|
||||
Schema and Rust `Mood` enum updated to use Chapter 4 names directly: `anxious`, `frustrated`, `content`, `suspicious`, `warm`, `hostile`, `relieved`, `focused`. Neutral mood = omit tag (untagged lines are always eligible). `analytical` and `conflicted` dropped (merged into `focused` and modeled as `suspicious`+`warm` collision respectively). `hostile` added. Authors can now use voice guide mood names directly in YAML files.
|
||||
|
||||
### Mood as selection weight — mechanical coherence
|
||||
|
||||
The selection model in Section 4.3 is mechanically coherent with how the pipeline works:
|
||||
- Line pool query returns all eligible lines (pass Layers 1-3)
|
||||
- Layer 4 (topic + mood) applies weights, not hard filters — correct
|
||||
- Untagged lines remain eligible — correct
|
||||
- Mood-tagged lines are preferred when mood matches — correct
|
||||
|
||||
**Trait modifier system (Chapters 2-3):** Mechanically coherent. Traits are authoring modifiers, not runtime filters. No engine-side trait tracking needed for monologue. The authoring guide is sufficient.
|
||||
|
||||
**FRIEND arc special case (Section 4.3):** The note about prioritizing mood-tagging for crisis beats is correct. The collision of `suspicious` + `warm` as the trust-contamination zone is the right call.
|
||||
|
||||
**Mood → delivery validation: PASS.** The delivery model is mechanically coherent. Vocabulary mismatch resolved. All mood system design approved.
|
||||
@@ -1,251 +0,0 @@
|
||||
# THE FRIEND: Contradiction Arc Pattern
|
||||
|
||||
**Ticket:** #332 | **Priority:** Medium | **Sprint:** 12
|
||||
**Status:** v0.1 Draft
|
||||
**Owner:** Paula
|
||||
**Blocked by:** #297 (Kael Davan profile — done), #298 (Sera Venn profile — done)
|
||||
**Decisions referenced:** D-034 (THE FRIEND pattern), D-035 (tag taxonomy), D-039 (wow moment #3), D-041 (knowledge graph), D-062 (invisible locked options), D-063 (confrontation mechanics)
|
||||
|
||||
---
|
||||
|
||||
## 1. What This Document Is
|
||||
|
||||
A reusable design pattern document extracted from the two concrete THE FRIEND implementations: Kael Davan (smuggler's FRIEND) and Sera Venn (detective's FRIEND). Both are complete. Both worked. This document captures the structural logic they share so that future FRIEND NPCs can be authored consistently and quickly.
|
||||
|
||||
The pattern is called the **Contradiction Arc**. It is not a mystery. It is not a betrayal in the conventional sense. It is the discovery that someone the player trusts is carrying something they haven't shared — and that what they're carrying changes everything the player thought they understood about the relationship.
|
||||
|
||||
---
|
||||
|
||||
## 2. The Pattern: Definition
|
||||
|
||||
A Contradiction Arc is a 5-phase character trajectory built around a single observable contradiction that the player discovers through spatial observation, not through dialogue. The contradiction is:
|
||||
|
||||
- **Observable**: The player sees it happen. No NPC tells them. No dialogue flag. No notification.
|
||||
- **Spatially staged**: The contradiction is a behavioral deviation from expected routine (wrong location, wrong time, wrong person, wrong pattern).
|
||||
- **Morally complex**: THE FRIEND's concealment comes from care or fear, not malice. There is no clean resolution.
|
||||
- **Dual-lens resonant**: The same contradiction means something different to each playable character. The second playthrough recontextualizes the first.
|
||||
|
||||
---
|
||||
|
||||
## 3. The 5 Phases
|
||||
|
||||
### Phase 1: Baseline Warmth (0-10 minutes)
|
||||
|
||||
**Purpose:** Establish the relationship BEFORE the contradiction. Create genuine attachment so the discovery has emotional weight.
|
||||
|
||||
**Mechanics:**
|
||||
- THE FRIEND is warm, reliable, helpful. Their dialogue is at surface/real trust for their relationship tier.
|
||||
- Monologue during this phase is fond, casual, present-tense. No hints of incoming trouble.
|
||||
- THE FRIEND's routine is consistent with their stated role. No behavioral deviations.
|
||||
- Their personal tell (the observable habit that will become load-bearing later) is established here — but reads as innocuous.
|
||||
|
||||
**Content authoring rule:** Write Phase 1 as if it is the whole story. The warmth must be real, not performed. If the player never discovers the contradiction, Phase 1 should feel like a complete, satisfying relationship.
|
||||
|
||||
**Tag notes:**
|
||||
- Dialogue: `trust: surface` (greeting, small talk) + `trust: real` (personal warmth, shared history)
|
||||
- Monologue: positive mood tags (content, fond, warm)
|
||||
|
||||
**Kael example:** "Kael's already at the dock. Good. The day's better when he's on shift."
|
||||
**Sera example:** "Good to see Sera. She always was the reliable one. At least someone in this district speaks my language."
|
||||
|
||||
---
|
||||
|
||||
### Phase 2: First Behavioral Shift (10-15 minutes)
|
||||
|
||||
**Purpose:** Introduce behavioral tells that the observant player might notice — but that have plausible innocent explanations.
|
||||
|
||||
**Mechanics:**
|
||||
- THE FRIEND's behavior changes in small ways. Shortened interactions. Increased action frequency (lattice checking, looking around). Redirected attention.
|
||||
- These are observable but not alarming. A non-observant player may not register them at all.
|
||||
- The monologue shifts to mild concern or puzzlement. "Not like them to be..." registers something without naming it.
|
||||
- THE FRIEND's dialogue remains warm at the surface level. The behavioral tells exist beneath the dialogue.
|
||||
|
||||
**Content authoring rule:** Every tell in Phase 2 must have a non-suspicious explanation AND a suspicious one. The player who discovers the contradiction on a second playthrough should recognize these tells as load-bearing. The player experiencing them for the first time should accept the innocent explanation.
|
||||
|
||||
**Tag notes:**
|
||||
- Dialogue: same trust tiers as Phase 1 — surface content unchanged
|
||||
- Monologue: mild concern tone; `trigger: observe_anomaly` for behavioral tell moments
|
||||
- Tell system: all Phase 2 tells fire with `visible_to: peripheral` or `visible_to: any`
|
||||
|
||||
**Kael example:** "Kael's distracted today. Checks his lattice more than usual. Probably nothing."
|
||||
**Sera example:** "Sera left early. 'Headache,' she said. First time she's done that."
|
||||
|
||||
---
|
||||
|
||||
### Phase 3: The Contradiction (15-20 minutes)
|
||||
|
||||
**Purpose:** The observable contradiction. THE FRIEND is in the wrong place, doing the wrong thing, with the wrong person — and the player sees it.
|
||||
|
||||
**Mechanics:**
|
||||
- Spatial staging: THE FRIEND deviates from their established routine in a way that is spatially visible to the player. This is NOT communicated through dialogue or UI. The player moves through the world and encounters the deviation.
|
||||
- The contradiction must be observable without being forced. The player discovers it; the game does not direct them to it. However, the contradiction is staged in a location the player will naturally visit in the course of normal gameplay.
|
||||
- The monologue fires on `trigger: observe_anomaly` or `trigger: witness_interaction`. It names what the player has seen without drawing a conclusion. The character asks the question; the player supplies the answer.
|
||||
- **Entity color shifts** at this moment: `Friendly` (green) → `PersonOfInterest` (amber). The visual system registers what the player has just observed.
|
||||
- **Dialogue tiers lock**: The discovery creates a relationship fracture. Insider/peer warmth content becomes unavailable. Only public/surface dialogue remains for this NPC going forward. The absence is the signal.
|
||||
|
||||
**Content authoring rule:** The contradiction must be:
|
||||
1. Spatially clear (the player can see what is happening)
|
||||
2. Contextually ambiguous (they understand WHAT but not WHY)
|
||||
3. Emotionally weighted (the relationship context makes the "what" feel like a wound)
|
||||
|
||||
**Tag notes:**
|
||||
- Monologue at discovery: `trigger: witness_interaction` or `trigger: observe_anomaly`, `mood: [shocked, analytical]`
|
||||
- Monologue should name the observation, not the interpretation
|
||||
- KG update: `contradiction_flagged: true`, relationship shifts to PersonOfInterest
|
||||
|
||||
**Kael example:** "That's Kael. But who's he talking to? I don't know that face. And that's not anyone from our rotation."
|
||||
**Sera example:** "That's the third time. Sera leaves when Torek walks in. Three different excuses. Same result."
|
||||
|
||||
---
|
||||
|
||||
### Phase 4: Confrontation Opportunity (20-25 minutes)
|
||||
|
||||
**Purpose:** Give the player the option to press THE FRIEND. The confrontation dialogue reveals concealment without full confession.
|
||||
|
||||
**Mechanics:**
|
||||
- A new dialogue option appears (D-062 — invisible until unlocked; players won't see it until the contradiction triggers it). The option is written in the character's internal voice (D-063).
|
||||
- THE FRIEND deflects. They give an answer that is technically not a lie, but is not the truth. Their personal tell fires during the deflection — the tell established in Phase 1 becomes the proof that they're hiding something.
|
||||
- The player can choose to accept the deflection, push harder, or walk away. All three paths have consequences.
|
||||
- This is the emotional peak. Whatever the player does here determines the shape of the rest of the session.
|
||||
|
||||
**Content authoring rule:** THE FRIEND's deflection must be sympathetic. They are not lying to harm the player. They are concealing because the truth would hurt someone they love, or would place them in impossible danger. The player who understands the full arc (second playthrough) recognizes the deflection as fear, not treachery.
|
||||
|
||||
**Tag notes:**
|
||||
- New dialogue option: confrontation style, `situation: [confrontation]`, `access: [peer, insider]` — only the character who has the relationship can ask this question
|
||||
- THE FRIEND's response: `trust: real` (this is as honest as THE FRIEND can be without full confession), `situation: [confrontation]`, mood that indicates concealment
|
||||
- Personal tell confirmation: observation monologue fired by THE FRIEND's specific tell behavior
|
||||
|
||||
**Kael example:** "Just a thing. Don't worry about it." [looks left before answering] / Smuggler monologue: "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."
|
||||
**Sera example:** "He's just loud. I don't like loud drunks." / Detective monologue: "She's not lying. But she's not telling me everything. Sera, what do you know?"
|
||||
|
||||
---
|
||||
|
||||
### Phase 5: Contaminated Trust (25-30 minutes)
|
||||
|
||||
**Purpose:** THE FRIEND returns to surface-normal behavior. But the player is now watching differently. Every warm interaction is filtered through doubt.
|
||||
|
||||
**Mechanics:**
|
||||
- THE FRIEND's surface behavior normalizes. They resume their routine, greet the player warmly, act as if Phase 3 and 4 didn't happen (or at least, as if they're trying to move past it).
|
||||
- But dialogue has shifted: insider/peer warmth is gone, replaced by public/surface content only. The player hears the same NPC; the texture is different. The warmth is slightly performed.
|
||||
- Monologue shifts into the contaminated register: every warm interaction generates a note of doubt. The player's observational frame has changed.
|
||||
- Three player paths diverge from here:
|
||||
- **Understanding** — gentle follow-up, possible confession, partial truth
|
||||
- **Betrayal** — report/expose THE FRIEND; relationship damage is permanent
|
||||
- **Observation** — watch and wait; the doubt lives but no confrontation happens
|
||||
|
||||
**Content authoring rule:** Phase 5 content must work for all three player paths. The NPC's surface behavior is path-neutral — they don't know what the player has decided. The player's monologue shifts based on what decision they've made (or chosen not to make yet).
|
||||
|
||||
**Tag notes:**
|
||||
- Dialogue: `trust: surface` only; warm tone but no real-tier content; `mood: [composed]` for THE FRIEND
|
||||
- Monologue: `mood: [conflicted]` or `mood: [analytical]`; prerequisite gates on relationship state PersonOfInterest
|
||||
- If player chose Understanding path: additional monologue lines for partial-confession scenario
|
||||
|
||||
**Kael example:** "Same old Kael. Same jokes, same routine. ...What are you not telling me?"
|
||||
**Sera example:** "Still the same Sera. Still reliable. ...But reliable about what?"
|
||||
|
||||
---
|
||||
|
||||
## 4. Required Content Per FRIEND NPC
|
||||
|
||||
| Content Type | Count | Notes |
|
||||
|-------------|-------|-------|
|
||||
| Phase 1 dialogue lines (warmth, establishment) | 8-12 | Across greeting, social, situation contexts |
|
||||
| Phase 1-2 monologue (fond, mild concern) | 5-8 | `trigger: observe_npc`, `trigger: post_conversation` |
|
||||
| Phase 2 behavioral tells (description + monologue) | 3+ | Each tell: visible_to, behavior, monologue line |
|
||||
| Phase 3 contradiction discovery monologue | 3-5 | `trigger: witness_interaction`, observation language only |
|
||||
| Phase 4 confrontation dialogue option (player choice) | 1 | In character's internal voice per D-063 |
|
||||
| Phase 4 THE FRIEND deflection dialogue | 3-5 | With personal tell behavior flagged |
|
||||
| Phase 4 tell confirmation monologue | 1-2 | "I know this tell. They're lying." |
|
||||
| Phase 5 contaminated-trust monologue | 4-6 | Varies by player path taken |
|
||||
| **Total authored** | **~70-100 items** | No generation expansion — all hand-authored |
|
||||
|
||||
---
|
||||
|
||||
## 5. The Tell System
|
||||
|
||||
Every FRIEND NPC has a **personal tell** — a specific behavioral marker established in Phase 1 (innocent, recognizable) and confirmed in Phase 4 (proof of concealment). The tell must:
|
||||
|
||||
1. Be **physical and observable** (not internal state — visible behavior the player can see)
|
||||
2. Be **introduced before it becomes load-bearing** — Phase 1 or early Phase 2
|
||||
3. Be **unique to this NPC** — not a generic "nervousness" tell, but a specific habit
|
||||
4. Be **explainable differently before and after** — innocent early, incriminating late
|
||||
|
||||
**Kael's tell:** Looks left before answering. Established as a habit the smuggler has observed for two years. Becomes proof of lying at Phase 4 because the smuggler knows the tell AND its meaning.
|
||||
|
||||
**Sera's tell:** Gathers her things quickly when leaving. Not a lie tell — Sera isn't lying when she leaves. But the timing (always when Torek arrives) and the variety of excuses (genuine, not scripted) creates the pattern the detective reads as behavioral.
|
||||
|
||||
**Tell design rule:** The tell should produce a different emotional register for each playable character observing it:
|
||||
- The character with the relationship reads the tell as **personal** ("I know that tell — I've seen it before")
|
||||
- The character without the relationship reads the tell as **behavioral pattern** ("That's twice now — flag it")
|
||||
|
||||
---
|
||||
|
||||
## 6. Dual-Lens Design Requirements
|
||||
|
||||
Every FRIEND NPC must produce different monologue experiences for both characters observing the same behavior. The contradiction arc has two distinct "readings":
|
||||
|
||||
| Phase | Bonded Character Reading | Other Character Reading |
|
||||
|-------|--------------------------|------------------------|
|
||||
| Phase 1 | Warmth, familiarity, fond reliance | Clinical observation, behavioral baseline, possible suspicion |
|
||||
| Phase 2 | Personal concern ("something's wrong with them") | Analytical flag ("deviation from baseline, note it") |
|
||||
| Phase 3 | Betrayal, confusion, hurt | Evidence accumulation, pattern confirmation, institutional assessment |
|
||||
| Phase 4 | Personal confrontation (uses the personal tell as confirmation) | Investigative confrontation (uses behavioral pattern as evidence) |
|
||||
| Phase 5 | Contaminated intimacy (every warm moment now suspect) | Professional caution (reliable informant now uncertain quantity) |
|
||||
|
||||
**The second-playthrough resonance:** The player who has experienced both sides of Triangle 4 understands:
|
||||
- Kael is trying to get OUT of the ring to protect Naia. His exit attempt is an act of love, not treachery.
|
||||
- Sera is protecting Naia by NOT reporting what she found. Her concealment is loyalty, not corruption.
|
||||
- The smuggler and detective are both experiencing friendship fractured by the same cause — Naia's worry about Kael, and the chain of protection that worry created.
|
||||
|
||||
This is the design. The contradiction is not "THE FRIEND is bad." The contradiction is "THE FRIEND is doing something complicated for reasons that make sense, and it's happening to YOU."
|
||||
|
||||
---
|
||||
|
||||
## 7. The No-Clean-Resolution Rule
|
||||
|
||||
Every Contradiction Arc must refuse to offer a clean resolution. This is non-negotiable.
|
||||
|
||||
**What "no clean resolution" means:**
|
||||
- Confronting THE FRIEND does not produce a confession that absolves them. It produces a partial truth that raises more questions.
|
||||
- Protecting THE FRIEND does not produce safety. It produces continued risk with the added weight of knowledge.
|
||||
- Reporting THE FRIEND does not produce justice. It produces a particular kind of harm to people who didn't deserve to be caught in the consequence.
|
||||
- Ignoring THE FRIEND does not produce peace. The doubt persists. The knowledge lives.
|
||||
|
||||
**Why this rule exists:** D-027 success criterion #3 is "after each playthrough, player names an NPC they felt conflicted about." Confliction requires that no choice was clearly right. The moment a clean resolution exists — confess = forgiven, report = solved, ignore = safe — the Contradiction Arc collapses into a problem with a correct answer. The player stops feeling conflicted and starts making optimal choices. Emotional weight requires moral weight. Moral weight requires cost on every path.
|
||||
|
||||
---
|
||||
|
||||
## 8. Content Authoring Checklist
|
||||
|
||||
Before shipping a FRIEND NPC with a Contradiction Arc, validate:
|
||||
|
||||
- [ ] Phase 1 warmth is genuine — the relationship is established as real before it's threatened
|
||||
- [ ] Phase 2 tells are pre-established in Phase 1 (not appearing for first time at contradiction)
|
||||
- [ ] Phase 3 contradiction is observable through spatial play — no dialogue/UI flag triggers it
|
||||
- [ ] Phase 3 monologue names the observation without naming the explanation
|
||||
- [ ] Phase 3 entity color shifts to amber (PersonOfInterest) at contradiction discovery
|
||||
- [ ] Phase 3 dialogue tier lock: insider/peer content unavailable post-contradiction
|
||||
- [ ] Phase 4 confrontation option appears only post-Phase 3 (D-062 invisible until unlocked)
|
||||
- [ ] Phase 4 confrontation written in character's internal voice (D-063)
|
||||
- [ ] Phase 4 THE FRIEND's deflection is sympathetic — they're concealing, not lying maliciously
|
||||
- [ ] Phase 4 personal tell fires during deflection and is confirmed in monologue
|
||||
- [ ] Phase 5 content exists for all three player paths (Understanding / Betrayal / Observation)
|
||||
- [ ] Dual-lens notes written for both characters on every key monologue trigger
|
||||
- [ ] No clean resolution on any player path
|
||||
- [ ] Total authored content: 70-100 items
|
||||
|
||||
---
|
||||
|
||||
## 9. Application to Future FRIEND NPCs
|
||||
|
||||
This pattern is designed to be reused. When designing a future FRIEND NPC for a new template:
|
||||
|
||||
1. **Identify the concealment.** What is THE FRIEND hiding, and WHY? The why must be sympathetic. "Protecting someone they love" or "fear of consequences" — not "because they're secretly bad."
|
||||
2. **Design the contradiction.** What does the player OBSERVE that breaks the baseline? It must be spatial and behavioral, not told.
|
||||
3. **Design the tell.** What physical habit is introduced in Phase 1 that becomes load-bearing in Phase 4? It must be specific to this NPC.
|
||||
4. **Map the dual-lens difference.** How does the bonded character read the contradiction differently from the observing character? The emotional register must diverge.
|
||||
5. **Refuse the clean resolution.** What does each of the three player paths cost? If any path costs nothing, revise.
|
||||
|
||||
---
|
||||
|
||||
*Ticket #332 — Contradiction arc design document. Reusable FRIEND pattern. v0.1 scope.*
|
||||
@@ -1,280 +0,0 @@
|
||||
# Mirror Moment Design Document
|
||||
|
||||
**Ticket:** #329 | **Priority:** Medium | **Sprint:** 12
|
||||
**Status:** v0.1 Draft
|
||||
**Owners:** Paula (design), Mellanie (authoring)
|
||||
**Blocked by:** #297 (Kael profile — done), #298 (Sera profile — done)
|
||||
**Decisions referenced:** D-032 (separate monologue pools), D-034 (THE FRIEND), D-039 (wow moment #4 — Divergence Reveal)
|
||||
|
||||
---
|
||||
|
||||
## 1. What Is a Mirror Moment?
|
||||
|
||||
A mirror moment is a **shared trigger that produces completely different monologue for each playable character.** Same event. Same NPC. Same location. Two entirely different emotional experiences.
|
||||
|
||||
The player who has completed both playthroughs encounters the mirror moments as a recognition: *"I was in this exact situation, but I felt something completely different."* This is the mechanism of Wow Moment #4 (Divergence Reveal — D-039): the realization that the same world contains two different experiences, and that you've had both.
|
||||
|
||||
**What a mirror moment is NOT:**
|
||||
- A branching dialogue option
|
||||
- A triggered cutscene
|
||||
- An informational difference ("the smuggler knows X and the detective doesn't")
|
||||
|
||||
A mirror moment is an **interpretive difference** — same information, same NPC behavior, same physical event. Different internal frame. Different emotional weight.
|
||||
|
||||
---
|
||||
|
||||
## 2. Design Principles
|
||||
|
||||
**Principle 1: Same trigger, different pool (D-032 hard partition)**
|
||||
Mirror moments operate because monologue pools are hard-partitioned by character. The same trigger key fires into the smuggler pool OR the detective pool — never both. The authoring requirement is to write both sides of every shared trigger.
|
||||
|
||||
**Principle 2: The difference must be felt, not explained**
|
||||
A mirror moment works when the player FEELS the divergence without having it explained. The two monologue lines should be immediately recognizable as coming from different places — different relationships, different frames, different fears.
|
||||
|
||||
**Principle 3: The mirror reveals what the character CARES about**
|
||||
The smuggler's monologue reveals personal loyalty (people). The detective's monologue reveals investigative analysis (patterns). A mirror moment that doesn't surface this difference is a content gap, not a mirror.
|
||||
|
||||
**Principle 4: At least some mirrors should work on first playthrough**
|
||||
Not every mirror moment requires a second playthrough to land. Some mirrors work as a moment of character voice — the player just hears what their character notices. Second playthrough makes the divergence explicit, but first playthrough should have its own emotional coherence.
|
||||
|
||||
---
|
||||
|
||||
## 3. The 10 Mirror Moments (v0.1)
|
||||
|
||||
### Mirror 1: The Friend's Routine
|
||||
|
||||
**Trigger:** `observe_npc` — Seeing THE FRIEND (Kael/Sera) going about their daily routine in their expected location.
|
||||
|
||||
**Shared observation:** THE FRIEND is doing exactly what they always do. Nothing unusual. The baseline before anything cracks.
|
||||
|
||||
**Smuggler monologue:**
|
||||
*"Kael's at his station. Right where he always is. Something settles when the shift starts right."*
|
||||
|
||||
**Detective monologue:**
|
||||
*"The dock worker — Davan — is on the floor again. Same position, same timing. Three days in a row. That's a routine. File it."*
|
||||
|
||||
**What the mirror reveals:** The smuggler sees a person. The detective sees a data point. Same NPC at the same station. The relationship determines the register.
|
||||
|
||||
---
|
||||
|
||||
### Mirror 2: The Empty Corridor
|
||||
|
||||
**Trigger:** `enter_location` — Player enters a maintenance corridor when no other NPCs are present.
|
||||
|
||||
**Shared observation:** The corridor is empty. The maintenance systems hum. No one is watching.
|
||||
|
||||
**Smuggler monologue:**
|
||||
*"Clear. Good. Transition window's still open for eleven more minutes."*
|
||||
|
||||
**Detective monologue:**
|
||||
*"Three separate entries to this corridor in my district walkthrough. Nothing documented in my file about why workers access this route. Off-books path? Add it to the log."*
|
||||
|
||||
**What the mirror reveals:** The smuggler reads the empty corridor as operational safety. The detective reads it as an investigative lead. The physical space is identical; the cognitive frame inverts it.
|
||||
|
||||
---
|
||||
|
||||
### Mirror 3: The Worried Partner (Naia Tamm)
|
||||
|
||||
**Trigger:** `observe_npc` — Seeing Naia Tamm sitting alone at the bar, visibly preoccupied.
|
||||
|
||||
**Shared observation:** Naia is at The Last Shift without Kael. She looks tired or worried. Not in distress — just carrying something heavy.
|
||||
|
||||
**Smuggler monologue:**
|
||||
*"Naia's here without Kael again. She looks rough. Should check in. ...Not now. Later."*
|
||||
|
||||
**Detective monologue:**
|
||||
*"That woman — Tamm, I think Sera mentioned her — is sitting alone. Wrong energy for a social evening. Something at home, or something she's heard?"*
|
||||
|
||||
**What the mirror reveals:** The smuggler has a protective impulse toward Naia but defers it. The detective categorizes Naia as a potential information source. Same worried woman, same empty chair across from her. One character plans to check on a person; the other plans to assess a witness.
|
||||
|
||||
---
|
||||
|
||||
### Mirror 4: The Spending
|
||||
|
||||
**Trigger:** `observe_npc` — Watching Torek Lintar buy rounds at the bar.
|
||||
|
||||
**Shared observation:** Torek is buying drinks for several people he doesn't know well. The drinks are nicer than they should be on a compliance officer's salary. He's clearly enjoying himself.
|
||||
|
||||
**Smuggler monologue:**
|
||||
*"Torek's buying rounds again. That's the third time this week. Either he won something, or he's getting paid from somewhere he shouldn't be. Starting to worry about that."*
|
||||
|
||||
**Detective monologue:**
|
||||
*"Commission compliance officer, buying grain spirit for half the bar. On his salary? That doesn't close. Financial tell. Noted."*
|
||||
|
||||
**What the mirror reveals:** Both characters notice the same behavioral anomaly. The smuggler frames it as a security risk to the ring. The detective frames it as an evidentiary lead. Both have the same concern (Torek's spending is unusual) — but the concern has completely different stakes.
|
||||
|
||||
---
|
||||
|
||||
### Mirror 5: Sera Leaving
|
||||
|
||||
**Trigger:** `observe_npc` — Watching Sera Venn gather her things and leave the bar when Torek arrives.
|
||||
|
||||
**Shared observation:** Sera gives a brief excuse (headache, kiosk check, early shift) and leaves. She was comfortable until the moment Torek walked in.
|
||||
|
||||
**Smuggler monologue:**
|
||||
*"Sera left. Good timing — she was starting to make everyone nervous anyway. Commission presence at Lera's always shifts the temperature."*
|
||||
|
||||
**Detective monologue:**
|
||||
*"Second time now. Sera leaves when Torek walks in. Same type of excuse. 'Headache' last time, 'kiosk' tonight. Same result. That's two data points. Third is a pattern."*
|
||||
|
||||
**What the mirror reveals:** The smuggler reads Sera's departure as relief (Commission leaving = safer conversation). The detective reads the same departure as a behavioral anomaly. The event is identical. The emotional response is inverted.
|
||||
|
||||
This mirror is structurally important: it shows the detective's FRIEND arc developing through observational patience, while simultaneously showing the smuggler's categorical relationship with Commission presence.
|
||||
|
||||
---
|
||||
|
||||
### Mirror 6: The Station Hum
|
||||
|
||||
**Trigger:** `time_idle` — Player is stationary in the terminal for more than a few seconds with no active interaction.
|
||||
|
||||
**Shared observation:** The station's ambient systems — span gate hum, ventilation cycle, cargo machinery in the background — fill the silence. Sova at rest.
|
||||
|
||||
**Smuggler monologue:**
|
||||
*"Span gate's cycling early. One hour to the next transit. Voss'll be running the schedule check in twenty."*
|
||||
|
||||
**Detective monologue:**
|
||||
*"They've been on this station their whole lives. That hum is just background to them. I'm still trying to tune it out."*
|
||||
|
||||
**What the mirror reveals:** The smuggler hears operational data in the ambient sound. The detective hears alienation. The station hum carries the same frequency to both characters' ears. It means completely different things to their experience of being in this place.
|
||||
|
||||
---
|
||||
|
||||
### Mirror 7: The Commission Kiosk
|
||||
|
||||
**Trigger:** `enter_location` or `observe_npc` — The player walks past or observes the Commission compliance kiosk near the terminal entrance.
|
||||
|
||||
**Shared observation:** The kiosk is a small Commission compliance desk near the terminal entrance — mostly unmanned, used for permit verification and compliance queries. Standard infrastructure.
|
||||
|
||||
**Smuggler monologue:**
|
||||
*"Commission kiosk. Nobody uses it. Institutional furniture. Long as nobody decides to run a full cargo audit, that's exactly what I want it to stay."*
|
||||
|
||||
**Detective monologue:**
|
||||
*"The compliance kiosk has public access to manifest verification records. Local. Less filtered than the request I made through channels. Check it when Maret's not watching."*
|
||||
|
||||
**What the mirror reveals:** The smuggler reads the kiosk as a passive threat to be ignored. The detective reads it as an investigative tool. Same object. Same physical location. The smuggler hopes it stays irrelevant; the detective plans to use it.
|
||||
|
||||
---
|
||||
|
||||
### Mirror 8: Kael and Naia Together (Bar)
|
||||
|
||||
**Trigger:** `observe_npc` — Seeing Kael and Naia sitting together at their usual table. Naia is talking; Kael is listening but seems distracted.
|
||||
|
||||
**Shared observation:** A couple having dinner. Naia is clearly talking seriously about something. Kael is present but not quite there. The gap between them is subtle but visible.
|
||||
|
||||
**Smuggler monologue:**
|
||||
*"Kael and Naia look... off. Naia's talking a lot. Kael's nodding but he's somewhere else. Something's going on at home. He doesn't say."*
|
||||
|
||||
**Detective monologue:**
|
||||
*"Couple — the dock worker, Davan, and the woman who sits with Sera sometimes. She's animated; he's distracted. Relationship tension. That level of checked-out usually means someone's keeping something."*
|
||||
|
||||
**What the mirror reveals:** The smuggler reads this as a friend's private trouble that deserves respect and distance. The detective reads it as behavioral evidence — someone keeping something from a partner. Same visible tension. One character looks away; the other leans in.
|
||||
|
||||
---
|
||||
|
||||
### Mirror 9: The Manifest Terminal
|
||||
|
||||
**Trigger:** `observe_npc` or `enter_location` — The freight manifest terminal in the terminal hub.
|
||||
|
||||
**Shared observation:** A freight terminal kiosk showing manifest data. Busy during shifts; the data moves constantly.
|
||||
|
||||
**Smuggler monologue:**
|
||||
*"That's Maret's terminal. She's got access to all the schedules from here. If anything's getting flagged in the manifest data, she'd see it before anyone else. Maret's solid. She won't say anything."*
|
||||
|
||||
**Detective monologue:**
|
||||
*"Freight manifests for the last six months, loaded from here. The cluster analysis shows three anomaly windows, all at shift transition. That's not clerical error. Someone's using this terminal to adjust records after the fact."*
|
||||
|
||||
**What the mirror reveals:** The smuggler sees a trusted colleague's workspace and trusts that colleague's loyalty. The detective sees the exact location where evidence of the ring's operations lives. The terminal is simultaneously proof of criminal activity and proof of a trusted relationship — depending on which character is reading it.
|
||||
|
||||
---
|
||||
|
||||
### Mirror 10: The End of Shift
|
||||
|
||||
**Trigger:** `observe_npc` — Watching the shift change happen across the terminal floor — workers clocking out, new crew arriving, a brief period of cross-traffic and handoffs.
|
||||
|
||||
**Shared observation:** Dozens of workers moving at once. The shift change is organized chaos. Cargo gets routed, schedules are handed off, the floor changes.
|
||||
|
||||
**Smuggler monologue:**
|
||||
*"Shift transition. Twenty-minute window. The floor's all cross-traffic now — nobody's tracking individual movement. This is when it runs."*
|
||||
|
||||
**Detective monologue:**
|
||||
*"Shift change. Every anomaly in my manifest data clusters around this. The window. The handoff moment. Someone is using the cross-traffic as cover. But for WHAT?"*
|
||||
|
||||
**What the mirror reveals:** The smuggler knows exactly what the shift change covers. The detective sees the pattern but not the specific. Both characters observe the same 20-minute window of organized chaos. One is running something through it; the other is trying to figure out what's being run.
|
||||
|
||||
---
|
||||
|
||||
## 4. Mirror Moment Authoring Rules
|
||||
|
||||
### Rule 1: Both sides are mandatory
|
||||
A mirror moment is only complete when both the smuggler monologue and the detective monologue are authored. Omitting one side is a content gap.
|
||||
|
||||
### Rule 2: Same trigger key, different pool
|
||||
Both lines use the same `trigger` type and similar `prerequisite` conditions. They appear in separate character monologue files (D-032 hard partition). The only difference is the `character` tag.
|
||||
|
||||
### Rule 3: No shared content
|
||||
Neither monologue line should directly reference the other or acknowledge the other character's frame. Each line is internally coherent to its character. The divergence is created by the CHARACTER's relationship to the world, not by explicit contrast.
|
||||
|
||||
### Rule 4: The lines must stand alone
|
||||
A player who only plays one character should not feel the mirror moment is incomplete. Both lines should work as independent character voice — good monologue that stands on its own.
|
||||
|
||||
### Rule 5: Tag all mirrors for tracking
|
||||
Add `tags: [mirror_moment]` to both sides of every mirror pair so they can be identified and validated as a set.
|
||||
|
||||
---
|
||||
|
||||
## 5. YAML Example
|
||||
|
||||
```yaml
|
||||
# Smuggler side — monologue-smuggler.yaml
|
||||
- id: pc-smuggler_m_s_044
|
||||
character: smuggler
|
||||
trigger: observe_npc
|
||||
prerequisite:
|
||||
location: the-terminal
|
||||
target: npc:naia-tamm
|
||||
relationship_state: Known
|
||||
text: "Naia's here without Kael again. She looks rough. Should check in. ...Not now. Later."
|
||||
mood: [concerned, fond]
|
||||
topic: [colleague]
|
||||
tags: [mirror_moment, mirror_worried_partner]
|
||||
|
||||
# Detective side — monologue-detective.yaml
|
||||
- id: pc-detective_m_d_044
|
||||
character: detective
|
||||
trigger: observe_npc
|
||||
prerequisite:
|
||||
location: the-last-shift
|
||||
target: npc:naia-tamm
|
||||
text: "That woman — Tamm, I think Sera mentioned her — is sitting alone. Wrong energy for a social evening. Something at home, or something she's heard?"
|
||||
mood: [analytical, curious]
|
||||
topic: [investigation]
|
||||
tags: [mirror_moment, mirror_worried_partner]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. Validation Checklist
|
||||
|
||||
For each mirror pair:
|
||||
|
||||
- [ ] Both sides authored
|
||||
- [ ] Same trigger type used
|
||||
- [ ] Both sides use `tags: [mirror_moment, {mirror_name}]`
|
||||
- [ ] Lines stand independently as character voice
|
||||
- [ ] Emotional register diverges (personal vs. analytical, OR equivalent meaningful contrast)
|
||||
- [ ] No shared vocabulary that implies the characters are comparing notes
|
||||
- [ ] Prerequisites match (same NPC, same location condition, equivalent state requirements)
|
||||
|
||||
---
|
||||
|
||||
## 7. Expansion Notes (Post-v0.1)
|
||||
|
||||
Additional mirror moments to author in future content passes:
|
||||
|
||||
- **The Missing Person Notice:** A posted notice near the bar about a missing dock worker (pre-existing, unrelated to main plot). Smuggler: "People disappear. Station life." Detective: "Filed under 'before my posting.' What was the investigative status?"
|
||||
- **Voss Walking the Floor:** The shift supervisor doing a routine floor inspection. Smuggler sees cover being maintained. Detective sees a potential informant.
|
||||
- **Drin's Inspection:** Dock inspector doing a container verification. Smuggler knows Drin will find nothing. Detective sees the inspection as either genuine compliance or evidence of a compromised process.
|
||||
|
||||
---
|
||||
|
||||
*Ticket #329 — Mirror moment design document. 10 paired observations. v0.1 scope.*
|
||||
@@ -1,632 +0,0 @@
|
||||
# THE MIRROR — NPC Pattern Specification
|
||||
|
||||
**Pattern Type:** Production-level Tier 1 (emotional depth, full 10-axis model)
|
||||
**Design Principle:** Transparency as contrast mechanism
|
||||
**Ticket:** #380
|
||||
**Reference Implementation:** Naia Tamm (Sova Transit District v0.1)
|
||||
|
||||
---
|
||||
|
||||
## 1. Pattern Definition
|
||||
|
||||
THE MIRROR is the honest-character NPC pattern. No contradiction arc, no deep secret, no hidden agenda. MIRROR NPCs are transparent — what you see is what you get.
|
||||
|
||||
**Core mechanic:** Their role in the system is to make surrounding dishonesty visible by contrast. When everyone else is hiding something, the one person who isn't becomes the emotional anchor.
|
||||
|
||||
**Design payload:** In a game built around asymmetric information and deception detection, THE MIRROR is the NPC whose absence of deception becomes its own kind of content. The player learns to read tells on every other NPC — facial tics, evasive answers, spatial deviations. Encountering someone without tells is disorienting and emotionally significant.
|
||||
|
||||
**Thematic integration:** THE MIRROR connects directly to Gore's contentment axis and the game's central question: "Is this enough?" The MIRROR NPC typically answers: "It was enough — until everything around me started falling apart." Their contentment is genuine, their worry is genuine, their emotional reactions are genuine. That honesty makes everyone else's lies painful by proximity.
|
||||
|
||||
---
|
||||
|
||||
## 2. Mechanical Rules
|
||||
|
||||
### What MIRROR NPCs Do NOT Have
|
||||
|
||||
| Absent System | Why Missing | Content Signal |
|
||||
|--------------|-------------|----------------|
|
||||
| **No tells** | Tells imply deception or concealment. MIRROR has nothing to conceal from the player (though they may be uninformed about events around them). The absence of tells IS the tell — when the player has learned to read behavioral flags on every other NPC, encountering someone without them is the anomaly. | The player's monologue might note: "No hesitation. No evasion. Either she's telling the truth or she's the best liar I've ever met." The absence becomes noticeable. |
|
||||
| **No dishonesty ≠ no misinformation** | MIRROR NPCs can be *wrong* without being *deceptive*. A MIRROR who has been lied to will repeat that lie in good faith -- they are transparent about what they believe, not omniscient about what is true. Naia reporting "Kael said he's picking up extra shifts" is honest transmission of a lie she was told. | The player recognizes the MIRROR is being used as an unwitting conduit. This makes the liar's deception feel worse, not the MIRROR's honesty feel cheaper. |
|
||||
| **No secrets** (or only mundane surface-level ones) | The `secret_held` field is empty or contains only ordinary privacy (e.g., "worried about partner's late nights" — visible to anyone observant). No trust gates that reveal hidden criminal knowledge or conspiracies. | If a MIRROR has a "secret," it's one they'd share with a sympathetic stranger at a bar. There's no revelation moment where the player discovers the MIRROR was hiding something all along. |
|
||||
| **No contradiction arc** | No phases, no discovery moment, no color shift from green to amber. The relationship with MIRROR is stable across the session. | The trust level may deepen (public → insider → peer), but there's no betrayal moment. The MIRROR you meet at minute 5 is the same MIRROR at minute 25. |
|
||||
| **No trust-gated dialogue that changes the picture of who they are** | Trust progression reveals more FEELING, not more SECRETS. Deeper access tiers show emotional vulnerability, not concealed information. | At `public` tier: "I'm worried about Kael." At `peer` tier: "I don't know what to do. I love him, but I can't keep living like this." Same truth, deeper emotion. |
|
||||
|
||||
### What MIRROR NPCs DO Have
|
||||
|
||||
| Present System | Function | Why Essential |
|
||||
|---------------|----------|---------------|
|
||||
| **Full 10-axis profile** | Want, Secret/Vulnerability, Relationships 1-3, Tolerance, Routine, Information, Contentment, Personality, Tell (absent), Skills | MIRROR is not a shallow NPC. They're Tier 1 depth — full emotional complexity, just without deception. |
|
||||
| **Tier 1 emotional depth despite pattern simplicity** | Rich personality, genuine reactions, emotional stakes in the world around them | The player trusts the MIRROR because the MIRROR is WORTH trusting. They're not a cardboard cutout labeled "honest person." They're a complete character whose honesty is part of their identity. |
|
||||
| **Genuine emotional reactions to the world** | MIRROR NPCs respond to events around them with authentic worry, joy, confusion, anger — whatever fits their personality and situation | When the ring's actions threaten someone the MIRROR loves, the MIRROR's distress is real. The player FEELS it because they've learned this person doesn't perform emotions — they experience them. |
|
||||
| **Emotional vulnerability as content** | The MIRROR's lack of deception makes them emotionally EXPOSED. They wear their worry visibly. They confide in friends. They react honestly to stress. | This vulnerability is load-bearing. The player becomes protective of the MIRROR. Threats to the MIRROR create player urgency. |
|
||||
|
||||
---
|
||||
|
||||
## 3. Content Requirements
|
||||
|
||||
**Total authored line budget:** 50-70 lines (Tier 1 MIRROR is slightly lower than FRIEND pattern's 70-100, because no contradiction arc content)
|
||||
|
||||
| Content Type | Line Count | Function |
|
||||
|-------------|-----------|----------|
|
||||
| **Dialogue** | 25-35 | Greetings (5), emotional state conversation (8-10), relationship discussion (5-7), situation responses (5-8), peer-tier vulnerability (3-5) |
|
||||
| **Trust-gated dialogue** | 10-15 | Deeper emotional exposure at insider/peer tiers. Not secret revelations — emotional revelations. "I'm scared" vs "I'm worried." |
|
||||
| **Unprompted lines** | 3-5 | MIRROR volunteers emotional state or asks for help. "Have you seen Kael today? I'm worried." |
|
||||
| **Monologue triggers** | 10-15 per character | Player's internal reaction to MIRROR's honesty. Smuggler: guilt (if protecting someone the MIRROR loves). Detective: relief (finally someone not lying) + strategic value (MIRROR as witness to behavioral change). |
|
||||
| **Voice sample** | 3-5 lines | Covering: baseline warm, worried, brittle (close to tolerance break) |
|
||||
|
||||
**No contradiction discovery content.** No tell observation content (because no tells). No phase-shift dialogue. This is where MIRROR saves budget relative to FRIEND.
|
||||
|
||||
### Dual-Lens Distribution
|
||||
|
||||
**Smuggler perspective (if MIRROR is connected to a ring member):** Emotional collateral. The MIRROR's worry creates guilt. The smuggler knows WHY the person the MIRROR loves is behaving strangely and can't say. Seeing the MIRROR's distress is a cost of operations.
|
||||
|
||||
**Detective perspective:** Potential witness + emotional anchor. A partner who suspects their loved one is hiding something is a classic entry point for investigation. The MIRROR knows behavioral patterns, routines, recent changes. The detective can cultivate trust by being sympathetic.
|
||||
|
||||
---
|
||||
|
||||
## 4. Tell System Rules
|
||||
|
||||
**Core principle:** MIRROR has no tells because tells imply deception or concealment.
|
||||
|
||||
### The Absence-as-Content Design
|
||||
|
||||
| What the Player Experiences | System State | Mechanical Expression |
|
||||
|-----------------------------|--------------|---------------------|
|
||||
| Early game: MIRROR seems ordinary | No behavioral flags set. No `contradiction_flagged`. No tell observations in monologue. | The player's training (from interacting with NPCs who DO have tells) hasn't fired. This feels normal. |
|
||||
| Mid game: Player has learned to read other NPCs | The player has observed: Kael looks left when lying, Sera leaves when Torek arrives, Voss fidgets when questioned about manifests. | The player's mental model now expects tells. They're watching for them. |
|
||||
| MIRROR interaction: No tells present | Player talks to MIRROR. MIRROR makes eye contact, answers directly, emotional state matches words. No spatial deviation, no topic deflection, no nervous tics. | The ABSENCE is striking. The player's monologue notes it: "No hesitation. She's either telling the truth or she's the best actor I've ever seen." |
|
||||
| Resolution: Trust through transparency | If the player cross-references MIRROR's information with other sources, it checks out. MIRROR was telling the truth. | The player LEARNS that honesty exists in this world. That one person isn't performing. That becomes the emotional fulcrum for everything else. |
|
||||
|
||||
### How This Interacts with the Contradiction System
|
||||
|
||||
FRIEND NPCs have contradiction arcs: warmth → trust → doubt → conflict. Color shifts green to amber. The emotional payload is betrayal.
|
||||
|
||||
MIRROR NPCs have NO contradiction arc. Color remains green (or progresses public → insider → peer within green). The emotional payload is RELIEF and PROTECTION.
|
||||
|
||||
**Mechanical distinction:**
|
||||
- FRIEND: `EntityKnowledge.state` transitions to `KnowledgeState::Contradicted` when tells accumulate.
|
||||
- MIRROR: `EntityKnowledge.state` remains `KnowledgeState::Confirmed` or `KnowledgeState::Direct`. No contradiction flags ever set.
|
||||
|
||||
**Content signal:** The player's monologue about MIRROR evolves from neutral observation to active trust: "She's worried. Can't blame her — her partner is acting strange." → "I believe her. She doesn't know what's happening, but she's telling me everything she does know."
|
||||
|
||||
---
|
||||
|
||||
## 5. Dialogue Architecture
|
||||
|
||||
MIRROR dialogue follows the standard four-layer system (D-028) but with simplified secret-tier structure.
|
||||
|
||||
### Access Tiers (Layer 1)
|
||||
|
||||
| Tier | What MIRROR Shares | Example |
|
||||
|------|-------------------|---------|
|
||||
| **Public** | Observable emotional state, general information about their life/relationships | "I teach at the community school. The kids are doing well this term." |
|
||||
| **Insider** | Specific worry, named relationships, genuine vulnerability | "Kael's been coming home late. Says it's work, but the schedule doesn't match. I don't know what to think." |
|
||||
| **Peer** | Deep emotional exposure, requests for help or advice | "I'm scared, honestly. Not of Kael — of what Kael might be involved in. I don't know who else to talk to." |
|
||||
| **Authority** (if detective) | Cooperation with investigation, willingness to provide information about loved one despite emotional cost | "If you think Kael is in trouble, I want to know. I'll help if I can. Just — please don't hurt him." |
|
||||
|
||||
**No secret tier that reveals hidden criminal knowledge.** The MIRROR doesn't have hidden criminal knowledge. The "secret" tier for MIRROR is the deepest emotional vulnerability, not a plot revelation.
|
||||
|
||||
### Trust Progression
|
||||
|
||||
```
|
||||
Public (stranger) → Insider (acquaintance) → Peer (trusted friend) → Authority (if applicable)
|
||||
|
||||
What changes: Depth of emotional sharing, not type of information.
|
||||
What doesn't change: The facts. MIRROR tells the same truth at all tiers. The emotion around it deepens.
|
||||
```
|
||||
|
||||
**Example progression (Naia about Kael):**
|
||||
|
||||
- **Public:** "Kael works at the freight hub. Dock worker. We've been together six years."
|
||||
- **Insider:** "Kael's been stressed lately. Late nights, evasive when I ask about it. I'm worried."
|
||||
- **Peer:** "I love him. But I can't keep doing this — the not-knowing is killing me. I think something's wrong. I just don't know what."
|
||||
- **Authority (detective):** "If you're investigating something at the hub, and if Kael is involved — I need to know. I'll help. I just need the truth."
|
||||
|
||||
Same story. Deeper emotion. No revelation that changes the player's understanding of who Naia is.
|
||||
|
||||
### Monologue Trigger Design
|
||||
|
||||
MIRROR NPCs trigger monologue focused on the PC's EMOTIONAL REACTION to the MIRROR's honesty, not on information extraction.
|
||||
|
||||
**Smuggler monologue about MIRROR (if MIRROR is connected to ring member):**
|
||||
|
||||
| Trigger | Monologue Content | Emotional Layer |
|
||||
|---------|------------------|-----------------|
|
||||
| Observe MIRROR waiting at bar | "Naia's at the bar again. Alone. Keeps looking at the door. I know where Kael is. I can't say." | Guilt. The smuggler's operational knowledge creates distance from the MIRROR's suffering. |
|
||||
| MIRROR asks about loved one | "She asked if I'd seen Kael today. What do I say? 'Yeah, he's fine, just moving contraband?' Can't tell her. Can't lie to her face either." | Moral tension. The MIRROR's directness makes evasion feel worse. |
|
||||
| MIRROR shares deep worry | "She's really scared. Not just worried — scared. And she has no idea what's actually happening. If she knew..." | Protective instinct + guilt. The smuggler wants to shield the MIRROR from both the truth and the consequences. |
|
||||
|
||||
**Detective monologue about MIRROR:**
|
||||
|
||||
| Trigger | Monologue Content | Emotional Layer |
|
||||
|---------|------------------|-----------------|
|
||||
| First conversation with MIRROR | "She's not hiding anything. I've interviewed enough people to know when someone's performing. She's genuinely worried." | Relief. In a district where everyone seems evasive, the MIRROR is a breath of fresh air. |
|
||||
| MIRROR shares information about loved one | "She knows his routine better than anyone. The late nights, the evasions — she's been tracking them without realizing it. She's building my case for me." | Strategic recognition. The MIRROR is a witness to behavioral change — the best kind. |
|
||||
| MIRROR asks for help | "She wants me to figure out what's wrong. Not to arrest anyone — just to know. That's... trust. Real trust." | Emotional weight. The detective realizes the investigation has personal stakes for the MIRROR. Success means breaking someone's heart. |
|
||||
|
||||
---
|
||||
|
||||
## 6. Naia Tamm — Reference Implementation
|
||||
|
||||
Naia Tamm is the v0.1 MIRROR NPC in Sova Transit District. Let me walk through how her 10-axis profile demonstrates each MIRROR rule.
|
||||
|
||||
### Core Identity
|
||||
|
||||
- **Name:** Naia Tamm
|
||||
- **Age:** 33
|
||||
- **Role:** Teacher, Station Sova community school
|
||||
- **Social Site:** The Last Shift (Bar)
|
||||
- **Triangle:** Triangle 4 — The Worried Partner (Naia - Kael - Sera)
|
||||
|
||||
### 10-Axis MIRROR Implementation
|
||||
|
||||
#### 1. Want (Tier 1 depth, no deception)
|
||||
|
||||
**Primary:** Understand what's happening with Kael.
|
||||
|
||||
Naia and Kael have been together 6 years. Kael started coming home late, evasive answers, money that doesn't match hours. Naia doesn't know about the ring. Naia knows the person they share a life with is hiding something. The not-knowing is worse than almost any truth.
|
||||
|
||||
**Secondary:** Protect the life they've built.
|
||||
|
||||
Naia wants it resolved without destroying everything — the home, the relationship, the stability. This is why Naia confides in Sera instead of confronting Kael directly: wants advice, not a fight.
|
||||
|
||||
**MIRROR rule demonstrated:** Want is ABOUT someone else's secret, not concealing Naia's own. Naia's motivation is transparent to the player from the first conversation.
|
||||
|
||||
#### 2. Secret / Vulnerability (surface-level only)
|
||||
|
||||
**Surface secret:** Worried about Kael. Visible to anyone who sees Naia's stress.
|
||||
|
||||
**Deep secret:** Naia confided in Sera about Kael's behavior. This is the action that set Sera's compliance check in motion, though Naia doesn't know that. Naia shared a personal worry with a trusted friend.
|
||||
|
||||
**Vulnerability:** Emotional exposure. Naia's worry is genuine, visible, exploitable.
|
||||
|
||||
**MIRROR rule demonstrated:** Naia's "secret" is that she confided in a friend. That's not a conspiracy — it's ordinary human behavior under stress. The vulnerability is EMOTIONAL, not criminal.
|
||||
|
||||
#### 3. Relationships (genuine, no hidden agendas)
|
||||
|
||||
**Kael Davan (partner, 6 years):** Deep love, growing anxiety. Doesn't question Kael's character — just Kael's honesty.
|
||||
|
||||
**Sera Venn (close friend, 10 months):** Genuine friendship. Trusts Sera as someone who can give perspective without gossip.
|
||||
|
||||
**Lera Sessik (bar acquaintance):** Social connection. Lera is warm to Naia — protective attention to someone visibly struggling.
|
||||
|
||||
**MIRROR rule demonstrated:** All relationships are exactly what they appear to be. No hidden resentments, no secret alliances, no ulterior motives. Naia likes who she likes for straightforward reasons.
|
||||
|
||||
#### 4. Tolerance Threshold (moderate, genuine limits)
|
||||
|
||||
**Moderate.** Patient — teaching station kids requires it. But patience is fraying. Every evasive answer from Kael chips at 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.
|
||||
|
||||
**MIRROR rule demonstrated:** Tolerance threshold is real and observable. No hidden resilience, no secret breaking point. What Naia says she can tolerate is what she can tolerate.
|
||||
|
||||
#### 5. Daily Routine (predictable, no spatial deviations)
|
||||
|
||||
- 07:00 - 15:00: Teaching (community school, Residential Radial A)
|
||||
- 15:00 - 15:30: Commute back to Transit District
|
||||
- 15:30 - 17:30: Bar (The Last Shift) — meets Sera, social time
|
||||
- 17:30 - 22:00: Home. Waits for Kael.
|
||||
- Late evenings: Alone in apartment, wondering where Kael is.
|
||||
|
||||
**MIRROR rule demonstrated:** Routine is stable, observable, doesn't hide anything. Naia is where she says she'll be. No unauthorized corridor meetings, no suspicious timing patterns. The routine itself is transparent.
|
||||
|
||||
#### 6. Information Inventory (knows what she knows, doesn't know what she doesn't)
|
||||
|
||||
**Knows:** Kael's normal routine (6 years of partnership), Kael's recent deviations (late nights, evasive answers), Sera's Commission role (knows Sera is a tech, not investigator), bar social dynamics, school community.
|
||||
|
||||
**Doesn't know:** Ring, smuggling, Kael's membership, manifest discrepancies, Sera's compliance check, the detective's investigation.
|
||||
|
||||
**MIRROR rule demonstrated:** Naia's knowledge state is exactly what it appears to be. She's not concealing anything she knows. She genuinely doesn't know the conspiracy exists. This makes her the perfect witness to BEHAVIORAL change without knowledge of CAUSE.
|
||||
|
||||
#### 7. Contentment (low and declining — thematically essential)
|
||||
|
||||
**Was content:** Stable job, loving partner, community. Now relationship anxiety is coloring everything. Teaching is harder when distracted. Bar visits tinged with worry. Home is where the absence lives.
|
||||
|
||||
**MIRROR rule demonstrated:** Contentment trajectory is VISIBLE and GENUINE. Naia isn't pretending to be happy or hiding dissatisfaction. Her emotional state is observable in her voice, her behavior, her routine changes (increased bar presence = avoiding empty apartment).
|
||||
|
||||
#### 8. Personality Traits (no performance, no mask)
|
||||
|
||||
- **Primary: Caring** — genuinely invested in other people's wellbeing
|
||||
- **Secondary: Patient** — tolerates uncertainty longer than most, but not indefinitely
|
||||
- **Tertiary: Perceptive** — reads emotional states well. Knows when Kael is lying even if can't prove it.
|
||||
|
||||
**MIRROR rule demonstrated:** These traits are REAL, not performed. Naia's caring isn't a manipulation tactic. Her perceptiveness makes her WORRIED (she knows something's wrong) but doesn't make her SUSPICIOUS (she trusts Kael's character even while doubting his honesty about the situation).
|
||||
|
||||
#### 9. Tell System (ABSENT — the design payload)
|
||||
|
||||
Naia's entry in the wiki lists three "tells":
|
||||
|
||||
| Tell | Trigger | Observable To |
|
||||
|------|---------|---------------|
|
||||
| Visible stress | Tired eyes, distracted conversation, checking lattice | Sera, Lera, Detective, bar regulars |
|
||||
| Mentions Kael unprompted | Worry overflowing into conversation | Sera, Detective (if sitting nearby) |
|
||||
| Increased bar presence | Coming more often, staying longer — avoiding empty apartment | Lera (notices pattern), Sera (recognizes coping mechanism) |
|
||||
|
||||
**CRITICAL MIRROR DISTINCTION:** These are NOT tells in the deception-detection sense. They're not "behavioral flags that signal concealment." They're GENUINE STRESS MARKERS. Naia is visibly worried because Naia IS worried. There's no contradiction between internal state and external behavior.
|
||||
|
||||
**The system perspective:** A TELL is a deviation that signals deception (Kael looks left when lying, Sera leaves when Torek arrives). Naia's behaviors are COPING MECHANISMS and EMOTIONAL EXPRESSIONS, not tells. The player's monologue doesn't say "She's hiding something." It says "She's really struggling."
|
||||
|
||||
**MIRROR rule demonstrated:** The absence of deception-tells IS the content. The player who has learned to read evasion on other NPCs will notice that Naia makes direct eye contact, answers questions fully, doesn't deflect topics, doesn't have spatial anomalies beyond her normal routine. That ABSENCE becomes the signal: "This person is being honest with me."
|
||||
|
||||
#### 10. Skill Set (civilian, no hidden capabilities)
|
||||
|
||||
**Occupational:** Teaching, community engagement, youth education, curriculum management.
|
||||
|
||||
**Combat tag:** NO. Entirely civilian.
|
||||
|
||||
**Lattice capability:** Baseline.
|
||||
|
||||
**MIRROR rule demonstrated:** No hidden skills, no secret training, no combat capability concealed behind a civilian facade. Naia is exactly what she presents: a teacher who's worried about her partner.
|
||||
|
||||
### Naia's Triangle Role (Emotional Center)
|
||||
|
||||
**Triangle 4: The Worried Partner (Naia - Kael - Sera)**
|
||||
|
||||
Naia is the emotional center. Naia's worry about Kael triggered Sera's investigation. Naia's trust in Sera makes Sera's concealment more painful. Naia connects the detective's investigation to Kael's personal life through Sera, through Naia's own observations, through the fact that a worried partner is the best witness to behavioral change.
|
||||
|
||||
**Why MIRROR works here:** Naia is UNINVOLVED in the conspiracy but CENTRAL to its emotional impact. She's the person both the smuggler and detective want to protect — and the person whose honest worry makes the smuggling operation's human cost visible. If Naia were lying, the triangle would be about competing deceptions. Because Naia is honest, the triangle is about the COST of everyone else's deceptions.
|
||||
|
||||
### Dual-Lens Implementation
|
||||
|
||||
**Smuggler perspective (if smuggler is Kael's friend):**
|
||||
|
||||
Naia is emotional collateral. The smuggler knows why Kael is busy and can't say. Seeing Naia's worry creates guilt. If Naia asks the smuggler about Kael, there's no good answer.
|
||||
|
||||
Sample monologue: *"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 perspective:**
|
||||
|
||||
Naia is a potential source. A partner who suspects their loved one is hiding something is a classic entry point. The detective can cultivate Naia's trust by being sympathetic — listen, validate, gently probe. Naia might not know specifics, but knows Kael's routine, habits, recent changes better than anyone.
|
||||
|
||||
Sample monologue: *"The partner — Naia Tamm. Teacher. Visibly stressed. Keeps looking at the door. If Davan is involved, this partner knows something changed, even if they don't know what."*
|
||||
|
||||
**MIRROR payload in dual-lens:** SAME transparency, DIFFERENT player reaction. Smuggler feels guilt. Detective sees opportunity. Both recognize honesty. The MIRROR's transparency makes the two characters' different relationships to truth more visible by contrast.
|
||||
|
||||
---
|
||||
|
||||
## 7. Generator Template
|
||||
|
||||
For creating future MIRROR NPCs. This is the content pack structure for a MIRROR.
|
||||
|
||||
### Profile Fields (What to Fill)
|
||||
|
||||
```yaml
|
||||
npc_id: "{name-lowercase}"
|
||||
name: "{Full Name}"
|
||||
age: {25-50 typical}
|
||||
role: "{Occupation — typically civilian}"
|
||||
social_site: "{Primary location}"
|
||||
tier: 1 # MIRROR is Tier 1 depth
|
||||
pattern: "MIRROR"
|
||||
entanglement: "mundane" # MIRROR is never directly entangled
|
||||
|
||||
# 10-Axis Profile
|
||||
|
||||
want:
|
||||
primary: "{Want that's ABOUT someone else or visible situation — no hidden agenda}"
|
||||
secondary: "{Want that's protective or stabilizing — preserve what they have}"
|
||||
|
||||
secret:
|
||||
surface: "{Visible emotional state — worry, stress, joy}"
|
||||
deep: "{Ordinary privacy or emotional vulnerability — NOT conspiracy knowledge}"
|
||||
vulnerability: "{Emotional exposure, not operational risk}"
|
||||
|
||||
relationships:
|
||||
relationship_1:
|
||||
target: "{Name}"
|
||||
type: "{Genuine bond — no hidden resentment}"
|
||||
history: "{How they met, why they care}"
|
||||
tension: "{Current stress in relationship — external, not deceptive}"
|
||||
relationship_2: ...
|
||||
relationship_3: ...
|
||||
|
||||
tolerance: "{moderate/high — describe genuine limits, what would make them break}"
|
||||
|
||||
routine:
|
||||
"{Time range}": "{Activity — predictable, no hidden meetings}"
|
||||
# No spatial deviations, no unauthorized locations
|
||||
|
||||
information:
|
||||
knows:
|
||||
- "{Visible facts about their life}"
|
||||
- "{Behavioral observations about loved ones}"
|
||||
- "{Community knowledge}"
|
||||
doesnt_know:
|
||||
- "{Conspiracy details}"
|
||||
- "{Hidden agendas of others}"
|
||||
- "{Secret motivations}"
|
||||
|
||||
contentment: "{low/moderate — declining if connected to stressed loved one}"
|
||||
|
||||
personality:
|
||||
primary: "{Caring, Honest, Warm — prosocial trait}"
|
||||
secondary: "{Patient, Loyal, Perceptive — supportive trait}"
|
||||
tertiary: "{Genuine emotional responsiveness}"
|
||||
|
||||
tell_system:
|
||||
tells: [] # Empty array — MIRROR has no deception tells
|
||||
behavioral_markers:
|
||||
- "{Genuine stress marker — visible worry, not concealment}"
|
||||
- "{Coping mechanism — increased social presence, routine changes}"
|
||||
# These are NOT tells. They're genuine emotional expressions.
|
||||
|
||||
skills:
|
||||
occupational: ["{Teaching}", "{Community work}", "{Civilian profession}"]
|
||||
combat: false # MIRROR is never combat-capable
|
||||
lattice: "baseline"
|
||||
```
|
||||
|
||||
### Dialogue Content Pack Structure
|
||||
|
||||
```yaml
|
||||
# File: districts/{location}/dialogue/{role}-mirror.yaml
|
||||
|
||||
- id: "{npc-slug}_d_001"
|
||||
text: "Greeting — warm, open, no guardedness"
|
||||
role: "{role}"
|
||||
access: ["public"]
|
||||
trust: "surface"
|
||||
situation: ["greeting"]
|
||||
mood: ["warm"]
|
||||
|
||||
- id: "{npc-slug}_d_002"
|
||||
text: "Sharing worry — direct, no evasion"
|
||||
role: "{role}"
|
||||
access: ["public", "insider"]
|
||||
trust: "surface"
|
||||
situation: ["worried_inquiry"]
|
||||
mood: ["anxious"]
|
||||
|
||||
- id: "{npc-slug}_d_010"
|
||||
text: "Deep emotional vulnerability — peer tier"
|
||||
role: "{role}"
|
||||
access: ["peer"]
|
||||
trust: "real" # Not 'secret' — MIRROR has no secrets tier content
|
||||
situation: ["emotional_crisis"]
|
||||
mood: ["desperate"]
|
||||
|
||||
# Monologue content (separate per character, per D-032)
|
||||
|
||||
# File: districts/{location}/monologue/smuggler/{location}.yaml
|
||||
- id: "pc-smuggler_m_s_001"
|
||||
text: "Smuggler feels guilt observing MIRROR's distress"
|
||||
character: "smuggler"
|
||||
trigger: "observe_npc"
|
||||
prerequisite:
|
||||
target.known_attributes.name: "{Name}"
|
||||
target.known_attributes.emotional_state: "worried"
|
||||
|
||||
# File: districts/{location}/monologue/detective/{location}.yaml
|
||||
- id: "pc-detective_m_d_001"
|
||||
text: "Detective recognizes MIRROR as honest witness"
|
||||
character: "detective"
|
||||
trigger: "post_conversation"
|
||||
prerequisite:
|
||||
target.known_attributes.name: "{Name}"
|
||||
target.known_attributes.honesty_assessment: "transparent"
|
||||
```
|
||||
|
||||
### What Fields to Leave Empty
|
||||
|
||||
| Field | State | Why |
|
||||
|-------|-------|-----|
|
||||
| `tell_system.tells` | Empty array `[]` | MIRROR has no deception tells |
|
||||
| `secret.criminal_knowledge` | Omit entirely | MIRROR doesn't have criminal secrets |
|
||||
| `contradiction_arc` | Omit entirely | MIRROR has no contradiction phases |
|
||||
| `access: ["authority"]` content | Minimal | Only if MIRROR cooperates with investigation — still no secret reveals |
|
||||
| `trust: "secret"` tier content | Omit or minimal | MIRROR's deepest tier is emotional vulnerability, not plot revelation |
|
||||
|
||||
### What Makes a Good MIRROR Candidate
|
||||
|
||||
**Ideal MIRROR characteristics:**
|
||||
|
||||
1. **Emotionally connected to an entangled NPC** — Partner, sibling, close friend of someone in the conspiracy. Their honesty makes the conspiracy's human cost visible.
|
||||
|
||||
2. **Civilian role** — Teacher, bartender, service worker. Not institutional (Commission, Security). Not criminal. Represents ordinary life.
|
||||
|
||||
3. **Observable worry or stress** — MIRROR's emotional state is VISIBLE because they don't hide it. Their distress is the content.
|
||||
|
||||
4. **Genuine perceptiveness** — MIRROR notices behavioral changes in loved ones but doesn't KNOW the cause. "Something's wrong" without "I know what's wrong." Perfect witness to change without knowledge of crime.
|
||||
|
||||
5. **Prosocial personality** — Caring, loyal, honest. The player trusts them BECAUSE they're trustworthy. The game needs at least one person whose goodness is real.
|
||||
|
||||
**Poor MIRROR candidates:**
|
||||
|
||||
- NPCs with institutional power (they'd have investigative tools)
|
||||
- NPCs with hidden skills or backgrounds (contradicts transparency)
|
||||
- NPCs who are themselves criminals (MIRROR must be genuinely uninvolved)
|
||||
- NPCs without emotional stakes in the district (MIRROR's honesty is load-bearing only if they CARE)
|
||||
|
||||
---
|
||||
|
||||
## 8. Design Notes: Why MIRROR Isn't Boring
|
||||
|
||||
**The risk:** A character with no secrets, no tells, no contradiction arc sounds mechanically thin. "Just an honest person" doesn't feel like a gameplay system.
|
||||
|
||||
**Why it works:**
|
||||
|
||||
### The Contrast Mechanic
|
||||
|
||||
MIRROR is mechanically interesting BECAUSE of the surrounding systems. In a game where:
|
||||
|
||||
- Every FRIEND has a contradiction arc (warmth → doubt → conflict)
|
||||
- Every CATALYST disrupts equilibrium through action
|
||||
- Every SYSTEM embodies corrupted institutions
|
||||
- Every WITNESS carries dangerous knowledge
|
||||
- Every GHOST applies pressure from off-screen
|
||||
|
||||
...the ONE character with no deception becomes the ANCHOR. The player learns to expect complexity, hidden agendas, behavioral tells. MIRROR subverts that learned expectation by being EXACTLY what they appear to be.
|
||||
|
||||
**Mechanical payload:** The observation pipeline (Ozzie + Gestalt + Paula's unified system) trains the player to notice tells. The MIRROR's ABSENCE of tells is itself an observation event. The player's monologue fires: "No evasion. No deflection. Either honest or the best liar I've encountered." The uncertainty itself creates tension until the player verifies the honesty.
|
||||
|
||||
### The Emotional Fulcrum
|
||||
|
||||
When the ring's actions threaten the MIRROR (Naia worrying about Kael, potentially losing her relationship and stability), the player FEELS it because they've learned to believe this person.
|
||||
|
||||
**Smuggler:** The guilt of watching an innocent person suffer because of your operations. You can't tell her. You can't protect her. You're part of the cause of her pain.
|
||||
|
||||
**Detective:** The weight of knowing your investigation will break this person's life. Success means revealing that her partner is a criminal. The MIRROR trusted you to find answers — and the answers will destroy her.
|
||||
|
||||
**That's the design payoff.** MIRROR's transparency isn't boring — it's the emotional investment that makes the conspiracy's consequences real. The player cares about protecting the MIRROR because the MIRROR is the one person in the district who isn't performing, isn't hiding, isn't playing angles. That honesty makes them precious.
|
||||
|
||||
### The Trust Anchor
|
||||
|
||||
In a district where everyone has an agenda, the MIRROR is the person the player can RELY on. When the smuggler needs to know what's happening with Kael, Naia will tell the truth as she understands it. When the detective needs a witness, Naia will cooperate fully. The MIRROR's reliability is itself a strategic asset — but one that comes with emotional cost (using an innocent person's trust).
|
||||
|
||||
**System interaction:** The trust-gated gossip system (D-028 Layer 3, #171) means NPCs share information at different access tiers. With most NPCs, the player wonders: "Is this real or are they steering me?" With MIRROR, that question is answered: "This is real. She's telling me everything she knows." That certainty is VALUABLE in a game built on asymmetric information.
|
||||
|
||||
### The Replay Dimension
|
||||
|
||||
On second playthrough, playing the other character, the MIRROR's honesty becomes even more visible. The player KNOWS Naia isn't involved. They see her worry from a different angle:
|
||||
|
||||
- **Playthrough 1 (smuggler):** "I know why Kael is busy. Naia's worry is collateral damage."
|
||||
- **Playthrough 2 (detective):** "Naia's worry is my opening. She's the way in."
|
||||
|
||||
Same honesty. Different use. The player's knowledge that Naia is a MIRROR (from first playthrough) makes the second playthrough's interaction with her more complex: "I know she's honest. How do I use that? Should I?"
|
||||
|
||||
**Replay payload:** MIRROR transparency survives across playthroughs. FRIEND contradictions change (different seed might assign FRIEND to different NPC). MIRROR remains honest regardless of seed. That constancy is mechanically useful for teaching the player to recognize honesty — and ethically complex when the player knows they'll exploit it.
|
||||
|
||||
---
|
||||
|
||||
## 9. Implementation Checklist
|
||||
|
||||
For developers implementing a MIRROR NPC:
|
||||
|
||||
### ECS Component Setup
|
||||
|
||||
```rust
|
||||
// MIRROR NPCs use standard NPC components but with specific flags
|
||||
|
||||
NPCProfile {
|
||||
pattern: NPCPattern::Mirror,
|
||||
tier: ContentTier::One, // MIRROR is always Tier 1
|
||||
entanglement: EntanglementLevel::Mundane, // Never directly criminal
|
||||
}
|
||||
|
||||
TellSystem {
|
||||
tells: vec![], // Empty — no deception tells
|
||||
behavioral_markers: vec![
|
||||
BehavioralMarker::VisibleStress,
|
||||
BehavioralMarker::EmotionalExpression,
|
||||
// These are NOT tells — they're genuine coping mechanisms
|
||||
],
|
||||
}
|
||||
|
||||
ContradictionState {
|
||||
has_contradiction_arc: false, // MIRROR never contradicts
|
||||
relationship_phase: RelationshipPhase::Stable, // No phase transitions
|
||||
}
|
||||
|
||||
SecretInventory {
|
||||
criminal_secrets: vec![], // Empty
|
||||
personal_vulnerabilities: vec![
|
||||
Vulnerability::EmotionalExposure,
|
||||
Vulnerability::UninformedWitness,
|
||||
],
|
||||
}
|
||||
```
|
||||
|
||||
### Dialogue System Configuration
|
||||
|
||||
```rust
|
||||
// MIRROR dialogue has simpler trust structure
|
||||
|
||||
DialogueProfile {
|
||||
access_tiers: vec![
|
||||
AccessTier::Public, // General conversation
|
||||
AccessTier::Insider, // Named relationships, specific worries
|
||||
AccessTier::Peer, // Deep emotional vulnerability
|
||||
AccessTier::Authority, // (Optional) Cooperation with investigation
|
||||
],
|
||||
trust_gates: vec![
|
||||
TrustGate { tier: TrustTier::Surface, access: [Public, Insider] },
|
||||
TrustGate { tier: TrustTier::Real, access: [Peer, Authority] },
|
||||
// NO TrustTier::Secret — MIRROR doesn't have secret-tier content
|
||||
],
|
||||
}
|
||||
```
|
||||
|
||||
### Knowledge System Integration
|
||||
|
||||
```rust
|
||||
// Observer's knowledge state about MIRROR
|
||||
|
||||
EntityKnowledge {
|
||||
state: KnowledgeState::Confirmed, // Or Direct. Never Contradicted.
|
||||
known_attributes: {
|
||||
"honesty_assessment": "transparent",
|
||||
"reliability": "solid",
|
||||
"facade_status": "N/A", // MIRROR has no facade
|
||||
"emotional_state": "worried", // Visible, genuine
|
||||
"threat_to_position": "none", // MIRROR is not operationally dangerous
|
||||
"moral_standing": "innocent", // Never shifts to complicit
|
||||
},
|
||||
contradiction_flagged: None, // MIRROR never flags contradictions
|
||||
}
|
||||
```
|
||||
|
||||
### Monologue Event Triggers
|
||||
|
||||
```rust
|
||||
// When player observes MIRROR, monologue focuses on emotional reaction
|
||||
|
||||
if npc.pattern == NPCPattern::Mirror {
|
||||
if observer.has_learned_to_read_tells() {
|
||||
// Trigger "absence of tells" observation
|
||||
monologue_event = MonologueEvent {
|
||||
trigger: MonologueTrigger::ObserveNPC,
|
||||
target: npc.entity_id,
|
||||
filter_tags: ["honesty_recognition", "emotional_anchor"],
|
||||
};
|
||||
}
|
||||
|
||||
if npc.emotional_state == EmotionalState::Distressed
|
||||
&& observer.knows_cause_of_distress()
|
||||
&& !observer.can_share_knowledge() {
|
||||
// Trigger guilt/conflict monologue (if smuggler)
|
||||
monologue_event = MonologueEvent {
|
||||
trigger: MonologueTrigger::ObserveNPC,
|
||||
target: npc.entity_id,
|
||||
filter_tags: ["guilt", "emotional_collateral"],
|
||||
};
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Testing Validation
|
||||
|
||||
**MIRROR correctness tests:**
|
||||
|
||||
1. **No contradiction flags should ever set** for MIRROR entity.
|
||||
2. **EntityKnowledge.state should never transition to Contradicted** for MIRROR.
|
||||
3. **TellSystem.tells should remain empty array** throughout session.
|
||||
4. **Monologue events about MIRROR should NOT include tags:** `"deception"`, `"evasion"`, `"suspicious"`.
|
||||
5. **Monologue events about MIRROR SHOULD include tags:** `"honesty"`, `"transparency"`, `"genuine"`, `"emotional_anchor"`.
|
||||
6. **Trust progression should not unlock "secret" tier content** — only surface/real tiers should have content.
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
**THE MIRROR pattern is the emotional foundation of the game's moral complexity.**
|
||||
|
||||
In a world where everyone is hiding something, the one person who isn't becomes the player's anchor — and their vulnerability. The MIRROR's transparency is mechanically expressed through the ABSENCE of systems (no tells, no contradiction arc, no secrets) that are present on every other NPC. That absence becomes visible through contrast.
|
||||
|
||||
**The design works because:**
|
||||
- The observation pipeline trains the player to expect deception
|
||||
- The MIRROR subverts that expectation through consistent honesty
|
||||
- The player's verification of honesty (cross-referencing MIRROR's info against other sources) creates trust
|
||||
- That trust makes the MIRROR's emotional stakes real
|
||||
- Threats to the MIRROR create urgency and moral weight
|
||||
|
||||
**Naia Tamm demonstrates every rule:** She has full Tier 1 depth, genuine emotional complexity, visible stress, transparent relationships, predictable routine, and zero deception. Her honesty makes Kael's secrets painful, Sera's concealment costly, and the investigation's human consequences visible.
|
||||
|
||||
**For content authors:** MIRROR is mechanically simple (no contradiction content) but emotionally complex (full 10-axis depth). The 50-70 line budget focuses on genuine emotional expression, trust progression through vulnerability, and dual-lens player reaction. The MIRROR is the person both characters want to protect — and the person who makes the cost of deception real.
|
||||
|
||||
---
|
||||
|
||||
**End Pattern Specification.**
|
||||
|
||||
**Files referenced:**
|
||||
- `/var/mnt/data/projects/settled-reach/copy/wiki/npcs/naia-tamm.md` — Reference implementation
|
||||
- `/var/mnt/data/projects/settled-reach/copy/decisions/content.md` — D-024 (10-axis model), D-028 (dialogue architecture), D-029 (entanglement ratio), D-032 (separate monologue pools), D-034 (THE FRIEND pattern), D-035 (tag taxonomy)
|
||||
- `/var/mnt/data/projects/settled-reach/copy/docs/workshops/v01-content-scoping/round2-gestalt.md` — Pattern definitions and NPC mapping
|
||||
- `/var/mnt/data/projects/settled-reach/copy/docs/workshops/v01-gap-analysis/round2-gestalt.md` — Unified observation system, character identity integration
|
||||
@@ -1,450 +0,0 @@
|
||||
# Tier 1 Drama Module — Authoring Guide
|
||||
|
||||
**Schema:** `content/schemas/drama_module.schema.yaml`
|
||||
**Module pool:** `content/modules/tier1/*.yaml`
|
||||
**Decisions:** D-023 (three-tier model), D-027 (vertical slice), D-029 (30/50/20 population), D-034 (FRIEND pattern)
|
||||
**Vertical slice reference:** `content/modules/tier1/smuggling_ring_v0_1.yaml`
|
||||
|
||||
---
|
||||
|
||||
## What Is a Tier 1 Drama Module?
|
||||
|
||||
Tier 1 is the authored conspiracy layer of D-023. Drama modules are the things that can go wrong — or go very right, or simply happen — beneath the surface of daily life in Sova Transit. They are:
|
||||
|
||||
- **Hand-authored.** Every event sequence, every NPC role, every outcome was written by a person.
|
||||
- **Pool-based.** Multiple modules exist. The storyteller draws from the pool at game start and activates a subset based on the district and the storyteller's pacing decisions.
|
||||
- **Optional from the player's perspective.** The player can play 60 minutes without engaging the ring. The ring happens anyway. D-027 criterion #4: the observe→notice→follow→discover sequence must emerge from *systems*, not *scripts*.
|
||||
- **Dual-lens.** Every module must be experienced differently by the smuggler and detective characters. Same world, different keyholes.
|
||||
|
||||
What they are **not:**
|
||||
- Not quests with markers or objectives.
|
||||
- Not scripted cutscenes.
|
||||
- Not balanced challenge encounters.
|
||||
|
||||
The storyteller uses the module as a *schedule* — a series of world events it will fire, and conditions it monitors to determine how the world resolves. The player is a witness and agent in a world that moves with or without them.
|
||||
|
||||
---
|
||||
|
||||
## File Structure
|
||||
|
||||
```
|
||||
content/
|
||||
schemas/
|
||||
drama_module.schema.yaml ← Schema reference (this file validates against it)
|
||||
modules/
|
||||
tier1/
|
||||
smuggling_ring_v0_1.yaml ← The v0.1 vertical slice module
|
||||
future_module_v0_1.yaml ← Future modules go here
|
||||
```
|
||||
|
||||
One `.yaml` file per drama module. The storyteller's content loader scans `content/modules/tier1/` at startup and adds all valid modules to the pool.
|
||||
|
||||
---
|
||||
|
||||
## Field Reference
|
||||
|
||||
### Identity Fields
|
||||
|
||||
| Field | Required | Description |
|
||||
|-------|----------|-------------|
|
||||
| `module_id` | Yes | Stable slug: `{name}_v{major}_{minor}`. Never reuse. Increment on breaking structural change. |
|
||||
| `display_name` | Yes | Human-readable title for dev tooling. Not shown in-game. |
|
||||
| `version` | Yes | Authoring version: `{major}.{minor}`. |
|
||||
| `tier` | Yes | Always `1`. |
|
||||
| `description` | No | One-paragraph design summary. Authoring-only. |
|
||||
| `notes` | No | Design rationale, cross-references. Ignored at load time. |
|
||||
| `dual_lens` | No | How smuggler vs detective experience this module. Authoring-only. **Write this first** — it disciplines the design. |
|
||||
|
||||
---
|
||||
|
||||
### Pool Metadata
|
||||
|
||||
Controls how the storyteller samples this module.
|
||||
|
||||
| Field | Required | Description |
|
||||
|-------|----------|-------------|
|
||||
| `pool.weight` | Yes | Selection probability 1–10. Higher = more likely per playthrough. Default 5. |
|
||||
| `pool.compatible_districts` | No | District slugs. Omit for "any". |
|
||||
| `pool.incompatible_with` | No | Module IDs that can't run concurrently. |
|
||||
| `pool.max_concurrent` | No | Almost always 1. |
|
||||
|
||||
**Design note on weight:** Use weight to tune narrative variety, not difficulty. A weight-1 module is a rare playthrough surprise. A weight-8 module like the smuggling ring is "this is usually what's happening in Sova Transit."
|
||||
|
||||
---
|
||||
|
||||
### Entry Conditions
|
||||
|
||||
Defines when the module becomes eligible for activation. ALL world-state conditions must be true. The activation trigger determines *how* it fires.
|
||||
|
||||
#### World-State Condition Types
|
||||
|
||||
| Type | Required Fields | Use When |
|
||||
|------|----------------|----------|
|
||||
| `npc_present` | `role` | The module requires a specific NPC to be in the district. |
|
||||
| `location_accessible` | `location` | The module requires a location the player can physically reach. |
|
||||
| `fact_not_known` | `fact_id` | Module shouldn't activate if a precondition has already been discovered. |
|
||||
| `no_active_module` | `module_id` | Prevents two incompatible modules running at once. |
|
||||
| `fact_known` | `fact_id`, `known_by` | Module requires prior knowledge to make sense. |
|
||||
|
||||
#### Player Conditions (Optional)
|
||||
|
||||
Player conditions are *optional* — modules can and should activate without player engagement as a prerequisite. Use player conditions sparingly, only when the module literally cannot function without a minimum relationship state.
|
||||
|
||||
#### Activation Triggers
|
||||
|
||||
| Trigger | When to Use |
|
||||
|---------|-------------|
|
||||
| `storyteller_push` | Default. Storyteller activates on its own pacing. Most Tier 1 modules. |
|
||||
| `proximity` | Module activates when player wanders near a key location. Useful for "stumble-upon" conspiracies. |
|
||||
| `player_action` | Reserved for modules that require player initiation. Use rarely. |
|
||||
|
||||
**The `min_play_ticks` field is load-bearing for D-027 criterion #1.** At approximately 1 tick/second, 30 minutes of play ≈ 1800 ticks. Set `min_play_ticks` to at least 1800. The vertical slice uses 2100 to give extra breathing room.
|
||||
|
||||
---
|
||||
|
||||
### NPC Requirements
|
||||
|
||||
Each module specifies its NPC slots. Roles are internal slugs used throughout the rest of the document.
|
||||
|
||||
| Field | Required | Description |
|
||||
|-------|----------|-------------|
|
||||
| `role` | Yes | Module-internal slug. Kebab-case. Used in event triggers and outcome conditions. |
|
||||
| `display_hint` | No | Authoring note: who this role is narratively. |
|
||||
| `binding` | Yes | `named` (specific authored NPC) or `generated` (any matching NPC). |
|
||||
| `named_npc` | Conditional | Required when `binding: named`. Short-form canonical ID: `npc:{slug}`. |
|
||||
| `axes` | Conditional | Required when `binding: generated`. Axis constraints the NPC must satisfy. |
|
||||
| `must_have_pattern` | No | Optional NPC pattern (D-024 System A). |
|
||||
| `must_have_motivation` | No | Optional NPC motivation (D-024 System B). |
|
||||
| `is_optional` | No | Default false. If true, module runs without this slot filled (degraded experience). |
|
||||
|
||||
#### Named vs. Generated Bindings
|
||||
|
||||
**Named bindings** reference specific hand-authored NPCs from the district. All v0.1 roles are named. This is the right choice for:
|
||||
- THE FRIEND NPCs (D-034) — they have authored arcs, not generic behavior
|
||||
- NPCs with unique relationships in the 5-triangle web
|
||||
- Roles where voice, history, and moral weight matter
|
||||
|
||||
**Generated bindings** are for future modules set in different districts or using procedurally generated NPCs. They use axis constraints:
|
||||
|
||||
```yaml
|
||||
axes:
|
||||
- axis: secret
|
||||
constraint: has_major_secret
|
||||
- axis: contentment
|
||||
constraint: min_contentment_-3 # Discontented, susceptible to opportunity
|
||||
```
|
||||
|
||||
Constraint conventions: `has_{value}`, `min_{N}`, `not_{value}`. The server's NPC filter system interprets these.
|
||||
|
||||
#### What "Roles" Are Not
|
||||
|
||||
NPC roles in a drama module are **not** the same as NPC patterns (FRIEND, MIRROR, etc.) or motivations (HANDLER, WITNESS, etc.). Module roles are:
|
||||
- Functional slots within the module's narrative (ring-leader, witness, evidence-holder)
|
||||
- Module-local: "ring-leader" in the smuggling ring module ≠ "ring-leader" in any other module
|
||||
- Used to reference the same NPC across events and outcomes without hardcoding the NPC slug
|
||||
|
||||
#### NPC Pattern and Motivation Reference
|
||||
|
||||
Patterns (System A, `must_have_pattern`) encode the NPC's thematic function in the player's experience:
|
||||
|
||||
| Pattern | What It Means |
|
||||
|---------|---------------|
|
||||
| `FRIEND` | Emotionally complex anchor; the contradiction arc lives here (D-034) |
|
||||
| `MIRROR` | Reflects the player character's own path back at them |
|
||||
| `ANCHOR` | Reliable presence; stability the player can always return to |
|
||||
| `GHOST` | Presence felt more than seen; past hangs over current events |
|
||||
| `CATALYST` | Actions cause cascading effects on other NPCs |
|
||||
| `THRESHOLD` | Gatekeeper; controls access to deeper information or relationships |
|
||||
| `REMNANT` | Survivor of a prior event; carries knowledge others want buried |
|
||||
| `SYSTEM` | Embodies an institution or faction rather than personal stakes |
|
||||
| `NOBODY` | Genuinely flat; texture and atmosphere, no arc |
|
||||
|
||||
Motivations (System B, `must_have_motivation`) encode why the NPC acts within the module's conspiracy:
|
||||
|
||||
| Motivation | What It Means |
|
||||
|------------|---------------|
|
||||
| `HANDLER` | Organizes or directs others; the operational center |
|
||||
| `WITNESS` | Knows something they haven't decided to act on |
|
||||
| `TURNCOAT` | Wants out, or has already switched allegiance |
|
||||
| `CIVILIAN` | No conspiracy involvement; proximity creates moral weight |
|
||||
| `OPERATOR` | Executes tasks; functional cog in the system |
|
||||
| `SKEPTIC` | Doubts the conspiracy exists; useful foil for investigation |
|
||||
|
||||
**Full definitions and canonical usage:** `decisions/content.md` D-024.
|
||||
|
||||
---
|
||||
|
||||
### Events
|
||||
|
||||
Events are world-state changes the storyteller fires. They are not scripted player experiences — they happen in the world, and the player may or may not observe them.
|
||||
|
||||
#### Sequences vs. Pools
|
||||
|
||||
| Structure | Use For |
|
||||
|-----------|---------|
|
||||
| **Sequence** | Ordered narrative beats. Step N+1 becomes eligible only after step N fires. Use for character arcs. |
|
||||
| **Pool** | Unordered ambient activity. The storyteller fires any eligible event at any time. Use for texture and background. |
|
||||
|
||||
The vertical slice uses:
|
||||
- `kael_exit_arc` (sequence) — Kael's ordered character arc
|
||||
- `investigation_pressure` (sequence) — Parallel pressure escalation
|
||||
- `ambient_ring_activity` (pool) — Background ring business that runs throughout
|
||||
|
||||
Most modules should have 1-2 sequences plus 1 pool.
|
||||
|
||||
#### Event Step Fields
|
||||
|
||||
| Field | Required | Description |
|
||||
|-------|----------|-------------|
|
||||
| `event_id` | Yes | Unique within module. Used in outcome conditions and `ticks_since_event` triggers. |
|
||||
| `label` | No | Short human-readable label for dev tooling. |
|
||||
| `description` | No | What happens narratively. Write this first — events should have a clear observable presence. |
|
||||
| `triggers` | Yes | ANY trigger being true fires the event. Multiple triggers = OR logic. |
|
||||
| `effects` | No | What changes in the world. |
|
||||
| `once` | No | Default `true`. Set `false` for repeating events (ambient discrepancies, etc.). |
|
||||
| `sets_flag` | No | Module-internal flag set when event fires. Used in outcome conditions. |
|
||||
|
||||
#### Trigger Types
|
||||
|
||||
| Type | Fires When | Key Fields |
|
||||
|------|-----------|------------|
|
||||
| `ticks_since_activation` | N ticks after module activated | `ticks` |
|
||||
| `ticks_since_event` | N ticks after a previous event fired | `after_event`, `ticks` |
|
||||
| `player_proximity` | Player near NPC/location | `target_type`, `target`, `radius_tiles` |
|
||||
| `player_action` | Player interacts with target | `action`, `target_role` |
|
||||
| `fact_known_by_player` | Player has discovered a fact | `fact_id` |
|
||||
| `flag_set` | A module flag has been set | `flag` |
|
||||
| `npc_mood` | NPC enters a mood state | `npc_role`, `mood` |
|
||||
|
||||
**Design principle: events should fire without the player.** Every event must have at least one tick-based trigger (`ticks_since_activation` or `ticks_since_event`). Proximity and action triggers are secondary paths that fire the event *earlier* if the player engages. The world moves at its own pace; the player accelerates or delays, not controls.
|
||||
|
||||
#### Effect Types
|
||||
|
||||
| Type | Use For |
|
||||
|------|---------|
|
||||
| `npc_routine_deviation` | Visible NPC behavior change. Write this descriptively — it's what the player sees. |
|
||||
| `fact_becomes_discoverable` | Gates a fact into the knowledge graph at Rumoured confidence. |
|
||||
| `tell_intensify` | NPC's tell behavior becomes more frequent/pronounced. |
|
||||
| `flag_set` | Internal state tracking. Not visible to player. |
|
||||
| `location_state` | Something visible changes in a location. |
|
||||
| `npc_knowledge_update` | An NPC learns something new. |
|
||||
|
||||
**On `fact_becomes_discoverable`:** This makes a fact discoverable, not known. The player still has to find it — through proximity, examination, dialogue, or observation. The `discovery_method` field is an authoring note for how: be specific enough that a Mellanie can write the dialogue or monologue that surfaces it, and a Gestalt can define the trigger condition in the fact catalog.
|
||||
|
||||
**Fact ID convention:** Use `{module-slug}.{fact_name}` — e.g., `ring.kael_unauthorized_corridor_access`. The module slug prefix namespaces the fact to avoid collisions across modules. Before creating a new fact ID, check `content/global/knowledge/` to see if an equivalent fact already exists; reuse it rather than creating a duplicate.
|
||||
|
||||
**Mapping `discovery_method` to D-035 trigger types:** The `discovery_method` note should describe exactly how the player triggers fact discovery. This maps directly to the D-035 monologue trigger taxonomy (full list in `decisions/content.md` D-035 and `content/global/enums/triggers.yaml`):
|
||||
|
||||
| If discovery happens via… | D-035 trigger type | What to author |
|
||||
|--------------------------|-------------------|----------------|
|
||||
| Player enters the location where something is visible | `enter_location` | Monologue line flagging the anomaly on arrival |
|
||||
| Player watches an NPC doing something unusual | `observe_npc` | Monologue line on NPC observation; dialogue option unlocks |
|
||||
| Player examines an object or terminal | `observe_anomaly` | Examine verb interaction; monologue on result |
|
||||
| Player witnesses two NPCs interacting | `witness_interaction` | Monologue line; trust-gated gossip unlock |
|
||||
| Player finishes a conversation with the relevant NPC | `post_conversation` | Monologue beat after talking to the NPC |
|
||||
| Player discovers a physical object (cargo, message) | `discover_evidence` | Examine verb; monologue on discovery |
|
||||
| Player returns to a location they've been before | `return_visit` | Monologue on changed state vs. prior visit |
|
||||
|
||||
Write the `discovery_method` note to specify which of these applies — ideally two methods for redundancy (e.g., `enter_location` plus `observe_anomaly`) so players aren't funneled into a single approach.
|
||||
|
||||
---
|
||||
|
||||
### Outcomes
|
||||
|
||||
Outcomes are resolution states. The storyteller checks all outcome conditions each tick after the module activates. The first matching outcome is applied.
|
||||
|
||||
**Every module must include:**
|
||||
- At least one terminal outcome that represents "the investigation succeeded"
|
||||
- At least one terminal outcome that represents "the conspiracy ran its course"
|
||||
- Exactly one expiry outcome (`is_expiry: true`) for quiet player non-engagement
|
||||
|
||||
#### Outcome Fields
|
||||
|
||||
| Field | Required | Description |
|
||||
|-------|----------|-------------|
|
||||
| `outcome_id` | Yes | Unique slug. |
|
||||
| `label` | Yes | Short label. |
|
||||
| `is_terminal` | Yes | `true` = module ends. `false` = transitional state (module can continue evolving). |
|
||||
| `is_expiry` | No | `true` = this is the quiet-exit outcome. One per module. |
|
||||
| `conditions` | No | ALL conditions must be true. See below. |
|
||||
| `effects` | No | World changes when outcome is reached. |
|
||||
|
||||
**On `is_terminal: false`:** A non-terminal outcome fires its effects and applies its label, but the module remains active — the storyteller keeps checking for the next matching outcome. Use this for intermediate states where the world has visibly shifted but the situation hasn't resolved: the `ring_splinters` outcome in the vertical slice is non-terminal because the ring going quiet is a change of state, not a conclusion. A module with only non-terminal outcomes will run forever; always ensure there is a reachable terminal outcome (or expiry) downstream.
|
||||
|
||||
#### Outcome Conditions
|
||||
|
||||
| Condition | Description |
|
||||
|-----------|-------------|
|
||||
| `facts_known` | Player must know all listed facts. |
|
||||
| `facts_not_known` | Player must NOT know any listed facts. |
|
||||
| `flags_set` | All listed module flags must be set. |
|
||||
| `flags_not_set` | None of listed flags may be set. |
|
||||
| `events_fired` | All listed events must have fired. |
|
||||
| `ticks_since_activation` | Module has been running for at least N ticks. |
|
||||
|
||||
#### Outcome Effects
|
||||
|
||||
| Type | Description |
|
||||
|------|-------------|
|
||||
| `npc_disposition` | NPC's relationship state with player shifts. |
|
||||
| `faction_reaction` | Faction reputation change. |
|
||||
| `location_access_change` | Location becomes restricted, locked, or open. |
|
||||
| `fact_state` | Fact is permanently known, hidden, or destroyed. |
|
||||
| `npc_exit` | NPC leaves the district or becomes inaccessible. |
|
||||
|
||||
---
|
||||
|
||||
## Design Principles for Tier 1 Modules
|
||||
|
||||
### 1. The World Moves First
|
||||
|
||||
Events happen on a tick schedule. The player is a witness who can accelerate, delay, or redirect — not a trigger. If your module can only function if the player takes specific actions, it's a quest, not a drama module.
|
||||
|
||||
### 2. Both Characters Must Have a Story
|
||||
|
||||
Every event and outcome must mean something different to the smuggler and the detective. Write the `dual_lens` authoring field first. If you can't write both lenses, the module is character-agnostic filler — not Tier 1.
|
||||
|
||||
### 3. No Clean Resolutions
|
||||
|
||||
D-034 and D-027 both require moral ambiguity. The smuggling ring doesn't have a "good" ending. The detective arresting Kael is not obviously better than letting him go. Every outcome must have a cost. If one outcome is obviously correct, you've failed the design.
|
||||
|
||||
### 4. THE FRIEND Contradiction Is the Pivot
|
||||
|
||||
If your module involves a FRIEND-pattern NPC, the observable contradiction (D-034) must be:
|
||||
- **Observable from spatial positioning** — not from dialogue, not from menus
|
||||
- **Ambiguous before context** — the player sees the behavior before they understand what it means
|
||||
- **Irreversible once witnessed** — seeing changes the relationship, even if the player does nothing
|
||||
|
||||
The secret meeting in corridor B-7 is the canonical example. After witnessing it, neither character can pretend they don't know what they saw.
|
||||
|
||||
### 5. Expiry Is Not Failure
|
||||
|
||||
The `module_abandoned` expiry outcome should feel like a natural ending, not a penalty. The world closes around this conspiracy without the player. That's the 70% mundane reality (D-029): most conspiracies don't get protagonists. Write the expiry description to feel melancholy but not punitive.
|
||||
|
||||
### 6. Facts, Not Flags, Drive Investigation
|
||||
|
||||
Facts (from `global/knowledge/`) are the player's knowledge graph. Flags are the storyteller's internal state tracking. The key design question: "Is this something the player knows, or is this something the storyteller tracks?" If the player knows it, it's a fact. If the storyteller tracks it, it's a flag.
|
||||
|
||||
Facts should be discoverable through multiple methods (observation, dialogue, examination, proximity). Never require a single specific action to surface a critical fact.
|
||||
|
||||
---
|
||||
|
||||
## Validation and Format Rules (Gestalt)
|
||||
|
||||
These rules cover the schema's format constraints and the validation gaps that JSON Schema cannot enforce. All of these are also caught by Tier 2 build-time validation (`make validate-content`), but catching them during authoring saves a pipeline run.
|
||||
|
||||
### ID and Slug Formats
|
||||
|
||||
| Field | Regex | Example |
|
||||
|-------|-------|---------|
|
||||
| `module_id` | `^[a-z][a-z0-9-]*_v[0-9]+_[0-9]+$` | `smuggling_ring_v0_1` |
|
||||
| `sequence_id`, `pool_id` | `^[a-z][a-z0-9_-]*$` | `kael_exit_arc` |
|
||||
| `event_id` | `^[a-z][a-z0-9_-]*$` | `kael_goes_cold` |
|
||||
| `outcome_id` | `^[a-z][a-z0-9_-]*$` | `ring_exposed` |
|
||||
| `sets_flag` / flag references | `^[a-z][a-z0-9_-]*$` | `kael_behavior_changed` |
|
||||
| `role` (npc slot) | `^[a-z][a-z0-9-]*$` | `ring-member-exiting` |
|
||||
| `named_npc` | `^npc:[a-z][a-z0-9-]*$` | `npc:kael-davan` |
|
||||
| `version` | `^[0-9]+\\.[0-9]+$` | `0.1` |
|
||||
|
||||
Note the difference: `event_id`, `outcome_id`, `sequence_id`, and flags use underscores and hyphens (`[a-z0-9_-]*`). NPC `role` slugs use hyphens only (`[a-z0-9-]*`). Mixing them in wrong fields will fail schema validation.
|
||||
|
||||
### Flag Naming Convention
|
||||
|
||||
Flags are module-internal state. Every flag name that appears in `sets_flag` on an event **must** also appear in at least one outcome's `flags_set` or `flags_not_set` condition — or the flag serves no purpose. Convention:
|
||||
|
||||
- Use `snake_case` with underscores: `kael_behavior_changed`, `voss_pressure_applied`
|
||||
- Name by what happened, not what it enables: `handler_pressure_applied` not `kael_ready_to_flee`
|
||||
- Flags set by events accumulate — they are never automatically cleared
|
||||
- A flag set by a time-triggered event (not player-triggered) cannot be used as an expiry gate (see "Common Mistakes" below)
|
||||
|
||||
### Axis Constraint Syntax (Generated NPC Bindings)
|
||||
|
||||
The `constraint` field in `axes` is a freeform string. The storyteller's NPC filter interprets it. Convention (author responsibility — schema does not enforce):
|
||||
|
||||
| Prefix | Example | Meaning |
|
||||
|--------|---------|---------|
|
||||
| `has_` | `has_major_secret` | NPC axis value includes this descriptor |
|
||||
| `min_contentment_` | `min_contentment_-3` | Contentment axis value ≤ N (more discontented) |
|
||||
| `not_` | `not_combat_trained` | Axis value does NOT include this descriptor |
|
||||
| `is_` | `is_ring_member` | Boolean flag set on NPC profile |
|
||||
|
||||
### What JSON Schema Cannot Validate (Tier 2 Catches These)
|
||||
|
||||
| Issue | Where to Look | Impact |
|
||||
|-------|--------------|--------|
|
||||
| `fact_id` not defined in `global/knowledge/` | Effect `fact_becomes_discoverable`, outcome `facts_known` | Fact silently never becomes discoverable |
|
||||
| `sets_flag` name not referenced in any outcome condition | Event `sets_flag` | Flag is set but never meaningful |
|
||||
| `flags_set`/`flags_not_set` reference flag never set by any event | Outcome conditions | Condition permanently true or false |
|
||||
| `ticks_since_event.after_event` references unknown event_id | Event trigger | Trigger never fires |
|
||||
| `named_npc` ID doesn't exist in district NPC profiles | NPC requirements | Load-time failure |
|
||||
| Multiple outcomes have `is_expiry: true` | Outcomes list | Undefined storyteller behavior |
|
||||
| `faction` in outcome effects not in `global/factions/` | Outcome effects | Effect silently ignored |
|
||||
|
||||
### The Expiry Condition Pitfall
|
||||
|
||||
This is the most common authoring mistake for expiry outcomes. **The expiry condition must use `facts_not_known`, not `flags_not_set`.** Reason:
|
||||
|
||||
Events with `ticks_since_activation` triggers fire automatically without player engagement. If an auto-firing event sets a flag, and your expiry checks `flags_not_set: [that_flag]`, the expiry condition becomes permanently false after the event fires — the module can never expire quietly.
|
||||
|
||||
**Wrong:**
|
||||
```yaml
|
||||
# kael_goes_cold fires automatically at tick 300, sets kael_behavior_changed
|
||||
# This expiry can never fire after tick 300
|
||||
- outcome_id: module_abandoned
|
||||
is_expiry: true
|
||||
conditions:
|
||||
flags_not_set:
|
||||
- kael_behavior_changed # This flag is always set by tick 300
|
||||
ticks_since_activation: 5400
|
||||
```
|
||||
|
||||
**Correct:**
|
||||
```yaml
|
||||
# facts_not_known gates on player investigative action, not auto-fired events
|
||||
- outcome_id: module_abandoned
|
||||
is_expiry: true
|
||||
conditions:
|
||||
facts_not_known:
|
||||
- "ring.cargo_discrepancy_pattern" # Only known if player examined terminal
|
||||
- "ring.kael_unauthorized_corridor_access" # Only known if player observed Kael
|
||||
ticks_since_activation: 5400
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Checklist Before Submitting a New Module
|
||||
|
||||
- [ ] `module_id` uses correct format and doesn't collide with existing modules
|
||||
- [ ] `dual_lens` is written and shows clearly different experiences per character
|
||||
- [ ] `min_play_ticks` ≥ 1800 (30 minutes at 1 tick/second)
|
||||
- [ ] Every event sequence step has at least one tick-based trigger
|
||||
- [ ] Every `fact_becomes_discoverable` effect has a `discovery_method` note
|
||||
- [ ] The module includes at least one named FRIEND-pattern NPC (for v0.1 modules)
|
||||
- [ ] Expiry outcome is present (`is_expiry: true`) with conditions gated on `facts_not_known`, NOT `flags_not_set`
|
||||
- [ ] All outcomes have been reviewed for moral ambiguity — no "obviously correct" resolution
|
||||
- [ ] `npc_requirements` covers every role referenced in events and outcomes
|
||||
- [ ] All fact IDs used in effects/conditions exist in `global/knowledge/`
|
||||
- [ ] All `sets_flag` names appear in at least one outcome condition
|
||||
- [ ] All `flags_set`/`flags_not_set` names are set by at least one event's `sets_flag`
|
||||
- [ ] `make validate-content` passes
|
||||
|
||||
---
|
||||
|
||||
## Cross-References
|
||||
|
||||
| Topic | Location |
|
||||
|-------|----------|
|
||||
| Three-tier content model | `decisions/content.md` D-023 |
|
||||
| NPC 10-axis model | `decisions/content.md` D-024 |
|
||||
| Vertical slice scope | `decisions/scope.md` D-027 |
|
||||
| Population ratios | `decisions/content.md` D-029 |
|
||||
| THE FRIEND pattern | `decisions/content.md` D-034 |
|
||||
| Smuggling ring module | `content/modules/tier1/smuggling_ring_v0_1.yaml` |
|
||||
| Drama module schema | `content/schemas/drama_module.schema.yaml` |
|
||||
| Fact catalog | `content/global/knowledge/` |
|
||||
| NPC profiles (v0.1) | `content/campaigns/main/systems/krenn/` |
|
||||
| Storyteller stub | `server/src/storyteller/mod.rs` |
|
||||
|
||||
---
|
||||
|
||||
*Ticket #158 — Tier 1 drama module schema. Paula (dramatic structure), Gestalt (schema format), Mellanie (authoring review).*
|
||||
Reference in New Issue
Block a user