Files
settled-reach/docs/workshops/llm-voice-pipeline/round-2-notes.md
T
jpmschweitzer 23d9ff0a58 Merge remote-tracking branch 'origin/main' into planning
# 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
2026-03-14 00:24:53 +01:00

18 KiB
Raw Blame History

title, description, type, status, workshop, agent, round, created
title description type status workshop agent round created
Round 2 Notes Compiled notes from round 2 convergent evaluation across all seven participants workshop archived llm-voice-pipeline 2 2026-03-07

LLM Voice Pipeline Workshop — Round 2 Notes

Compiled by: Qatux (Documenter) Round: 2 — Convergent Evaluation Date: 2026-03-07 Source files: *-round2.md (7 participants)


Proposal Votes

Participant Vote Can live with A? Can live with B? Can live with C?
Gestalt B Yes Yes (preferred) Yes, conditionally
Tyre B Yes Yes (preferred) Yes, if phased
Paula A → C sequenced Yes (recommended) Yes, with naming change Yes, if staged
Mellanie B Yes Yes (preferred) Yes, with amended D-123 + human review
Ozzie C (A fallback) Yes Yes, if spike defines success bar Yes (preferred)
Miri A Yes (recommended) Yes, ≥98% threshold No for v0.2
Troblum A Yes (recommended) Yes, with validation pass Yes, conditionally

Tally: A — 3 votes. B — 3 votes. C — 1 vote.

No participant is a blocker on either A or B. Every participant can live with both. Miri is the only vote against C for v0.2 (as opposed to deferred). Ozzie prefers C but accepts A as fallback.

Consensus forming: A as the v0.2 spike target, B as next step if A validates, C as explicit v0.3 target. The A/B split is not an impasse — it is a sequencing question.


Resolution of Open Questions from Round 1

Q-R1-01: Is the tell literacy model cross-NPC grammar or fresh-each-time?

RESOLVED — Cross-NPC grammar at the phenomenon-class level.

Gestalt's answer, with codebase evidence: gen_tells() produces at most ~12 distinct tell behavior strings across the entire game. This is not coincidence — it is a grammar. Q-052 confirms the teaching model: "Hours 1-5: full hints. Hours 15+: player reads the world by behavioral tells alone." Players are explicitly intended to develop a cross-NPC pattern recognition skill. D-039 wow moment #2 ("The Character's Eye") requires the player to have a learnable tell grammar for the moment to function.

Critical nuance (Gestalt): The grammar operates at the phenomenon-class level, not the phrasing level. Players learn "suppression behavior = hiding something consciously," not the exact string "affects exaggerated calm." This matters for Proposal B: constrained re-voicing is safe if the constraint preserves phenomenon-class membership, not just the original phrasing.

Implication for Proposal B: Abstract semantic core labels (e.g., "suppression_behavior") are insufficient for reliable 2B constraint following. Precise phenomenon descriptions are required: "PRESERVE: forced calm. The NPC appears deliberately composed and unhurried. Must not show avoidance, fidgeting, or hurry." The label is for humans; the precise description is what the model needs.


Q-R1-02: Does re-voicing target behaviors only, or dialogue too?

RESOLVED — Behaviors first; dialogue deferred.

Near-consensus across Tyre, Paula, Miri, Troblum: behaviors are the correct first spike target. Dialogue re-voicing is the higher-value player experience enhancement (Ozzie, Paula agree) but the higher-risk operation for a 2B model — longer form, more context, harder to validate, franchise bleed is "corrosive" rather than "bounded."

Tyre gives concrete spike complexity comparison:

  • Behaviors (A/B): 1-2 prompt templates, 150-token context, 30-token output, 1 model, 1-2 sprint spike
  • Dialogue (C): 3 prompt templates, 400-500 token context, 50-token output, potentially 2 models, 2-3 sprint spike

The spike complexity increase for C is real, and the risk of an inconclusive result (quality failure attributable to model, prompt, or content type without clear isolation) is Tyre's primary objection.

Ozzie dissents productively: The dialogue gap is real and will be felt by players. An NPC who observes in Van Maanen's Star voice and speaks in form-letter voice creates a whiplash moment at exactly the highest-investment point (direct conversation). This is a known limitation of A/B, not a resolved one. The correct response is to plan C explicitly, not treat it as hypothetical.

