Merge remote-tracking branch 'origin/main' into ci

# Conflicts:
#	client/tests/fixtures/msgpack/snapshot_boundary_tick_0.msgpack
#	client/tests/fixtures/msgpack/snapshot_boundary_tick_127.msgpack
#	client/tests/fixtures/msgpack/snapshot_boundary_tick_2b31m1.msgpack
#	client/tests/fixtures/msgpack/snapshot_boundary_tick_2b32.msgpack
#	client/tests/fixtures/msgpack/snapshot_boundary_tick_32767.msgpack
#	client/tests/fixtures/msgpack/snapshot_empty.msgpack
#	client/tests/fixtures/msgpack/snapshot_multi_entity.msgpack
#	client/tests/fixtures/msgpack/snapshot_one_npc.msgpack
#	client/tests/fixtures/msgpack/snapshot_player.msgpack
#	client/tests/fixtures/msgpack/snapshot_v2_full.msgpack
#	server/src/perception/observer/mod.rs
This commit is contained in:
2026-02-25 12:51:41 +01:00
46 changed files with 3722 additions and 31 deletions
@@ -0,0 +1,375 @@
# Workshop: Character Creation & Game Setup
**Date:** 2026-02-25
**Facilitator:** Team Leader (Jeroen)
**Participants:** Nigel (replayability), Paula (narrative), Gestalt (systems), Miri (worldbuilding), Tyre (architecture), Qatux (documenter)
**Status:** Not started
---
## Purpose
Define what the character creation / new game screen actually does. This
is the most fundamental unresolved design question in the project: what
does the player choose, what does the seed control, and what does that
combination produce?
This workshop resolves **Q-011** (character selection and playable
characters) and establishes the boundary between player agency, character
archetype, and world seed. Everything downstream — quest generation, gate
activation, difficulty, replayability — flows from getting this table right.
## Context
### What's decided
- **D-005:** Single character per playthrough. Character choice determines
starting location, starting knowledge, available levers, personal goals.
"Same conspiracy, different character, completely different game."
- **D-027:** v0.1 vertical slice ships with 2 characters: smuggler and
detective. Inverted perspectives on the same world.
- **D-023:** Three-tier content model. Tier 1 (authored drama) drawn from
a pool at game start. Tier 2 (templated). Tier 3 (procedural filler).
- **D-029:** Population entanglement ratio 30/50/20, varies per seed.
- **D-010:** Deterministic simulation. Same seed + same content = identical
world state.
- **D-039:** Wow moment 4 is the Divergence Reveal — same room, different
character, different everything. This is THE replayability payoff.
- **D-041:** Knowledge graph is per-entity. Characters start with different
knowledge.
- **D-032:** Separate monologue pools per character.
- **Seed config schema** (ticket #394): Records seed value, character
selection, pool draws, template assignments, starting knowledge.
### What's open
- **Q-011:** Character selection and playable characters — not yet discussed.
Which characters? How different are starting positions? Canon or original?
- **Q-010:** Storyteller AI design — pacing rules, structural vs dramatic
randomness. Adjacent to this workshop but NOT in scope to fully resolve.
### What's NOT in scope
- Full character roster beyond v0.1 (two characters first, prove it works)
- Endgame quest design (no endgame exists yet — note toggles, defer design)
- Storyteller pacing algorithm (Q-010 is a separate workshop)
- Character naming edge cases (namespace collisions with NPCs — note, defer)
- Full quest system architecture (scope to: what quest SHAPES are seeded at
creation, not the full quest pipeline)
### Design guardrail
Character selection determines your starting **information position** and
**social graph**, not your capabilities. Characters have different verbs
available, not different success probabilities for the same verbs. The
smuggler doesn't get "+5% to cargo inspection" — the smuggler gets "Slip
Manifest" as a verb the detective never sees. This is D-005's intent and
D-028's access tier system in practice. Do not drift toward stat sheets.
## Key Questions
### Q1: What does character selection actually select?
Three possible models — the workshop must pick one (or a hybrid):
**A. Fixed archetype roster.** Player picks "smuggler" or "detective" from a
list. Each is a fully pre-authored starting position. Knowledge from
playthrough 1 fully transfers — you know exactly where the smuggler starts.
**B. Archetype + generated instance.** Player picks "smuggler" but YOUR
smuggler is procedurally placed in the social web. Different starting
coworkers, different shift schedule, different corridor assignment. Knowledge
partially transfers — you know smuggler life, but not this smuggler's life.
**B2. Archetype + curated instance.** Player picks "smuggler," sees 2-3
procedurally generated social configurations, and picks one. RimWorld's
colonist reroll mechanic — curation from a generated pool rather than full
specification. Middle path between A and B.
**C. Fully custom.** Player picks background axes (profession, social
tier, faction affinity). No pre-authored archetype. Maximum variation,
maximum authoring cost.
For each model: what are the replayability implications? What's the
authoring cost? What does this mean for the Divergence Reveal (D-039)?
Also consider: does the player configure starting knowledge weights, or
is starting knowledge fully determined by archetype? (DF's embark skill
point system lets players shape starting capability within constraints.)
### Q2: The seed boundary — what varies by what?
Produce a canonical three-column table:
| Determined by world seed | Determined by character choice | Player-configured |
|--------------------------|-------------------------------|-------------------|
| ? | ? | ? |
Examples to place: NPC relationships, which NPCs are compromised,
starting location, starting knowledge graph state, access tiers,
gate activation timing, conspiracy shape, population entanglement
ratio, THE FRIEND identity, starting inventory...
Include a fourth implicit column: **what information exists in the world
but is inaccessible to this character?** Not locked behind a mechanic —
just absent from their information space entirely. The gap between what
the world contains and what the character can see IS the replayability.
(See: Obra Dinn in Reference Games.)
This table IS the workshop's primary deliverable. Get it right and every
downstream system knows its inputs.
### Q3: How does gate activation relate to character choice?
The contamination/conspiracy discovery trigger — the moment the game shifts
from daily life to investigation. Two sub-questions:
**A.** Does character choice change WHEN you discover contamination, or only
HOW you experience it? (Detective flags cargo anomalies early via lattice
analysis. Smuggler witnesses something directly. Same world-state, different
discovery paths.)
Consider Pentiment's model: the murder happens near you, not TO you. You're
pulled in by proximity and relationship, not by being the assigned
investigator. Is gate activation something that happens to the world (and
the character stumbles into it), or something the character triggers through
their specific access?
**B.** Are discovery paths authored per character (detective always discovers
via X) or emergent (character knowledge graph + storyteller pacing = different
discovery window per playthrough)? What's the minimum authored content needed
per character to make gate activation feel character-specific?
Explicit RimWorld check: is contamination timing a player-configurable
"storyteller" choice, fixed per character, or emergent from play? Don't
collapse pacing control into archetype selection.
### Q4: Quest seeding — templates vs randomization
The user's directive: "the quest system should offer relevant randomized
quests based on creation instead of going fully scripted." Scope this to:
- What quest SHAPES (not specific quests) are determined at character
creation? (e.g., smuggler gets logistics-flavored side quests, detective
gets investigation-flavored ones)
- How do Tier 2 templates (D-023) interact with character choice? Does the
smuggler's template pool differ from the detective's?
- What is authored (main quest templates, scripted quality) vs generated
(side content, character-relevant variations)?
- How many quest templates are needed per character for v0.1 to feel varied?
- Does the character have visible long-term goals the game tracks? Does the
smuggler TELL you what they want (goals screen) or do wants emerge from
play? (The Sims' wants/aspirations system as reference.)
### Q5: Game conditions and toggles
The user wants players to be able to configure their experience. But some
toggles destroy the game's core tension. Define:
- **What CAN be toggled:** Challenge intensity, optional content modules,
timer pressure, specific life-sim subsystems
- **What CANNOT be toggled:** Core conspiracy simulation, investigator
faction presence, information asymmetry. These exist whether the player
sees them or not.
- **Starting location selection:** Is this a player choice or determined
by archetype? If player choice, what does it mean for authored content?
- **Enable/disable endgame quests:** Note for future design. What's the
minimum we need to decide NOW vs what can wait until endgame exists?
### Q6: The playthrough 2 test
Concrete synthesis test. Nigel presents the following scenario to the room:
> You've played the smuggler on seed X. You now know: Kael is trying to
> exit the ring. Sera Venn is protecting Naia. The detective flagged your
> manifest on Day 2. The contamination hit during the evening shift at
> The Last Shift. You pick the detective on the SAME seed. Minute 1: you
> arrive at the Commission office. Minute 5: your first assignment.
> Minute 10: you walk into The Terminal where you spent 30 hours as the
> smuggler.
Against the combined design from Rounds 1-4, each participant answers:
1. What does the detective see in The Terminal that the smuggler never saw?
2. What does the detective's monologue say about Kael — whom the smuggler
considered a friend?
3. Does the contamination trigger differently, or at the same moment via
a different path?
4. Name one thing the player LEARNED in playthrough 1 that changes how
they PLAY playthrough 2 — not metagaming, but genuine new understanding.
If participants can't answer these concretely, the design has a gap.
Find it and fix it before the workshop closes.
## Reference Games
### Dwarf Fortress — the fossil record
World generation creates centuries of invisible history. The player never
reads a history log — they excavate its consequences. A collapsed
civilization left ruins. A grudge between two species shapes who attacks
your fort. The history is SUBSTRATE, not content.
The lesson for us: the world seed should produce CONSTRAINTS and RESIDUES
that make the current situation feel inevitable. How long has this smuggling
ring been operating? What's its history of near-discovery? Which institutional
figures already have kompromat on them? The player never sees this directly
but feels its weight on every NPC relationship state they encounter.
Also relevant: the embark skill point system — players shape starting
capability within constraints rather than receiving a fixed loadout. Consider
for Q1: does the player configure starting knowledge within their archetype?
### RimWorld — the separation principle
Storyteller selection (Cassandra/Phoebe/Randy) controls pacing, not content.
Scenario defines starting resources and constraints. Colonist generation is
partially random, partially player-curated (reroll, choose skills).
**Key lesson 1:** The storyteller and starting conditions are SEPARATE
choices. Our gate activation / contamination pacing (Q3) maps to storyteller
selection. Our character archetype maps to scenario. Don't collapse them.
**Key lesson 2:** Player CURATION from a procedurally generated set is
different from player SPECIFICATION of a custom set. RimWorld's colonist
reroll is a point-buy system hidden behind a reroll interface. For us:
model B2 — see 2-3 generated social configurations for "your smuggler" and
pick one. This is a viable middle path that deserves to be on the table.
### The Sims — verbs, not stats
Traits in The Sims are PERMISSION SYSTEMS for social interactions, not stat
modifiers. The Outgoing Sim doesn't get +20% to social checks — they get
access to DIFFERENT VERBS. They can autonomously initiate conversations the
Introvert Sim cannot. This is exactly our access tier system (D-028 Layer 1).
**Key lesson 1:** Character creation changes which verbs you have, not how
well you perform shared verbs. The smuggler gets "Slip Manifest." The
detective gets "Pull Records." Neither is better — they're different
information-gathering tools for the same world.
**Key lesson 2:** Neighborhood placement as replayability driver. The lot
you choose positions you relative to neighbor NPCs, which determines which
relationships bootstrap organically through proximity. Early relationships
form through proximity, not player initiative. The smuggler starts embedded
in The Terminal — relationships with ring members bootstrap before the
player does anything. The detective starts at the Commission — different
organic relationships form. THIS is the structural driver that makes the
same seed play differently.
### Disco Elysium — observation filters, not capabilities
D-005 already cites Disco Elysium as a design reference. The Thought
Cabinet is a permission system for new dialogue options and monologue lines.
Building a character in DE doesn't give you stats — it gives you access to
different OBSERVATIONS of the same world. Intellect doesn't make you
smarter — it makes your character say different things to themselves when
they see the same evidence.
**Key lesson:** Character build determines what your character NOTICES, not
what they can DO. This is D-032 (separate monologue pools) and D-041
(per-entity knowledge graph) in one reference. If participants are thinking
about Q1 models without DE on the table, they'll drift toward stat-system
thinking. DE keeps them on the observation-filter track.
### Return of the Obra Dinn — information gap as presence
Obra Dinn demonstrates that information asymmetry can be the ENTIRE game.
You piece together events from fragments. The information gap feels like
presence, not absence — you FEEL the weight of what you can't see yet.
**Key lesson for Q2:** The seed boundary table needs to account for what
exists in the world but is invisible to this character. Not locked behind a
mechanic — just absent from their information space. Character A's world
contains things that are simply not in Character B's world. That gap is
the pull that drives playthrough 2.
### Pentiment — gate activation by proximity
Pentiment commits to a single-character perspective. The gate activation
question it answers: "what triggers the player from daily life into
investigation?" A murder happens near you, not TO you. You're pulled in
by proximity and relationship, not by institutional assignment. The player
character is NOT the assigned detective — they're a witness with skills.
**Key lesson for Q3:** Same discovery timing, but character-dependent tools
for responding to it. The contamination doesn't care who you are — it
happens. But your character's position determines whether you see it as
threat, opportunity, or puzzle.
### The common thread
In all six games, the setup screen generates ASYMMETRIC STARTING CONDITIONS.
The same world, entered from different positions, produces different
information access, different social proximity, and different verb
availability. The asymmetry IS the replayability. Our character creation
should produce a starting POSITION in an information landscape — not a
stat block, not a story, not a difficulty setting.
## Participants and Roles
| Agent | Role | Why they're here |
|-------|------|-----------------|
| Nigel | Replayability lead | Structural randomness, seed design, "what happens on playthrough 10?" |
| Paula | Narrative lead | Starting NPC relationships, character-specific story hooks, social web implications |
| Gestalt | Systems lead | How character choice propagates through mechanics (KG, dialogue tiers, movement, perception) |
| Miri | Worldbuilding | Which archetypes fit the Krenn System, canon constraints, lore accuracy |
| Tyre | Architecture | Implementation cost reality check. "That's 4 new ECS components — is it worth it?" |
| Qatux | Documenter | Track decisions, cross-references, dissent. Maintain running reference list. |
## Round Structure
### Round 1 — The Lens Question (Nigel leads)
Single question: what does character selection actually select? (Q1)
Nigel opens with a replayability scoring of each model (A/B/B2/C) — 3
bullet points per model on the replayability axis. This is a BASELINE, not
a verdict. Participants then argue from their domain against that baseline.
This converges faster than open advocacy.
Target: agree on the model by end of round.
### Round 2 — The Seed Boundary (Gestalt leads)
Given the model from Round 1: draw the exact line between world seed,
character choice, and player customization. Produce the three-column
table (Q2). Each participant fills in their domain's rows.
### Round 3a — Gate Activation (Paula leads)
How does contamination trigger work per character? (Q3)
This flows directly from Round 1's model decision. Paula leads because
gate activation is fundamentally a narrative question — when does the
story shift?
### Round 3b — Quest Seeding (Nigel leads, Tyre has implementation floor)
How do quest templates interact with character choice? (Q4)
Nigel leads because quest variation is the replayability engine. Tyre gets
explicit authority to reject quest template proposals that require new
architecture — every template decision has an implementation cost that
spirals without active checking.
### Round 4 — Conditions, Toggles & Synthesis (all)
Game conditions and what's toggleable (Q5). Then run the concrete
playthrough 2 test (Q6). Nigel presents the scenario. Each participant
must answer the four concrete questions. If they can't, the design has
a gap — find it and fix it before closing.
## Required Reading for Participants
- `decisions/scope.md` — D-005, D-013, D-027, D-029, D-053
- `decisions/content.md` — D-023, D-028, D-032, D-034
- `decisions/architecture.md` — D-041 (knowledge graph)
- `decisions/questions.md` — Q-010, Q-011
## Expected Outputs
- **D-record:** Character creation model (resolves Q-011)
- **D-record:** Seed boundary table (what varies by seed vs character vs player)
- **D-record:** Gate activation trigger design
- **D-record or Q:** Quest seeding model (may produce a Q if full design deferred)
- **D-record:** Game condition toggles (what's configurable, what isn't)
- Ticket updates for Sprint 19+ backlog as needed
@@ -0,0 +1,82 @@
# Workshop Outcomes: v0.1 Content Gap Analysis
**Workshop:** v0.1 Content Gap Analysis
**Date:** 2026-02-11
**Rounds:** 2 (Analysis + Synthesis)
**Participants:** Mellanie, Paula, Araminta, Miri, Gestalt, Ozzie
**Facilitator:** Jeroen
**Documenter:** Qatux
**Status:** DONE — all decisions actioned, tickets created
**Full notes:** `docs/workshops/content-gap-analysis_v0_1/SUMMARY.md`
---
## What the Workshop Accomplished
Six agents independently analyzed 9 content layers across the vertical slice (D-027), then synthesized across all outputs. The project lead issued 9 directive decisions between rounds. Remarkable cross-agent convergence: the Dual Lens Guide, monologue as primary carrier, and the tag taxonomy were independently identified by multiple agents without coordination. THE FRIEND concept evolved from Ozzie's emotional instinct to Paula's structural design to Mellanie's authoring plan in a single workshop.
---
## Decisions Produced
| ID | Decision | Domain | Source |
|----|----------|--------|--------|
| D-032 | Separate monologue pools per character | content.md | Lead directive #1 |
| D-033 | Entity color = relationship to player | perception.md | Araminta R1 + lead directive #2 |
| D-034 | THE FRIEND production-level NPC pattern | content.md | Ozzie concept + lead directive #4 + Paula design |
| D-035 | Converged tag taxonomy for line pools (6+3 tags) | content.md | Gestalt + Mellanie convergence |
| D-036 | Sova Transit District / Krenn System as v0.1 setting | content.md | Miri R1 + lead directive #6 |
| D-037 | Contraband specification | content.md | Miri R1/R2 |
| D-038 | Audio in v0.1 scope via Stable Audio Open (8 files) | scope.md | Lead directives #3 + #9 |
| D-039 | v0.1 wow moment scope — all 6 moments | scope.md | Ozzie R1/R2 + lead directive #8 |
| D-040 | Wiki taxonomy structure | process.md | Miri R2 + lead directive #5 |
All 9 decisions confirmed by project lead between rounds as non-negotiable directives.
---
## Open Questions Identified
| ID | Question | Owner | Status |
|----|----------|-------|--------|
| Q-012 | How does the generation expansion pass work? LLM, template-based, or rule-based? | Gestalt, Mellanie | Raised this workshop |
| Q-013 | How does the line previewer handle THE FRIEND's temporal progression? | Gestalt, Dudley | Raised this workshop |
| Q-014 | Audio timing with monologue — when does the chime fire relative to text? | Gestalt, Ozzie | Raised this workshop |
| Q-015 | Does 4x generation expansion apply to THE FRIEND's custom lines? | Mellanie, Gestalt | Raised this workshop |
| Q-016 | Knowledge hierarchy for monologue prerequisites | Gestalt, Paula | Raised this workshop |
| Q-017 | Triangle pressure threshold — what events trigger escalation? | Gestalt, Paula | Raised this workshop |
---
## Tickets Created
48 total tickets (42 new + 6 updates). See `docs/workshops/content-gap-analysis_v0_1/TICKETS.md` for full list.
**Critical (9 new):** #297 Kael Davan full profile, #298 Sera Venn full profile, #299 Opening hook (smuggler), #300 Opening hook (detective), #301 Wiki taxonomy, #302 Sova Texture Appendix, #303 v0.1 Visual Grammar, #304 Entity Color System Spec, #305 Dialogue selection pipeline.
**High (23 new):** Content and narrative (#306, #307, #310, #328), visual and spatial layouts (#311-318), worldbuilding (#319-322), systems and implementation (#308, #309, #323-327).
**Medium (10 new):** Mirror moments, tutorial content, environmental standards, tell derivation (#329-338).
**Updated (6):** #261 promoted to critical with expanded scope; #189, #168, #124, #90, #193 updated.
---
## Key Flags
- Detective's FRIEND confirmed as Sera Venn (Paula, not Mellanie's Lera proposal). Lera Sessik remains the bar owner.
- NPC triangle count: Paula reconciled from 7 to 5 triangles in Round 2. Five-triangle model is canonical.
- Tag taxonomy convergence was independent: Mellanie and Gestalt proposed nearly identical structures without coordination.
- Dual Lens Guide (#261) is the single highest-risk dependency — everything downstream blocks on it.
---
## Critical Path Produced
Dual Lens Guide (#261) → Voice Kits → THE FRIEND Content Packs → Validation → Content at Scale.
Three parallel tracks: narrative (Paula), setting (Miri), systems (Gestalt + Araminta) — converging at content pack production.
---
*Compiled by Qatux. Source: `docs/workshops/content-gap-analysis_v0_1/SUMMARY.md`, `TICKETS.md`. Decisions in `decisions/content.md` (D-032 through D-040 excl. D-033 in perception.md, D-038/D-039 in scope.md, D-040 in process.md).*
@@ -0,0 +1,90 @@
# Workshop Outcomes: Knowledge Graph & Information Boundaries
**Workshop:** Knowledge Graph & Information Boundaries
**Date:** 2026-02-11
**Rounds:** 2 (Design + Synthesis)
**Participants:** Tyre, Gestalt, Paula, Dudley, Si
**Facilitator:** Jeroen
**Documenter:** Qatux
**Status:** DONE — fully actioned, decisions filed, tickets created
**Full notes:** `docs/workshops/knowledge-graph-information-boundaries/round2-synthesis.md`, `sprint2-impact.md`
---
## What the Workshop Accomplished
Replaced the `InformationInventory { known_facts: Vec<String> }` placeholder with a fully specified knowledge graph data model. Five agents analyzing from different angles converged independently on all fundamentals: per-entity ECS component, stable entity IDs, per-entry provenance tracking. The synthesis resolved the only substantive debate (centralized resource vs. per-entity component) unanimously in favour of per-entity. The resulting D-041 spec is the foundation for asymmetric information as a playable mechanic — and became load-bearing for D-010, D-011, D-017, D-028, D-033, and Q-016.
---
## Major Decision Produced
### D-041: Knowledge Graph Data Model
The core design decision of this workshop. Full specification in `decisions/perception.md`.
Key architectural choices:
- `KnowledgeGraph` as a Bevy ECS `Component` on each entity (not a centralized resource)
- `StableEntityId` (`u64`-based) for cross-reference stability; runtime `EntityRegistry` for bidirectional mapping
- `BTreeMap<StableId, EntityKnowledge>` + `BTreeMap<FactId, FactKnowledge>` per entity
- Four confidence levels: `Direct` > `KnowsDetails` > `KnowsOf` > `Suspects`
- Three knowledge states: `Active`, `Stale`, `Contradicted`
- `KnowledgeSource` tracked per-entry (not per-graph): `DirectObservation`, `ToldBy`, `Background`, `Heard`
- Event-driven updates via `KnowledgeEventQueue`; decay pass once per game-minute
- Sprint 2 scope: data structures + direct observation + basic decay only
### Additional Decisions Implied (formalized later)
The workshop produced the architectural foundation that fed into:
- D-012: Information boundaries (per-character knowledge isolation)
- Formal resolution of Q-016: Knowledge hierarchy (`Suspects` < `KnowsOf` < `KnowsDetails` < `Direct`)
---
## Open Questions Identified
| ID | Question | Sprint Impact | Resolved By |
|----|----------|---------------|-------------|
| Q-024 | Gossip propagation timing (immediate vs queued) | Sprint 3+ | D-080 (knowledge-flow-npc-boundaries workshop) |
| Q-025 | Knowledge graph cap and eviction policy | Sprint 3+ | D-080 (closed: no cap needed at projected v0.1 scale) |
| Q-026 | Contradiction detection algorithm | Sprint 3+ (THE FRIEND arc) | D-083 (knowledge-flow-npc-boundaries workshop) |
None blocked Sprint 2.
---
## Tickets Created
8 new tickets added to Sprint 2, all under epic #351. Sprint 2 expanded from 14 to 22 tickets (+6.5 developer-days).
| # | Title | Priority | Estimate |
|---|-------|----------|----------|
| #361 | KnowledgeGraph component + types (D-041) | critical | 1 day |
| #362 | StableEntityId + EntityRegistry resource | critical | 1 day |
| #363 | KnowledgeEventQueue + processing system | high | 0.5 day |
| #364 | Direct observation knowledge flow | critical | 0.5 day |
| #365 | Basic knowledge decay system | high | 0.5 day |
| #366 | Observer snapshot knowledge integration | critical | 1 day |
| #367 | Knowledge graph unit test suite | high | 1 day |
| #368 | Knowledge vocabulary for v0.1 content | high | 0.5 day |
**Existing tickets affected:**
- #89 (Information inventory) — cancelled, subsumed by #361
- #269 (CauseChain component) — marked done (already implemented)
- #138-142 (Information boundary epics) — reparented under #351; #139, #141, #142 deferred to Sprint 3; #140 cancelled (merged into #366)
**Critical path impact:** #361, #362, #363, #364 added serially to Sprint 2 critical path (10 tickets serial, up from 6).
---
## Sprint 2 Completion Criteria (Added by Workshop)
Two new acceptance criteria added to Sprint 2's definition of done:
- Entity color reflects relationship state from knowledge graph (#361, #366)
- Remembered (not visible) entities appear as ghosts at last-known position (#361, #366)
**Knowledge graph proof:** Observe an NPC, walk away, return. NPC appears as ghost at last-known position while not in LOS. Color shifts by relationship state.
---
*Compiled by Qatux. Source: `docs/workshops/knowledge-graph-information-boundaries/round2-synthesis.md`, `sprint2-impact.md`. Primary decision in `decisions/perception.md` (D-041).*
@@ -0,0 +1,116 @@
# Workshop Outcomes: v0.1 Content Scoping
**Workshop:** v0.1 Content Scoping
**Date:** 2026-02-12
**Rounds:** 2 + closing round (lead resolutions)
**Participants:** Gestalt, Paula, Tyre, Mellanie, Stig, Dudley, Si, Qatux
**Facilitator:** Jeroen
**Documenter:** Qatux
**Status:** CLOSED — all recoverable decisions filed, tickets created
**Full notes:** `docs/workshops/v01-content-scoping/SUMMARY.md`, `si-ticket-changes.md`
---
## What the Workshop Accomplished
Applied the Wiki Review's long-term generator strategy to the immediate v0.1 hand-authored proof. Produced 20 decisions (D-042 through D-061), 38 new tickets, canonical NPC mapping for 17 characters, the 16-key EntityKnowledge specification, full content directory architecture, and a Sprint 3-5 roadmap. Tyre and Dudley independently produced structurally identical ObserverSnapshot v3 definitions without coordination — confirmed the architecture was sound. Lead issued 4 decisions resolving the major Round 1 disagreements between rounds, then resolved 3 remaining questions in a closing round.
**Note on decision IDs:** Several IDs assigned at this workshop collided with later numbering. Genuinely new decisions identified in retrospect were filed as D-087 (content directory structure), D-089 (NPC canonical mapping method), D-091 (EntityKnowledge 16-key canonical set), Q-031 through Q-034.
---
## Decisions Produced
### From Round 1 Consensus (7)
| ID | Decision | Domain |
|----|----------|--------|
| D-042 | Drin promoted from Tier 3 to Tier 2 | content.md |
| D-043 | THE NOBODY mechanic deferred to v0.2; hidden data ships in v0.1 content | scope.md |
| D-044 | v0.1 interaction model: 7 verbs (Move, Look, Monologue, Examine Object, Examine NPC, Talk, Overhear) | scope.md |
| D-045 | v0.1 scope IN: news ticker, PC-as-NPC, time progression, relationship state transitions | scope.md |
| D-046 | v0.1 scope OUT: inventory, stealth, combat, save/load, lattice modification | scope.md |
| D-047 | v0.1 triangles: 3 active forks (T1, T2, T4), 2 passive tensions (T3, T5) | content.md |
| D-048 | Client receives all text from server via state updates; client does not load content files | architecture.md |
### From Round 2 + Closing (13)
| ID | Decision | Domain |
|----|----------|--------|
| D-049 | YAML is the content file format for v0.1; RON is optional build-time optimization | architecture.md |
| D-050 | Gestalt's NPC pattern/motivation mapping canonical for v0.1; Paula's emotional layer becomes v0.2 annotations | content.md |
| D-051 | v0.1 ships single context-sensitive verb; multi-verb architecture modeled underneath | architecture.md |
| D-052 | 3-state pause: Normal (100%), Overlay (50%), Paused (0%); server-authoritative | architecture.md |
| D-053 | Self-contained triangle forks for v0.1; no cross-triangle cascade (v0.2) | content.md |
| D-054 | ObserverSnapshot v3: adds sim_speed, nearby_interactions, active_dialogue, monologue, overheard, knowledge_updates, examine_result, ticker_headlines | architecture.md |
| D-055 | 16 EntityKnowledge keys; 4 new role-perspective keys; trust_read merged into trust_level; secret_held → leverage_held | architecture.md |
| D-056 | PC voice registers: smuggler (feeling-first, fragments, physical); detective (analysis-first, complete sentences, institutional) | content.md |
| D-057 | Content directory: content/ with _schema/, global/, districts/ top-level split; JSON Schema validation at build time | process.md |
| D-058 | THE FRIEND content pack template: Kael Davan, 91 lines across 5 arc phases | content.md |
| D-059 | Monologue display: 160 char max, 2-line max, 4-6s display, 2s cooldown, queue depth 1, 9-level priority | architecture.md |
| D-060 | actions[] renamed to verbs[] across all surfaces | architecture.md |
| D-061 | No ticket merges across domain teams | process.md |
### Retrospective Filings (ID collisions resolved)
| ID | Decision | Domain |
|----|----------|--------|
| D-087 | Content directory structure (content/ split) | process.md |
| D-089 | Canonical NPC pattern/motivation mapping method | content.md |
| D-091 | EntityKnowledge 16-key canonical specification | architecture.md |
---
## Open Questions Carried Forward
| ID | Question | Status |
|----|----------|--------|
| Q-031 | NPC surnames for Drin, Sess, Tav awaiting Miri validation | Informational |
| Q-032 | Interaction struct naming: AvailableActions (Tyre) vs EntityInteractions (Dudley) | Resolved at implementation |
| Q-033 | 695 authored items: validated as scope input but not independently verified | Informational |
| Q-034 | Dialogue max-width: pixel value for 20% height / max-width constraint | Pending lead call |
None blocked Sprint 3.
---
## Tickets Created
38 new tickets + 10 existing ticket updates. See `si-ticket-changes.md` for full list.
**Teams:** copy (21), server (13), client (2), ci (1).
**Critical path:** #261 (Dual Lens Authoring Guide) is the single biggest blocker — directly blocks 9 downstream tickets across the content pipeline. Five-day time-box recommended.
| Series | Count | Domain |
|--------|-------|--------|
| A (Wiki content fixes) | 8 | copy |
| B (Style guides + specs) | 5 | copy |
| C (Content directory + schemas) | 10 | copy/server/ci |
| D (Design specs) | 2 | server/copy |
| NEW 1-7 (Workshop rounds) | 7 | copy |
| NEW 8-14 (Lead decisions, excl. killed NEW-12) | 6 | server/client |
**Killed:** NEW-12 (client pause state machine — pause is server-authoritative, client sends IPC command only).
**Sprint allocation:** Sprint 3 — foundations and specs. Sprint 4 — content conversion and authoring begins. Sprint 5+ — content at scale.
---
## NPC Canonical Mapping (17 NPCs)
The Gestalt-Paula synthesis produced the v0.1 canonical pattern/motivation mapping for all 17 Sova NPCs. This is the authoritative reference for content authoring.
| Name | Tier | Pattern | Motivation |
|------|------|---------|-----------|
| Kael Davan | T1 | FRIEND | OPERATOR |
| Sera Venn | T1 | FRIEND | WITNESS |
| Naia Tamm | T1* | MIRROR | CIVILIAN |
| Voss, Lera, Torek, Devra, Maret, Resha, Drin, Renn, Pell, Harek | T2 | (varied) | (varied) |
| Sess, Olin, Sabel, Tav | T3 | (varied) | (varied) |
Off-stage: Nils Davan — GHOST + HANDLER.
---
*Compiled by Qatux. Source: `docs/workshops/v01-content-scoping/SUMMARY.md`, `si-ticket-changes.md`. Decisions in relevant `decisions/` domain files (D-042 through D-061, D-087, D-089, D-091). Open questions in `decisions/questions.md` (Q-031 through Q-034).*
@@ -0,0 +1,97 @@
# Workshop Outcomes: v0.1 Gap Analysis
**Workshop:** v0.1 Gap Analysis
**Date:** 2026-02-11
**Rounds:** 2 (Gap identification + Synthesis)
**Participants:** Gestalt, Tyre, Ozzie, Paula, Nigel, Gore, Hoshe
**Facilitator:** Jeroen
**Documenter:** Qatux
**Status:** DONE — fully actioned, decisions confirmed, tickets created
**Full notes:** `docs/workshops/v01-gap-analysis/si-ticket-changes.md`
---
## What the Workshop Accomplished
Stress-tested the full v0.1 plan (232 tickets, 7 initiatives) against three tracks: strength of concept proof, fun and wow factor, and completeness. Found significant gaps: missing infrastructure (collision, pathfinding, time system), a missing experience layer (observation pipeline, interaction verbs), and systemically underpriced tickets across social, dialogue, and replayability systems. The workshop ended with 273 tickets (+41) and a clear Sprint 1-5 dependency chain.
Key outcome: the workshop revealed that tile collision, A* pathfinding, the observation event generator, and the interaction dispatcher were absent from the ticket catalog despite being architectural blockers for almost everything else. These were added at critical priority.
---
## Decisions Confirmed
The workshop confirmed 6 decisions. These fed directly into later formal D-records:
| Decision | Formal Record | Notes |
|----------|---------------|-------|
| Deterministic replay is an architectural requirement, not just test infrastructure | D-010 (reinforced) | Promoted #201 to critical |
| Time system: 10 tps, 4 day phases, diegetic clock | D-031 | Resolved Q-009; ticket #25 renamed and promoted |
| Godot test framework = gdUnit4 | process.md | Tyre reversed GUT recommendation after Hoshe's analysis |
| IPC testing = three-layer architecture (fixture, protocol mock, real integration) | architecture.md | Hoshe + Tyre |
| CauseChain is a production component, not test pollution | architecture.md | #269 created |
| Dual Lens Authoring Guide must precede content authoring | D-038 extended | All agents converged |
These decisions fed into the scope and architecture domain files. The three-tier content system (D-023), vertical slice (D-027), and population ratios (D-029) were validated against the gap analysis findings and confirmed as sound.
---
## Ticket Changes
**Before:** 232 tickets | **After:** 273 tickets (+41)
| Change Type | Count |
|-------------|-------|
| Priority promotions (existing) | 15 |
| New epics | 3 |
| New stories | 38 |
| Dependency records added | 21 |
| Renamed + promoted | 1 (#25) |
### Priority Promotions (15 tickets)
**Medium → High (11):** #103 (relationship dynamics), #105 (tolerance threshold triggers), #171 (trust-gated gossip), #172 (unprompted disclosure), #173 (trait modifier system), #175 (entanglement ratio), #176 (NPC pool generation), #121 (character voice variation), #126 (medium-range visual indicators), #162 (storyteller module activation), #178 (seed-based variation).
**High → Critical (3):** #201 (deterministic replay), #182 (divergent starting knowledge), #183 (divergent relationships).
### New Epics (3)
| ID | Title | Priority |
|----|-------|----------|
| #233 | Movement & Collision | critical |
| #234 | Observation & Interaction | critical |
| #235 | Game State Management | high |
### Critical New Stories
| ID | Title | Priority |
|----|-------|----------|
| #236 | Tile collision system | critical |
| #239 | Observation event generator | critical |
| #240 | Player interaction system and dispatcher | critical |
| #237 | Tile-based A* pathfinding | high |
| #238 | NPC path following and movement | high |
| #253 | Monologue content architecture | high |
| #261 | Dual Lens Authoring Guide | high |
| (+ 31 more stories) | | high/medium/low |
### Critical Path Produced
```
Sprint 1: #236 (collision) → #237 (pathfinding) → #238 (NPC movement)
#25 (game clock) → #88 (daily routines)
Sprint 2: #239 (observation generator) + #240 (interaction dispatcher)
Sprint 3: Observation verbs, NPC conversation, monologue, triangle escalation
Sprint 4: Content pipeline (#261 dual lens guide blocks all content packs)
Sprint 5: Validation and playtest protocol
```
---
## Open Questions
None formally raised as Q-records by this workshop — the gap analysis was primarily a ticket and priority exercise. Questions about content authoring (Q-012 through Q-017) were raised in the companion content-gap-analysis workshop the same day.
---
*Compiled by Qatux. Source: `docs/workshops/v01-gap-analysis/si-ticket-changes.md`. Decisions confirmed fed into `decisions/scope.md` (D-023, D-027, D-029) and `decisions/architecture.md` (D-010, D-031).*
@@ -0,0 +1,116 @@
# Workshop Outcomes: Wiki Review & Content Standards
**Workshop:** Wiki Review & Content Standards
**Date:** 2026-02-12
**Rounds:** 4 + lead interview between R3 and R4
**Participants:** Paula, Mellanie, Miri, Gestalt, Gore, Nigel, Ozzie, Tyre, Qatux, Si
**Facilitator:** Jeroen
**Documenter:** Qatux
**Status:** CLOSED — all recoverable decisions filed, tickets created
**Full notes:** `docs/workshops/wiki-review/SUMMARY.md`, `si-ticket-changes.md`
---
## What the Workshop Accomplished
Began as a v0.1 wiki review (45 files, ticket #368) and was redirected between rounds 2 and 3 by a major strategic reframe: the lead declared the target as 300 populated worlds before DLC. This transformed the workshop from a content authoring strategy into a generator specification strategy. All Round 4 responses independently arrived at the same conclusion: the workshop had been designing generator specifications all along. The district skeleton, NPC composition matrix, Sacred/Profane framework, and pool architecture were already generator-shaped.
**The strategic reframe:** Old model: writers produce districts, tooling accelerates writers. New model: engineers produce generators, writers produce generator inputs, tooling IS the product.
**Note on decision IDs:** Several IDs proposed at this workshop collided with later numbering. Genuinely new decisions identified in retrospect were filed as D-088 (300-world generator model), D-090 (three-tier world authoring), D-092 (Sacred/Profane/Middle Kingdom framework), Q-030, Q-035 through Q-039.
---
## Decisions Produced
### Long-Term Strategy Decisions (Confirmed by Lead)
| ID | Decision | Domain |
|----|----------|--------|
| D-088 | 300 worlds before DLC — generator model required | scope.md |
| D-090 | Three-tier world authoring: Landmark (10-15 hand-authored), Regional (30-50 template), Generated (230-260 procedural) | scope.md |
| D-092 | Sacred/Profane/Middle Kingdom randomization framework | architecture.md |
### Supporting Decisions (Rounds 1-2, v0.1 Specific)
| ID | Decision | Domain |
|----|----------|--------|
| Q-030 | Cultural ingredients menu: 6 ingredient categories, Heritage OPTIONAL, derivation function produces cultural parameters | pending formalization |
| — | Hael renamed to Naia Tamm (resolves Kael/Hael sonic collision) | content.md |
| — | Three-system NPC architecture: Thematic Patterns + Functional Motivations + Composition rules | content.md |
| — | Cultural brief = generation seed (seed.yaml + brief.md dual artifact) | process.md |
| — | 8 PC archetypes at v1.0; archetypes are FLUID positions, not classes | scope.md |
| — | THE NOBODY: dynamic tier promotion (NOBODY → NOTICED → RECOGNIZED → KNOWN → INVESTED) | scope.md |
The specific v0.1 decisions (Naia rename, NPC architecture, THE NOBODY, THE MIRROR) were carried forward and filed in the subsequent v0.1 Content Scoping workshop where IDs were formally assigned.
---
## Open Questions Raised
| ID | Question | Status |
|----|----------|--------|
| Q-030 | Cultural ingredients menu: full formalization of 6 categories, null-heritage behavior, derivation function specification | Pending |
| Q-035 | Naming algorithm: phonetic rules vs word lists — which approach for 300-world cultural naming | Pending |
| Q-036 | Gate topology design: connectivity requirements, hub placement, small-world properties | Pending |
| Q-037 | Storyteller cultural literacy: how storyteller adapts pacing to cultural trust-building rates | Pending |
| Q-038 | NPC pattern composition rules: forbidden/preferred combination formalization | Pending |
| Q-039 | Modding toolkit: content pack manifest, ADD/REPLACE/MERGE overlay operations | Pending |
---
## Tickets Created
29 new tickets (1 epic, 9 stories, 19 tasks) + 4 existing ticket updates. See `si-ticket-changes.md` for full list.
**Teams:** copy (21), server (7), ci (1).
### Existing Ticket Updates (4)
| ID | Action |
|----|--------|
| #301 | Update description with concrete taxonomy rules from workshop |
| #319 | Update — Miri's Krenn brief supersedes original scope |
| #368 | Mark done — wiki at wiki/ is the delivered output |
| #261 | No change — confirmed still blocking, assign to copy when ready |
### New Epic
**Wiki Review Workshop Outputs** — parent epic for all workshop-produced tickets. Priority: high. Team: copy.
### Selected New Tickets
| Series | Count | Examples |
|--------|-------|---------|
| A (Wiki content updates) | 12 | A1 canonical names, A2 Hael→Naia rename, A3 Krenn brief, A7 smuggler attributes, A11 Triangle 1 fix |
| B (Style guides + specs) | 5 | B1 NPC Authoring Style Guide, B2 MIRROR spec, B3 PC-as-NPC spec, B4 Smuggler voice card |
| C (Content directory + schemas) | 10 | C1 design doc, C2 directory skeleton, C3 schemas, C9 validate-content CLI |
| D (Design specs) | 4 | D1 cultural_gate design, D2 seed config schema, D3 secondary contraband, D4 news ticker |
---
## Deferred to Future Workshops
The wiki-review triggered scoping of several follow-on workshops:
- **Control & Interaction Scheme** — brief written during this workshop; held separately (`docs/workshops/control-interaction/`)
- Perception system gravity variation for world transitions
- Full NPC pattern composition rules (forbidden/preferred lists)
- Gate topology design
- Storyteller cultural literacy
- LLM-assisted content pipeline design
- Modding toolkit specification
- Inter-world political generation
---
## Key Quotes Preserved
- Nigel: "Two players, same world, same seed, different experience because they noticed different people."
- Gore: "Learning to see is the endgame."
- Gestalt: "Hotline Miami movement + Disco Elysium interaction."
- Gore: "The theme is the field, not any specific phrasing of it. The field is: what does it cost to be human inside something bigger than yourself?"
---
*Compiled by Qatux. Source: `docs/workshops/wiki-review/SUMMARY.md`, `si-ticket-changes.md`. Decisions in `decisions/scope.md` (D-088, D-090) and `decisions/architecture.md` (D-092). Open questions in `decisions/questions.md` (Q-030, Q-035 through Q-039).*