# Conflicts: # CHANGELOG.md # content/_meta/README.md # content/_meta/npc-authoring-style-guide.md # wiki/_templates/cultural-group.md # wiki/_templates/institution.md # wiki/_templates/star-system.md # wiki/characters/devra.md # wiki/characters/drin.md # wiki/characters/harek.md # wiki/characters/lera-sessik.md # wiki/characters/maret-korr.md # wiki/characters/naia-tamm.md # wiki/characters/nils-davan.md # wiki/characters/pell.md # wiki/characters/renn.md # wiki/characters/resha.md # wiki/characters/sabel.md # wiki/characters/sera-venn.md # wiki/characters/torek-lintar.md # wiki/characters/voss.md # wiki/star-systems/krenn/index.md
36 KiB
title, description, type, status, workshop, agent, round, created
| title | description | type | status | workshop | agent | round | created |
|---|---|---|---|---|---|---|---|
| Workshop Outcomes | Final outcomes summary including D-138, D-123 amendment, and implementation plan | workshop | archived | llm-voice-pipeline | 0 | 2026-03-07 |
LLM Voice Pipeline Workshop — Outcomes
Workshop: LLM Voice Pipeline Design Workshop Dates: 2026-03-07 (all three rounds) Rounds: 3 (Inventory → Convergent Evaluation → Decision) Participants: Gestalt, Tyre, Paula, Mellanie, Ozzie, Miri, Troblum, Qatux Decisions produced: D-138 (new), D-123 (amended), D-124 (superseded) Compiled by: Qatux — 2026-03-07
1. Architecture Decision (D-138)
D-138: LLM Re-voicing Pipeline for NPC Voice
Status: Pending formal record in
decisions/content.md(ID claimed, text below is canonical)Decision: NPC observable behaviors and dialogue are processed through an LLM re-voicing pipeline that translates culture-neutral semantic base text into character-voiced output. The pipeline is a background runtime enhancement, not a live generation system. Tell behaviors are base-text passthrough — always. Active tell state influences the re-voicing prompt for surrounding content without the tell text itself being re-voiced. The game is complete and functional without the pipeline; it is an enhancement that elevates voice quality for players with sufficient hardware.
Rationale: D-122 (all NPCs generated) and D-128 (culture implicit in starting location) require NPC voice to scale across zones and cultures without O(R×Z×C) hand-authoring. The re-voicing model — translate culture-neutral semantic base text into character voice — is the only architecture that scales while preserving content quality. The base-text fallback ensures the game is complete without the pipeline. Tell-as-passthrough with context influence preserves the information asymmetry mechanic (D-010) while giving tells cultural texture through their influence on surrounding content.
Raised by: LLM Voice Pipeline Workshop (2026-03-07). Jeroen's decisions are the binding inputs.
Dissent: Miri flagged concern about cultural philosophy at 2B model size — addressed via hybrid injector format (instruction + example pairs) and spike validation.
Amends: D-123 — see Section 2. Supersedes: D-124 (in-game AI deferred — door is now walked through). Cross-references: D-010, D-121, D-122, D-128, D-029, D-007, D-092.
Architecture Layers
| Layer | What | How |
|---|---|---|
| Semantic base text | Culture-neutral behaviors and dialogue | Authored in RON files; serves as LLM seed, graceful fallback, and LLM-off experience simultaneously |
| Tell behaviors | Mechanical signals (TellCategory) | Base-text passthrough — NEVER sent to LLM. Always served as authored. |
| Tell context injectors | Active tell state influence on surrounding content | Per-TellCategory tone instructions shaping how behaviors/dialogue are re-voiced; tells inform without being re-voiced |
| Culture injectors | Culture-specific voice (register, oath vocabulary, negatives) | 150–250 tokens per culture; sourced from NpcBlueprint.cultural_markers; universal negatives in shared prefix |
| Trait + mood modifiers | Personality and current emotional state | ~10–25 tokens each; layered atop culture injector |
| Re-voiced output | Cached, player-facing voiced content | Generated per (NPC × tell_state × culture); cached at generation time; served at runtime by lookup |
Content Tiers
- Baked — Hub zones (Sova Transit District) ship with pre-voiced content generated at build time and human-reviewed before shipping. This is the quality reference and the player's first-hours experience.
- Pre-voiced — Background queue generates voiced content for adjacent zones before the player arrives. Priority: Critical (P0, plot-critical) → High (P1, current zone) → Standard (P2, adjacent) → Background (P3, distant).
- Base text fallback — If pre-voicing has not completed, base text is served. Designed to be intentionally spare, not broken. Pre-voicing catches up in the background.
Tell-State Variant Caching
Each behavior and dialogue line is pre-voiced in 6 variants: Neutral + 5 TellCategory states (Nervous, Angry, Friendly, Guarded, RoutineDeviation). Cache key: (npc_stable_id, line_id, tell_state, culture_id). At runtime, the game reads the NPC's current tell state and serves the matching pre-voiced variant — zero runtime inference for tell-state changes.
Fallback order:
- Pre-voiced variant for current tell state → serve it
- Pre-voiced neutral variant → serve it (acceptable degradation)
- Base text → always present, always correct
Data Model Changes Required
// NpcBlueprint — tell_behaviors as first-class field, routing by field not content
pub struct NpcBlueprint {
pub observable_behaviors: Vec<String>, // → free re-voicing queue
pub tell_behaviors: Vec<TellBehavior>, // → base-text passthrough always
// ...
}
pub struct TellBehavior {
pub category: TellCategory, // Nervous | Angry | Friendly | Guarded | RoutineDeviation
pub base_text: String, // base text — also the final shipped text; never re-voiced
}
// Individual voiced lines — anchor line protection (D-092)
pub struct VoicedLine {
pub base_text: String,
pub anchor_line: bool, // true = passthrough regardless of field; protects D-092 anchor lines
}
Tell-as-Context: How Tell State Influences Surrounding Content
Tells are READ-ONLY inputs. The tell text is never sent to the LLM. When an NPC's tell state is active, it flows into the re-voicing prompt for the NPC's behaviors and dialogue as a tone injector.
The effect: An NPC with a Guarded tell should feel guarded in their dialogue — more clipped, more words chosen, a slight sense of something unsaid — while the base-text tell string remains the mechanical signal exactly as authored.
The five tell-context tone injectors (Gestalt v1, to be refined in Spike 1):
| TellCategory | Tone Injector |
|---|---|
Neutral |
(no injector — free re-voicing with culture + trait only) |
Nervous |
"This NPC's words come slightly faster than usual, briefer. They don't elaborate. A phrase drops off before it's finished. Do not say they seem nervous or afraid." |
Angry |
"This NPC's words are measured and deliberate — not shouting, containing. A word hits harder than the context requires. Do not say they seem angry." |
Friendly |
"This NPC offers slightly more than asked. A word of genuine warmth lands casually. They don't perform friendliness — it just shows. Do not add compliments or over-warmth." |
Guarded |
"This NPC chooses each word with a half-second more care than normal. They answer what was asked, no more. There is nothing wrong here. Do not say they seem guarded or evasive." |
RoutineDeviation |
"This NPC is elsewhere in their mind. They are present but preoccupied — answers are on track but land a beat late. Do not explain why or name what they're thinking about." |
Critical constraint on all tone injectors: Do not name the internal state. Do not add information. Do not change the content — only the texture of expression. Results must pass the deniability test: could the player explain this phrasing without knowing the tell was active?
Van Maanen's Star-culture tell-tone table (Miri v1 — culture-inflected expressions; one per culture required):
| Tell category | Van Maanen's Star-inflected tonal register |
|---|---|
| Nervous | Answers run shorter than usual. Eyes stay on task. Nothing's wrong — they just have things to do. |
| Guarded | Direct past the point of directness. Closes conversation paths fast without being unfriendly. |
| Avoidance/relationship | Task-focused when this person is nearby. Finds work to do. Polite but not engaging. |
| Hostile suppression (Angry) | Steady. Even. The kind of steady that takes effort to maintain. Not hostile — just flat in a way that doesn't feel natural for Van Maanen's Star. |
| RoutineDeviation | Unhurried. Unremarkably normal. Like nothing's worth noticing. |
Architecture: universal-first tell-context prompt. The universal phenomenon-class description (baseline readability) is always present. Cultural flavor is conditional and additive — the prompt asks the LLM whether it can add cultural texture without significantly changing the information conveyed. Humans are humans first; shiftiness, micro-expressions, and body language must remain universally recognizable. Cultural convention is sprinkled in sparingly, not substituted. Per-culture tell-tone tables are optional enrichment authored over time, not a launch requirement.
Model and Runtime
- Primary model: Gemma 2 2B (Google, Apache 2.0 + Google Gemma ToU), Q4_K_M quantization, ~1.5 GB
- Fallback model: Phi-3 (Microsoft, MIT license) — note: Phi-3-mini is 3.8B parameters, NOT 2B class. ~2.2 GB Q4, ~30% slower on minimum spec hardware
- No Chinese-origin models (Qwen/Alibaba excluded by Jeroen's decision)
- Inference runtime:
llama-cpp-2(Rust bindings to llama.cpp), GGUF format - Distribution: Model bundled in game install (~1.5 GB added to base). No optional download.
- Thread isolation: Separate thread pool for inference vs. world generation. Inference at below-normal OS priority.
2. D-123 Amendment and D-124 Supersession
D-123 (Amended)
D-123: Generative AI for NPC content — build-time authoring tool and runtime voice pipeline
Date (original): 2026-03-05
Date (amended): 2026-03-07
Decision: The AI pipeline operates in two distinct modes with different safety profiles:
Build-time mode (authoring tool): Content generated at build time for baked hub zones. Subject to mandatory human review before shipping. This preserves D-123's original authorial control constraint — AI as an accelerated authoring tool producing content humans review and approve.
Runtime mode (background enhancement): Content generated during gameplay for non-baked zones, via a background inference queue, when "AI-Enhanced Dialogue" is enabled. Not human-reviewed per line. Safety provided by three layers: (1) base-text-as-fallback — always present and complete; (2) build-time-validated injectors — only pre-validated prompts used, never ad-hoc; (3) runtime contamination filter — lightweight check before content is served.
Non-negotiable constraints (both modes): Culture vectors are the primary prompt constraint. The AI does not default to genre conventions. Authorial control governs what the LLM may and may not produce through injector clauses, negative constraints, and pipeline routing rules. The AI pipeline applies voice to authored semantic content; it does not generate narrative decisions, base text, tell behaviors, secret-tier dialogue (D-028 Layer 3), or anchor lines (D-092). These categories are always authored and always served as-authored.
Rationale: Full pipeline (behaviors + dialogue) is the correct scope. A system that voices observed behavior but not spoken dialogue creates register whiplash at the highest-investment moment of player engagement. Build-time mode preserves the human-review safety model. Runtime mode enables scaling to the generated world with base-text fallback as the permanent safety net.
D-124 (Superseded)
D-124 is superseded by D-138. D-124 deferred in-game AI but left the door explicitly open. That door is now walked through. The system is not ollama-based — it uses
llama-cpp-2with GGUF Q4_K_M quantization, bundled with the game, running background inference via an isolated thread pool. The key constraint from D-124 remains binding through D-123 (amended): this system does not drive live narrative decisions. It applies voice to authored semantic content.
3. Resolved Questions
Q-057 (content authoring scale at O(R×Z×C))
RESOLVED by D-138. The LLM re-voicing pipeline is the answer. Culture-neutral base text authored once per role/zone; culture injectors authored once per culture (~1 day per culture); LLM applies voice at runtime. The O(R×Z×C) scaling problem is replaced by O(R×Z) + O(C), where O(C) is a small constant.
Q-012 (how to scale NPC voice across cultures without per-culture hand-authoring)
RESOLVED by D-138. Same answer as Q-057. The culture injector system (8-10 clauses + 2 examples per culture) is the scaling mechanism. Each new culture requires ~1 day of copy work, not weeks of behavior authoring.
Q-R1-01 (tell literacy model: cross-NPC grammar or fresh-each-time?)
RESOLVED. Cross-NPC grammar at the phenomenon-class level. The player learns classes of observable behavior (suppression, avoidance, surveillance, nervous fidget, routine deviation) that map to NPC internal states. Tell re-voicing (if any) must preserve phenomenon-class membership, not just phrasing. This is established by gen_tells() producing ~12 distinct tell behavior strings across the entire game — a designed grammar, not random variation.
Q-R1-02 (scope: behaviors only, or behaviors + dialogue?)
RESOLVED by Jeroen's decision. Full pipeline: behaviors AND dialogue. "We don't introduce a precision laser cutting tool and then use it only to open boxes."
Q-R1-03 (are tells a first-class data model field?)
RESOLVED. tell_behaviors: Vec<TellBehavior> as a first-class field in NpcBlueprint, separate from observable_behaviors. Routing is by field, not content analysis. In production, tells are 5 TellCategory enums computed per-tick by DerivedTellState — making tell voicing a fixed 5-category × N-cultures library (~20-40 strings per culture), bakeable at build time.
Q-R1-04 (effective token budget for cultural injectors?)
RESOLVED. 150 tokens is insufficient for cultural philosophy; 200-250 tokens with hybrid format (instructions + 2 example pairs) is recommended for register accuracy. Universal negative injectors (NI-1 through NI-5, ~265 tokens full / ~100 tokens compressed) go in the shared system/prefix prompt — not the culture injector — preserving the full budget for culture-specific content. Troblum confirms that prompt length difference between 150-token and 500-token prompts adds only ~15% overhead (prefill is cheap; generation is the bottleneck).
Q-R1-05 (minimum hardware CPU spec?)
RESOLVED. Workshop assumption: 4-core 2019+ CPU (i5-9400 / Ryzen 5 3600). Gemma 2B Q4: 7-9 t/s on i5-9400, 9-12 t/s on Ryzen 5 3600. Zone pre-voicing (behaviors + dialogue) completes in 2-7 minutes on this hardware — comfortable for immersive-sim play patterns. No hard minimum spec floor (Jeroen's decision). Layered hardware detection handles the recommendation logic.
4. Spike 1 Definition
Purpose
Build the Rust inference plumbing and validate model/prompt quality before any game integration. Answer: "does this even play?"
Deliverable: sr-voice CLI tool
A standalone Rust crate (server/sr-voice/) wrapping llama-cpp-2. CLI accepts a prompt (from file, stdin, or JSONL batch), runs inference, returns text + timing. No queue, no cache, no game integration.
server/sr-voice/
Cargo.toml
src/
main.rs # CLI entry point
inference.rs # Model loading + generation wrapper
prompt.rs # Prompt payload parsing
Key CLI flags: --model <path>, --threads <n>, --max-tokens <n>, --seed <n>, --json, --batch <jsonl-file>, --benchmark.
Participants
Tyre builds the sr-voice CLI. Jeroen, Mellanie, and Paula run manual prompt experiments.
Test Matrix
11 prompt payloads (7 behaviors + 3 tells + 5 dialogue samples), each run through:
- Both models: Gemma 2B Q4_K_M and Phi-3 (fallback)
- 2-3 prompt template variants (instruction-only, few-shot, negative-constraint-heavy)
Key test payloads include:
- B-01 to B-07: behavior samples across roles, moods, relationship states, tell-context (Mellanie's payloads)
- T-01 to T-03: tell behaviors testing phenomenon-class preservation
- D-01 to D-05: dialogue samples from neutral to high-affect with tell-context (Paula's payloads)
Success Criteria (Gestalt's 5 criteria)
| Criterion | Hard requirement? | Target |
|---|---|---|
| Information preservation (behaviors) | No | ≥9/10 outputs |
| Information preservation (dialogue) | No | ≥9/10 outputs |
| Tell-context tone (undertone sensed without naming) | No | ≥8/10 outputs |
| Tell-context: zero explicit state naming | YES | 0 instances across all outputs |
| Cultural grammar survival (Van Maanen's Star legible, blind review) | No | ≥8/10 correct identifications |
| No false information (D-010 boundary) | YES | 0 instances |
| Qualitative "real person" test | No | ≥1 convincing output per reviewer |
Go/No-Go rule: Both hard requirements met + ≥4/5 soft criteria pass → proceed to Spike 2 with the winning model. Hard requirement failure → fix prompt architecture before Spike 2 (never accept explicit state naming or false information).
Model selection: Winning model = passes both hard requirements and scores higher across soft criteria. If only Phi-3 meets quality bar, accept the RAM/throughput tradeoff and document why. If neither passes, fall back to base-text-only and investigate prompt architecture.
5. Spike 2 Definition
Purpose
Wire the validated Spike 1 runner into the game. Full architecture integration.
Components (all from Tyre's spec)
5.1 Inference thread pool
- 1 dedicated inference thread owning the
InferenceEngine - Below-normal OS priority; inference yields to simulation and rendering
- llama.cpp internal threading: physical_cores - world_gen_threads - 1
5.2 Work queue
crossbeam-channelbounded channel (capacity: 256)- Priority tiers: Critical (P0) → High (P1) → Standard (P2) → Background (P3)
- Backpressure: queue full → drop item silently, game continues with base text
- Zone transition: pause inference on
ZoneTransitionStart, resume onZoneTransitionComplete
5.3 Voice cache
- Key:
(world_seed, culture_id, npc_stable_id, content_type, content_index) - Format: MessagePack (D-020), stored per-zone in
user://voice_cache/{seed}.msgpack - Invalidation: on seed change, model update, or injector version change
- Baked content: ships as
res://voice_baked/{zone_id}.msgpackgame asset, never regenerated at runtime
5.4 Tell-as-context prompt construction
The build_prompt() function reads npc.cultural_markers (Miri's source-of-truth recommendation) and injects the active TellCategory as a mood/state modifier. Tell text itself is never in the prompt.
5.5 Observer integration Observer reads behavior string:
- Check voice cache for (seed, culture, npc_id, behavior_index)
- Cache hit → use voiced string
- Cache miss → use base text (fallback)
- Tell state → always from
DerivedTellState(passthrough, never from cache)
No changes to wire format (ObserverSnapshot). Client-transparent.
5.6 Baked content generation
Build-time make voice-bake target runs inference against all hub NPC blueprints, writes .voicecache files. Human review by Paula/Mellanie before commit. Required CI check before game package builds.
5.7 Hardware detection Layer 1 (RAM check) → Layer 2 (TPT benchmark, 20 tokens) → Layer 3 (recommendation thresholds). See Section 8 for full spec.
Effort estimate (Tyre)
| Work item | Sprints |
|---|---|
Spike 1: sr-voice CLI |
1 |
| Spike 1: Prompt testing (Mellanie/Paula/Jeroen) | 1 (parallel) |
| Spike 2: Queue + cache + thread pool | 1.5 |
| Spike 2: Tell-as-context prompt construction | 0.5 |
| Spike 2: Observer integration | 0.5 |
| Spike 2: Baked content generation tool | 0.5 |
| Hardware detection system | 0.5 |
| Total | 5.5 sprints |
6. Authoring Workflow
What the copy team authors
Base text (ongoing, per zone/role/dialogue pool)
typical_behaviorsarrays in zone RON files- Dialogue line pools in D-028 tagged format
- Quality bar: "deliberately sparse observation" — complete, evocative, culturally neutral. Not rough draft. Not placeholder.
- Test: (1) Does this show a moment, not a category? (2) Could you imagine a specific person doing this? (3) Would you be okay if this were the only text the player sees?
Culture injectors (once per culture, ~1 day of work)
voice_injectorsfield in culture RON (new field)- 8-10 explicit LLM persona instruction sentences in second-person imperative register
- 2 brief example pairs demonstrating correct culture voice
- Van Maanen's Star v2 is finalized (see Section 7.1 below) — ready for Spike 1
Trait modifier clauses (once total, ~10 sentences)
- 1 injector clause per personality trait, 10 traits
- Written in world-specific terms: "Bold" = "You say the uncomfortable thing in front of people."
- Mellanie to draft all 10 before Spike 1
Negative injectors (system prompt layer — written by Miri/Mellanie, integrated by Tyre)
- NI-1 through NI-5 in shared system/prefix prompt
- Full version: ~265 tokens; compressed: ~100 tokens
- Troblum confirms prompt length overhead is acceptable
Anchor line flags (per notable NPC, Tier 1 and Tier 2 only)
anchor_line: boolflag on individual lines (Paula's N-2 requirement)- Copy team flags lines that must never be re-voiced under any circumstances
- Volume: small — only Tier 1 and Tier 2 notable NPCs
What the copy team does NOT author
- Tell behavior strings (algorithmically generated, fixed library per culture)
- Tell category definitions (Gestalt/Tyre)
- Voice cache infrastructure (Tyre)
Review process
Baked content (hub zones): Mandatory human review. Paula and Mellanie review all generated lines against: (1) culture register correct, (2) no lore contamination, (3) base text content preserved. Sign-off required before commit. Estimated: 3-4 hours for Sova Transit District (~360 lines).
Runtime pre-voiced content: 5% sampling to log file, reviewed per sprint. Automated NI-1 through NI-5 keyword scan on all output — hits above 2% trigger prompt audit.
7. Key Artifacts
7.1 Van Maanen's Star Culture Injectors v2 (finalized for Spike 1)
Source: mellanie-round3.md
1. Be direct. No pleasantries. Everyone you talk to is short on time, and so are you.
2. You're working-class and pragmatic. Competence is what earns respect here, not rank
or credentials. You grew up in a community where you either show up and do the work
or you don't, and everyone notices which one you are.
3. You're suspicious of distant authority — management that hasn't worked a shift,
institutions that talk big and deliver slow. You've seen it. It doesn't impress you.
4. When something surprises or frustrates you, expressions like "void take it", "stars",
"cold vacuum", or "blood and void" come naturally. They're not dramatic — they're just
how people here talk.
5. You use first names. Family names belong on contracts and arrest records, not in
conversation.
6. Loyalty runs narrow and deep. Your crew, your shift, your street. Not abstractions.
7. You greet people briefly: "hey", "morning", "shift treating you alright?" No ceremony.
8. You're not rude — you're honest. If something's wrong, you say so. If it's fine,
you say that too. You don't pad.
Example pairs (pattern anchors for small models):
BASE: "declines to answer a question about the overnight run"
VOICED: "Look, that's not mine to say."
BASE: "acknowledges a colleague's greeting while continuing to work"
VOICED: "Hey. Yeah. Catch you at shift end."
Assembly notes: Culture is the baseline for all Van Maanen's Star NPCs. Void-oaths (clause 4) gated to high-affect contexts only. Trait modifiers and tell-context injectors layer on top.
7.2 Finalized Universal Negative Injectors (NI-1 through NI-5)
Source: miri-round3.md. These go in the shared system/prefix prompt for all re-voicing operations.
NI-1 — No Religious Language: "Do not use religious language of any kind: no prayer, no references to gods or deities, no spiritual practices, no phrases derived from religious traditions. Characters in this setting do not have canonical religious expression."
NI-2 — No Military Ranks: "Do not use military rank titles. Prohibited: Commander, Captain (except as vessel operators), Sergeant, General, Admiral, Lieutenant, Private, Corporal, Major, Colonel. Authority in this setting uses occupational and institutional titles: shift lead, port authority, supervisor, Commission officer."
NI-3 — Technology Vocabulary: "Use only the following terms for technology and infrastructure: insert (neural implant worn at the base of the skull), span gate (fixed transit installation for faster-than-light transit), horizon gate (alien-built gate at Oort-cloud distance), the Reach (the network of settled systems). Do not use: holoscreens, blasters, force fields, teleporters, mind-reading, jump drives, FTL, warp, neural link, brain chip, stasis pods."
NI-4 — No Banter or Wit: "Do not produce wit, quips, or wordplay intended to entertain the reader. Do not add levity not present in the original text. Humor in this setting is dry, incidental, and rare."
NI-5 — No Earth-Origin Social References: "Do not reference Earth, nations, sports, Earth history, Earth seasons, Earth religion, or other Earth-origin social structures. Earth-origin swearing (damn, hell, crap, Jesus, goddamn) should not appear — use culture-specific expressions instead."
Total: ~265 tokens full. Compressed version (~100 tokens) available for throughput-constrained cases.
7.3 Culture Injector Template (6-block structure for all future cultures)
Source: miri-round3.md
[BLOCK 1 — REGISTER (~25 tokens)]
Brief description of register style, why it is this way, 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]
Greetings: [list]
Farewells: [list]
Fillers: [NPC-specific — read from NpcBlueprint.cultural_markers.filler_words]
[BLOCK 4 — VALUES (~20 tokens)]
Two core values expressed as behavioral instructions.
[BLOCK 5 — CULTURE-SPECIFIC NOT-LIST (~20 tokens)]
2-3 exclusions specific to this culture (universal NIs already cover global set).
[BLOCK 6 — EXAMPLE PAIRS (~70-80 tokens)]
BASE: [culture-neutral semantic line]
[CULTURE]: [culture-voiced output]
---
BASE: [culture-neutral semantic line]
[CULTURE]: [culture-voiced output]
Per-culture ongoing deliverable: Each culture profile also requires a 5-row tell-tone table (Miri's Section 4) mapping TellCategory to culture-inflected tonal register. See Van Maanen's Star reference table in Section 1 above.
7.4 Dialogue Re-voicing Constraints (6 rules)
Source: paula-round3.md
- D-1: Secret-tier passthrough — Lines tagged
trust: secret(D-028 Layer 3) never enter the re-voicing queue. Served as authored, always. - D-2: Epistemic weight must not shift — Hedge words ("I think," "might," "probably") and direct evidence markers ("I saw," "I was there") must survive verbatim with the same epistemic force.
- D-3: Access tier feel must be preserved —
insidermust feel insider;authoritymust feel institutional;peermust feel lateral. The tag governs eligibility; the register governs feel. - D-4: Named entities are passthrough within output — Proper nouns in base text (NPC names, locations, technology terms) must appear verbatim in re-voiced output. Extraction step before re-voicing, injected as protected list.
- D-5: Relationship-specific lines are passthrough — Lines naming a specific third-party NPC or describing a specific interpersonal event are not re-voiced.
- D-6: Tell-context cannot override culture register — Tell-context modifies emotional inflection within the culture register; it does not replace the register.
7.5 Spike 1 Prompt Payloads
Behavior samples (Mellanie): 7 payloads covering neutral ambient (B-1, B-2), high-affect (B-3), relationship-driven positive/negative (B-4, B-5), tell-context (B-6), social greeting (B-7).
Dialogue samples (Paula + Mellanie): 5 payloads covering low/medium/high access tiers with neutral, Nervous, Guarded, RoutineDeviation, and Angry tell states.
Full prompts with character context, injector stacks, and quality-pass criteria are in mellanie-round3.md and paula-round3.md.
8. Hardware Detection Spec
Three-layer system. No hard minimum spec floor. If a player can load the model, they can run the feature.
Layer 1 — RAM Check
| Free RAM | Action |
|---|---|
| ≥ 2.0 GB | Pass — proceed to Layer 2 |
| 1.6–2.0 GB | Marginal — warn, offer to proceed |
| < 1.6 GB | Fail — feature disabled with message |
Message on fail: "AI-Enhanced Dialogue requires 2 GB of free memory to run. Your system currently has [X] GB available. Close other applications and try again, or leave the setting off — the game is complete either way."
Layer 2 — Time-Per-Token Benchmark
Runs once per installation. 150-token synthetic prompt, 20 tokens of output, temperature 0.0 (deterministic). Cached in {user_data}/ai-dialogue-config.json.
| Tokens/sec | Status | Player message |
|---|---|---|
| ≥ 6 t/s | Green | No message — feature enables silently |
| 3–6 t/s | Yellow | "Running at [X] t/s — pre-voicing will work for main characters and key scenes. Background NPCs may show base text until queue catches up." |
| < 3 t/s | Red | "Running very slowly — we recommend leaving this off, but the choice is yours." |
Layer 3 — Ongoing Monitoring
Inference worker maintains moving average TPT over last 10 tasks. If sustained degradation >40% from benchmark baseline (thermal throttling, power saver mode): settings status changes to yellow, tooltip explains, offers to suspend. Not a forced disable.
Battery/power-saver detection: Windows GetSystemPowerStatus(), Linux /sys/class/power_supply/. Auto-suspend inference when on battery at power saver, resume when plugged in.
Toggle label: "AI-Enhanced Dialogue" (Jeroen's decision — transparency is the priority).
9. Distribution Spec
Model bundled in game install. No optional download step.
SettledReach/
├── game.exe / settled-reach.x86_64
├── SettledReach.pck
├── models/
│ └── voice-pipeline/
│ ├── gemma-2b-q4_k_m.gguf (~1.5 GB)
│ └── model-manifest.json (version, checksum, performance profile)
├── data/
│ └── baked-voice/
│ ├── sova-transit-district.voicecache
│ └── [other hub zones].voicecache
└── [other game files]
Model loaded lazily (on first "AI-Enhanced Dialogue" enable). Cold start performance unaffected. Checksum verification on load against model-manifest.json. Mismatch → log error, disable feature, surface message.
itch.io: Split installer (base game + model pack) as two files. Both required. Player downloads both; installer merges.
Steam: Mark model GGUF file as separate depot chunk so routine game patches don't re-download it.
Platform notes: macOS Apple Silicon — Metal acceleration, 15-30 t/s expected (always green). Steam Deck — Vulkan acceleration, 6-10 t/s (green). Windows/Linux CPU-only — 7-12 t/s on 2019+ hardware.
10. Risk Register
Source: troblum-round3.md with additions from all rounds. 12 risks.
| ID | Risk | Severity | Status | Mitigation summary |
|---|---|---|---|---|
| R-001 | LLM output quality below reference bar | HIGH | OPEN | Spike 1 quality gate. Fallback: ship base text only. Hybrid injector format addresses small-model register failure. |
| R-002 | RAM pressure / OOM after Layer 1 pass | MEDIUM | MITIGATED | 350 MB safety margin. Graceful degradation on allocation failure. Ongoing monitoring. |
| R-003 | Thermal throttling degrades TPT from benchmark | MEDIUM-HIGH | MITIGATED | Moving-average TPT monitoring. Yellow-status notification. Zone-transition pause provides thermal recovery. |
| R-004 | Lore contamination — franchise bleed | MEDIUM-HIGH | MITIGATED | NI-1 through NI-5 in system prompt. Baked content human review. Runtime blocklist scan. 5% sampling. |
| R-005 | Lore contamination — wrong culture register | MEDIUM | MITIGATED | Hybrid injector format (instructions + examples). Oath vocabulary tracked per output. Spike 1 measures directly. |
| R-006 | Cache invalidation failure | LOW | MITIGATED | Hash-based key including injector version and model version. Append-only with TTL sweep. |
| R-007 | Install size friction (1.5 GB model) | HIGH | ACCEPTED | Jeroen's decision. Split-installer for itch.io. Steam depot chunk separation for patch efficiency. |
| R-008 | Model provenance / licensing change | MEDIUM | PARTIALLY MITIGATED | Gemma Apache 2.0 (current). Phi-3 MIT (fallback). License reviewed at each game version. Optional feature means removable without breaking gameplay. |
| R-009 | Save compatibility / voiced text drift on model update | LOW-MEDIUM | MITIGATED | Cache persistent in user data. Old entries unreachable (key changes on model version). Graceful degradation to base text on miss. |
| R-010 | Inference worker crash or hang | MEDIUM | MITIGATED | 60-second per-task timeout. Supervised restart. Auto-disable after 3 crashes per session. Max tokens hard limit. |
| R-011 | Phi-3 misclassified as "2B class" | LOW | RESOLVED | Phi-3-mini is 3.8B params. ~2.2 GB Q4, ~30% slower than Gemma 2B. Layer 1 threshold for Phi-3 would be 2.7 GB. Documented. |
| R-012 | Baked/runtime content divergence | LOW-MEDIUM | MITIGATED | make voice-bake enforces model version match. Same prompt templates for both. Required CI check. |
R-001 is the primary open risk. The team does not know if 2B model quality meets the bar until Spike 1 runs. This is the central unknown the workshop was designed to push toward resolving.
11. Player Experience Architecture
Source: ozzie-round3.md
Three interdependent pillars:
-
Base text is a designed aesthetic, not a fallback. It reads as deliberately sparse observation. Standard mode (AI-Enhanced Dialogue OFF) is a complete experience. The copy team authors base texts to this bar — not to a rough-draft bar.
-
Tell contrast is intentional. Tells in base text read as detective observations against culture-voiced ambient content. This register difference signals "pay attention here." It is a designed feature, not a seam.
-
Player autonomy is respected at every hardware decision. The game recommends. It never forces. "AI-Enhanced Dialogue" toggle is always present in settings. The player can always override any recommendation.
Base text quality bar examples:
| Placeholder (below bar) | Deliberately spare (at bar) |
|---|---|
| "tends crops in the field" | "works a crop row with slow, unhurried passes" |
| "checks credentials at the gate" | "holds out a hand for credentials without looking up from the gate log" |
| "I don't know anything about that." | "That's not something I know anything about." |
Base text elevation priority order: Hub zones (Sova Transit District) → plot-critical NPC roles → tells → ambient roles in non-hub zones.
Zone re-entry transition rule: Base text shown on first zone entry per session. If player leaves and re-enters, voiced content is shown if available. Provides natural diegetic cover for the base text → voiced text transition. Tells never change — always passthrough, always anchoring.
12. Open Items (Post-Workshop)
These require follow-up but do not block the spike.
| Item | Owner | Urgency |
|---|---|---|
Formally record D-138 in decisions/content.md |
SI (ticketed) | Before Spike 2 |
Record D-123 amendment and D-124 supersession in decisions/content.md |
SI (ticketed) | Before Spike 2 |
| Draft and share 10 trait modifier clauses | Mellanie | Before Spike 1 prompt testing |
Add voice_injectors field to culture RON schema |
Tyre | Before Spike 2 |
Add tell_behaviors field to NpcBlueprint |
Tyre | Before Spike 2 |
Add anchor_line: bool field to individual dialogue lines |
Tyre | Before Spike 2 |
| Van Maanen's Star tell-tone table to be mapped to canonical TellCategory enum once confirmed | Miri | After Spike 1 |
| Confirm full set of negative injectors fit within throughput budget (compressed vs. full NI set) | Troblum | Before Spike 1 |
| Jeroen (decided) | Resolved | |
| Diagram: voice pipeline architecture (base text → re-voicing queue → LLM → cache → observer) | Tyre/Qatux | After Spike 1 |
Qatux — 2026-03-07