Consensus position: Proposal A or B for the v0.2 spike; Proposal C as the Sprint 26/27 extension, planned explicitly as the next step in the same D-record.


Q-R1-03: Are tells a first-class protected field in NpcBlueprint, or editorial convention?

RESOLVED — First-class field. Data model change confirmed and implementable.

Both Gestalt and Tyre provide implementation specifics.

Tyre's critical clarification: In the production server (not the spike), tells are NOT authored per-NPC — they are 5 TellCategory enums (Nervous, Angry, Friendly, Guarded, RoutineDeviation) computed per-tick by DerivedTellState. The spike's behavior of appending tell strings to observable_behaviors was a pragmatic shortcut. The voice pipeline is NOT a per-NPC scaling problem — it is a fixed 5-category × N-cultures library (~20-40 voiced tell strings per culture), which can be baked at build time for all cultures.

Schema change (Gestalt + Tyre, aligned):

// In npc/blueprint.rs
pub struct TellBehavior {
    pub category: TellCategory,       // or trigger_type for Proposal B
    pub base_text: String,            // culture-neutral base / passthrough
    pub semantic_core: String,        // re-voicing constraint (Proposal B)
}

pub struct NpcBlueprint {
    pub observable_behaviors: Vec<String>,   // → free re-voicing queue
    pub tell_behaviors: Vec<TellBehavior>,   // → locked/constrained queue
}

Routing principle (Gestalt): Field routing, not content analysis. The pipeline checks which field a string came from, never infers whether a string looks mechanical. This is deterministic; content analysis is fragile.

Authoring burden: ~12 constraint sentences (one per tell type) written once by Gestalt or Tyre at implementation time. Copy team does not own tell authoring — tells are generated algorithmically.


Q-R1-04: What is the effective token budget for cultural injectors?

RESOLVED — 150 tokens sufficient for vocabulary; hybrid format at 200-250 recommended for register.

Tyre and Miri answer independently and converge.

Tyre's token count for a complete ambient behavior prompt:

  • System instruction: ~45 tokens
  • Culture injector: ~75 tokens (register, oath vocabulary list, negative constraints)
  • Personality + mood: ~10 tokens
  • Base text + format: ~15 tokens
  • Total: ~145 tokens ✓ (fits 150-token budget)

Miri's assessment: 150 tokens encodes vocabulary preservation correctly. It does NOT encode cultural philosophy (why void-oaths exist, community topology, social calibration). The difference between 150 and 300 tokens is "following rules" vs. "embodying a voice." The model at 150 tokens follows a vocabulary list; at 300 tokens it can make sensible judgment calls.

Key architectural decision (Miri): Universal negative injectors (NI-1 through NI-5 covering religion, military ranks, wrong technology terms, banter/wit, Earth references) should go in the system/prefix prompt, not the culture injector. This preserves the full 150-token culture injector budget for culture-specific content. The 5 NIs total ~130-150 tokens in a shared prompt layer.

Hybrid format recommendation (Miri, 200-250 token culture injector):

  • ~80-90 tokens: minimal instruction set (register, oath vocabulary list, 3-4 culture-specific NOT-items)
  • ~120-140 tokens: 2 brief example pairs demonstrating Van Maanen's Star register in practice

Small models are pattern matchers before instruction-followers. Examples demonstrating Van Maanen's Star register are more reliably reproduced than abstract instructions describing it.

The spike should test 150-token instruction-only vs. 200-token hybrid and measure: oath vocabulary correct usage rate (>95%), register accuracy (blind review), franchise bleed rate (<2%).


Q-R1-05: What is the minimum hardware CPU specification?

RESOLVED — 4-core 2019+ CPU (i5-9400 / Ryzen 5 3600). Sufficient.

Workshop assumption defined in Round 2 proposals; Troblum confirms viability with derivations.

  • i5-9400: 7-9 t/s decode on Gemma 2B Q4_K_M
  • Ryzen 5 3600: 9-12 t/s decode

Zone pre-voicing times at 8 t/s (i5-9400 midpoint):

  • Rural zone (behaviors only): ~50 seconds — comfortable
  • Industrial zone (behaviors only): ~2.1 minutes — comfortable
  • Industrial zone (behaviors + dialogue): ~7.1 minutes — workable if player spends 10+ minutes per zone; tight for transit zones

Laptop caveat (Troblum): The above assumes desktop 65W CPUs. Laptops with thermal throttling (45W TDP under sustained load) may degrade to 4-6 t/s, pushing industrial zone behavior pre-voicing to 5 minutes. Thermal monitoring in the queue scheduler is mandatory, not optional, for this hardware class.


New Issues Raised in Round 2

N-1: D-123 amendment language requires precision

Paula identifies a critical distinction the proposals paper over:

  • Build-time mode (baked hub content): AI pipeline operates as an authoring tool. Content is generated at build time, reviewed by humans, shipped reviewed. This is D-123 as written.
  • Runtime mode (background pre-voicing during gameplay): AI pipeline operates as a background enhancement. Content generated without human review. Players encounter it without editorial filter.

These are different safety models. Calling both an "authoring tool AND runtime enhancement" is misleading. Proposal C's "D-123 is fully superseded" language is rejected by Mellanie and Paula — the non-runtime constraints (culture vectors primary, no genre-convention defaults, authorial control binding) must survive the amendment.

Mellanie's proposed amendment language (with broad support):

"D-123 is amended as follows: The AI pipeline is an authoring tool for content assembly AND a background runtime enhancement when AI-Enhanced Dialogue is enabled. All other constraints remain binding: culture vectors are the primary prompt constraint, the AI does not default to genre conventions, and authorial control governs what the LLM may and may not produce. The AI pipeline does not drive live narrative decisions — it applies voice to authored semantic content."


N-2: Anchor lines (D-092) need explicit passthrough protection

Paula: All three proposals protect tells. None addresses D-092 anchor lines, which are a separate protection class for Tier 1 and Tier 2 notable NPCs. Anchor lines must not be re-voiced regardless of whether they appear in observable_behaviors or dialogue pool.

Proposed addition: An anchor_line: bool flag on individual lines in the data model, in addition to the tell_behaviors field separation. Without this, baked hub content could have anchor lines re-voiced during the pre-voicing pass.

This is new scope not in any of the three proposals. It is a non-blocking addition to whichever proposal is chosen.


N-3: Semantic core naming convention is disputed

Paula prefers stimulus/response labels over clinical psychology labels:

Clinical label (Gestalt/Tyre/Mellanie) Stimulus/response alternative (Paula)
avoidance_behavior changed_routine
nervous_fidget stress_physical_marker
concealment_tell information_protection
relationship_avoidance social_routing_change

Paula's argument: clinical labels risk surfacing verbatim in 2B output ("seems to be avoiding someone"), collapsing tell ambiguity. Stimulus/response labels constrain without naming the phenomenon.

Gestalt's response (implicit): precision is what a 2B model needs — abstract labels are unreliable, concrete phenomenon descriptions are reliable. Gestalt's actual proposal uses full constraint sentences, not bare labels: "PRESERVE: forced calm. The NPC appears deliberately composed and unhurried. Must not show avoidance, fidgeting, or hurry."

For the record: The tension may be partially semantic — both parties want the same behavior (phenomenon preserved, specific mechanism not named in output). The spike can settle it empirically by testing both label styles.


N-4: Qwen2.5-3B may violate a project constraint

Troblum: The original proposed-llm-voice.md includes a constraint "no Meta/Chinese models." Qwen2.5-3B is an Alibaba (Chinese company) model. If this constraint remains in force, Qwen2.5-3B cannot be the Proposal C dialogue model candidate. The fallback is Phi-3-mini (3.8B, larger and slower), or the spike may prove Gemma 2B Q4 is sufficient for dialogue after all.

Resolution needed: Is the "no Chinese models" constraint still in force? No participant other than Troblum addressed this. Needs a decision from Jeroen or Gestalt before model selection for a C spike is finalized.


N-5: Dialogue spike payload availability

Ozzie: A Proposal C spike requires dialogue samples with relationship state and access tier context. If the copy team is still writing base dialogue, the spike cannot test dialogue quality yet. This is a practical constraint that may determine whether C can be validated this sprint regardless of the architecture decision.

Paula or Mellanie should confirm whether dialogue base text samples exist at sufficient volume for a spike test payload.


N-6: Model download strategy must be decided

Troblum: Bundling a 1.5 GB model in the base install creates distribution problems (itch.io 2 GB file limit, involuntary bandwidth for players who don't use the feature). Recommends: optional in-game download triggered on first "AI-Enhanced Dialogue" enable. Baked hub content ships in game data regardless — first hours are pre-voiced without any model download.

This is a product/distribution decision, not a technical one. It affects all three proposals equally but is most acute for Proposal C's dual-model scenario (3.5 GB total, potentially larger than the base game).


N-7: Corrected Van Maanen's Star injectors are ready

Mellanie delivered 8 corrected Van Maanen's Star culture injector clauses in mellanie-round2.md. Round 1 blocker B-3 (the placeholder injector "formal, avoids contractions" was wrong) is resolved. The corrected injectors correctly capture Van Maanen's Star's direct-informal, working-class register. These are v1 drafts for spike validation, not final copy.


Remaining Blockers

B-R2-01: D-123 amendment language must be finalized before any D-record is written. Mellanie's proposed language has broad support; Paula's build-time/runtime mode distinction must be incorporated. Not blocking the spike design, but blocking the formal decision record.

B-R2-02: Tell taxonomy enumeration required before semantic core labels can be authored (Proposal B path). Mellanie needs: full tell category enumeration (5 from tell_state.rs but partial visibility), whether one category maps to one or multiple semantic cores, confirmed schema field name (tell_behaviors). This blocks Mellanie's Proposal B authoring work. Gestalt and Tyre have the answers and should provide them.

B-R2-03: Qwen2.5-3B "no Chinese models" constraint question must be answered before Proposal C model selection. Only relevant if C is chosen; does not block A or B.

B-R2-04: Dialogue base text spike payload availability must be confirmed before a Proposal C spike can be scoped. Relevant only if C is chosen.


Spike Design Notes (for Round 3 reference)

If Proposal A or B is chosen:

Criterion Target
Oath vocabulary correct usage rate >95%
Register accuracy (blind review: "does this sound like Settled Reach?") Qualitative, reviewer consensus
Franchise bleed rate <2% of outputs
Proposal B: phenomenon-class preservation on tell re-voicing >90% (Gestalt), >95% (Ozzie), >98% (Miri)
Tell preservation success bar Must be defined before spike, not after

Gestalt proposes a specific B validation protocol: 12 tell types × 20 completions each, scored by phenomenon-class preservation via blind review. Target: ≥90% (Gestalt says this; Miri says 98%). The threshold must be agreed before the spike runs. If not met, Proposal A passthrough applies for tells; no other architecture change required.


Summary: State of the Workshop

Round 2 produced a clean A/B vote split with no real blockers — participants favoring A are not opposed to B, and vice versa. The meaningful outcome is:

  1. Proposal C (full pipeline) is deferred to v0.3. This is near-universal (6 of 7 participants). The vision is correct; the timing is not.
  2. Proposal A is the safe, provable baseline. Paula, Miri, Troblum favor it. Infrastructure is simple, spike is clean, tell safety is absolute.
  3. Proposal B is a small step above A with meaningful payoff. Gestalt, Tyre, Mellanie favor it. The additional complexity is bounded (~20 extra tokens per tell prompt, 12 authored constraint sentences), the tells become culturally distinctive, and the architecture is valid if the spike validates constrained re-voicing.
  4. The real question is spike design, not architecture. Both A and B use the same infrastructure. The only difference is whether tells go through the constrained re-voicing path (B) or passthrough (A). This can be made configurable — implement the architecture, let the spike result determine which tell path ships.

The recommended synthesis: Ship the two-track architecture (Proposal B data model: tell_behaviors field + semantic_core). Define the tell preservation threshold before the spike. If the spike hits the threshold, ship Proposal B tell re-voicing. If it misses, flip tells to passthrough (Proposal A behavior) with no architectural change. The architecture is B; the spike determines whether the constrained tell track is enabled.


Qatux — 2026-03-07