Compare commits
@@ -25,7 +25,8 @@ The current branch IS the team. Read it with:
|
||||
git branch --show-current
|
||||
```
|
||||
|
||||
Valid team branches: `server`, `client`, `copy`, `audio`, `visual`, `ci`.
|
||||
Valid team branches: `server`, `client`, `copy`, `audio`, `visual`, `ci`,
|
||||
`planning`.
|
||||
|
||||
If on `main`, follow the **Main branch workflow** below instead of
|
||||
the team branch workflow (steps 2–8).
|
||||
@@ -399,6 +400,68 @@ Task(
|
||||
)
|
||||
```
|
||||
|
||||
#### 8d-planning. Planning team variant — proposers vs executors
|
||||
|
||||
When the team is `planning`, agents work in discussion mode, not
|
||||
implementation mode. The briefing typically defines discussion rounds
|
||||
(propose → review → execute). Most agents are **proposers** — they
|
||||
analyze and recommend. Only designated agents **execute** (write to
|
||||
files, modify DB).
|
||||
|
||||
**Classify agents from the briefing:**
|
||||
- **Executor agents:** SI (project manager), Qatux (documenter).
|
||||
These agents wait for consensus before writing anything.
|
||||
- **Proposer agents:** Everyone else (Gestalt, Tyre, Paula, Ozzie,
|
||||
etc.). These agents analyze, propose, and discuss — they do NOT
|
||||
write decision files, modify the DB, or create/delete tickets.
|
||||
|
||||
**Add this block to proposer agent prompts** (replaces rules 3–5
|
||||
and the WORKFLOW section from the standard template):
|
||||
|
||||
```
|
||||
PLANNING TEAM RULES (replace standard rules 3-7 and WORKFLOW):
|
||||
|
||||
3. PROPOSE ONLY: You are a discussion participant. Your job is
|
||||
to ANALYZE tickets, PROPOSE team assignments, and RECOMMEND
|
||||
splits. You do NOT:
|
||||
- Write or modify decision files (decisions/*.md)
|
||||
- Run DB update/insert/delete commands
|
||||
- Create, delete, or modify tickets
|
||||
- Mark tasks as completed
|
||||
Those actions belong to executor agents (SI, Qatux) after
|
||||
the team lead confirms consensus.
|
||||
|
||||
4. OUTPUT FORMAT: Your first message to the team lead should
|
||||
be your full analysis. Structure it as:
|
||||
- Your position on open questions (with rationale)
|
||||
- Proposed team assignments (table format)
|
||||
- Split candidates (if any)
|
||||
- Sprint readiness assessment
|
||||
Do NOT claim or work tasks. The team lead coordinates.
|
||||
|
||||
5. WAIT FOR CONSENSUS: Do not treat your own proposal as
|
||||
decided. Other agents may disagree. The team lead calls
|
||||
consensus and directs executors to implement it.
|
||||
```
|
||||
|
||||
**Add this block to executor agent prompts** (appended after the
|
||||
standard rules):
|
||||
|
||||
```
|
||||
PLANNING TEAM RULES (additional):
|
||||
|
||||
8. WAIT FOR CONSENSUS: Do NOT execute DB changes, write
|
||||
decision files, or create tickets until the team lead
|
||||
explicitly tells you to. Your first message should confirm
|
||||
you are ready and describe your execution plan. Then wait.
|
||||
|
||||
9. EXECUTE EXACTLY WHAT IS DIRECTED: When the team lead sends
|
||||
you a list of changes, execute them precisely. Do not add
|
||||
extra changes, reinterpret the instructions, or fill gaps
|
||||
with your own judgment. If something is ambiguous, ask
|
||||
before executing.
|
||||
```
|
||||
|
||||
#### 8e. Report
|
||||
|
||||
Output to the user:
|
||||
|
||||
@@ -21,7 +21,21 @@ run_check() {
|
||||
|
||||
# --- Checks ---
|
||||
run_check "tooling/check-fact-ids" "fact_id validation"
|
||||
run_check "tooling/check-decision-ids" "decision ID duplication"
|
||||
# TODO: uncomment when tooling/check-decision-ids is implemented
|
||||
# run_check "tooling/check-decision-ids" "decision ID duplication"
|
||||
|
||||
# Run cargo audit only when Cargo.toml or Cargo.lock changed
|
||||
if git diff --cached --name-only | grep -qE '(Cargo\.toml|Cargo\.lock)$'; then
|
||||
echo "pre-commit: Cargo dependency change detected — running cargo audit..."
|
||||
if command -v cargo-audit >/dev/null 2>&1 || cargo audit --version >/dev/null 2>&1; then
|
||||
if ! (cd "$REPO_ROOT/server" && cargo audit); then
|
||||
ERRORS=$((ERRORS + 1))
|
||||
fi
|
||||
else
|
||||
echo "pre-commit: WARNING — cargo-audit not installed, skipping advisory check"
|
||||
echo " Install with: cargo install cargo-audit"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$ERRORS" -gt 0 ]; then
|
||||
echo ""
|
||||
|
||||
+59
-12
@@ -6,6 +6,56 @@ Format based on [Keep a Changelog](https://keepachangelog.com/).
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [v0.1.27] — 2026-03-17
|
||||
|
||||
### Added
|
||||
- 29 zone-type behavior templates completing the full library of 31 zone types per D-142. 2,210 culture-neutral behavior primitives across rural, industrial, port, extraction, commercial, administrative, research, medical, military, security, entertainment, residential, detention, archaeological, wilderness, and diplomatic zones
|
||||
- Generator-compatible overheard conversation RON format replacing the deprecated named-NPC YAML. 16 sample conversations parameterized by role pair and zone type with knowledge_payload for investigative value
|
||||
- Cross-culture name pool collision checking in validate-ron (`--check-name-collisions` mode)
|
||||
|
||||
- Drifter's Guide to the Reach — 100% coverage (301/301 systems). 262 new GTTR entries across all 5 regions plus updated regional index pages with hop-grouped tables
|
||||
- GJ 6711 / Abzu workshop — 6 rounds, 24 documents: initial briefs (4 agents), cross-pollination syntheses, sealed envelope (observation is load-bearing), stress test challenges against existing canon, final syntheses with Abzu naming, mechanics design (watch investment counter, six player verbs, bleed tile states, Adams & Ford entry filing), carry-out proposals (unresolved — reward design TBD)
|
||||
- Star map topology and real-coordinate SVG visualizations
|
||||
- Compact of Westphalia faction page — mutual recognition treaty, ~30-40 west_reach systems, four core principles, rotating council, internal treaty-vs-government tension
|
||||
- Batch 18 wiki pages — 18 systems reassigned from deep_frontier into named corridors (Waterkant, Breëvlei, Stilwater, Mossbank, Ribeirão, Nascente, Dernier Quai, Marktfeld, Bestevaer, Lichtung, Knotenpunkt, Posto Avançado, Weitblick, Último Farol, plus 4 unsettled)
|
||||
- Batch 17 wiki pages — Xa Vời, Eisfeld, Confluent (60+ wine châteaux), Dunkelholz, Echternach (Luxembourgish), Bout du Chemin (French), Grenzstein, plus GJ 4056 (unsettled)
|
||||
- Corporation doc for Vins de Grand Vide — négociant cooperative, three-tier classification (Grand Vide Classé / Vins de Corridors / Vin de Table du Vide), 6 named estates, 350-year commercial archive
|
||||
- Batch 16 wiki pages — 13 south_reach systems at hops 7-8 including Espinho, Okahandja, Encrucijada, Quilombo, Velha Guarda, Fragua, Puerto Último, plus GJ 902 (unsettled, reserved for base building DLC per D-145)
|
||||
- Batch 15 wiki page — Shimanami (east_reach hop 8)
|
||||
- Batch 14 wiki pages — Wagtoring, Dunmore, Caledonia's End (north_reach hops 7-8)
|
||||
- Batch 13 wiki pages — Stillvakt, Haltefenn, Vindkast, Kopparhytta, Steinfeld, Brückenau (west_reach hops 7-8)
|
||||
- Corporation docs for Nordmark Skog (timber, Stillvakt) and Talbräu (lager, Brückenau)
|
||||
- D-145: base building DLC — GJ 902 habitable moon as potential player settlement site
|
||||
- South_reach wiki pages (batch 12) — Matamba, Inhambane, Isibaya, Kaapse Baai, Mwangaza, Dzimbahwe, Vuurkloof, Várzea, Nowa Huta, plus GJ 695A (unsettled)
|
||||
- Corporation docs for Ferreira Monteiro (trade arbitration, Matamba) and Stalownia Kowalski (heavy equipment, Nowa Huta)
|
||||
- East_reach wiki pages (batch 11) — Kaur's Observatory, Seongho, Tình Yên, Purnima, Marunong, Clearwater Station, Tam Giang, Jeonnam, Dagat, Suối Vàng
|
||||
- Inner hub wiki pages (hops 3-4) — Crown's Hollow, Cairnside, Schuilhoek, Travessia, Nová Tržnice
|
||||
- Corporation doc for Mercado Travessia (grocery chain, Travessia)
|
||||
- Corporation docs for Adams & Ford Publishing, Calloway Distillery, thrds (updated index)
|
||||
- 300-system CSV framework (systems-framework.md) — 66 columns covering colonization waves, cultural archetypes, tone framework, economic distribution, and Van Maanen's Star validation (D-095)
|
||||
- Star map gate topology — 300-node network with 334 edges across 6 sectors, generated and hand-tuned for natural corridor structure in frontier space
|
||||
- Star map generation pipeline — seed-based generator, sculpting script, core sector patcher, topology tuner with bridge-safe connectivity guarantees
|
||||
- d2 sector diagrams — 6 sector maps + overview visualization of gate network
|
||||
- Multi-table star systems DB schema with GJ catalog IDs as primary keys — 8 tables covering identity, gates, history, economy, factions, culture
|
||||
- Full wiki prose for 10 core systems — Sirius, Ran, Tau Ceti, Sol, Arbour, Groombridge, Struve, Cygni B, ACB, Bastion
|
||||
- Corporation wiki pages — Gate Corporation, Mastroianni Vehicle Group, Prometheus Labs
|
||||
- Wiki category index pages for star-systems, corporations, factions, technology, contraband, concepts
|
||||
- 10 next-tier systems named and assigned roles — Renaissance, Nova Roma, Prometheus, Proxima, Rigil Kentaurus, Barnard's Star, Lacaille, Cairn, Meridian, Aurelius
|
||||
- `hop_distance_from_gateway` column in system_gates table
|
||||
|
||||
### Changed
|
||||
- Renamed GJ-7547 from Wag-'n-Bietjie to Skemeraand ("twilight evening") — better tonal fit for hop 22 position
|
||||
- Rebuilt catalog.md and star-systems/index.md — now covers all 301 systems (227 named) organized by sector and hop distance
|
||||
- 14 systems reassigned from deep_frontier into named corridors at hops 5-7 (5 north, 3 south, 3 east, 3 west)
|
||||
- Renamed Carrefour to Confluent; expanded to 60+ named châteaux with 16 individually described estates
|
||||
- D-095 aperture range amended from 4-8 to 1-8 — single-aperture dead-end systems valid for isolated frontier outposts
|
||||
- D-095 amended: inter-system gates are alien-built (aperture count alien-determined), intra-system span gates are human-built (Institute reverse-engineering, Gate Corporation license)
|
||||
- All system identifiers migrated from arbitrary S-numbers to GJ astronomical catalog IDs
|
||||
- Q-039 (gate topology generation) resolved by 301-system star map
|
||||
|
||||
### Removed
|
||||
- Redundant `astronomical_id` column from star systems schema (system_id IS the GJ number)
|
||||
|
||||
## [v0.1.26] — 2026-03-13
|
||||
|
||||
### Added
|
||||
@@ -27,13 +77,13 @@ Format based on [Keep a Changelog](https://keepachangelog.com/).
|
||||
### Removed
|
||||
- v0.1 content loading system — server/src/content/ module (8200 lines), tooling/content-converter/, tooling/validate-content, content-ron/, content/_meta/ (#655, D-122)
|
||||
- AiDialogueDetector — duplicate of HardwareDetector, replaced by PlatformInfo abstraction (#659)
|
||||
- v0.1 hand-authored Krenn dialogue, monologue, and NPC profiles — 64 files superseded by generated NPCs (#656, D-122)
|
||||
- v0.1 hand-authored Van Maanen's Star dialogue, monologue, and NPC profiles — 64 files superseded by generated NPCs (#656, D-122)
|
||||
- Detective mission system — investigation knowledge, lattice-commission faction, design docs, workshop archives (#657, D-117)
|
||||
|
||||
### Fixed
|
||||
- Name pool cross-contamination — zero overlaps across Krenn, Vael, and Osse cultures
|
||||
- Name pool cross-contamination — zero overlaps across Van Maanen's Star, Vael, and Osse cultures
|
||||
- D-141 → D-142 reference correction in zone-type templates
|
||||
- Modifier coverage expanded to 2+ per category for all cultures; authority_response differentiated Krenn/Osse
|
||||
- Modifier coverage expanded to 2+ per category for all cultures; authority_response differentiated Van Maanen's Star/Osse
|
||||
- Gendered pronouns removed from culture-neutral zone-type templates
|
||||
- Ungrounded lore terms (Syndic, Meridian registration) replaced with generic descriptors in Osse culture
|
||||
- Stale notes in content-structure-canonical.md and base-text-authoring-guide.md corrected
|
||||
@@ -54,7 +104,7 @@ Format based on [Keep a Changelog](https://keepachangelog.com/).
|
||||
- Behavior dedup — same behavior string no longer assigned to multiple NPCs in one zone run (#629)
|
||||
|
||||
### Added
|
||||
- Zone identity specs renamed to location-specific: krenn-rural-zone.ron and krenn-industrial-zone.ron — acknowledges these are culture×zone content, not reusable templates (#630, Q-057)
|
||||
- Zone identity specs renamed to location-specific: van-maanens-star-rural-zone.ron and van-maanens-star-industrial-zone.ron — acknowledges these are culture×zone content, not reusable templates (#630, Q-057)
|
||||
- ~108 new NPC behavior pool entries across all roles in both zone files — trader stage directions, foreman humanity behaviors, dock_worker/technician off-shift/break room behaviors (#630)
|
||||
- Q-057 open question: composable behavior generation — decompose hand-authored pools into role actions + culture modifiers + context tags (#633, #634)
|
||||
- Relationship-to-behavior pipeline — NPC behavior lines now reflect social connections (rivals ignore each other, friends gravitate, subordinates defer) (#631)
|
||||
@@ -63,9 +113,6 @@ Format based on [Keep a Changelog](https://keepachangelog.com/).
|
||||
|
||||
## [v0.1.24] — 2026-03-06
|
||||
|
||||
### Changed
|
||||
- Replaced all in-universe "Commonwealth" references with "the Settled Reach" across 44 files (agents, decisions, docs, tooling, server). Historical discussion transcripts and Hamilton book references kept as-is.
|
||||
|
||||
### Added
|
||||
- Character archetype select screen — two-card UI (Smuggler/Detective) between New Game and session start, keyboard+mouse selection, ESC cancels (#588, D-027)
|
||||
- Triangle activation consumer — urgent monologue chime fires once per triangle per session when triangle_crisis_events received (#590, D-039)
|
||||
@@ -165,7 +212,7 @@ Format based on [Keep a Changelog](https://keepachangelog.com/).
|
||||
- Consolidate near-identical unit tests with integration counterparts
|
||||
|
||||
### Changed
|
||||
- Sova station profile updated — horizon gates located at The Krenn Ring (800 AU), not on Station Sova; Admin Hub houses transit processing facility only
|
||||
- Sova station profile updated — horizon gates located at The Van Maanen Ring (800 AU), not on Station Sova; Admin Hub houses transit processing facility only
|
||||
- game_state.gd: stationary_ticks and zone_id now read from server snapshot with deprecated client-side fallbacks (#557, D-020)
|
||||
- dialogue_box.gd: decoupled from GameState and AudioManager via signals — zero direct autoload references (#558, D-020)
|
||||
- main.gd: snapshot dispatch via SnapshotEventRouter, dialogue signal coordinator handlers (#559, #558)
|
||||
@@ -343,7 +390,7 @@ Format based on [Keep a Changelog](https://keepachangelog.com/).
|
||||
- Text display hierarchy spec — 4 content pipelines (dialogue, monologue, observation, environmental) with z-layers and positioning (#316)
|
||||
- Sound indicator visual design — fog-edge pulse for D-018 three-range sound model with direction encoding and range differentiation (#317)
|
||||
- THE FRIEND visual treatment spec — 3-phase earned visual detail for Kael Davan and Sera Venn (#318)
|
||||
- Environmental text visual standards — signage, terminal, and news ticker rendering with bilingual Concordat/Krenn treatment (#334)
|
||||
- Environmental text visual standards — signage, terminal, and news ticker rendering with bilingual Concordat/Van Maanen's Star treatment (#334)
|
||||
- Tell visual/behavioral expression spec — 5 tell categories mapped to 6 Tier 2 behaviors (#251)
|
||||
- Monologue line pool maxLength raised from 160 to 256 chars (soft guidance ≤160)
|
||||
- NPC name masking infrastructure — entity-anchored dialogue log with server-side role labels, retroactive name update on learning, NpcColorIndex for stable color assignment
|
||||
@@ -720,7 +767,7 @@ Format based on [Keep a Changelog](https://keepachangelog.com/).
|
||||
- UIStrings autoload with YAML-based UI string loading (#409) — minimal YAML parser, `get_text()` lookup with fallback-to-key
|
||||
- HUD and interaction prompt labels now loaded from `client/data/ui-strings.yaml` instead of hardcoded strings
|
||||
- Character voice speech patterns (#310) — sentence-level execution spec for smuggler and detective covering contractions, punctuation, stress markers, vocabulary, verbal tics, and authoring checklist
|
||||
- NPC authoring style guide (#379) — 954-line handbook: tier budgets, 9 NPC patterns, dialogue/monologue rules, tag taxonomy, dual-lens coordination, Krenn/Sova culture, FRIEND phase mapping, validation checklist
|
||||
- NPC authoring style guide (#379) — 954-line handbook: tier budgets, 9 NPC patterns, dialogue/monologue rules, tag taxonomy, dual-lens coordination, Van Maanen's Star/Sova culture, FRIEND phase mapping, validation checklist
|
||||
- UI microcopy (#409) — 72 YAML strings for client integration: interaction verbs, relationship states, HUD labels, perception modes, notifications, knowledge panel, tutorial prompts
|
||||
- Kael Davan FRIEND pack (#297) — 86 hand-authored lines across 3 locations, 5-phase relationship arc with contradiction scene, dual-lens notes
|
||||
- Sera Venn FRIEND pack (#298) — 75 hand-authored lines at The Last Shift, trust-gated gossip, avoidance contradiction, contaminated trust arc
|
||||
@@ -805,7 +852,7 @@ Format based on [Keep a Changelog](https://keepachangelog.com/).
|
||||
### Changed
|
||||
- NearbyInteractionBuffer refactored from global Resource to per-entity Component on PlayerCharacter — multiplayer-ready (D-009)
|
||||
- Observer module split into mod.rs (244 lines) + tests.rs (480 lines) — reduces module complexity
|
||||
- Content directory restructured from flat districts/ to hierarchical campaigns/main/systems/krenn/stations/sova/districts/transit/ — path mirrors canonical IDs, glob-based discovery, multi-campaign/DLC ready
|
||||
- Content directory restructured from flat districts/ to hierarchical campaigns/main/systems/van-maanens-star/stations/sova/districts/transit/ — path mirrors canonical IDs, glob-based discovery, multi-campaign/DLC ready
|
||||
- Content manifest (content.yaml) rewritten for glob-based district discovery
|
||||
- District identity fields (system, station, district) now derived from directory path — removed from district.yaml required fields
|
||||
- NPC canonical_id schema accepts district-scoped IDs (npc:transit.kael-davan) for cross-district uniqueness
|
||||
@@ -968,7 +1015,7 @@ Format based on [Keep a Changelog](https://keepachangelog.com/).
|
||||
- D-033: Entity color represents relationship to player character (asymmetric per character)
|
||||
- D-034: THE FRIEND NPC pattern — production-level emotional centerpiece per character (Kael Davan, Sera Venn)
|
||||
- D-035: Converged tag taxonomy for dialogue/monologue line pools (6 structural + 3 selection tags)
|
||||
- D-036: Sova Transit District / Krenn System as v0.1 setting (first named star system)
|
||||
- D-036: Sova Transit District / Van Maanen's Star as v0.1 setting (first named star system)
|
||||
- D-037: Contraband specification — unlicensed lattice components (moral ambiguity by design)
|
||||
- D-038: Audio in v0.1 scope — 8 AI-generated files via Stable Audio Open
|
||||
- D-039: All 6 wow moments promoted to v0.1 must-have scope
|
||||
|
||||
@@ -2,7 +2,8 @@ GODOT := $(shell command -v godot4 2>/dev/null || command -v godot 2>/dev/null)
|
||||
|
||||
.PHONY: help setup build check-protocol client server game stop test lint ci ci-client ci-server clean \
|
||||
decisions-sync decisions-coverage decisions-active decisions-orphan \
|
||||
db-backup db-install validate-content content-ron check-fact-ids setup-hooks \
|
||||
db-backup db-install validate-content check-fact-ids setup-hooks \
|
||||
audit \
|
||||
pre-pr pre-pr-lint pre-pr-build pre-pr-test pre-pr-validate pre-pr-fixtures \
|
||||
pre-pr-server pre-pr-client pre-pr-content \
|
||||
fixtures-client fixtures-gauntlet golden-diff golden-update \
|
||||
@@ -45,9 +46,9 @@ help:
|
||||
@echo " make decisions-coverage Decision-to-ticket coverage by domain"
|
||||
@echo " make decisions-active List active decisions"
|
||||
@echo " make decisions-orphan Decisions without implementing tickets"
|
||||
@echo " make audit Run cargo audit (security advisory check)"
|
||||
@echo " make validate-content Validate content YAML against schemas"
|
||||
@echo " make check-fact-ids Check fact_id references against knowledge catalogs"
|
||||
@echo " make content-ron Convert content YAML to RON (build-time)"
|
||||
@echo " make fixtures-client Generate GDScript->Rust cross-encoder fixtures (#475)"
|
||||
@echo " make golden-diff Show diff if golden file output has changed"
|
||||
@echo " make golden-update Regenerate golden file and stage for commit"
|
||||
@@ -222,7 +223,7 @@ lint-client:
|
||||
|
||||
# --- Pre-PR verification ---
|
||||
|
||||
pre-pr: pre-pr-lint pre-pr-build pre-pr-test pre-pr-validate pre-pr-fixtures
|
||||
pre-pr: pre-pr-lint pre-pr-build pre-pr-test pre-pr-validate pre-pr-fixtures audit
|
||||
@echo ""
|
||||
@echo "=== PRE-PR: ALL CHECKS PASSED ==="
|
||||
@echo "Safe to create PR."
|
||||
@@ -275,7 +276,7 @@ pre-pr-fixtures:
|
||||
|
||||
# Branch-specific variants (faster, scope-appropriate)
|
||||
|
||||
pre-pr-server: lint-server build-server test-server pre-pr-fixtures
|
||||
pre-pr-server: lint-server build-server test-server pre-pr-fixtures audit
|
||||
@echo "=== Server pre-PR: PASSED ==="
|
||||
|
||||
pre-pr-client: lint-client build-client test-client
|
||||
@@ -322,6 +323,9 @@ validate-content:
|
||||
check-fact-ids:
|
||||
@tooling/check-fact-ids
|
||||
|
||||
audit:
|
||||
cd server && cargo audit
|
||||
|
||||
checklist-validate:
|
||||
@tooling/validate-checklist --check
|
||||
|
||||
@@ -382,10 +386,6 @@ test-voice-real:
|
||||
cd server && cargo test --test voice_pipeline -- --nocapture
|
||||
@echo "Results: .tmp/voice-test/results.txt"
|
||||
|
||||
content-ron:
|
||||
cd tooling/content-converter && cargo build --release
|
||||
tooling/content-converter/target/release/content-converter --input content --output content-ron --verbose
|
||||
|
||||
# --- Clean ---
|
||||
|
||||
clean:
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
# Content Infrastructure
|
||||
|
||||
Directories prefixed with `_` are infrastructure, not game content. The server content loader skips directories starting with `_` when scanning for content files.
|
||||
|
||||
- `_meta/` — Infrastructure metadata (this directory)
|
||||
- `_schema/` — JSON Schema validation files (draft 2020-12)
|
||||
|
||||
## Directory Hierarchy
|
||||
|
||||
Content is organized hierarchically to match the game universe:
|
||||
|
||||
```
|
||||
content/
|
||||
content.yaml # Manifest: campaign list, glob discovery patterns
|
||||
global/ # Cross-campaign shared content (factions, enums, knowledge)
|
||||
campaigns/
|
||||
{campaign}/ # e.g., "main"
|
||||
campaign.yaml
|
||||
systems/
|
||||
{system}/ # e.g., "krenn"
|
||||
system.yaml
|
||||
stations/
|
||||
{station}/ # e.g., "sova"
|
||||
station.yaml
|
||||
districts/
|
||||
{district}/ # e.g., "transit"
|
||||
district.yaml
|
||||
npcs/
|
||||
locations/
|
||||
triangles/
|
||||
dialogue/
|
||||
monologue/
|
||||
routines/
|
||||
templates/
|
||||
```
|
||||
|
||||
## Canonical ID Derivation
|
||||
|
||||
Identity is derived from directory path at load time — no redundant ID fields in YAML.
|
||||
|
||||
- **District:** `{system}.{station}.{district}` (e.g., `krenn.sova.transit`)
|
||||
- **NPC (within district):** `npc:{slug}` (e.g., `npc:kael-davan`)
|
||||
- **NPC (cross-district):** `npc:{district}.{slug}` (e.g., `npc:transit.kael-davan`)
|
||||
- **Location:** `{system}.{station}.{district}.location.{slug}`
|
||||
|
||||
## Content Discovery
|
||||
|
||||
The loader reads `content.yaml` for enabled campaigns and their glob patterns.
|
||||
District discovery uses `systems/**/districts/*/district.yaml` — no per-district
|
||||
manifest entry needed. Adding a district = creating a directory with district.yaml.
|
||||
@@ -1,954 +0,0 @@
|
||||
# NPC Authoring Style Guide
|
||||
|
||||
**The Settled Reach** | v0.1 Content Authoring Handbook
|
||||
**Ticket:** #379 | **Sprint:** 5
|
||||
**Authors:** Gestalt (mechanical constraints), Mellanie (voice rules), Paula (tier templates, relationship design), Ozzie (anchor lines)
|
||||
**Cross-references:** D-024, D-025, D-028, D-029, D-032, D-034, D-035, D-036, D-039, D-050, D-056, D-059
|
||||
**Schemas:** `content/_schema/npc-profile.schema.json`, `dialogue-pool.schema.json`, `monologue-pool.schema.json`
|
||||
|
||||
---
|
||||
|
||||
## 1. Purpose
|
||||
|
||||
This document is the single reference for all NPC content authoring in The Settled Reach. Every dialogue line, monologue line, NPC profile, and content pack must conform to the rules here. The guide is used by:
|
||||
|
||||
- **Content authors** writing dialogue pools, monologue pools, NPC profiles, and content packs
|
||||
- **Reviewers** checking tag compliance, voice consistency, and mechanical correctness
|
||||
- **The generation pipeline** (v0.2+) as the style constraint set for expanded content
|
||||
- **Future content authors** (including AI-assisted generation) as the specification they must satisfy
|
||||
|
||||
**If it's not in this guide, it's not a rule. If it contradicts a decision document, the decision document wins.**
|
||||
|
||||
---
|
||||
|
||||
## 2. Content Tiers
|
||||
|
||||
Every NPC has a tier (D-023, D-024). The tier determines content depth and authoring budget.
|
||||
|
||||
### Tier 1: Conspiracy-Entangled (Full Depth)
|
||||
|
||||
| Attribute | Value |
|
||||
|-----------|-------|
|
||||
| **Pattern** | FRIEND, MIRROR, or CATALYST |
|
||||
| **Motivation** | Any |
|
||||
| **Line budget** | 70-100 lines (FRIEND), 50-70 lines (MIRROR/CATALYST) |
|
||||
| **Profile depth** | Full 10-axis, all fields populated |
|
||||
| **Relationship arcs** | Multi-phase (3-5 phases for FRIEND), stable-deep for MIRROR |
|
||||
| **Dual-lens notes** | Required on profile and every 5th dialogue line minimum |
|
||||
| **FRIEND content** | Hand-authored only. No generation expansion. |
|
||||
| **Triangle membership** | 1-3 triangles |
|
||||
| **Trust-gated dialogue** | All three tiers (surface, real, secret) populated |
|
||||
|
||||
**v0.1 Tier 1 NPCs:** Kael Davan (FRIEND/OPERATOR), Sera Venn (FRIEND/WITNESS), Naia Tamm (MIRROR/CIVILIAN)
|
||||
|
||||
### Tier 2: Template-Situated (Social Context)
|
||||
|
||||
| Attribute | Value |
|
||||
|-----------|-------|
|
||||
| **Pattern** | ANCHOR, THRESHOLD, SYSTEM, GHOST, or REMNANT |
|
||||
| **Motivation** | Any |
|
||||
| **Line budget** | 20-40 lines |
|
||||
| **Profile depth** | Full 10-axis, supporting fields optional |
|
||||
| **Relationship arcs** | Single phase, stable. Access tier shifts possible but not required. |
|
||||
| **Dual-lens notes** | Required on profile; optional on individual lines |
|
||||
| **Triangle membership** | 1-2 triangles |
|
||||
| **Trust-gated dialogue** | Surface required. Real recommended. Secret optional. |
|
||||
|
||||
**v0.1 Tier 2 NPCs (D-050 canonical):** Voss (SYSTEM/OPERATOR), Lera Sessik (ANCHOR/OPERATOR), Torek Lintar (CATALYST/CIVILIAN), Devra (THRESHOLD/HANDLER), Maret Korr (WITNESS/SKEPTIC), Resha (CATALYST/CIVILIAN), Drin (SYSTEM/TURNCOAT), Renn (THRESHOLD/OPERATOR), Pell (CATALYST/TURNCOAT), Harek (ANCHOR/HANDLER)
|
||||
|
||||
### Tier 3: Filler (Atmosphere)
|
||||
|
||||
| Attribute | Value |
|
||||
|-----------|-------|
|
||||
| **Pattern** | NOBODY |
|
||||
| **Motivation** | CIVILIAN |
|
||||
| **Line budget** | 5-10 lines |
|
||||
| **Profile depth** | Minimal: canonical_id, display_name, tier, pattern, motivation, want, routine |
|
||||
| **Relationship arcs** | None |
|
||||
| **Dual-lens notes** | Not required |
|
||||
| **Triangle membership** | None |
|
||||
| **Trust-gated dialogue** | Surface only |
|
||||
|
||||
**v0.1 Tier 3 NPCs (D-050 canonical):** Sess (ANCHOR/CIVILIAN), Olin (CATALYST/CIVILIAN), Sabel (GHOST/OPERATOR), Tav (SYSTEM/CIVILIAN)
|
||||
|
||||
**Off-stage:** Nils Davan (GHOST/HANDLER) — referenced in dialogue, effects visible through other NPCs, rarely or never directly encountered.
|
||||
|
||||
**Design note:** The 30% flat population (D-029) is the noise floor. These NPCs make investigation signal meaningful. One memorable trait per Tier 3 NPC. Write the trait, write 5 greeting/routine lines, stop. But write them as real people — Tav worries about his first real responsibility. Sess remembers how the district used to be. Their genuineness is what makes the noise floor believable.
|
||||
|
||||
---
|
||||
|
||||
## 3. NPC Patterns (System A)
|
||||
|
||||
Patterns define an NPC's narrative archetype. Each pattern has specific authoring rules.
|
||||
|
||||
### FRIEND
|
||||
|
||||
The emotional centerpiece. Full contradiction arc, multi-phase relationship, maximum content depth. D-034 is the specification.
|
||||
|
||||
| Rule | Detail |
|
||||
|------|--------|
|
||||
| **Phases** | 3-5 phases: warmth -> trust -> doubt -> conflict -> new equilibrium |
|
||||
| **Contradiction** | Must be observable through player observation, NOT told through dialogue |
|
||||
| **Sympathetic motivation** | THE FRIEND isn't evil. Concealment comes from care or fear. |
|
||||
| **No clean resolution** | Every player choice (confront, ignore, exploit, protect) has consequences |
|
||||
| **Tell progression** | 3+ tells that escalate across phases |
|
||||
| **Dialogue shift** | Pre-discovery and post-discovery pools must feel different |
|
||||
| **Dual-lens resonance** | The other character's playthrough recontextualizes FRIEND behavior |
|
||||
| **No generation expansion** | All FRIEND content is hand-authored |
|
||||
|
||||
**Content budget:** 70-100 lines per FRIEND NPC:
|
||||
- 25-35 dialogue (greetings, shift talk, casual, deflection, confrontation)
|
||||
- 15-20 trust-gated (insider ring talk, close warmth, secret-tier hints)
|
||||
- 5-8 unprompted (NPC volunteers info early, warnings/deflections late)
|
||||
- 10-15 monologue per character (bonded character + opposite character)
|
||||
- 5-8 tell observation lines
|
||||
- 3-5 contradiction discovery lines
|
||||
|
||||
### MIRROR
|
||||
|
||||
The honest character. No contradiction arc, no deception tells, no secrets. Full emotional depth despite mechanical simplicity.
|
||||
|
||||
| Rule | Detail |
|
||||
|------|--------|
|
||||
| **No tells** | Empty tells array. Behavioral markers (visible stress, coping) are NOT deception tells. |
|
||||
| **No contradiction arc** | No phases, no color shift, no betrayal moment |
|
||||
| **No secret-tier revelation** | Trust progression reveals deeper FEELING, not deeper SECRETS |
|
||||
| **Absence as content** | The player's observation pipeline flags the LACK of tells as notable |
|
||||
| **Emotional vulnerability** | MIRROR wears their worry visibly. Transparency is load-bearing. |
|
||||
|
||||
**Content budget:** 50-70 lines per MIRROR NPC. No contradiction discovery content. No tell observation content.
|
||||
|
||||
### ANCHOR
|
||||
|
||||
Stabilizing community presence. Protects the status quo.
|
||||
|
||||
| Rule | Detail |
|
||||
|------|--------|
|
||||
| **Social gatekeeper** | Controls information flow through social position, not power |
|
||||
| **Protective reflex** | Shields regulars and community members from outsiders |
|
||||
| **Tells signal vigilance** | Not deception — watchfulness, redirection, protective silence |
|
||||
|
||||
### THRESHOLD
|
||||
|
||||
Controls access between social worlds.
|
||||
|
||||
| Rule | Detail |
|
||||
|------|--------|
|
||||
| **Gatekeeper mechanic** | Cooperation or opposition shapes player options |
|
||||
| **Access tier is the tool** | THRESHOLD decides who gets insider access |
|
||||
| **Pressurable** | The player can earn or force cooperation |
|
||||
|
||||
### GHOST
|
||||
|
||||
Absent figure whose influence is felt through others.
|
||||
|
||||
| Rule | Detail |
|
||||
|------|--------|
|
||||
| **Minimal direct content** | Referenced in dialogue, rarely seen |
|
||||
| **Off-screen pressure** | Effects visible through other NPCs' behavior changes |
|
||||
| **Content is in OTHER NPCs' lines** | Ghost's impact authored through relationship stubs |
|
||||
|
||||
### SYSTEM, CATALYST, REMNANT, NOBODY
|
||||
|
||||
See `content/global/enums/patterns.yaml` for definitions. Each follows the general tier rules above.
|
||||
|
||||
---
|
||||
|
||||
## 4. Functional Motivations (System B)
|
||||
|
||||
Motivations define the NPC's role relative to the conspiracy. Combined with pattern to produce the full NPC identity.
|
||||
|
||||
| Motivation | Relationship to Ring | Content Implication |
|
||||
|------------|---------------------|---------------------|
|
||||
| **HANDLER** | Manages ring operations | Authority dialogue, operational language, power dynamics |
|
||||
| **WITNESS** | Knows something, possibly unwittingly | Information gates, trust-progression reveals |
|
||||
| **TURNCOAT** | Wavering loyalty | Pressurable, flip conditions, dual-access content |
|
||||
| **CIVILIAN** | Genuinely uninvolved | Mundane substrate, noise floor, honest responses |
|
||||
| **OPERATOR** | Active ring participant | Operational jargon, insider access content, complicity |
|
||||
| **SKEPTIC** | Questions status quo | Uncomfortable questions, institutional criticism |
|
||||
|
||||
**Composition examples:**
|
||||
- FRIEND + OPERATOR (Kael): "I was your friend AND your co-conspirator"
|
||||
- FRIEND + WITNESS (Sera): "I was your friend AND I was hiding evidence"
|
||||
- MIRROR + CIVILIAN (Naia): "The one person not lying, surrounded by liars"
|
||||
- ANCHOR + OPERATOR (Lera): "Profitable blindness — is this enough? Yes, if I don't look"
|
||||
- SYSTEM + OPERATOR (Voss): "The system works — for the wrong people"
|
||||
- WITNESS + SKEPTIC (Maret): "I see the discrepancies. I can't pretend I don't"
|
||||
- SYSTEM + TURNCOAT (Drin): "The institution made me vulnerable, and the ring exploited it"
|
||||
|
||||
**Authoring guidance:** When writing any NPC, start from the pattern+motivation tension. Every line should be legible as coming from that specific combination. An ANCHOR+OPERATOR speaks differently from an ANCHOR+CIVILIAN — the first maintains normalcy as active concealment, the second maintains normalcy because that's genuinely all they have.
|
||||
|
||||
---
|
||||
|
||||
## 4b. The 5 Key Axis Interactions
|
||||
|
||||
The 10 axes (D-024) don't exist in isolation. These 5 axis interactions generate the contradictions that drive gameplay. When authoring an NPC, identify which interactions are active — they determine what content to write.
|
||||
|
||||
| Interaction | What It Creates | Example |
|
||||
|-------------|----------------|---------|
|
||||
| **Want x Secret** | The contradiction between what they pursue and what they hide | Kael wants safety but his exit attempt is the biggest security risk. Sera wants connection but her concealment isolates her. |
|
||||
| **Routine x Secret** | Observable deviations from normal behavior | Sera leaves the bar every time Torek arrives — the avoidance IS the tell. Kael lingers in restricted corridors during off-hours. |
|
||||
| **Tolerance x Relationships** | When pressure on one relationship breaks another | Voss's compliance with Nils corrodes his authority over Kael. Naia's worry about Kael triggers Sera's unauthorized compliance check. |
|
||||
| **Want x Relationships** | When personal desires conflict with social bonds | Kael's desire to protect Naia requires lying to the smuggler — the friend he sees every day. |
|
||||
| **Personality x Tolerance** | How stress changes observable behavior | Kael goes quiet and checks exits. Sera redirects and overcompensates with helpfulness. Voss gets procedural and avoids the break room. |
|
||||
|
||||
**For each Tier 1 NPC, all 5 interactions must be active and authored.** For Tier 2, at least 2 interactions should be authored. Tier 3 NPCs need at minimum the Want x Routine interaction (what they want shapes their observable daily life).
|
||||
|
||||
---
|
||||
|
||||
## 4c. Triangle Content Requirements
|
||||
|
||||
Triangles (3 NPCs with conflicting interests) are the atomic unit of social intrigue (D-024, D-025). Every Tier 1 and Tier 2 NPC belongs to at least one triangle.
|
||||
|
||||
### v0.1 Triangles
|
||||
|
||||
| # | Name | Members | Type | Core Tension |
|
||||
|---|------|---------|------|-------------|
|
||||
| T1 | **Hub Power** | Voss - Kael - Nils (off-stage) | Active fork | Voss has the title, Nils has the power, Kael is caught between |
|
||||
| T2 | **Worried Knowledge** | Maret - Drin - Voss | Active fork | Maret sees discrepancies, Drin is compromised, Voss needs silence |
|
||||
| T3 | **Bar Tensions** | Lera - Torek - Harek | Passive tension | Torek's spending draws attention, Lera protective, Harek watching |
|
||||
| T4 | **Worried Partner** | Naia - Kael - Sera | Active fork | Naia worries about Kael, confides in Sera, Sera discovers evidence |
|
||||
| T5 | **Informant Question** | Naia - Devra - Drin | Passive tension | Cross-template — potential unraveling vectors |
|
||||
|
||||
### What Authors Must Provide per Triangle
|
||||
|
||||
1. **Observable signals:** What the player can see that indicates triangle pressure (behavioral changes, spatial avoidance, tonal shifts in dialogue)
|
||||
2. **Smuggler relevance:** How the smuggler reads this triangle — what they know, what they worry about
|
||||
3. **Detective relevance:** How the detective reads this triangle — what they observe, what it suggests
|
||||
4. **Pressure points:** What player actions could escalate or de-escalate the tension
|
||||
5. **Dialogue shift lines:** At least 2-3 lines per triangle member that change when the triangle is under pressure vs. at rest
|
||||
|
||||
### Triangle Rules
|
||||
|
||||
- **Self-contained in v0.1 (D-053).** No cross-triangle cascade. Pressure in T1 does not automatically affect T3. Cross-triangle cascade is a v0.2 storyteller feature.
|
||||
- **Observable, not narrated.** Triangle tension must be visible through NPC behavior (tells, routine deviations, tonal shifts), not explained through dialogue exposition.
|
||||
- **Dual-lens mandatory.** Every triangle must read differently through smuggler and detective perspectives.
|
||||
|
||||
---
|
||||
|
||||
## 4d. Access Tier Shift Paths
|
||||
|
||||
Access tiers change during gameplay based on player actions and story progression. Content authors must provide dialogue for both the starting state and the shifted state.
|
||||
|
||||
| Social Site | Character | Starting Tier | Likely Shift | Trigger |
|
||||
|-------------|-----------|---------------|-------------|---------|
|
||||
| Logistics Hub | Smuggler | insider + peer | insider > hostile | Cover blown — seen with detective, or ring member reports suspicion |
|
||||
| Logistics Hub | Detective | authority | authority > peer | Earns trust by keeping a minor infraction quiet |
|
||||
| Bar | Smuggler | insider (regular) | insider > hostile | Social contamination from hub events |
|
||||
| Bar | Detective | public | public > insider | Repeated visits (3-4), earns regular status |
|
||||
| Ring spaces | Smuggler | insider + peer | peer > hostile | Suspected of cooperation with detective |
|
||||
| Ring spaces | Detective | public (doesn't know ring exists) | public > hostile | Stumbles into ring awareness — NPCs react defensively |
|
||||
|
||||
**Authoring implication:** For every access tier in the table above, content packs must include dialogue that works at that tier. When a shift happens (e.g., smuggler goes from insider to hostile at the hub), the *absence* of insider-tier lines IS the emotional payload — the player notices that Kael no longer shares operational details, that the warmth is gone. This means `public` and `hostile` tier lines must be authored with enough depth to carry the post-shift experience.
|
||||
|
||||
---
|
||||
|
||||
## 5. Dialogue Authoring Rules
|
||||
|
||||
### The Tag Taxonomy (D-035)
|
||||
|
||||
Every dialogue line requires 6 structural tags + up to 3 selection tags.
|
||||
|
||||
#### Structural Tags (Required)
|
||||
|
||||
| Tag | Type | Format | Description |
|
||||
|-----|------|--------|-------------|
|
||||
| `id` | string | `{npc-slug}_d_{###}` | Stable line ID. Machine-parseable. Never reused. NPC-scoped per D-035 Sprint 15 amendment. |
|
||||
| `text` | string | The line | The authored dialogue text |
|
||||
| `role` | enum | lowercase-slug | Template role, not NPC name. NPCs fill roles at runtime. |
|
||||
| `access` | list | `[public, insider, ...]` | D-028 Layer 1 hard filter. Who can hear this. |
|
||||
| `trust` | enum | `surface\|real\|secret` | D-028 Layer 3 hard filter. What trust level unlocks this. |
|
||||
| `situation` | list | `[arrival, routine, ...]` | D-028 Layer 2 context filter. When this line can fire. |
|
||||
|
||||
#### Selection Tags (Recommended)
|
||||
|
||||
| Tag | Type | Format | Description |
|
||||
|-----|------|--------|-------------|
|
||||
| `topic` | list | `[colleague, cargo, ...]` | D-028 Layer 4 weighted selection. Defaults to `[routine]`. |
|
||||
| `mood` | list | `[content, anxious, ...]` | D-028 Layer 4 weighted selection. Defaults to untagged (neutral). |
|
||||
| `tags` | list | freeform strings | Escape hatch for author intent. |
|
||||
|
||||
#### Authoring-Only Tags (Not Consumed by Engine)
|
||||
|
||||
| Tag | Type | Description |
|
||||
|-----|------|-------------|
|
||||
| `dual_lens` | map | Per-character interpretation notes |
|
||||
| `notes` | string | Design notes for reviewers |
|
||||
| `knowledge_grant` | object | What the player learns from hearing this line |
|
||||
|
||||
### The Four-Layer Pipeline
|
||||
|
||||
Content authors must understand how the engine selects lines. A line must pass ALL layers to fire.
|
||||
|
||||
```
|
||||
Layer 1: ACCESS (hard filter)
|
||||
Does the player's current access tier match the line's access list?
|
||||
If no -> line is invisible. The player never knows it exists.
|
||||
|
||||
Layer 2: SITUATION (context filter)
|
||||
Is the current situation in the line's situation list?
|
||||
If no -> line is ineligible for this encounter.
|
||||
|
||||
Layer 3: TRUST (hard filter)
|
||||
Has the player reached the required trust level with this NPC?
|
||||
If no -> line is invisible.
|
||||
|
||||
Layer 4: MOOD + TOPIC (weighted selection)
|
||||
From the eligible pool, weight by mood and topic match.
|
||||
Higher match = more likely to be selected.
|
||||
```
|
||||
|
||||
**Authoring implication:** A line tagged `access: [insider], trust: secret, situation: [confrontation]` will ONLY fire when:
|
||||
1. The player has insider access (smuggler at the hub, not detective)
|
||||
2. The player has earned secret-level trust (deep relationship)
|
||||
3. The situation is a confrontation (triangle pressure escalated)
|
||||
|
||||
If any layer fails, the line is invisible. Tag conservatively.
|
||||
|
||||
### Access Tier Rules
|
||||
|
||||
| Tier | Who Gets It | Authoring Guidance |
|
||||
|------|-------------|-------------------|
|
||||
| `public` | Everyone | Safe topics. Greetings. Shift small talk. What you'd say to a stranger. |
|
||||
| `insider` | Group members | Ring operational talk. Close colleague warmth. What you'd say to someone who belongs. |
|
||||
| `authority` | Institutional figures | Formal responses to power. Careful language. What you'd say to a cop. |
|
||||
| `peer` | Earned personal trust | Real conversation. Honest opinions. What you'd say to someone you actually like. |
|
||||
| `hostile` | Broken relationship | Accusations. Threats. Defensive walls. What you'd say to someone you no longer trust. |
|
||||
|
||||
**Critical rules:**
|
||||
- `access` is a **list**. A line can be eligible for multiple tiers: `[public, peer]`.
|
||||
- The smuggler starts with `insider` + `peer` at the hub. The detective starts with `authority`.
|
||||
- When Kael transitions from Friendly to PersonOfInterest, `insider` and `peer` lines **lock out**. That absence IS the emotional payload.
|
||||
- Never tag a line `access: [insider, authority]` unless you mean "ring members AND institutional figures hear the same line." That's almost never correct.
|
||||
|
||||
### Trust Tier Rules
|
||||
|
||||
| Tier | What It Gates | Authoring Guidance |
|
||||
|------|--------------|-------------------|
|
||||
| `surface` | Default | Safe, non-committal. The public face. Most dialogue is here. |
|
||||
| `real` | Earned through repeated positive interaction | Genuine opinions, workplace complaints, personal concerns. The real person. |
|
||||
| `secret` | Highest tier | Information they'd normally hide. Ring involvement, fears, leverage. For MIRROR NPCs: deepest emotional vulnerability, NOT plot secrets. |
|
||||
|
||||
### Situation Assignment
|
||||
|
||||
Tag lines with situations they're appropriate for. The engine decides which situations are currently active.
|
||||
|
||||
**Common mistakes:**
|
||||
- Tagging everything `[routine]`. If the line is specific to a time or context, tag it specifically.
|
||||
- Omitting `observation` from lines that make sense when the player is watching from a distance.
|
||||
- Using `confrontation` for any tense moment. `confrontation` means triangle pressure has escalated past threshold. Most tension is `investigation` or `social`.
|
||||
|
||||
---
|
||||
|
||||
## 6. Monologue Authoring Rules
|
||||
|
||||
### Hard Partition (D-032)
|
||||
|
||||
Internal monologue is **completely separate** per playable character. The `character` tag is a hard partition, not a filter. The smuggler and detective have independent monologue pools. **No shared lines.**
|
||||
|
||||
Same trigger, different pool. That's how mirror moments work.
|
||||
|
||||
### Monologue-Specific Tags
|
||||
|
||||
| Tag | Type | Description |
|
||||
|-----|------|-------------|
|
||||
| `id` | string | `{npc-slug}_m_{s\|d}_{###}` — `s` for smuggler, `d` for detective. NPC-scoped per D-035 Sprint 15 amendment. |
|
||||
| `text` | string | The monologue line (160 char max) |
|
||||
| `character` | enum | `smuggler` or `detective` |
|
||||
| `trigger` | enum | What causes this line to fire (see trigger types below) |
|
||||
| `prerequisites` | object | AND-only knowledge gates (facts, entity attributes, relationship state) |
|
||||
| `priority` | int 0-10 | Selection weight. Default 5. Higher = more likely to fire. |
|
||||
| `cooldown` | int | Minimum ticks before line can fire again |
|
||||
| `tags` | list | Freeform tags |
|
||||
|
||||
### Trigger Types
|
||||
|
||||
| Trigger | When It Fires | Authoring Guidance |
|
||||
|---------|--------------|-------------------|
|
||||
| `enter_location` | Player enters new area | First impressions, atmosphere, spatial awareness |
|
||||
| `observe_npc` | Player sees an NPC doing something notable | Body language, activity, posture, tell |
|
||||
| `hear_sound` | Sound event from fog edge | Interpretation of what the player can't see |
|
||||
| `observe_anomaly` | NPC deviates from known routine | Requires prerequisite knowledge of normal pattern |
|
||||
| `post_conversation` | After dialogue ends | Reflection on what was said, what wasn't, what felt off |
|
||||
| `discover_evidence` | Player examines informational object | Interpretation of found evidence |
|
||||
| `witness_interaction` | Player sees two NPCs interacting | Social observation, body language reading |
|
||||
| `time_idle` | Player hasn't acted for a while | Ambient thoughts, rumination, noticing background |
|
||||
| `return_visit` | Player returns to visited area | Changed perspective, comparison to last time |
|
||||
|
||||
### Display Constraints (Hard Ceiling)
|
||||
|
||||
| Constraint | Value | Implication |
|
||||
|------------|-------|-------------|
|
||||
| **Max length** | 160 characters | Hard ceiling. Most lines 80-120 characters. |
|
||||
| **Max visual lines** | 2 | If it wraps to 3, cut it. |
|
||||
| **Display time** | 4-6 seconds (length-adjusted) | Target: 15-25 words per line. |
|
||||
| **Self-contained** | Each line stands alone | A line must make sense even if the previous one didn't display. |
|
||||
| **25-word rule** | If over 25 words, it must be the most important line in the pool | Most lines: 10-18 words. Average target: 14 words. |
|
||||
|
||||
### Prerequisite Authoring
|
||||
|
||||
Monologue lines can gate on knowledge state. Use sparingly — most lines should fire on trigger alone.
|
||||
|
||||
```yaml
|
||||
prerequisites:
|
||||
facts:
|
||||
- fact_id: "contraband.ring_exists"
|
||||
min_confidence: "knows_of"
|
||||
entity_attributes:
|
||||
- entity: "npc:kael-davan"
|
||||
key: "behavior_flags"
|
||||
value: "nervous"
|
||||
relationship:
|
||||
target: "npc:kael-davan"
|
||||
state: "friendly"
|
||||
```
|
||||
|
||||
**Confidence hierarchy (D-041):**
|
||||
- `suspects` — heard a rumor, gut feeling
|
||||
- `knows_of` — has evidence something exists
|
||||
- `knows_details` — understands specifics
|
||||
- `direct` — personally witnessed
|
||||
|
||||
**Rule:** Gate on the MINIMUM confidence needed. If a monologue line works at `suspects`, don't gate it at `knows_details`. More gates = fewer fires = less content the player experiences.
|
||||
|
||||
---
|
||||
|
||||
## 7. Regional Culture: Krenn System / Sova Transit District (D-036)
|
||||
|
||||
All NPC dialogue and monologue must carry the Sova cultural substrate. This is not decoration — it's the baseline voice.
|
||||
|
||||
### Krenn Naming Conventions
|
||||
|
||||
- **First-name-primary.** Compact, consonant-heavy. First names in all social contexts.
|
||||
- **Surnames exist for records, not conversation.** Using a surname signals formality or institutional distance.
|
||||
- **Exception:** The detective uses surnames for targets and unknowns. The shift to first-name IS a relationship marker.
|
||||
|
||||
**Canonical Krenn names (v0.1):** Kael, Voss, Lera, Torek, Drin, Maret, Naia, Sera, Nils, Renn, Harek, Pell, Tav, Olin, Resha, Sess, Sabel, Devra
|
||||
|
||||
### Sova Atmosphere
|
||||
|
||||
The voice of Sova Transit District is **"quotidian-with-undertow"** — comfortable enough to be complacent, tight enough that extra income is tempting.
|
||||
|
||||
| Element | Application |
|
||||
|---------|------------|
|
||||
| **Sensory palette** | Span gate hum, industrial lubricant, recycled air, cargo machinery, metal grating underfoot |
|
||||
| **Economic tone** | Working-class pragmatic. Money is tight. Grey-market spending is a lifeline, not a crime spree. |
|
||||
| **Social fabric** | Regulars, shift crews, bar habits, "the usual." Community defined by routine co-presence. |
|
||||
| **Institutional relationship** | The Commission is distant, resented, tolerated. Station admin is bureaucracy. Nobody trusts institutions to help. |
|
||||
| **Trade jargon** | Containers, manifests, shifts, routes, transition windows, temp storage, freight bay. Native vocabulary for dock workers — never explain or annotate. |
|
||||
|
||||
### What Sova Voice Is NOT
|
||||
|
||||
- Not grimdark. People laugh, drink, complain about their shifts, look forward to the bar.
|
||||
- Not polished sci-fi. No one says "atmospheric recycling unit." They say "recycled air."
|
||||
- Not exposition. Characters know where they live. They don't describe it to themselves.
|
||||
- Not uniform. Lera's bartender warmth differs from Voss's terse authority. Culture is substrate, not script.
|
||||
|
||||
---
|
||||
|
||||
## 8. Dual-Lens Coordination
|
||||
|
||||
### The Core Test (Every Line, Every Time)
|
||||
|
||||
1. Does this line make sense if the **smuggler** experiences it?
|
||||
2. Does this line make sense if the **detective** experiences it?
|
||||
3. Does this line reveal **something different** to each character?
|
||||
4. Is the **access tier correct** for both characters?
|
||||
5. Does this line advance at least one character's **emotional arc**?
|
||||
|
||||
If 1 or 2 fails, the line is broken. If 3 fails, the line isn't dual-lens — it's generic.
|
||||
|
||||
### Three Types of Dual-Lens Difference
|
||||
|
||||
**Type 1: Access Difference.** The smuggler hears a line the detective doesn't (or vice versa). Enforced by `access` tag.
|
||||
|
||||
**Type 2: Interpretation Difference.** Both characters hear the same dialogue, but their monologue reactions interpret it differently. Enforced by separate monologue pools.
|
||||
|
||||
**Type 3: Emotional Weight Difference.** Relationship history creates different emotional stakes for the same observation.
|
||||
|
||||
### The `dual_lens` Field
|
||||
|
||||
On dialogue lines and NPC profiles, use the authoring-only `dual_lens` field to document the split:
|
||||
|
||||
```yaml
|
||||
dual_lens:
|
||||
smuggler: "Operational context -- part of ring pipeline. 'Backed up' is cover."
|
||||
detective: "Anomaly -- overnight exceeds procedure. Flag for investigation."
|
||||
```
|
||||
|
||||
This field is never consumed by the engine. It exists for reviewers and future authors.
|
||||
|
||||
---
|
||||
|
||||
## 9. Voice Register Quick Reference
|
||||
|
||||
Full voice specifications live in:
|
||||
- **Voice patterns (complete):** `docs/design/voice-patterns.md` (#310) — sentence-level execution rules, contraction patterns, punctuation, stress markers, verbal tics
|
||||
- **Smuggler voice card:** `docs/design/smuggler-voice-card.md` — full smuggler voice reference + moral arc
|
||||
|
||||
This section provides the quick-reference contrast. For authoring-level detail (contraction rules, sentence starters, stress markers), consult the voice patterns document directly.
|
||||
|
||||
### Smuggler Voice
|
||||
|
||||
| Parameter | Value |
|
||||
|-----------|-------|
|
||||
| **Sentence length** | Short. Fragments. Rarely more than 2 sentences. |
|
||||
| **Vocabulary** | Concrete, physical, sensory. Trade jargon without explaining. No institutional language. |
|
||||
| **Emotional register** | Feeling-first, analysis second. Gut before brain. |
|
||||
| **Relationship mode** | First-name basis. People by connection, not role. |
|
||||
| **Observation priority** | People > environment > objects |
|
||||
| **Self-reference** | Rare. Through physical sensation, not emotional labels. |
|
||||
|
||||
**Smuggler anchor lines:**
|
||||
1. *"Kael's already at the dock. Good. The day's better when he's on shift."* (warm)
|
||||
2. *"Shift transition in thirty minutes. If Voss kept the schedule thin, the route's clear."* (operational)
|
||||
3. *"Kael keeps checking his lattice. Waiting for a message? Not like him to be jumpy."* (concerned)
|
||||
4. *"He looked left. He always looks left when he's making something up. Two years I've known that tell."* (hurt)
|
||||
5. *"Morning shift. Recycled air and cargo lubricant. Home sweet home."* (atmospheric)
|
||||
|
||||
### Detective Voice
|
||||
|
||||
| Parameter | Value |
|
||||
|-----------|-------|
|
||||
| **Sentence length** | Complete sentences. Structured. Occasional fragments for emphasis. |
|
||||
| **Vocabulary** | Institutional layer over plain speech. "Noted," "flagged," "filing it." |
|
||||
| **Emotional register** | Analysis-first, personal second. When personal breaks through, it's notable. |
|
||||
| **Relationship mode** | Surname-first for targets. First-name for allies. The shift IS a marker. |
|
||||
| **Observation priority** | Patterns > people > environment |
|
||||
| **Self-reference** | More common than smuggler. Through professional lens. |
|
||||
|
||||
**Detective anchor lines:**
|
||||
1. *"Logistics hub. Standard prefab, heavy foot traffic. Let's see what the shift change tells me."* (clinical)
|
||||
2. *"That's the third time. Sera leaves when Torek arrives. Three different excuses, same result."* (pattern)
|
||||
3. *"Good to see Sera. She always was the reliable one. At least someone speaks my language."* (personal leak)
|
||||
4. *"Same booth. Same warm smile. Same offer to buy me a drink. ...Everything except whatever she's not saying."* (conflicted)
|
||||
5. *"Grain spirit and low conversation. Only place that doesn't smell like freight lubricant."* (atmospheric)
|
||||
|
||||
---
|
||||
|
||||
## 10. FRIEND Relationship Phase Mapping
|
||||
|
||||
THE FRIEND arc is the emotional centerpiece of v0.1. Both FRIEND NPCs follow a multi-phase relationship progression with distinct mechanical expressions at each phase.
|
||||
|
||||
### Kael Davan (Smuggler's FRIEND)
|
||||
|
||||
**Arc:** comfort -> crack -> observation -> confrontation -> contaminated trust
|
||||
|
||||
| Phase | Timing | RelationshipState | Access Available | Monologue Register | Tell State | Content Types |
|
||||
|-------|--------|------------------|-----------------|-------------------|------------|---------------|
|
||||
| **1: Comfort** | 0-10 min | Friendly (green) | insider, peer | Fond, casual | None (baseline) | Greeting, shift talk, bar casual, ring coordination |
|
||||
| **2: First Crack** | 10-15 min | Friendly (green) | insider, peer | Mild concern | Lattice checking, shortened interactions | Distracted dialogue, early worry monologue |
|
||||
| **3: The Observation** | 15-20 min | PersonOfInterest (amber) | **insider/peer lock out** | Alarm + confusion | Spatial: wrong place, wrong time | Contradiction discovery monologue (3-5 lines) |
|
||||
| **4: Confrontation** | 20-25 min | PersonOfInterest (amber) | public, hostile | Betrayal crystallizing | Looks-left tell confirmed | Deflection dialogue, evasion, the tell |
|
||||
| **5: Contaminated Trust** | 25-30 min | PersonOfInterest (amber) | public | Conflicted | Every warm interaction suspicious | Surface-normal dialogue, doubt monologue |
|
||||
|
||||
**Mechanical triggers for phase transitions:**
|
||||
- Phase 1->2: Time-based. Behavioral flags begin accumulating after ~10 minutes.
|
||||
- Phase 2->3: Spatial trigger. Smuggler enters Corridor B-7, directly observes unauthorized meeting.
|
||||
- Phase 3->4: Player-initiated. Smuggler chooses to ask Kael about the observation.
|
||||
- Phase 4->5: Automatic. Post-confrontation, trust is structurally damaged regardless of dialogue choice.
|
||||
|
||||
**Key authoring constraint:** At Phase 3, `insider` and `peer` dialogue **locks out**. Kael still talks to the smuggler, but only `public` + `surface` lines remain. That absence IS the emotional payload. Authors must provide enough `public/surface` lines for Phases 3-5 to feel populated but noticeably colder than Phases 1-2.
|
||||
|
||||
### Sera Venn (Detective's FRIEND)
|
||||
|
||||
**Arc:** trust -> background data -> pattern recognition -> the question -> contaminated trust
|
||||
|
||||
| Phase | Timing | RelationshipState | Access Available | Monologue Register | Tell State | Content Types |
|
||||
|-------|--------|------------------|-----------------|-------------------|------------|---------------|
|
||||
| **1: Trust** | 0-10 min | Friendly (green) | peer | Professional + warmth | None (baseline) | Bar greeting, district orientation, institutional background |
|
||||
| **2: Background Data** | 10-15 min | Friendly (green) | peer | Noting connections | Social: relationships outside institutional channels | Naia introduction, community context |
|
||||
| **3: The Pattern** | 15-20 min | PersonOfInterest (amber) | peer, **authority unlocks** | Suspicion activating | Avoidance: leaves when Torek arrives (3x) | Pattern recognition monologue, avoidance observation |
|
||||
| **4: The Question** | 20-25 min | PersonOfInterest (amber) | peer, authority | Professional + personal conflict | Controlled deflection, quick warmth recovery | Confrontation dialogue, evasion |
|
||||
| **5: Contaminated Trust** | 25-30 min | PersonOfInterest (amber) | peer, authority | Analytical doubt | Overcompensation helpfulness | Surface-helpful dialogue, evaluating monologue |
|
||||
|
||||
**Mechanical triggers for phase transitions:**
|
||||
- Phase 1->2: Time-based + social triggers. Sera introduces detective to bar regulars.
|
||||
- Phase 2->3: Observation accumulation. Third departure when Torek arrives triggers pattern recognition.
|
||||
- Phase 3->4: Player-initiated. Detective chooses to ask about Torek.
|
||||
- Phase 4->5: Automatic. Post-question, trust is contaminated regardless of Sera's response.
|
||||
|
||||
**Key authoring contrast with Kael:** Sera's `peer` access does NOT lock out at Phase 3. Instead, `authority` access **opens**. The detective gains institutional leverage while personal warmth remains but is contaminated. The content shift is additive (more dialogue available) rather than subtractive (Kael's loss of insider content).
|
||||
|
||||
---
|
||||
|
||||
## 11. Tag Taxonomy Complete Reference
|
||||
|
||||
### Access Tiers (5 values)
|
||||
|
||||
`public`, `insider`, `authority`, `peer`, `hostile`
|
||||
|
||||
See `content/global/enums/access-tiers.yaml` for full descriptions.
|
||||
|
||||
### Trust Tiers (3 values)
|
||||
|
||||
`surface`, `real`, `secret`
|
||||
|
||||
See `content/global/enums/trust-tiers.yaml`.
|
||||
|
||||
### Situations (13 values)
|
||||
|
||||
`arrival`, `shift_start`, `shift_end`, `shift_transition`, `bar_evening`, `night_shift`, `investigation`, `confrontation`, `social`, `alone`, `emergency`, `routine`, `observation`
|
||||
|
||||
See `content/global/enums/situations.yaml`.
|
||||
|
||||
### Topics (9 values)
|
||||
|
||||
`colleague`, `routine`, `cargo`, `money`, `trust`, `danger`, `institution`, `personal`, `investigation`
|
||||
|
||||
See `content/global/enums/topics.yaml`. Note: `crime` is deliberately excluded. NPCs think of smuggling as `cargo` or `money`, not crime.
|
||||
|
||||
### Moods (8 values)
|
||||
|
||||
`anxious`, `frustrated`, `content`, `suspicious`, `warm`, `hostile`, `relieved`, `focused`
|
||||
|
||||
See `content/global/enums/moods.yaml`. (Updated Sprint 14 amendment to D-035.)
|
||||
|
||||
### Monologue Triggers (9 values)
|
||||
|
||||
`enter_location`, `observe_npc`, `hear_sound`, `observe_anomaly`, `post_conversation`, `discover_evidence`, `witness_interaction`, `time_idle`, `return_visit`
|
||||
|
||||
See `content/global/enums/triggers.yaml`.
|
||||
|
||||
### NPC Patterns (9 values)
|
||||
|
||||
`FRIEND`, `MIRROR`, `ANCHOR`, `GHOST`, `CATALYST`, `THRESHOLD`, `REMNANT`, `SYSTEM`, `NOBODY`
|
||||
|
||||
See `content/global/enums/patterns.yaml`.
|
||||
|
||||
### Functional Motivations (6 values)
|
||||
|
||||
`HANDLER`, `WITNESS`, `TURNCOAT`, `CIVILIAN`, `OPERATOR`, `SKEPTIC`
|
||||
|
||||
See `content/global/enums/motivations.yaml`.
|
||||
|
||||
---
|
||||
|
||||
## 12. Mechanical Validation Checklist
|
||||
|
||||
Before submitting any content, run through these checks. Items marked **HARD** will be enforced by schema validation. Items marked **SOFT** require reviewer judgment.
|
||||
|
||||
### Dialogue Lines
|
||||
|
||||
- [ ] **HARD:** `id` matches pattern `{npc-slug}_d_{###}` (e.g. `kael-davan_d_001`) — NPC-scoped per D-035 Sprint 15 amendment
|
||||
- [ ] **HARD:** `role` is a valid lowercase slug matching a template role
|
||||
- [ ] **HARD:** `access` is a non-empty list of valid access tier enums
|
||||
- [ ] **HARD:** `trust` is one of `surface`, `real`, `secret`
|
||||
- [ ] **HARD:** `situation` is a non-empty list of valid situation enums
|
||||
- [ ] **SOFT:** `topic` and `mood` are populated (defaults apply if empty, but explicit is better)
|
||||
- [ ] **SOFT:** Line passes dual-lens test (both characters, or correctly tier-gated)
|
||||
- [ ] **SOFT:** `access` list makes sense (no `[insider, authority]` unless intentional)
|
||||
- [ ] **SOFT:** `trust` tier matches content sensitivity (don't put ring talk at `surface`)
|
||||
- [ ] **SOFT:** Line advances character, relationship, or narrative (no filler)
|
||||
|
||||
### Monologue Lines
|
||||
|
||||
- [ ] **HARD:** `id` matches pattern `{npc-slug}_m_{s|d}_{###}` (e.g. `pc-smuggler_m_s_001`) — NPC-scoped per D-035 Sprint 15 amendment
|
||||
- [ ] **HARD:** `text` is 160 characters or fewer
|
||||
- [ ] **HARD:** `trigger` is a valid trigger enum
|
||||
- [ ] **HARD:** Character partition: smuggler lines in smuggler files, detective in detective files
|
||||
- [ ] **SOFT:** Under 25 words (or the most important line in the pool if over)
|
||||
- [ ] **SOFT:** Self-contained (makes sense without context from previous line)
|
||||
- [ ] **SOFT:** Voice register matches character (smuggler fragments, detective sentences)
|
||||
- [ ] **SOFT:** Prerequisites gate on MINIMUM confidence needed (don't over-gate)
|
||||
- [ ] **SOFT:** Trigger matches content (don't use `enter_location` for NPC observations)
|
||||
|
||||
### NPC Profiles
|
||||
|
||||
- [ ] **HARD:** `canonical_id` matches `npc:{slug}` pattern
|
||||
- [ ] **HARD:** `tier` is 1, 2, or 3
|
||||
- [ ] **HARD:** `pattern` is a valid pattern enum
|
||||
- [ ] **HARD:** `motivation` is a valid motivation enum
|
||||
- [ ] **HARD:** FRIEND pattern requires `friend_arc` field
|
||||
- [ ] **SOFT:** All 10 axes populated for Tier 1 and 2 (optional fields for Tier 3)
|
||||
- [ ] **SOFT:** `tells` array empty for MIRROR pattern
|
||||
- [ ] **SOFT:** `dual_lens` notes present for Tier 1 and 2
|
||||
- [ ] **SOFT:** `trust_levels` descriptions provided for all populated tiers
|
||||
- [ ] **SOFT:** `information.knows` uses valid `category.topic` fact IDs
|
||||
|
||||
### Content Packs (Per NPC)
|
||||
|
||||
- [ ] **SOFT:** Line count within tier budget
|
||||
- [ ] **SOFT:** Access tier distribution covers the NPC's expected encounters
|
||||
- [ ] **SOFT:** Trust progression has content at each populated tier
|
||||
- [ ] **SOFT:** Situation coverage: not everything tagged `routine`
|
||||
- [ ] **SOFT:** Dual-lens notes on profile and every 5th line minimum (Tier 1)
|
||||
- [ ] **SOFT:** FRIEND content covers all phases with distinct voice/mood shifts
|
||||
- [ ] **SOFT:** Monologue for BOTH characters exists (Tier 1 minimum)
|
||||
|
||||
---
|
||||
|
||||
## 13. File Structure and Schema Reference
|
||||
|
||||
### Directory Hierarchy
|
||||
|
||||
Dialogue is organized by **location + role**, not by NPC. This is deliberate — roles belong to templates, NPCs fill roles at runtime (D-025, D-028). Monologue is organized by **character + location** per the hard partition rule (D-032).
|
||||
|
||||
```
|
||||
content/campaigns/main/systems/krenn/stations/sova/districts/transit/
|
||||
district.yaml # District metadata
|
||||
pools.yaml # Seed-time pool definitions
|
||||
npcs/
|
||||
kael-davan.yaml # NPC profile (npc-profile.schema.json)
|
||||
sera-venn.yaml
|
||||
voss.yaml
|
||||
...
|
||||
locations/
|
||||
the-terminal.yaml # Location definition (location.schema.json)
|
||||
the-last-shift.yaml
|
||||
maintenance-corridors.yaml
|
||||
dialogue/
|
||||
the-terminal/ # Dialogue pools by location + role
|
||||
dock-worker.yaml # (dialogue-pool.schema.json)
|
||||
shift-supervisor.yaml
|
||||
scheduler.yaml
|
||||
new-hire.yaml
|
||||
courier.yaml
|
||||
the-last-shift/
|
||||
bar-owner.yaml
|
||||
bar-regular.yaml
|
||||
bartender.yaml
|
||||
maintenance-corridors/
|
||||
ring-operative.yaml
|
||||
monologue/
|
||||
smuggler/ # Hard character partition (D-032)
|
||||
general.yaml # Location-independent lines
|
||||
the-terminal.yaml # Location-specific lines
|
||||
the-last-shift.yaml
|
||||
maintenance-corridors.yaml
|
||||
detective/
|
||||
general.yaml
|
||||
the-terminal.yaml
|
||||
the-last-shift.yaml
|
||||
maintenance-corridors.yaml
|
||||
triangles/
|
||||
hub-power.yaml # Triangle definition (triangle.schema.json)
|
||||
worried-knowledge.yaml
|
||||
bar-tensions.yaml
|
||||
worried-partner.yaml
|
||||
informant-question.yaml
|
||||
routines/
|
||||
schedules.yaml # NPC daily schedules (routine.schema.json)
|
||||
templates/
|
||||
logistics-hub.yaml # Social site template (D-025)
|
||||
bar.yaml
|
||||
smuggling-ring.yaml
|
||||
ticker/
|
||||
the-last-shift.yaml # News ticker content
|
||||
```
|
||||
|
||||
**Key convention:** Dialogue pools belong to `dialogue/{location}/{role}.yaml`, never `dialogue/{npc-name}.yaml`. The NPC assigned to a role is determined at runtime. FRIEND NPCs (Kael, Sera) are the exception — their content is NPC-specific because the FRIEND pattern is inherently character-bound, but the files still follow the location+role structure to maintain consistency.
|
||||
|
||||
### Schema Validation
|
||||
|
||||
All YAML content files must validate against their JSON Schema:
|
||||
|
||||
| Content Type | Schema File |
|
||||
|-------------|-------------|
|
||||
| NPC profiles | `content/_schema/npc-profile.schema.json` |
|
||||
| Dialogue pools | `content/_schema/dialogue-pool.schema.json` |
|
||||
| Monologue pools | `content/_schema/monologue-pool.schema.json` |
|
||||
| Triangles | `content/_schema/triangle.schema.json` |
|
||||
| Routines | `content/_schema/routine.schema.json` |
|
||||
|
||||
### Line ID Convention
|
||||
|
||||
| Content Type | Pattern | Example |
|
||||
|-------------|---------|---------|
|
||||
| Dialogue | `{npc-slug}_d_{###}` | `kael-davan_d_001` |
|
||||
| Monologue (smuggler) | `{npc-slug}_m_s_{###}` | `pc-smuggler_m_s_001` |
|
||||
| Monologue (detective) | `{npc-slug}_m_d_{###}` | `pc-detective_m_d_001` |
|
||||
|
||||
IDs are stable identifiers. Once assigned, never reused or reassigned. Number gaps are acceptable.
|
||||
|
||||
### Naming Conventions
|
||||
|
||||
- File names: `lowercase-hyphenated.yaml`
|
||||
- Role slugs: `lowercase-hyphenated` (e.g., `dock-worker`, `bar-owner`)
|
||||
- NPC slugs: `lowercase-hyphenated` (e.g., `kael-davan`, `sera-venn`)
|
||||
- Location slugs: `lowercase-hyphenated` (e.g., `sova-transit`)
|
||||
- Fact IDs: `category.topic` (e.g., `contraband.ring_exists`, `relationship.kael_naia_connection`)
|
||||
|
||||
---
|
||||
|
||||
## 14. Anti-Patterns
|
||||
|
||||
### Dialogue Anti-Patterns
|
||||
|
||||
**Expository NPC.** The NPC explains the world to the player.
|
||||
- Bad: *"The Commission regulates all trade through Sova Transit. Manifests must be filed within 8 hours."*
|
||||
- Fix: *"Manifests are late again. Maret's going to catch heat."* (Character knows the rules. Show the consequence, not the rule.)
|
||||
|
||||
**Universal access.** A line tagged `[public]` contains insider information.
|
||||
- Bad: `access: [public]`, text: *"Container 4471 is flagged for rerouting during transition."*
|
||||
- Fix: Tag `access: [insider]` or rewrite for public consumption.
|
||||
|
||||
**Trust mismatch.** A `surface`-trust line reveals deep personal information.
|
||||
- Bad: `trust: surface`, text: *"I'm trying to get out of the ring. Don't tell Nils."*
|
||||
- Fix: That's `trust: secret` content. Gate it correctly.
|
||||
|
||||
**Crime vocabulary.** NPCs use the word "crime" or "smuggling" in casual conversation.
|
||||
- Bad: *"The smuggling operation runs during shift transitions."*
|
||||
- Fix: *"The cargo moves during transitions. When oversight's thin."* NPCs think in their own terms.
|
||||
|
||||
### Monologue Anti-Patterns
|
||||
|
||||
**Wrong voice register.** Smuggler uses detective vocabulary or vice versa.
|
||||
- Bad (smuggler): *"I should investigate this anomaly further."*
|
||||
- Fix: *"That's not right. I need to see what's going on."*
|
||||
- Bad (detective): *"Kael's here. Good."*
|
||||
- Fix: *"Davan's on shift. Standard."*
|
||||
|
||||
**Explaining the already-known.** Character tells themselves something they already know.
|
||||
- Bad (smuggler): *"According to the manifest, container 4471 should weigh 240 kilograms."*
|
||||
- Fix: *"4471's heavy. Too heavy."*
|
||||
|
||||
**Over-gating.** Prerequisite blocks a line that would work without the gate.
|
||||
- Bad: prerequisite requires `knows_details` when the line only needs `suspects`
|
||||
- Fix: Gate on minimum confidence. More fires = more content = better experience.
|
||||
|
||||
**Breaking the partition.** A smuggler monologue line that sounds like the detective, or shared content between pools.
|
||||
- Rule: If you can swap `character: smuggler` to `character: detective` and the line still works, it's not character-specific enough. Rewrite.
|
||||
|
||||
### Profile Anti-Patterns
|
||||
|
||||
**MIRROR with tells.** A MIRROR NPC profile lists deception tells.
|
||||
- Rule: MIRROR tells array must be empty. Behavioral markers (visible stress, coping mechanisms) are NOT tells.
|
||||
|
||||
**FRIEND without phases.** A FRIEND NPC profile omits the `friend_arc.phases` field.
|
||||
- Rule: FRIEND pattern requires 3-5 phases with distinct triggers and routine deviations.
|
||||
|
||||
**Tier 3 overwriting.** A Tier 3 filler NPC with 40 dialogue lines.
|
||||
- Rule: Tier 3 budget is 5-10 lines. One memorable trait. Write it, stop. Content budget is finite.
|
||||
|
||||
---
|
||||
|
||||
## 15. Generation Expansion Rules
|
||||
|
||||
Tier 2 and Tier 3 dialogue is expanded 4x from authored base lines (D-028: "write 10, generate 40"). The authored lines are the style anchors — generation must reproduce, not reinvent.
|
||||
|
||||
### What Generation Can Do
|
||||
|
||||
- **Vary phrasing** of the same semantic content ("Shift's running smooth" -> "Smooth shift so far" -> "Nothing out of the ordinary today")
|
||||
- **Vary topic/mood tags** within the same access and trust tier
|
||||
- **Combine** elements from two base lines into a single generated line
|
||||
- **Add** environmental color within the Sova sensory palette (span gate hum, recycled air, cargo sounds)
|
||||
|
||||
### What Generation Cannot Do
|
||||
|
||||
- **Introduce new information.** Generated lines never reveal facts, names, or relationships not present in the base lines.
|
||||
- **Change access or trust tier.** A generated line inherits the access and trust constraints of its base line(s).
|
||||
- **Break voice register.** Generated lines must match the NPC's personality voice exactly — sentence length, contraction patterns, vocabulary level.
|
||||
- **Cross the character partition.** Generated monologue lines stay in the correct character pool.
|
||||
- **Add knowledge grants.** Only hand-authored lines can grant knowledge to the player.
|
||||
- **Create FRIEND content.** All FRIEND NPC content is hand-authored. No generation expansion.
|
||||
|
||||
### Generation Validation
|
||||
|
||||
Every generated line must pass:
|
||||
1. **Voice test:** Read aloud. Does it sound like the same NPC who said the base lines?
|
||||
2. **Dual-lens test:** Does it read differently through each character's perspective? (If the base line passes this test, the generated line must also.)
|
||||
3. **Tag inheritance:** Are access, trust, situation, topic, and mood tags consistent with the base line?
|
||||
4. **No new information:** Does the line reveal anything the base lines don't already establish?
|
||||
5. **Display constraint:** Under 160 characters for monologue. Self-contained.
|
||||
|
||||
---
|
||||
|
||||
## 16. Worked Example: Writing a Dialogue Line
|
||||
|
||||
**Context:** Writing a line for Kael Davan at the Logistics Hub during a routine morning shift.
|
||||
|
||||
### Step 1: Write the Line
|
||||
|
||||
*"Morning. Voss kept the rotation thin -- we've got a clear window after 14:00."*
|
||||
|
||||
### Step 2: Assign Tags
|
||||
|
||||
```yaml
|
||||
- id: kael-davan_d_076
|
||||
text: "Morning. Voss kept the rotation thin -- we've got a clear window after 14:00."
|
||||
role: dock-worker
|
||||
access: [insider]
|
||||
trust: real
|
||||
situation: [shift_start]
|
||||
topic: [cargo, routine]
|
||||
mood: [content]
|
||||
tags: [ring-operational]
|
||||
```
|
||||
|
||||
### Step 3: Validate
|
||||
|
||||
- `id`: `kael-davan_d_076` -- valid pattern (NPC-scoped per D-035 Sprint 15 amendment). Continues from kael-davan's terminal sequence (_034-_075).
|
||||
- `role`: `dock-worker` -- valid slug.
|
||||
- `access: [insider]` -- only ring members hear this. Detective never sees it. Correct.
|
||||
- `trust: real` -- requires earned trust. Not surface-level small talk. Correct for operational ring dialogue.
|
||||
- `situation: [shift_start]` -- morning shift context. Correct.
|
||||
- `topic: [cargo, routine]` -- covers both operational and schedule content. Correct.
|
||||
- `mood: [content]` -- Phase 1, baseline warm. Correct.
|
||||
|
||||
### Step 4: Dual-Lens Check
|
||||
|
||||
```yaml
|
||||
dual_lens:
|
||||
smuggler: "Operational confirmation. The window is clear. Routine ring coordination."
|
||||
detective: "Never hears this line. Insider access only."
|
||||
```
|
||||
|
||||
### Step 5: Voice Check
|
||||
|
||||
- Uses first name (Voss). Correct for smuggler context.
|
||||
- Short, operational. Fragment + sentence. Matches smuggler's colleague register.
|
||||
- Trade jargon without explanation ("rotation thin," "clear window"). Correct for Krenn substrate.
|
||||
- No institutional vocabulary. No analysis. Correct.
|
||||
|
||||
Line passes all checks.
|
||||
|
||||
---
|
||||
|
||||
## Appendix A: Decision Cross-Reference
|
||||
|
||||
| Decision | Title | Relevance to This Guide |
|
||||
|----------|-------|------------------------|
|
||||
| D-023 | Three-tier content model | Tier structure, content budgets |
|
||||
| D-024 | 10-axis NPC model | Profile structure, tell system, triangle model |
|
||||
| D-025 | Social site as template unit | NPC-to-location relationship, functional clusters |
|
||||
| D-027 | Vertical slice criteria | Success criteria that FRIEND content must satisfy |
|
||||
| D-028 | Dialogue architecture | Four-layer pipeline, tagged line pools, generation expansion |
|
||||
| D-029 | Population entanglement 30/50/20 | Tier distribution, noise floor |
|
||||
| D-032 | Separate monologue pools | Hard character partition |
|
||||
| D-034 | THE FRIEND pattern | Production-level NPC specification |
|
||||
| D-035 | Converged tag taxonomy | All tag definitions, pipeline layers |
|
||||
| D-036 | Sova Transit District setting | Regional culture, naming, atmosphere |
|
||||
| D-037 | Contraband specification | What NPCs are smuggling and why |
|
||||
| D-039 | v0.1 wow moments | Content that must exist for wow moments to fire |
|
||||
| D-041 | Knowledge graph data model | Prerequisite confidence hierarchy |
|
||||
| D-047 | v0.1 triangles | 3 active forks, 2 passive tensions |
|
||||
| D-050 | NPC pattern/motivation mapping | Canonical v0.1 NPC assignments (System A + B) |
|
||||
| D-053 | Self-contained triangle forks | No cross-triangle cascade in v0.1 |
|
||||
| D-056 | PC voice registers | Smuggler feeling-first, detective analysis-first |
|
||||
| D-059 | Monologue display constraints | 160 char max, 2-line max, priority ordering |
|
||||
|
||||
## Appendix B: Content Budget Summary (v0.1)
|
||||
|
||||
**Validated scope (v0.1 Content Scoping Workshop):** ~695 authored content items.
|
||||
|
||||
| Content Type | Authored | Generation-Expanded | Total |
|
||||
|-------------|---------|-------------------|-------|
|
||||
| Tier 1 FRIEND dialogue (x2) | 150-200 | 0 | 150-200 |
|
||||
| Tier 1 MIRROR dialogue (x1) | 50-70 | 0 | 50-70 |
|
||||
| Tier 2 NPC dialogue (x10) | 200-350 | 800-1400 | 1000-1750 |
|
||||
| Tier 3 NPC dialogue (x4) | 20-40 | 80-160 | 100-200 |
|
||||
| Monologue (smuggler pool) | ~100 | 0 | ~100 |
|
||||
| Monologue (detective pool) | ~100 | 0 | ~100 |
|
||||
| Environmental text | ~50 | 0 | ~50 |
|
||||
| News ticker | ~20 | 0 | ~20 |
|
||||
| UI microcopy | ~50 | 0 | ~50 |
|
||||
| PC-as-NPC content (x2) | ~25 | 0 | ~25 |
|
||||
| **Total authored** | **~695-1005** | | |
|
||||
| **Total with generation** | | | **~1545-2565** |
|
||||
|
||||
FRIEND content (hand-authored, no expansion) represents ~20-30% of all authored lines. This is where voice consistency matters most. Monologue is hand-authored only — the character voice is too precise for generation expansion in v0.1.
|
||||
|
||||
---
|
||||
|
||||
**End NPC Authoring Style Guide v0.1**
|
||||
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "campaign.schema.json",
|
||||
"title": "Campaign Metadata",
|
||||
"description": "Campaign definition file — one per campaign directory (D-003).",
|
||||
"type": "object",
|
||||
"required": ["display_name", "description"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"display_name": {
|
||||
"type": "string",
|
||||
"minLength": 1
|
||||
},
|
||||
"description": {
|
||||
"type": "string"
|
||||
},
|
||||
"version": {
|
||||
"type": "string",
|
||||
"pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,135 +0,0 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "checklist.schema.json",
|
||||
"title": "Gauntlet QA Checklist",
|
||||
"description": "Per-room QA checklist with conditions evaluable from ObserverSnapshot (D-030). Feeds into #503 auto-checklist progress tracking.",
|
||||
"type": "object",
|
||||
"required": ["conditions"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"room_id": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z][a-z0-9_]*$",
|
||||
"description": "Room identifier matching constants.rs room name"
|
||||
},
|
||||
"room_name": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"description": "Human-readable room name"
|
||||
},
|
||||
"scope": {
|
||||
"type": "string",
|
||||
"enum": ["per_room", "cross_room"],
|
||||
"description": "Checklist scope: per_room (default) or cross_room"
|
||||
},
|
||||
"description": {
|
||||
"type": "string"
|
||||
},
|
||||
"conditions": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"oneOf": [
|
||||
{ "$ref": "#/$defs/player_near" },
|
||||
{ "$ref": "#/$defs/player_facing" },
|
||||
{ "$ref": "#/$defs/entity_present" },
|
||||
{ "$ref": "#/$defs/entity_absent" },
|
||||
{ "$ref": "#/$defs/expected_monologue" },
|
||||
{ "$ref": "#/$defs/expected_dialogue" },
|
||||
{ "$ref": "#/$defs/expected_interaction_verb" }
|
||||
]
|
||||
},
|
||||
"minItems": 1
|
||||
}
|
||||
},
|
||||
"$defs": {
|
||||
"condition_id": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z][a-z0-9_-]*$",
|
||||
"description": "Globally unique condition identifier across all checklists. Use room_id prefix (e.g., inv-item-present, occ-wall-visible)."
|
||||
},
|
||||
"player_near": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["id", "description", "condition_type", "x", "y", "radius"],
|
||||
"properties": {
|
||||
"id": { "$ref": "#/$defs/condition_id" },
|
||||
"description": { "type": "string" },
|
||||
"condition_type": { "const": "player_near" },
|
||||
"x": { "type": "integer", "description": "Target X coordinate (absolute sim tiles)" },
|
||||
"y": { "type": "integer", "description": "Target Y coordinate (absolute sim tiles)" },
|
||||
"radius": { "type": "number", "minimum": 0, "description": "Proximity radius in tiles" }
|
||||
}
|
||||
},
|
||||
"player_facing": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["id", "description", "condition_type", "direction"],
|
||||
"properties": {
|
||||
"id": { "$ref": "#/$defs/condition_id" },
|
||||
"description": { "type": "string" },
|
||||
"condition_type": { "const": "player_facing" },
|
||||
"direction": {
|
||||
"type": "string",
|
||||
"enum": ["North", "South", "East", "West"],
|
||||
"description": "Expected player facing direction"
|
||||
}
|
||||
}
|
||||
},
|
||||
"entity_present": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["id", "description", "condition_type", "entity_id"],
|
||||
"properties": {
|
||||
"id": { "$ref": "#/$defs/condition_id" },
|
||||
"description": { "type": "string" },
|
||||
"condition_type": { "const": "entity_present" },
|
||||
"entity_id": { "type": "integer", "minimum": 0, "description": "StableId of expected entity" }
|
||||
}
|
||||
},
|
||||
"entity_absent": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["id", "description", "condition_type", "entity_id"],
|
||||
"properties": {
|
||||
"id": { "$ref": "#/$defs/condition_id" },
|
||||
"description": { "type": "string" },
|
||||
"condition_type": { "const": "entity_absent" },
|
||||
"entity_id": { "type": "integer", "minimum": 0, "description": "StableId of entity that should NOT be visible" }
|
||||
}
|
||||
},
|
||||
"expected_monologue": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["id", "description", "condition_type", "contains"],
|
||||
"properties": {
|
||||
"id": { "$ref": "#/$defs/condition_id" },
|
||||
"description": { "type": "string" },
|
||||
"condition_type": { "const": "expected_monologue" },
|
||||
"contains": { "type": "string", "minLength": 1, "description": "Substring expected in current_monologue text" }
|
||||
}
|
||||
},
|
||||
"expected_dialogue": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["id", "description", "condition_type", "contains"],
|
||||
"properties": {
|
||||
"id": { "$ref": "#/$defs/condition_id" },
|
||||
"description": { "type": "string" },
|
||||
"condition_type": { "const": "expected_dialogue" },
|
||||
"contains": { "type": "string", "minLength": 1, "description": "Substring expected in dialogue_response text" }
|
||||
}
|
||||
},
|
||||
"expected_interaction_verb": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["id", "description", "condition_type", "entity_id", "verb"],
|
||||
"properties": {
|
||||
"id": { "$ref": "#/$defs/condition_id" },
|
||||
"description": { "type": "string" },
|
||||
"condition_type": { "const": "expected_interaction_verb" },
|
||||
"entity_id": { "type": "integer", "minimum": 0, "description": "StableId of target entity" },
|
||||
"verb": { "type": "string", "minLength": 1, "description": "Expected interaction verb (e.g., Talk, Pickup, Examine)" }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,288 +0,0 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "dialogue-line.schema.json",
|
||||
"title": "Dialogue Line — canonical D-035 tag taxonomy",
|
||||
"description": "Canonical single-line schema for dialogue and monologue pools. Implements the converged tag taxonomy from D-035 (6 structural + 3 selection + 2 authoring-only tags). Monologue-specific additions (character, trigger, prerequisite) are defined in $defs/monologue_extension. Mood vocabulary renamed Sprint 14 to match voice guide (anxious/frustrated/content/suspicious/warm/hostile/relieved/focused).",
|
||||
"type": "object",
|
||||
"required": ["id", "text", "role", "access", "trust", "situation"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z][a-z0-9-]*_(d|m)_[0-9]{3}$",
|
||||
"description": "Stable machine-parseable line ID: {npc-slug}_{d|m}_{###} (e.g. kael-davan_d_001, pc-detective_m_d_001). d = dialogue, m = monologue. NPC-scoped per D-035 Sprint 15 amendment — each NPC has an independent sequence starting at _001."
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"description": "The authored line text."
|
||||
},
|
||||
"role": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z][a-z0-9-]*$",
|
||||
"description": "Template-defined role slug (e.g. dock-worker, bar-owner, player_character). Not NPC name — NPC assignment is runtime."
|
||||
},
|
||||
"access": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"enum": ["public", "insider", "authority", "peer", "hostile"]
|
||||
},
|
||||
"minItems": 1,
|
||||
"uniqueItems": true,
|
||||
"description": "D-028 Layer 1: access tiers this line is eligible for. List — a line can be eligible for multiple tiers. Hard filter."
|
||||
},
|
||||
"trust": {
|
||||
"type": "string",
|
||||
"enum": ["surface", "real", "secret"],
|
||||
"description": "D-028 Layer 3: minimum trust tier required. Hard filter. Ordering: surface < real < secret."
|
||||
},
|
||||
"situation": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"arrival",
|
||||
"shift_start",
|
||||
"shift_end",
|
||||
"shift_transition",
|
||||
"bar_evening",
|
||||
"night_shift",
|
||||
"investigation",
|
||||
"confrontation",
|
||||
"social",
|
||||
"alone",
|
||||
"emergency",
|
||||
"routine",
|
||||
"observation",
|
||||
"greeting"
|
||||
]
|
||||
},
|
||||
"minItems": 1,
|
||||
"uniqueItems": true,
|
||||
"description": "D-028 Layer 2: situations in which this line can fire. 14 v0.1 values (13 original + greeting added Sprint 8 for PC dialogue initial contact lines). NOTE: 'greeting' is not yet in server/src/content/line_pool.rs — lines using it will be skipped until Rust is updated."
|
||||
},
|
||||
"topic": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"colleague",
|
||||
"routine",
|
||||
"cargo",
|
||||
"money",
|
||||
"trust",
|
||||
"danger",
|
||||
"institution",
|
||||
"personal",
|
||||
"investigation"
|
||||
]
|
||||
},
|
||||
"uniqueItems": true,
|
||||
"description": "D-028 Layer 4: topic tags for weighted selection. 9 v0.1 values. Optional — defaults to empty if omitted. Note: 'crime' deliberately excluded; NPCs think of it as 'cargo' or 'money'."
|
||||
},
|
||||
"mood": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"anxious",
|
||||
"frustrated",
|
||||
"content",
|
||||
"suspicious",
|
||||
"warm",
|
||||
"hostile",
|
||||
"relieved",
|
||||
"focused"
|
||||
]
|
||||
},
|
||||
"uniqueItems": true,
|
||||
"description": "D-028 Layer 4: mood tags for weighted selection. 8 v0.1 values. Neutral mood = omit tag (untagged lines are always eligible). Renamed Sprint 14 to match voice guide vocabulary."
|
||||
},
|
||||
"tags": {
|
||||
"type": "array",
|
||||
"items": { "type": "string" },
|
||||
"description": "Freeform escape hatch for author intent not covered by the structured taxonomy. Not consumed by the engine selection pipeline."
|
||||
},
|
||||
"knowledge_grant": {
|
||||
"type": "object",
|
||||
"description": "Knowledge the player gains from hearing this line. Feeds into the knowledge graph (D-041).",
|
||||
"required": ["fact_id", "confidence"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"fact_id": {
|
||||
"type": "string",
|
||||
"description": "FactId from the knowledge vocabulary (#368)."
|
||||
},
|
||||
"confidence": {
|
||||
"type": "string",
|
||||
"enum": ["suspects", "knows_of", "knows_details", "direct"],
|
||||
"description": "D-041 confidence tier granted."
|
||||
}
|
||||
}
|
||||
},
|
||||
"dual_lens": {
|
||||
"type": "object",
|
||||
"description": "Authoring-only: per-character notes for content with different resonance for smuggler vs detective. NOT consumed by the engine.",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"smuggler": { "type": "string" },
|
||||
"detective": { "type": "string" }
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"type": "string",
|
||||
"description": "Authoring-only: freeform author notes, context, or intent documentation. NOT consumed by the engine."
|
||||
}
|
||||
},
|
||||
"$defs": {
|
||||
"monologue_extension": {
|
||||
"title": "Monologue-specific additions (D-035)",
|
||||
"description": "Additional required fields for monologue lines. Applied ON TOP OF the base dialogue line schema. Pool-level character partitioning (D-032) is enforced at the pool root, not per-line.",
|
||||
"type": "object",
|
||||
"required": ["trigger"],
|
||||
"properties": {
|
||||
"character": {
|
||||
"type": "string",
|
||||
"enum": ["smuggler", "detective"],
|
||||
"description": "D-032: hard partition tag. Which playable character this line belongs to. Must match the parent pool's character field."
|
||||
},
|
||||
"trigger": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"enter_location",
|
||||
"observe_npc",
|
||||
"hear_sound",
|
||||
"observe_anomaly",
|
||||
"post_conversation",
|
||||
"discover_evidence",
|
||||
"witness_interaction",
|
||||
"time_idle",
|
||||
"return_visit"
|
||||
],
|
||||
"description": "What causes this monologue line to fire. 9 v0.1 trigger types."
|
||||
},
|
||||
"prerequisite": {
|
||||
"description": "Knowledge state gate. null = unconditional (fires whenever triggered). Conditions are AND-evaluated. Uses FactIds from the knowledge vocabulary (#368, D-041).",
|
||||
"oneOf": [
|
||||
{ "type": "null" },
|
||||
{
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"facts": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/$defs/fact_prerequisite" }
|
||||
},
|
||||
"entity_attributes": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/$defs/attribute_prerequisite" }
|
||||
},
|
||||
"relationship": {
|
||||
"type": "object",
|
||||
"required": ["target", "state"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"target": { "type": "string" },
|
||||
"state": {
|
||||
"type": "string",
|
||||
"enum": ["unknown", "known", "friendly", "person_of_interest", "hostile"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"priority": {
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"maximum": 10,
|
||||
"default": 5,
|
||||
"description": "Selection priority. Higher = more likely to fire when multiple lines are eligible. Default: 5."
|
||||
},
|
||||
"cooldown": {
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"default": 0,
|
||||
"description": "Minimum simulation ticks before this line can fire again. Default: 0 (no cooldown)."
|
||||
}
|
||||
}
|
||||
},
|
||||
"fact_prerequisite": {
|
||||
"type": "object",
|
||||
"required": ["fact_id", "min_confidence"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"fact_id": {
|
||||
"type": "string",
|
||||
"description": "FactId from the knowledge vocabulary (#368, D-041)."
|
||||
},
|
||||
"min_confidence": {
|
||||
"type": "string",
|
||||
"enum": ["suspects", "knows_of", "knows_details", "direct"],
|
||||
"description": "Minimum D-041 confidence level required for this fact."
|
||||
}
|
||||
}
|
||||
},
|
||||
"attribute_prerequisite": {
|
||||
"type": "object",
|
||||
"required": ["entity", "key", "value"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"entity": { "type": "string" },
|
||||
"key": { "type": "string" },
|
||||
"value": { "type": "string" }
|
||||
}
|
||||
},
|
||||
"situation_enum": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"arrival",
|
||||
"shift_start",
|
||||
"shift_end",
|
||||
"shift_transition",
|
||||
"bar_evening",
|
||||
"night_shift",
|
||||
"investigation",
|
||||
"confrontation",
|
||||
"social",
|
||||
"alone",
|
||||
"emergency",
|
||||
"routine",
|
||||
"observation",
|
||||
"greeting"
|
||||
],
|
||||
"description": "14 v0.1 situation values (D-035 + Sprint 8 amendment)."
|
||||
},
|
||||
"topic_enum": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"colleague",
|
||||
"routine",
|
||||
"cargo",
|
||||
"money",
|
||||
"trust",
|
||||
"danger",
|
||||
"institution",
|
||||
"personal",
|
||||
"investigation"
|
||||
],
|
||||
"description": "9 v0.1 topic values (D-035)."
|
||||
},
|
||||
"mood_enum": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"anxious",
|
||||
"frustrated",
|
||||
"content",
|
||||
"suspicious",
|
||||
"warm",
|
||||
"hostile",
|
||||
"relieved",
|
||||
"focused"
|
||||
],
|
||||
"description": "8 v0.1 mood values. Renamed Sprint 14 to match voice guide vocabulary. Neutral = untagged."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,134 +0,0 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "dialogue-pool.schema.json",
|
||||
"title": "Dialogue Line Pool",
|
||||
"description": "Tagged dialogue lines scoped by location + role (D-028, D-035).",
|
||||
"type": "object",
|
||||
"required": ["location", "role", "lines"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"location": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z][a-z0-9-]*$",
|
||||
"description": "Location slug this dialogue pool belongs to"
|
||||
},
|
||||
"role": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z][a-z0-9-]*$",
|
||||
"description": "Template role slug (e.g. dock-worker, bar-owner)"
|
||||
},
|
||||
"lines": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/$defs/dialogue_line" },
|
||||
"minItems": 1
|
||||
}
|
||||
},
|
||||
"$defs": {
|
||||
"dialogue_line": {
|
||||
"type": "object",
|
||||
"required": ["id", "text", "role", "access", "trust", "situation"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z][a-z0-9-]*_d_[0-9]{3}$",
|
||||
"description": "Stable line ID: {npc-slug}_d_{###} (e.g. kael-davan_d_001). NPC-scoped per D-035 Sprint 15 amendment — each NPC has an independent sequence starting at _001."
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"minLength": 1
|
||||
},
|
||||
"role": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z][a-z0-9-]*$",
|
||||
"description": "Template role this line belongs to"
|
||||
},
|
||||
"access": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"enum": ["public", "insider", "authority", "peer", "hostile"]
|
||||
},
|
||||
"minItems": 1,
|
||||
"uniqueItems": true,
|
||||
"description": "Access tiers this line is available at (multi-tier eligibility)"
|
||||
},
|
||||
"trust": {
|
||||
"type": "string",
|
||||
"enum": ["surface", "real", "secret"],
|
||||
"description": "Minimum trust level required"
|
||||
},
|
||||
"situation": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"arrival", "shift_start", "shift_end", "shift_transition",
|
||||
"bar_evening", "night_shift", "investigation", "confrontation",
|
||||
"social", "alone", "emergency", "routine", "observation",
|
||||
"greeting"
|
||||
]
|
||||
},
|
||||
"minItems": 1,
|
||||
"uniqueItems": true,
|
||||
"description": "Situation contexts when this line can fire (D-035: list<enum>). greeting added Sprint 8 for PC dialogue pools"
|
||||
},
|
||||
"topic": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"colleague", "routine", "cargo", "money", "trust",
|
||||
"danger", "institution", "personal", "investigation"
|
||||
]
|
||||
},
|
||||
"uniqueItems": true,
|
||||
"description": "Topic tags for selection weighting (D-035: list<enum>)"
|
||||
},
|
||||
"mood": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"anxious", "frustrated", "content", "suspicious",
|
||||
"warm", "hostile", "relieved", "focused"
|
||||
]
|
||||
},
|
||||
"uniqueItems": true,
|
||||
"description": "Mood tags for selection weighting (D-035: list<enum>). 8 v0.1 values, renamed Sprint 14 to match voice guide vocabulary. Neutral = untagged."
|
||||
},
|
||||
"tags": {
|
||||
"type": "array",
|
||||
"items": { "type": "string" },
|
||||
"description": "Freeform tags for additional filtering"
|
||||
},
|
||||
"knowledge_grant": {
|
||||
"type": "object",
|
||||
"description": "Knowledge the player gains from hearing this line",
|
||||
"required": ["fact_id", "confidence"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"fact_id": { "type": "string" },
|
||||
"confidence": {
|
||||
"type": "string",
|
||||
"enum": ["suspects", "knows_of", "knows_details", "direct"]
|
||||
}
|
||||
}
|
||||
},
|
||||
"dual_lens": {
|
||||
"type": "object",
|
||||
"description": "Authoring-only: per-character resonance notes (NOT consumed by engine)",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"smuggler": { "type": "string" },
|
||||
"detective": { "type": "string" }
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"type": "string",
|
||||
"description": "Authoring-only: freeform author notes (NOT consumed by engine)"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "district.schema.json",
|
||||
"title": "District Metadata",
|
||||
"description": "District definition file — one per district directory (D-036). Identity derived from directory path.",
|
||||
"type": "object",
|
||||
"required": ["display_name", "description", "locations", "npc_count"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"canonical_id": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z]+\\.[a-z]+\\.[a-z-]+$",
|
||||
"description": "Deprecated — derived from directory path at load time. If present, must match {system}.{station}.{district}."
|
||||
},
|
||||
"display_name": {
|
||||
"type": "string",
|
||||
"minLength": 1
|
||||
},
|
||||
"system": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z]+$",
|
||||
"description": "Deprecated — derived from directory path."
|
||||
},
|
||||
"station": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z]+$",
|
||||
"description": "Deprecated — derived from directory path."
|
||||
},
|
||||
"district": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z-]+$",
|
||||
"description": "Deprecated — derived from directory path."
|
||||
},
|
||||
"description": {
|
||||
"type": "string",
|
||||
"minLength": 1
|
||||
},
|
||||
"locations": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z][a-z0-9-]*$"
|
||||
},
|
||||
"minItems": 1,
|
||||
"uniqueItems": true
|
||||
},
|
||||
"npc_count": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,73 +0,0 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "fact-catalog.schema.json",
|
||||
"title": "Fact Catalog",
|
||||
"description": "Fact definitions — one file per fact category in global/knowledge/ (D-035).",
|
||||
"type": "object",
|
||||
"required": ["category", "facts"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"category": {
|
||||
"type": "string",
|
||||
"description": "Fact category matching the filename"
|
||||
},
|
||||
"facts": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/$defs/fact" },
|
||||
"minItems": 1
|
||||
}
|
||||
},
|
||||
"$defs": {
|
||||
"fact": {
|
||||
"type": "object",
|
||||
"required": ["fact_id", "description", "discoverable_by"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"fact_id": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z][a-z0-9_-]*$",
|
||||
"description": "Stable unique fact identifier"
|
||||
},
|
||||
"description": {
|
||||
"type": "string",
|
||||
"minLength": 1
|
||||
},
|
||||
"discoverable_by": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"enum": ["smuggler", "detective"]
|
||||
},
|
||||
"minItems": 1,
|
||||
"uniqueItems": true,
|
||||
"description": "Which playable characters can discover this fact"
|
||||
},
|
||||
"abstract": {
|
||||
"type": "boolean",
|
||||
"default": false,
|
||||
"description": "If true, fact cannot reach Direct confidence (only inferred)"
|
||||
},
|
||||
"progression": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/$defs/confidence_level" },
|
||||
"description": "Confidence level descriptions in ascending order"
|
||||
}
|
||||
}
|
||||
},
|
||||
"confidence_level": {
|
||||
"type": "object",
|
||||
"required": ["confidence", "text"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"confidence": {
|
||||
"type": "string",
|
||||
"enum": ["suspects", "knows_of", "knows_details", "direct"]
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Player-facing description at this confidence level"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,54 +0,0 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "location.schema.json",
|
||||
"title": "Location Definition",
|
||||
"description": "Location metadata — one file per location (D-025, D-036).",
|
||||
"type": "object",
|
||||
"required": ["canonical_id", "display_name"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"canonical_id": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z]+\\.[a-z]+\\.[a-z-]+\\.location\\.[a-z][a-z0-9-]*$",
|
||||
"description": "Full canonical ID: {system}.{station}.{district}.location.{slug}"
|
||||
},
|
||||
"display_name": {
|
||||
"type": "string",
|
||||
"minLength": 1
|
||||
},
|
||||
"description": {
|
||||
"type": "string"
|
||||
},
|
||||
"tile_bounds": {
|
||||
"type": "object",
|
||||
"description": "Rectangular tile bounds for this location",
|
||||
"properties": {
|
||||
"x_min": { "type": "integer" },
|
||||
"y_min": { "type": "integer" },
|
||||
"x_max": { "type": "integer" },
|
||||
"y_max": { "type": "integer" },
|
||||
"z": { "type": "integer" }
|
||||
},
|
||||
"required": ["x_min", "y_min", "x_max", "y_max", "z"]
|
||||
},
|
||||
"sightlines": {
|
||||
"type": "object",
|
||||
"description": "Sightline properties for LOS computation",
|
||||
"properties": {
|
||||
"open": {
|
||||
"type": "boolean",
|
||||
"description": "True if the location is open-plan (no internal walls)"
|
||||
},
|
||||
"notes": { "type": "string" }
|
||||
}
|
||||
},
|
||||
"ambient_sound": {
|
||||
"type": "string",
|
||||
"description": "Reference to ambient sound asset"
|
||||
},
|
||||
"social_site": {
|
||||
"type": "string",
|
||||
"description": "Social site template this location belongs to"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,234 +0,0 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "monologue-pool.schema.json",
|
||||
"title": "Monologue Line Pool",
|
||||
"description": "Tagged monologue lines, hard-partitioned by character (D-032, D-035). Monologue lines carry all 6 D-035 structural tags for schema compliance, but role/access/trust are fixed constants for player-character internal voice (role=player_character, access=[public], trust=surface). The engine does not gate monologue on access or trust — these tags exist for taxonomy uniformity only.",
|
||||
"type": "object",
|
||||
"required": ["character", "location", "lines"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"character": {
|
||||
"type": "string",
|
||||
"enum": ["smuggler", "detective"],
|
||||
"description": "Playable character this pool belongs to (hard partition per D-032). All lines in this pool belong to this character."
|
||||
},
|
||||
"location": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z][a-z0-9-]*$",
|
||||
"description": "Location slug, or 'general' for location-independent lines."
|
||||
},
|
||||
"lines": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/$defs/monologue_line" },
|
||||
"minItems": 1
|
||||
}
|
||||
},
|
||||
"$defs": {
|
||||
"monologue_line": {
|
||||
"type": "object",
|
||||
"required": ["id", "text", "role", "access", "trust", "situation", "trigger"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z][a-z0-9-]*_m_[sd]_[0-9]{3}$",
|
||||
"description": "Stable line ID: {npc-slug}_m_{s|d}_{###} (e.g. pc-smuggler_m_s_001, pc-detective_m_d_001). s = smuggler, d = detective. NPC-scoped per D-035 Sprint 15 amendment — each NPC has an independent sequence starting at _001."
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 256,
|
||||
"description": "Line text — 256 char hard cap, aim for ≤160 to avoid line wrap"
|
||||
},
|
||||
"role": {
|
||||
"type": "string",
|
||||
"const": "player_character",
|
||||
"description": "D-035 structural tag — always player_character for monologue. Monologue is the player character's internal voice."
|
||||
},
|
||||
"access": {
|
||||
"type": "array",
|
||||
"items": { "const": "public" },
|
||||
"minItems": 1,
|
||||
"maxItems": 1,
|
||||
"description": "D-035 structural tag — always [public] for monologue. No access gating applies to internal voice."
|
||||
},
|
||||
"trust": {
|
||||
"type": "string",
|
||||
"const": "surface",
|
||||
"description": "D-035 structural tag — always surface for monologue. No trust gating applies to internal voice."
|
||||
},
|
||||
"situation": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"arrival",
|
||||
"shift_start",
|
||||
"shift_end",
|
||||
"shift_transition",
|
||||
"bar_evening",
|
||||
"night_shift",
|
||||
"investigation",
|
||||
"confrontation",
|
||||
"social",
|
||||
"alone",
|
||||
"emergency",
|
||||
"routine",
|
||||
"observation",
|
||||
"greeting",
|
||||
"triangle_activated"
|
||||
]
|
||||
},
|
||||
"minItems": 1,
|
||||
"uniqueItems": true,
|
||||
"description": "D-035 structural tag: situations in which this monologue line is contextually appropriate. 15 v0.1 values (triangle_activated added Sprint 24). The engine selects using trigger; situation provides additional authoring context for filtering by the caller. NOTE: 'greeting' and 'triangle_activated' are not yet in server/src/content/line_pool.rs Situation enum."
|
||||
},
|
||||
"trigger": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"enter_location",
|
||||
"observe_npc",
|
||||
"hear_sound",
|
||||
"observe_anomaly",
|
||||
"post_conversation",
|
||||
"discover_evidence",
|
||||
"witness_interaction",
|
||||
"time_idle",
|
||||
"return_visit"
|
||||
],
|
||||
"description": "What causes this line to fire. 9 v0.1 trigger types (D-035 monologue-specific tag)."
|
||||
},
|
||||
"prerequisites": {
|
||||
"description": "Knowledge state gate (D-035 monologue-specific tag). null or omitted = unconditional. Conditions are AND-evaluated. Uses FactIds from the knowledge vocabulary (#368, D-041).",
|
||||
"oneOf": [
|
||||
{ "type": "null" },
|
||||
{
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"facts": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/$defs/fact_prerequisite" }
|
||||
},
|
||||
"entity_attributes": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/$defs/attribute_prerequisite" }
|
||||
},
|
||||
"relationship": {
|
||||
"type": "object",
|
||||
"required": ["target", "state"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"target": { "type": "string" },
|
||||
"state": {
|
||||
"type": "string",
|
||||
"enum": ["unknown", "known", "friendly", "person_of_interest", "hostile"]
|
||||
}
|
||||
}
|
||||
},
|
||||
"npc_in_los": {
|
||||
"type": "boolean",
|
||||
"description": "Gate: line only fires when the triggering NPC is in the player's line of sight. Added Sprint 24 for triangle_activated observe_npc lines."
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"topic": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"colleague",
|
||||
"routine",
|
||||
"cargo",
|
||||
"money",
|
||||
"trust",
|
||||
"danger",
|
||||
"institution",
|
||||
"personal",
|
||||
"investigation"
|
||||
]
|
||||
},
|
||||
"uniqueItems": true,
|
||||
"description": "D-035 selection tag: topic tags for weighted selection. 9 v0.1 values. Optional."
|
||||
},
|
||||
"mood": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"anxious",
|
||||
"frustrated",
|
||||
"content",
|
||||
"suspicious",
|
||||
"warm",
|
||||
"hostile",
|
||||
"relieved",
|
||||
"focused"
|
||||
]
|
||||
},
|
||||
"uniqueItems": true,
|
||||
"description": "D-035 selection tag: mood tags for weighted selection. 8 v0.1 values, renamed Sprint 14 to match voice guide vocabulary. Neutral = untagged."
|
||||
},
|
||||
"priority": {
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"maximum": 10,
|
||||
"default": 5,
|
||||
"description": "Selection priority (higher = more likely to fire when multiple lines are eligible). Default: 5."
|
||||
},
|
||||
"cooldown": {
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"default": 0,
|
||||
"description": "Minimum simulation ticks before this line can fire again. Default: 0."
|
||||
},
|
||||
"tags": {
|
||||
"type": "array",
|
||||
"items": { "type": "string" },
|
||||
"description": "D-035 selection tag: freeform tags. Not consumed by the selection pipeline."
|
||||
},
|
||||
"dual_lens": {
|
||||
"type": "object",
|
||||
"description": "Authoring-only: notes on how this line reads differently for smuggler vs detective. NOT consumed by engine.",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"smuggler": { "type": "string" },
|
||||
"detective": { "type": "string" }
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"type": "string",
|
||||
"description": "Authoring-only: freeform author notes. NOT consumed by engine."
|
||||
}
|
||||
}
|
||||
},
|
||||
"fact_prerequisite": {
|
||||
"type": "object",
|
||||
"required": ["fact_id", "min_confidence"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"fact_id": {
|
||||
"type": "string",
|
||||
"description": "FactId from the knowledge vocabulary (#368, D-041)."
|
||||
},
|
||||
"min_confidence": {
|
||||
"type": "string",
|
||||
"enum": ["suspects", "knows_of", "knows_details", "direct"],
|
||||
"description": "Minimum D-041 confidence level required."
|
||||
}
|
||||
}
|
||||
},
|
||||
"attribute_prerequisite": {
|
||||
"type": "object",
|
||||
"required": ["entity", "key", "value"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"entity": { "type": "string" },
|
||||
"key": { "type": "string" },
|
||||
"value": { "type": "string" }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,209 +0,0 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "npc-profile.schema.json",
|
||||
"title": "NPC Profile",
|
||||
"description": "10-axis NPC model profile — one file per NPC (D-024, D-034).",
|
||||
"type": "object",
|
||||
"required": ["canonical_id", "display_name", "tier", "pattern", "motivation"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"canonical_id": {
|
||||
"type": "string",
|
||||
"pattern": "^npc:([a-z][a-z0-9-]+\\.)?[a-z][a-z0-9-]*$",
|
||||
"description": "Canonical ID: npc:{slug} (within district) or npc:{district}.{slug} (cross-district)"
|
||||
},
|
||||
"display_name": {
|
||||
"type": "string",
|
||||
"minLength": 1
|
||||
},
|
||||
"tier": {
|
||||
"type": "integer",
|
||||
"enum": [1, 2, 3],
|
||||
"description": "NPC tier: 1 = conspiracy (full depth), 2 = template (social context), 3 = filler (atmosphere)"
|
||||
},
|
||||
"pattern": {
|
||||
"type": "string",
|
||||
"enum": ["FRIEND", "MIRROR", "ANCHOR", "GHOST", "CATALYST", "THRESHOLD", "REMNANT", "SYSTEM", "NOBODY"],
|
||||
"description": "Thematic pattern — System A (D-050)"
|
||||
},
|
||||
"motivation": {
|
||||
"type": "string",
|
||||
"enum": ["HANDLER", "WITNESS", "TURNCOAT", "CIVILIAN", "OPERATOR", "SKEPTIC"],
|
||||
"description": "Functional motivation — System B (D-050)"
|
||||
},
|
||||
"description": {
|
||||
"type": "string"
|
||||
},
|
||||
"want": {
|
||||
"type": "object",
|
||||
"description": "Primary want/need driving this NPC",
|
||||
"properties": {
|
||||
"primary": { "type": "string", "enum": ["Wealth", "Safety", "Knowledge", "Connection", "Power", "Freedom", "Justice", "Revenge", "Happiness"] },
|
||||
"intensity": { "type": "integer", "minimum": 0, "maximum": 10 },
|
||||
"description": { "type": "string" }
|
||||
},
|
||||
"required": ["primary"]
|
||||
},
|
||||
"secret": {
|
||||
"type": "string",
|
||||
"description": "The NPC's hidden truth — what they don't want the player to know"
|
||||
},
|
||||
"relationships": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/$defs/relationship" },
|
||||
"description": "Named relationships to other NPCs"
|
||||
},
|
||||
"tolerance": {
|
||||
"type": "object",
|
||||
"description": "Stress tolerance threshold",
|
||||
"properties": {
|
||||
"threshold": { "type": "integer" },
|
||||
"description": { "type": "string" }
|
||||
}
|
||||
},
|
||||
"routine": {
|
||||
"type": "object",
|
||||
"description": "Summary of daily routine (full schedule in routines/schedules.yaml)",
|
||||
"properties": {
|
||||
"summary": { "type": "string" }
|
||||
}
|
||||
},
|
||||
"information": {
|
||||
"type": "object",
|
||||
"description": "What this NPC knows",
|
||||
"properties": {
|
||||
"knows": {
|
||||
"type": "array",
|
||||
"items": { "type": "string" },
|
||||
"description": "Fact IDs this NPC knows"
|
||||
},
|
||||
"access_tier": {
|
||||
"type": "string",
|
||||
"enum": ["public", "insider", "authority", "peer", "hostile"]
|
||||
}
|
||||
}
|
||||
},
|
||||
"contentment": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"level": { "type": "integer", "minimum": -10, "maximum": 10 },
|
||||
"description": { "type": "string" }
|
||||
}
|
||||
},
|
||||
"personality": {
|
||||
"type": "object",
|
||||
"description": "Personality traits and behavioral tendencies",
|
||||
"additionalProperties": { "type": "string" }
|
||||
},
|
||||
"tells": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/$defs/tell" },
|
||||
"description": "Observable behavioral tells (D-024)"
|
||||
},
|
||||
"skills": {
|
||||
"type": "object",
|
||||
"description": "Skill set and combat capability",
|
||||
"properties": {
|
||||
"combat_trained": { "type": "boolean" },
|
||||
"skills": {
|
||||
"type": "object",
|
||||
"additionalProperties": { "type": "integer", "minimum": 0, "maximum": 10 }
|
||||
}
|
||||
}
|
||||
},
|
||||
"triangle_membership": {
|
||||
"type": "array",
|
||||
"items": { "type": "string" },
|
||||
"description": "Triangle slugs this NPC participates in"
|
||||
},
|
||||
"trust_levels": {
|
||||
"type": "object",
|
||||
"description": "What the NPC reveals at each trust level",
|
||||
"properties": {
|
||||
"surface": { "type": "string" },
|
||||
"real": { "type": "string" },
|
||||
"secret": { "type": "string" }
|
||||
}
|
||||
},
|
||||
"friend_arc": {
|
||||
"type": "object",
|
||||
"description": "FRIEND arc data — only valid on FRIEND-pattern Tier 1 NPCs (D-034)",
|
||||
"properties": {
|
||||
"bonded_character": {
|
||||
"type": "string",
|
||||
"enum": ["smuggler", "detective"]
|
||||
},
|
||||
"phases": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/$defs/friend_phase" }
|
||||
}
|
||||
},
|
||||
"required": ["bonded_character", "phases"]
|
||||
},
|
||||
"dual_lens": {
|
||||
"type": "object",
|
||||
"description": "Authoring-only: how smuggler vs detective perceives this NPC",
|
||||
"properties": {
|
||||
"smuggler": { "type": "string" },
|
||||
"detective": { "type": "string" }
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"type": "string",
|
||||
"description": "Authoring-only: design notes"
|
||||
}
|
||||
},
|
||||
"if": {
|
||||
"properties": { "pattern": { "const": "FRIEND" } }
|
||||
},
|
||||
"then": {
|
||||
"required": ["friend_arc"]
|
||||
},
|
||||
"$defs": {
|
||||
"relationship": {
|
||||
"type": "object",
|
||||
"required": ["target", "kind"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"target": {
|
||||
"type": "string",
|
||||
"pattern": "^npc:([a-z][a-z0-9-]+\\.)?[a-z][a-z0-9-]*$"
|
||||
},
|
||||
"kind": {
|
||||
"type": "string",
|
||||
"enum": ["colleague", "friend", "rival", "romantic", "family", "superior", "subordinate"]
|
||||
},
|
||||
"trust": {
|
||||
"type": "integer",
|
||||
"minimum": -10,
|
||||
"maximum": 10
|
||||
},
|
||||
"notes": { "type": "string" }
|
||||
}
|
||||
},
|
||||
"tell": {
|
||||
"type": "object",
|
||||
"required": ["trigger", "behavior"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"trigger": { "type": "string" },
|
||||
"behavior": { "type": "string" },
|
||||
"visible_to": {
|
||||
"type": "string",
|
||||
"enum": ["forward", "peripheral", "any"]
|
||||
}
|
||||
}
|
||||
},
|
||||
"friend_phase": {
|
||||
"type": "object",
|
||||
"required": ["phase", "description"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"phase": { "type": "integer", "minimum": 1, "maximum": 5 },
|
||||
"description": { "type": "string" },
|
||||
"trigger": { "type": "string" },
|
||||
"routine_deviation": { "type": "string" }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,103 +0,0 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "routine.schema.json",
|
||||
"title": "NPC Routine Schedules",
|
||||
"description": "Daily routine schedules — all NPCs in one file per district for cross-NPC validation (D-034).",
|
||||
"type": "object",
|
||||
"required": ["district", "schedules"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"district": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z][a-z0-9-]*$",
|
||||
"description": "District slug this routine file belongs to"
|
||||
},
|
||||
"schedules": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/$defs/npc_schedule" },
|
||||
"minItems": 1
|
||||
}
|
||||
},
|
||||
"$defs": {
|
||||
"npc_schedule": {
|
||||
"type": "object",
|
||||
"required": ["npc", "entries"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"npc": {
|
||||
"type": "string",
|
||||
"pattern": "^npc:[a-z][a-z0-9-]*$",
|
||||
"description": "NPC short-form canonical ID"
|
||||
},
|
||||
"entries": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/$defs/routine_entry" },
|
||||
"minItems": 1
|
||||
},
|
||||
"deviations": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/$defs/deviation" },
|
||||
"description": "Conditional schedule overrides (FRIEND arc staging, etc.)"
|
||||
}
|
||||
}
|
||||
},
|
||||
"routine_entry": {
|
||||
"type": "object",
|
||||
"required": ["phase", "location"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"phase": {
|
||||
"type": "string",
|
||||
"enum": ["morning", "afternoon", "evening", "night"],
|
||||
"description": "Day phase for this entry"
|
||||
},
|
||||
"location": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z][a-z0-9-]*$",
|
||||
"description": "Location slug"
|
||||
},
|
||||
"tile": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"x": { "type": "integer" },
|
||||
"y": { "type": "integer" }
|
||||
},
|
||||
"required": ["x", "y"],
|
||||
"description": "Specific tile coordinates within the location"
|
||||
},
|
||||
"activity": {
|
||||
"type": "string",
|
||||
"description": "What the NPC is doing at this location/time"
|
||||
}
|
||||
}
|
||||
},
|
||||
"deviation": {
|
||||
"type": "object",
|
||||
"required": ["trigger", "location"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"trigger": {
|
||||
"type": "string",
|
||||
"description": "Condition that activates this deviation"
|
||||
},
|
||||
"phase": {
|
||||
"type": "string",
|
||||
"enum": ["morning", "afternoon", "evening", "night"]
|
||||
},
|
||||
"location": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z][a-z0-9-]*$"
|
||||
},
|
||||
"tile": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"x": { "type": "integer" },
|
||||
"y": { "type": "integer" }
|
||||
},
|
||||
"required": ["x", "y"]
|
||||
},
|
||||
"activity": { "type": "string" }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "station.schema.json",
|
||||
"title": "Station Metadata",
|
||||
"description": "Station definition file — one per station directory (D-036).",
|
||||
"type": "object",
|
||||
"required": ["display_name"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"display_name": {
|
||||
"type": "string",
|
||||
"minLength": 1
|
||||
},
|
||||
"description": {
|
||||
"type": "string"
|
||||
},
|
||||
"districts": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z][a-z0-9-]*$"
|
||||
},
|
||||
"uniqueItems": true
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "system.schema.json",
|
||||
"title": "Star System Metadata",
|
||||
"description": "System definition file — one per system directory (D-036).",
|
||||
"type": "object",
|
||||
"required": ["display_name"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"display_name": {
|
||||
"type": "string",
|
||||
"minLength": 1
|
||||
},
|
||||
"description": {
|
||||
"type": "string"
|
||||
},
|
||||
"stations": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z][a-z0-9-]*$"
|
||||
},
|
||||
"uniqueItems": true
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,99 +0,0 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "triangle.schema.json",
|
||||
"title": "Triangle Definition",
|
||||
"description": "3-NPC relationship triangle — self-contained forks, no cross-triangle cascade in v0.1 (D-024, D-047).",
|
||||
"type": "object",
|
||||
"required": ["canonical_id", "display_name", "members"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"canonical_id": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z][a-z0-9-]*$",
|
||||
"description": "Triangle slug"
|
||||
},
|
||||
"display_name": {
|
||||
"type": "string",
|
||||
"minLength": 1
|
||||
},
|
||||
"description": {
|
||||
"type": "string"
|
||||
},
|
||||
"members": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/$defs/member" },
|
||||
"minItems": 3,
|
||||
"maxItems": 3,
|
||||
"description": "Exactly 3 NPC members"
|
||||
},
|
||||
"forks": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/$defs/fork" },
|
||||
"description": "Possible fork points in this triangle"
|
||||
},
|
||||
"resolution_states": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/$defs/resolution" },
|
||||
"description": "Terminal states this triangle can reach"
|
||||
}
|
||||
},
|
||||
"$defs": {
|
||||
"member": {
|
||||
"type": "object",
|
||||
"required": ["npc", "role"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"npc": {
|
||||
"type": "string",
|
||||
"pattern": "^npc:[a-z][a-z0-9-]*$",
|
||||
"description": "NPC short-form canonical ID"
|
||||
},
|
||||
"role": {
|
||||
"type": "string",
|
||||
"description": "This NPC's role within the triangle"
|
||||
}
|
||||
}
|
||||
},
|
||||
"fork": {
|
||||
"type": "object",
|
||||
"required": ["id", "condition"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z][a-z0-9_-]*$"
|
||||
},
|
||||
"condition": {
|
||||
"type": "string",
|
||||
"description": "What triggers this fork"
|
||||
},
|
||||
"outcomes": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"id": { "type": "string" },
|
||||
"description": { "type": "string" },
|
||||
"effects": {
|
||||
"type": "array",
|
||||
"items": { "type": "string" }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"resolution": {
|
||||
"type": "object",
|
||||
"required": ["id", "description"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z][a-z0-9_-]*$"
|
||||
},
|
||||
"description": { "type": "string" }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -93,3 +93,8 @@ CREATE INDEX IF NOT EXISTS idx_decisions_domain ON decisions(domain);
|
||||
CREATE INDEX IF NOT EXISTS idx_decisions_status ON decisions(status);
|
||||
CREATE INDEX IF NOT EXISTS idx_decision_refs_source ON decision_refs(source_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_decision_refs_target ON decision_refs(target_id);
|
||||
|
||||
-- ---------------------------------------------------------------------------
|
||||
-- Star Systems live in a separate database: server/data/systems.db
|
||||
-- Schema: server/data/systems-schema.sql
|
||||
-- ---------------------------------------------------------------------------
|
||||
|
||||
+3
-3
@@ -12,13 +12,13 @@ Cross-domain decisions live in one file with cross-reference notes in related fi
|
||||
|------|--------|-----------|
|
||||
| [architecture.md](architecture.md) | Technical foundation | D-008, D-009, D-010, D-012, D-020, D-026, D-030, D-031, D-041, D-042, D-054, D-055, D-066, D-068, D-073, D-085, D-088, D-094, D-096, D-097, D-099, D-100, D-101, D-102, D-103, D-106, D-108, D-109, D-113, D-133, D-134, D-135, D-136, D-137 |
|
||||
| [perception.md](perception.md) | Player observation | D-011, D-015, D-016, D-017, D-018, D-019, D-033, D-035, D-043, D-044, D-045, D-046, D-047, D-048, D-049, D-052, D-056, D-057, D-058, D-059, D-060, D-061, D-067, D-069, D-070, D-071, D-072, D-076, D-077, D-078, D-086 |
|
||||
| [content.md](content.md) | NPC, dialogue, templates | D-023, D-024, D-025, D-028, D-029, D-032, D-034, D-035, D-036, D-037, D-050, D-062, D-063, D-064, D-074, D-075, D-084, D-090, D-092, D-093, D-095, D-098, D-104, D-105, D-107, D-121, D-122, D-123, D-124, D-125, D-126, D-127, D-128, D-129, D-130, D-131, D-132, D-138, D-139, D-140, D-142 |
|
||||
| [scope.md](scope.md) | Game concept, prototype | D-001, D-003, D-005, D-006, D-007, D-013, D-014, D-027, D-038, D-039, D-051, D-053, D-065, D-087, D-089, D-091, D-114, D-115, D-116, D-117, D-118, D-119, D-120 |
|
||||
| [content.md](content.md) | NPC, dialogue, templates | D-023, D-024, D-025, D-028, D-029, D-032, D-034, D-035, D-036, D-037, D-050, D-062, D-063, D-064, D-074, D-075, D-084, D-090, D-092, D-093, D-095, D-098, D-104, D-105, D-107, D-121, D-122, D-123, D-124, D-125, D-126, D-127, D-128, D-129, D-130, D-131, D-132, D-138, D-139, D-140, D-142, D-147 |
|
||||
| [scope.md](scope.md) | Game concept, prototype | D-001, D-003, D-005, D-006, D-007, D-013, D-014, D-027, D-038, D-039, D-051, D-053, D-065, D-087, D-089, D-091, D-114, D-115, D-116, D-117, D-118, D-119, D-120, D-145, D-146 |
|
||||
| [process.md](process.md) | Team, workflow | D-004, D-021, D-022, D-040 |
|
||||
| [questions.md](questions.md) | Open questions (index) | Q-001 through Q-054 |
|
||||
| [questions-architecture.md](questions-architecture.md) | Technical questions | Q-001, Q-006, Q-009, Q-018–Q-023, Q-029, Q-030, Q-046 |
|
||||
| [questions-perception.md](questions-perception.md) | Observation questions | Q-003, Q-014, Q-016, Q-024–Q-026, Q-051, Q-053, Q-054 |
|
||||
| [questions-content.md](questions-content.md) | Narrative questions | Q-010, Q-012–Q-015, Q-017, Q-028, Q-031, Q-033, Q-040–Q-050, Q-052 |
|
||||
| [questions-content.md](questions-content.md) | Narrative questions | Q-010, Q-012–Q-015, Q-017, Q-028, Q-031, Q-033, Q-040–Q-050, Q-052, Q-WTF-039, Q-WTF-040, Q-WTF-041 |
|
||||
| [questions-scope.md](questions-scope.md) | Scope questions | Q-002, Q-004, Q-005, Q-007, Q-008, Q-011, Q-027, Q-032, Q-034–Q-039 |
|
||||
| [rejected.md](rejected.md) | Rejected alternatives | R-001 through R-010 |
|
||||
|
||||
|
||||
@@ -462,7 +462,7 @@ Technical foundation decisions that constrain implementation: engine, client-ser
|
||||
- **Source:** Where's the Fun? Workshop, Round 4 Interview, Decision 12
|
||||
- **Raised by:** Team Leader (Jeroen) — both layered (option C)
|
||||
- **Dissent:** None
|
||||
- **Cross-reference:** [D-128](content.md#d-128-culture-implicit-in-starting-location--krenn-system-equals-krenn-culture) (culture as context for insert copy)
|
||||
- **Cross-reference:** [D-128](content.md#d-128-culture-implicit-in-starting-location--van-maanens-star-system-equals-van-maanens-star-culture) (culture as context for insert copy)
|
||||
|
||||
### D-136: First Settled Reach moment — auto-generated apartment + insert activation
|
||||
- **Date:** 2026-03-05
|
||||
|
||||
+87
-26
@@ -18,7 +18,7 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio
|
||||
- **Rationale:** Axes that create contradictions within NPCs produce player decisions. The 5 key interactions (Want×Secret, Routine×Secret, Tolerance×Relationships, Want×Relationships, Personality×Tolerance) drive the full investigation-and-social gameplay loop. Contentment axis (proposed by Gore) connects generated NPCs to the thematic spine. Combat as component follows the same pattern as perception modes ([D-017](perception.md#d-017-perception-modes-as-character-build-system)).
|
||||
- **Raised by:** Gestalt (consolidation), Gore (contentment axis), Paula (triangle model), Tyre (combat component). Full team endorsed.
|
||||
- **Dissent:** None
|
||||
- **Amendment (2026-03-05, Where's the Fun? Workshop):** The 10-axis model and core generation logic survive. However, [D-122](#d-122-all-npcs-generated--no-named-hand-authored-characters) (all NPCs generated) removes all named hand-authored NPCs from v0.2. Named NPCs and hand-authored triangles are now generator outputs, not authored content. The 10 axes apply to all generated NPCs. The `NpcBlueprint` struct (Tyre prerequisite for D-119 generator spike) must encode these axes as generator output format. Cultural/origin template (previously called "generation-time flavor") is now the primary driver per [D-128](#d-128-culture-implicit-in-starting-location--krenn-system-equals-krenn-culture) and [D-121](#d-121-voice-is-culture-driven--job-as-modifier).
|
||||
- **Amendment (2026-03-05, Where's the Fun? Workshop):** The 10-axis model and core generation logic survive. However, [D-122](#d-122-all-npcs-generated--no-named-hand-authored-characters) (all NPCs generated) removes all named hand-authored NPCs from v0.2. Named NPCs and hand-authored triangles are now generator outputs, not authored content. The 10 axes apply to all generated NPCs. The `NpcBlueprint` struct (Tyre prerequisite for D-119 generator spike) must encode these axes as generator output format. Cultural/origin template (previously called "generation-time flavor") is now the primary driver per [D-128](#d-128-culture-implicit-in-starting-location--van-maanens-star-system-equals-van-maanens-star-culture) and [D-121](#d-121-voice-is-culture-driven--job-as-modifier).
|
||||
|
||||
### D-025: Social site / functional cluster as atomic template unit
|
||||
- **Date:** 2026-02-10
|
||||
@@ -93,33 +93,33 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio
|
||||
- **Amendment (Sprint 24):** `triangle_activated` added as 15th situation (fires post-TriangleActivated when player observes anchor NPCs). Two freeform tags registered as conventions: `triangle-signal` (line is part of the triangle activation sequence) and `tell-observation` (line observes a behavioral tell without naming its cause). `npc_in_los` prerequisite added for LOS-gated monologue lines. Schema updated to match.
|
||||
- **Amendment (Sprint 15):** Line ID namespace changed from location-scoped to NPC-scoped. Old scheme: `{location_slug}_{d|m}_{###}` (e.g., `the-terminal_d_039`) — all NPCs at a location share one ID sequence, requiring cross-file coordination and causing collisions at scale. New scheme: `{npc-slug}_{d|m}_{###}` for dialogue, `{npc-slug}_m_{s|d}_{###}` for monologue (e.g., `kael-davan_d_001`, `dock-worker_d_001`). Each NPC's IDs are independent — no cross-file coordination needed. Auto-generated NPCs use their generated slug. Schema regex patterns unchanged (prefix is still `^[a-z][a-z0-9-]*`), only the `description` field and convention documentation update. Migration: mechanical rename of all existing line IDs across ~20 dialogue files and monologue pools.
|
||||
|
||||
### D-036: Sova Transit District / Krenn System as v0.1 setting
|
||||
### D-036: Sova Transit District / Van Maanen's Star as v0.1 setting
|
||||
- **Date:** 2026-02-11
|
||||
- **Decision:** The v0.1 vertical slice is set in Sova Transit District, a freight logistics hub on Station Sova in the Krenn System. This is the first concrete, named star system in The Settled Reach. The Krenn System is a mid-Reach G3V system, ~180 years settled, population ~2.4 million, working-class pragmatic culture. Station Sova is a logistics hub (~12,000 population). Sova Transit District is a 40-year-old prefab-modular-retrofitted freight district with three social sites: The Terminal (logistics hub), The Last Shift (bar), and maintenance corridors/smuggling spaces.
|
||||
- **Decision:** The v0.1 vertical slice is set in Sova Transit District, a freight logistics hub on Station Sova in Van Maanen's Star. This is the first concrete, named star system in The Settled Reach. Van Maanen's Star is a mid-Reach G3V system, ~180 years settled, population ~2.4 million, working-class pragmatic culture. Station Sova is a logistics hub (~12,000 population). Sova Transit District is a 40-year-old prefab-modular-retrofitted freight district with three social sites: The Terminal (logistics hub), The Last Shift (bar), and maintenance corridors/smuggling spaces.
|
||||
- **Setting details (canonical):**
|
||||
- NPC naming: Krenn System conventions — compact, consonant-heavy, first-name-primary in social contexts (Kael, Voss, Lera, Torek, Drin, Maret, Naia, Sera, Nils, Kosse, Pael, Tev, Ren)
|
||||
- NPC naming: Van Maanen's Star conventions — compact, consonant-heavy, first-name-primary in social contexts (Kael, Voss, Lera, Torek, Drin, Maret, Naia, Sera, Nils, Kosse, Pael, Tev, Ren)
|
||||
- Bar naming: "The Last Shift" (official), "Lera's" (informal, used by regulars)
|
||||
- Atmosphere: "quotidian-with-undertow" — comfortable enough to be complacent, tight enough that extra income is tempting
|
||||
- Sensory: span gate hum, industrial lubricant, recycled air, cargo machinery
|
||||
- **Cross-reference:** Vertical slice ([D-027](scope.md#d-027-vertical-slice--smuggler--detective-two-character-proof)), contraband ([D-037](#d-037-contraband-specification))
|
||||
- **Raised by:** Miri (Sova setting brief, Round 1; Krenn System profile, Round 2), project lead (confirmed as worldbuilding milestone, directive #6)
|
||||
- **Raised by:** Miri (Sova setting brief, Round 1; Van Maanen's Star profile, Round 2), project lead (confirmed as worldbuilding milestone, directive #6)
|
||||
- **Dissent:** None
|
||||
- **Amendment (2026-03-05, Where's the Fun? Workshop):** Station Sova / Krenn System confirmed as the v0.2 setting. [D-128](#d-128-culture-implicit-in-starting-location--krenn-system-equals-krenn-culture) makes Krenn culture the cultural context for the tycoon bookmark — Krenn System IS Krenn culture by default. The setting details (naming conventions, atmosphere, sensory palette) survive as generator inputs and culture profile content. However, the Sova Transit District spatial layout (D-093) was designed for the v0.1 hand-built slice. v0.2 generates the location via the generator ([D-114](scope.md#d-114-v02-proof-of-life--generator--graphics-not-hand-built-slice)); the Krenn culture profile (Miri prerequisite for [D-119](scope.md#d-119-generator-spike-confirmed-for-sprint-25--critical-path)) captures the setting identity as generator inputs. Sova remains the canonical example system and the first culture profile to author.
|
||||
- **Amendment (2026-03-05, Where's the Fun? Workshop):** Station Sova / Van Maanen's Star confirmed as the v0.2 setting. [D-128](#d-128-culture-implicit-in-starting-location--van-maanens-star-system-equals-van-maanens-star-culture) makes Van Maanen's Star culture the cultural context for the tycoon bookmark — Van Maanen's Star IS Van Maanen's Star culture by default. The setting details (naming conventions, atmosphere, sensory palette) survive as generator inputs and culture profile content. However, the Sova Transit District spatial layout (D-093) was designed for the v0.1 hand-built slice. v0.2 generates the location via the generator ([D-114](scope.md#d-114-v02-proof-of-life--generator--graphics-not-hand-built-slice)); the Van Maanen's Star culture profile (Miri prerequisite for [D-119](scope.md#d-119-generator-spike-confirmed-for-sprint-25--critical-path)) captures the setting identity as generator inputs. Sova remains the canonical example system and the first culture profile to author.
|
||||
|
||||
### D-037: Contraband specification — unlicensed lattice components
|
||||
- **Date:** 2026-02-11
|
||||
- **Decision:** The primary contraband in the v0.1 smuggling scenario is unlicensed lattice components — aftermarket neural lattice modifications that bypass Commission regulation. Secondary contraband: medical-grade neural lattice replacements (diverted from Syndic supply chains) and Severance counter-surveillance technology.
|
||||
- **Moral dimension:** The ring is smuggling *access*, not weapons. People want better lattice capability than Commission-regulated channels provide. Medical-grade replacements serve people whose lattices are degrading and who can't afford institutional replacement. This creates genuine moral ambiguity: the smuggler isn't a villain, they're providing a service the legitimate system won't.
|
||||
- **Gameplay relevance:** Lattice components connect to the perception system (D-017) — a smuggled upgrade could theoretically change what the player perceives. Manifest discrepancies are the primary investigation vector. The detective's analytical lattice can flag cargo anomalies.
|
||||
- **Cross-reference:** Perception modes ([D-017](perception.md#d-017-perception-modes-as-character-build-system)), setting ([D-036](#d-036-sova-transit-district--krenn-system-as-v01-setting))
|
||||
- **Cross-reference:** Perception modes ([D-017](perception.md#d-017-perception-modes-as-character-build-system)), setting ([D-036](#d-036-sova-transit-district--van-maanens-star-system-as-v01-setting))
|
||||
- **Raised by:** Miri (Round 1 proposal, Round 2 validation), Paula (moral dimension endorsement), full team validated
|
||||
- **Dissent:** None
|
||||
|
||||
### D-050: Velen — Krenn System primary world
|
||||
### D-050: Velen — Van Maanen's Star primary world
|
||||
- **Date:** 2026-02-12
|
||||
- **Decision:** Velen is the canonical name for the Krenn System's primary habitable world. Temperate-maritime climate, ~0.9G, regular rain, morning/evening fog, mild temperature range, occasional heavy squalls. Station Sova orbits Velen. The span gate connects Sova to a planetary freight depot on Velen's surface. Naming convention: compact, consonant-weighted, two-syllable, Nordic-influenced.
|
||||
- **Decision:** Velen is the canonical name for Van Maanen's Star's primary habitable world. Temperate-maritime climate, ~0.9G, regular rain, morning/evening fog, mild temperature range, occasional heavy squalls. Station Sova orbits Velen. The span gate connects Sova to a planetary freight depot on Velen's surface. Naming convention: compact, consonant-weighted, two-syllable, Nordic-influenced.
|
||||
- **Weather as gameplay (cross-ref D-046):** Fog degrades everyone's vision cones equally — shared vulnerability. The storyteller can time weather for dramatic effect without breaking environmental neutrality (D-045). Foggy mornings = shorter cones = smuggler's early drops safer, detective's dawn surveillance harder.
|
||||
- **Cross-reference:** Setting ([D-036](#d-036-sova-transit-district--krenn-system-as-v01-setting))
|
||||
- **Cross-reference:** Setting ([D-036](#d-036-sova-transit-district--van-maanens-star-system-as-v01-setting))
|
||||
- **Canonical reference:** `docs/workshops/art-direction-mood-board/workshop-outcomes.md` §1.13, §1.15
|
||||
- **Raised by:** Miri (Round 2 proposal), confirmed by project lead (Round 3). Unanimously endorsed.
|
||||
- **Dissent:** None
|
||||
@@ -165,7 +165,7 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio
|
||||
- High-freq detail (2-8kHz, sparse): scanner pings, metal impacts, environmental detail.
|
||||
- No harsh frequencies, no industrial brutality. The station is SETTLED — lived-in, maintained, comfortable enough to be complacent.
|
||||
- **Environmental neutrality per [D-045](perception.md#d-045-art-direction--environmental-neutrality-strict-zero-shift):** Ambient audio does NOT shift with narrative state. Same station hum before and after conspiracy discovery. No music stingers for investigation progress. Emotional weight comes from monologue and player knowledge, not audio cues.
|
||||
- **Cross-reference:** Audio assets ([D-038](scope.md#d-038-audio-in-v01-scope--8-files-via-stable-audio-open)), sound model ([D-018](perception.md#d-018-three-range-sound-model)), environmental neutrality ([D-045](perception.md#d-045-art-direction--environmental-neutrality-strict-zero-shift)), setting ([D-036](#d-036-sova-transit-district--krenn-system-as-v01-setting))
|
||||
- **Cross-reference:** Audio assets ([D-038](scope.md#d-038-audio-in-v01-scope--8-files-via-stable-audio-open)), sound model ([D-018](perception.md#d-018-three-range-sound-model)), environmental neutrality ([D-045](perception.md#d-045-art-direction--environmental-neutrality-strict-zero-shift)), setting ([D-036](#d-036-sova-transit-district--van-maanens-star-system-as-v01-setting))
|
||||
- **Raised by:** Inigo (insert-tech/organic split), Paula (cognitive architecture framing and trust model connection)
|
||||
- **Dissent:** None
|
||||
|
||||
@@ -248,9 +248,14 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio
|
||||
|
||||
### D-095: Horizon Stations and Gate Infrastructure — Transport Lore
|
||||
- **Date:** 2026-02-25
|
||||
- **Decision:** Span gates are human-built structures with a single aperture enabling near-instantaneous transit. Operating schedule uses dual-use windows: freight (bulk of hours) and passenger (scheduled slots). Physical layout: aperture chamber → freight staging / passenger arrival → customs lanes → gate concourse. Horizon stations are alien-built installations (no identified builder species), self-maintaining, located at Oort-cloud distance, with 4–8 apertures per station. Per-system canonical name: "The Ring." Travel is sequential-hop only (A→B→C through intermediate systems; no direct long-range transit). Per-system access tiers vary (4 tiers — some systems allow single-hop to orbital customs; no direct planetary span gate). Station Sova's horizon gates are located at The Ring (Oort-cloud orbital); the Administrative Hub contains booking offices only (not the gates themselves — correction to prior station profile text). "The Loop" is Sova's internal tram network: 6 districts, 4-minute run from Residential Core to Transit District. Workers arrive at the transit platform (bar-side) and disperse to Terminal or bar.
|
||||
- **Rationale:** Resolves transport lore questions Q-040, Q-041, Q-043, Q-044 raised during Workshop #153. Miri's Round 3 contribution. Horizon station as alien-built infrastructure adds worldbuilding depth without requiring a named builder species. Sequential-hop travel creates natural story hooks (layover locations, transit records, smuggling route complexity).
|
||||
- **Decision:** Span gates are human-built structures with a single aperture enabling near-instantaneous transit. Operating schedule uses dual-use windows: freight (bulk of hours) and passenger (scheduled slots). Physical layout: aperture chamber → freight staging / passenger arrival → customs lanes → gate concourse. Horizon stations are alien-built installations (no identified builder species), self-maintaining, located at Oort-cloud distance, with **1–8 apertures per station** (revised from 4–8; single-aperture stations are valid and produce isolated dead-end systems with one way in and one way out). Per-system canonical name: "The Ring." Travel is sequential-hop only (A→B→C through intermediate systems; no direct long-range transit). Per-system access tiers vary (4 tiers — some systems allow single-hop to orbital customs; no direct planetary span gate). Station Sova's horizon gates are located at The Ring (Oort-cloud orbital); the Administrative Hub contains booking offices only (not the gates themselves — correction to prior station profile text). "The Loop" is Sova's internal tram network: 6 districts, 4-minute run from Residential Core to Transit District. Workers arrive at the transit platform (bar-side) and disperse to Terminal or bar.
|
||||
- **Rationale:** Resolves transport lore questions Q-040, Q-041, Q-043, Q-044 raised during Workshop #153. Miri's Round 3 contribution. Horizon station as alien-built infrastructure adds worldbuilding depth without requiring a named builder species. Sequential-hop travel creates natural story hooks (layover locations, transit records, smuggling route complexity). Aperture count revised to 1–8 (from 4–8) to allow single-aperture stations, which produce the most isolated and narratively interesting dead-end systems — and leave open the question of what a single-aperture station pointing at an unknown destination means.
|
||||
- **Raised by:** Miri (worldbuilding), confirmed by team.
|
||||
- **Amendment (2026-03-13):** Aperture count range revised from 4–8 to **1–8** per project lead direction. Single-aperture horizon stations are valid; they are the mechanism for the most isolated dead-end systems, and for any system whose single gate points to a destination that is not (or not yet) part of the Reach. This change has downstream implications for the Earth question — see note in systems-framework-miri.md §7.
|
||||
- **Amendment (2026-03-14):** Clarified the inter-system / intra-system gate distinction and technology lineage:
|
||||
- **Inter-system gates (horizon gates / founder gates):** Alien-built. Aperture count and connections are properties of the alien infrastructure. Humans cannot add, remove, activate, or deactivate inter-system apertures. Gate topology is *given*, not chosen. The one known exception — a dormant aperture at Struve activating ~40 years ago — was not a human action; the alien infrastructure did something on its own, for reasons the Veil Institute has not explained. Whether dormant apertures exist elsewhere, and what triggers activation, is unknown.
|
||||
- **Intra-system gates (span gates):** Human-built technology, derived from the Veil Institute's study of alien horizon station architecture. The Institute reverse-engineered the principles governing short-range aperture formation and licensed the technology to a gate construction corporation, which now owns and operates span gate infrastructure across the Reach (and owns an entire system as its industrial base). Span gates are well-understood engineering: buildable, modifiable, commercially operated.
|
||||
- **Key constraint for wiki authors:** No system's aperture count or inter-system connections are the result of human decisions. Systems cannot "vote for" or "apply for" additional horizon gate apertures. A system's gate topology is an alien-determined fact that humans have adapted to, not chosen.
|
||||
- **Dissent:** None.
|
||||
- **Source:** Station District Layout Workshop, Ticket #153, Sprint 20. Round document: `docs/discussions/round-20-station-district-layout.md`
|
||||
- **Cross-reference:** D-093 (gate cluster spatial layout), Q-040 (gate dual-use topology — resolved), Q-041 (horizon station model — resolved), Q-042 (intra-system transport — partially resolved), Q-043 (station internal transit — resolved), Q-044 (gate-train integration — resolved)
|
||||
@@ -297,12 +302,12 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio
|
||||
|
||||
### D-121: Voice is culture-driven — job as modifier
|
||||
- **Date:** 2026-03-05
|
||||
- **Decision:** NPC voice is authored at the culture level with job-specific modifiers layered on top. Culture is primary — a character IS their background. Job adds a layer. A Krenn tycoon sounds like a Krenn person who runs businesses, not a generic tycoon. This is an inversion of the prior assumption that job drove voice with culture as modifier.
|
||||
- **Rationale:** Culture-primary voice produces characters that feel like they belong to a place. Job-primary voice produces archetypes. The life-sim vision requires characters legible as inhabitants of the Krenn System, not as representatives of occupational categories.
|
||||
- **Decision:** NPC voice is authored at the culture level with job-specific modifiers layered on top. Culture is primary — a character IS their background. Job adds a layer. A Van Maanen's Star tycoon sounds like a Van Maanen's Star person who runs businesses, not a generic tycoon. This is an inversion of the prior assumption that job drove voice with culture as modifier.
|
||||
- **Rationale:** Culture-primary voice produces characters that feel like they belong to a place. Job-primary voice produces archetypes. The life-sim vision requires characters legible as inhabitants of Van Maanen's Star, not as representatives of occupational categories.
|
||||
- **Source:** Where's the Fun? Workshop, Round 4 Interview, Decision 6
|
||||
- **Raised by:** Team Leader (Jeroen) — inversion of Mellanie's prior option C
|
||||
- **Dissent:** None
|
||||
- **Cross-reference:** [D-128](#d-128-culture-implicit-in-starting-location--krenn-system-equals-krenn-culture) (Krenn culture as starting context)
|
||||
- **Cross-reference:** [D-128](#d-128-culture-implicit-in-starting-location--van-maanens-star-system-equals-van-maanens-star-culture) (Van Maanen's Star culture as starting context)
|
||||
|
||||
### D-122: All NPCs generated — no named hand-authored characters
|
||||
- **Date:** 2026-03-05
|
||||
@@ -327,7 +332,7 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio
|
||||
- **Dissent:** None on amendment
|
||||
- **Amendment attribution:** The two-mode distinction (build-time authoring tool vs. runtime background enhancement) and the six dialogue re-voicing quality constraints are Paula's contribution from LLM Voice Pipeline Workshop Round 3. The two-mode framing is the organizing principle: build-time mode inherits the original D-123 safety model (human review); runtime mode operates under a different safety model (three-layer fallback) that was validated in Spikes 1 and 2.
|
||||
- **Amended by:** [D-138](#d-138-llm-re-voicing-pipeline-for-npc-voice) (LLM Voice Pipeline Workshop, 2026-03-07)
|
||||
- **Cross-reference:** [D-121](#d-121-voice-is-culture-driven--job-as-modifier) (culture-primary voice), [D-128](#d-128-culture-implicit-in-starting-location--krenn-system-equals-krenn-culture) (culture profile as generator input), [D-140](#d-140-dialogue-re-voicing-quality-constraints--paulas-six-rules) (dialogue re-voicing quality constraints)
|
||||
- **Cross-reference:** [D-121](#d-121-voice-is-culture-driven--job-as-modifier) (culture-primary voice), [D-128](#d-128-culture-implicit-in-starting-location--van-maanens-star-system-equals-van-maanens-star-culture) (culture profile as generator input), [D-140](#d-140-dialogue-re-voicing-quality-constraints--paulas-six-rules) (dialogue re-voicing quality constraints)
|
||||
|
||||
### D-124: In-game ollama for live NPC dialogue — ~~deferred~~ SUPERSEDED by D-138
|
||||
- **Date:** 2026-03-05
|
||||
@@ -364,14 +369,14 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio
|
||||
- **Raised by:** Team Leader (Jeroen)
|
||||
- **Dissent:** None
|
||||
|
||||
### D-128: Culture implicit in starting location — Krenn System equals Krenn culture
|
||||
### D-128: Culture implicit in starting location — Van Maanen's Star equals Van Maanen's Star culture
|
||||
- **Date:** 2026-03-05
|
||||
- **Decision:** Culture is implicit in the starting bookmark location. The tycoon bookmark in the Krenn System means Krenn culture. The player does not select culture at character creation; it derives from where the bookmark places them. This resolves the culture-everywhere-but-nowhere tension: culture IS in the game from day one, it's just not a character creation slider. The Krenn System provides the cultural context; NPC generation uses regional culture as the primary vector.
|
||||
- **Decision:** Culture is implicit in the starting bookmark location. The tycoon bookmark in Van Maanen's Star means Van Maanen's Star culture. The player does not select culture at character creation; it derives from where the bookmark places them. This resolves the culture-everywhere-but-nowhere tension: culture IS in the game from day one, it's just not a character creation slider. Van Maanen's Star provides the cultural context; NPC generation uses regional culture as the primary vector.
|
||||
- **Rationale:** Seven of nine workshop agents independently flagged the tension between D-115 (culture deferred from creation) and D-121 (culture primary for voice). Implicit culture unblocks five downstream pipelines simultaneously: voice cards (Mellanie), culture profiles (Miri), NpcBlueprint culture field (Tyre), cultural visual grammar (Araminta), systems integration (Gestalt).
|
||||
- **Source:** Where's the Fun? Workshop, Round 5 Interview, Decision 16
|
||||
- **Raised by:** Team Leader (Jeroen)
|
||||
- **Dissent:** None
|
||||
- **Cross-reference:** [D-121](#d-121-voice-is-culture-driven--job-as-modifier) (culture-primary voice), [D-036](#d-036-sova-transit-district--krenn-system-as-v01-setting) (Krenn System canonical details)
|
||||
- **Cross-reference:** [D-121](#d-121-voice-is-culture-driven--job-as-modifier) (culture-primary voice), [D-036](#d-036-sova-transit-district--van-maanens-star-system-as-v01-setting) (Van Maanen's Star canonical details)
|
||||
|
||||
### D-129: NPC personality — traits + behavior first, relationships codified for systems
|
||||
- **Date:** 2026-03-05
|
||||
@@ -432,7 +437,7 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio
|
||||
- **Amends:** [D-123](#d-123-generative-ai-for-npc-content--build-time-authoring-tool-and-runtime-voice-pipeline) (scope extended from authoring tool to authoring + runtime)
|
||||
- **Supersedes:** [D-124](#d-124-in-game-ollama-for-live-npc-dialogue--deferred-superseded-by-d-138) (in-game AI no longer deferred)
|
||||
- **Resolves:** Q-057 (composable behavior generation), Q-012 (generation expansion method)
|
||||
- **Cross-reference:** [D-010](architecture.md#d-010) (information boundaries), [D-121](#d-121-voice-is-culture-driven--job-as-modifier) (culture-primary voice), [D-122](#d-122-all-npcs-generated--named-npcs-deferred) (all NPCs generated), [D-128](#d-128-culture-implicit-in-starting-location--krenn-system-equals-krenn-culture) (culture as generator input), [D-029](#d-029-population-entanglement-ratio--305020) (NPC tier model), [D-092](perception.md#d-092) (anchor lines), [D-140](#d-140-dialogue-re-voicing-quality-constraints--paulas-six-rules) (dialogue re-voicing quality constraints)
|
||||
- **Cross-reference:** [D-010](architecture.md#d-010) (information boundaries), [D-121](#d-121-voice-is-culture-driven--job-as-modifier) (culture-primary voice), [D-122](#d-122-all-npcs-generated--named-npcs-deferred) (all NPCs generated), [D-128](#d-128-culture-implicit-in-starting-location--van-maanens-star-system-equals-van-maanens-star-culture) (culture as generator input), [D-029](#d-029-population-entanglement-ratio--305020) (NPC tier model), [D-092](perception.md#d-092) (anchor lines), [D-140](#d-140-dialogue-re-voicing-quality-constraints--paulas-six-rules) (dialogue re-voicing quality constraints)
|
||||
|
||||
### D-139: Composable behavior primitives — three-layer assembly model
|
||||
- **Date:** 2026-03-13
|
||||
@@ -457,9 +462,9 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio
|
||||
- **D-140-R3 — Access tier feel must be preserved:** The social register appropriate to the D-028 access tier tag must survive re-voicing. `public` stays neutral-transactional; `peer` stays lateral-relaxed; `insider` stays familiar-complicit; `authority` stays institutional-asymmetric; `hostile` stays minimal-closed. The tag governs eligibility; the register governs feel. An `insider` line re-voiced into institutional language reads as `authority` to the player regardless of tag. Implementation: access tier injected as a constraint clause alongside the culture injector.
|
||||
- **D-140-R4 — Named entities are passthrough within output:** Any proper noun in the base text (NPC names, location names, faction names, technology terms) must appear verbatim in the re-voiced output. Named entities carry specific information — "Kael" and "that dock worker" are not interchangeable in an information-asymmetry game. Implementation: extraction step before re-voicing; protected entity list injected as a hard constraint. The extractor need not understand lore — capitalized terms are sufficient for identification.
|
||||
- **D-140-R5 — Relationship-specific lines are passthrough:** Any dialogue line naming a specific third-party NPC or describing a specific interpersonal event is not re-voiced. It is served as authored base text. These lines carry social information whose phrasing is load-bearing — the hesitation, the neutral delivery, the precise ambiguity are all authored intentionally. Re-voicing risks substituting the named NPC with a reference, dramatizing the event, or adding social judgment not in the original.
|
||||
- **D-140-R6 — Tell-context modifier cannot override culture register:** When a tell-context injector is active, it shapes emotional inflection within the culture register — it does not replace the register. A Krenn NPC with a Nervous tell still speaks in Krenn register (direct, minimal pleasantries, working-class pragmatic) while the content reflects nervous pressure. Culture is primary (D-121); tell-context is situational. Implementation: culture injector is always applied before tell-context modifier; tell-context is framed as inflection, not override.
|
||||
- **D-140-R6 — Tell-context modifier cannot override culture register:** When a tell-context injector is active, it shapes emotional inflection within the culture register — it does not replace the register. A Van Maanen's Star NPC with a Nervous tell still speaks in Van Maanen's Star register (direct, minimal pleasantries, working-class pragmatic) while the content reflects nervous pressure. Culture is primary (D-121); tell-context is situational. Implementation: culture injector is always applied before tell-context modifier; tell-context is framed as inflection, not override.
|
||||
- **Rationale:** D-138 established the architecture; these rules operationalize the quality floor for dialogue content specifically. Dialogue re-voicing carries higher information risk than behavior re-voicing — dialogue is direct player-NPC exchange where epistemic signals and relationship registers matter most. These rules scale with the pipeline: at 300 systems and thousands of NPCs, the prompt engineering layer must enforce these constraints programmatically, not through per-line human review. The constraints are formalized here so server team, copy team, and QA can reference them independently.
|
||||
- **Scaling note:** R4 (named entity extraction) requires a proper noun tagger that works across all culture naming conventions — Krenn names differ structurally from other cultures. The extractor approach (capitalized terms as proxy) is sufficient for the Krenn launch system but must be culture-aware for systems with non-capitalized or logographic naming conventions. This is a DLC-scope concern, not a v0.2 blocker.
|
||||
- **Scaling note:** R4 (named entity extraction) requires a proper noun tagger that works across all culture naming conventions — Van Maanen's Star names differ structurally from other cultures. The extractor approach (capitalized terms as proxy) is sufficient for the Van Maanen's Star launch system but must be culture-aware for systems with non-capitalized or logographic naming conventions. This is a DLC-scope concern, not a v0.2 blocker.
|
||||
- **Source:** LLM Voice Pipeline Workshop (2026-03-07), Paula Round 3 (`docs/workshops/llm-voice-pipeline/paula-round3.md`)
|
||||
- **Raised by:** Paula (LLM Voice Pipeline Workshop, Round 3)
|
||||
- **Dissent:** None
|
||||
@@ -510,7 +515,7 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio
|
||||
- Culture profiles: `content/global/culture-{name}.ron` (existing)
|
||||
- Location specs: `content/locations/{system}-{zone}.ron` (metadata only, no primitives)
|
||||
|
||||
- **Rationale:** The per-location primitive model (current `typical_behaviors` and per-location `behavior_primitives` arrays) does not scale to 300 systems. A Krenn farmer and a Vael farmer doing the same physical work in the same zone type are authoring the same primitives twice — the content that differs between them is the *how* (culture), not the *what* (the physical action). Separating these dimensions reduces authoring cost by an order of magnitude and ensures that adding a new system is a metadata operation, not a content sprint. The standalone readability constraint ensures the system degrades gracefully when the LLM is unavailable, which is a runtime reliability requirement for a 300-system game, not just a fallback policy.
|
||||
- **Rationale:** The per-location primitive model (current `typical_behaviors` and per-location `behavior_primitives` arrays) does not scale to 300 systems. A Van Maanen's Star farmer and a Vael farmer doing the same physical work in the same zone type are authoring the same primitives twice — the content that differs between them is the *how* (culture), not the *what* (the physical action). Separating these dimensions reduces authoring cost by an order of magnitude and ensures that adding a new system is a metadata operation, not a content sprint. The standalone readability constraint ensures the system degrades gracefully when the LLM is unavailable, which is a runtime reliability requirement for a 300-system game, not just a fallback policy.
|
||||
|
||||
- **Layer 3 grammar constraint:** When Gemma appends environmental flavor to Layer 1+2 assembled text, the flavor clause must grammatically attach as a prepositional phrase or coordinating conjunction. Absolute and participial phrases (e.g., "tool already in hand") require a leading comma separator. Culture-specific modifier clauses that use absolute-phrase construction must include the separator (e.g., ", tool already in hand") or be rewritten as prepositional form ("with tool in hand") to ensure clean assembly. This constraint applies to all culture profile modifier authoring.
|
||||
|
||||
@@ -519,8 +524,64 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio
|
||||
- **Dissent:** None
|
||||
- **Supersedes:** Per-location behavior pool approach from current zone spec format (`behavior_primitives` arrays on location RON files). Location files retain metadata but behavior content migrates to zone-type template files.
|
||||
- **Amends:** [D-139](#d-139-composable-behavior-primitives-three-layer-assembly) — D-139 defined the assembly mechanics (BehaviorPrimitive, BehaviorModifier, assemble_behaviors); this decision defines the content architecture that feeds it. D-139 remains the implementation record; D-142 is the content architecture record.
|
||||
- **Cross-reference:** [D-138](#d-138-llm-re-voicing-pipeline-for-npc-voice) (LLM pipeline — Layer 3 safety model), [D-140](#d-140-dialogue-re-voicing-quality-constraints--paulas-six-rules) (quality constraints — R4, R6 apply to Layer 3), [D-139](#d-139-composable-behavior-primitives-three-layer-assembly) (assembly mechanics), [D-121](#d-121-voice-is-culture-driven--job-as-modifier) (culture-primary voice), [D-036](#d-036-sova-transit-district--krenn-system-setting) (Krenn setting origin of first zone specs), [D-128](#d-128-culture-is-implicit-in-starting-location) (culture implicit in location)
|
||||
- **Cross-reference:** [D-138](#d-138-llm-re-voicing-pipeline-for-npc-voice) (LLM pipeline — Layer 3 safety model), [D-140](#d-140-dialogue-re-voicing-quality-constraints--paulas-six-rules) (quality constraints — R4, R6 apply to Layer 3), [D-139](#d-139-composable-behavior-primitives-three-layer-assembly) (assembly mechanics), [D-121](#d-121-voice-is-culture-driven--job-as-modifier) (culture-primary voice), [D-036](#d-036-sova-transit-district--van-maanens-star-system-as-v01-setting) (Van Maanen's Star setting origin of first zone specs), [D-128](#d-128-culture-implicit-in-starting-location--van-maanens-star-system-equals-van-maanens-star-culture) (culture implicit in location)
|
||||
|
||||
---
|
||||
|
||||
*41 decisions. Last updated: 2026-03-13 (D-142 zone-type template architecture — Sprint 26; D-140 dialogue re-voicing quality constraints — Sprint 26 #647; D-139 composable behavior primitives — Sprint 26 #633)*
|
||||
### D-143: GD calendar epoch — Gate Discovery (2300 AD) as year 0
|
||||
- **Date:** 2026-03-14
|
||||
- **Decision:** The Settled Reach uses the Gate Discovery (GD) calendar. Year 0 GD = 2300 AD. The game present is ~600 GD (~2900 AD). The secession occurred ~300 GD (~2600 AD). The five settlement waves span 0–600 GD. Earth dates (AD/BC) exist but are an Earth-internal reference most Reach residents wouldn't use. All `age_years` fields in the systems framework measure years before game present, not GD years directly.
|
||||
- **Rationale:** A civilization that seceded from Earth would not use an Earth religious calendar. The gate discovery is the founding event of the Reach — the moment human settlement beyond Sol became possible. 2300 AD provides enough time (~275 years from present day) for pre-gate spacefaring development including Mars terraforming (~2100-2200 AD, or roughly -200 to -100 GD).
|
||||
- **Implications:** Mars terraforming predates the gates — it's an Earth-only achievement, which adds to the "we built everything" obligation narrative. The ~12,900-year span of human civilization becomes a number only Earth institutions would cite. Reach residents measure history from the gates forward.
|
||||
- **Reference timeline:**
|
||||
|
||||
| Event | GD | AD |
|
||||
|---|---|---|
|
||||
| Human civilization origin | ~-10600 GD | ~10,000 BC |
|
||||
| Mars terraforming begins | ~-200 GD | ~2100 AD |
|
||||
| **Gate Discovery (epoch)** | **0 GD** | **2300 AD** |
|
||||
| Five settlement waves | 0–600 GD | 2300–2900 AD |
|
||||
| Secession | ~300 GD | ~2600 AD |
|
||||
| Game present | ~600 GD | ~2900 AD |
|
||||
- **Cross-reference:** [D-036](#d-036-sova-transit-district--van-maanens-star-system-as-v01-setting) (setting), Sol wiki page (GJ-0)
|
||||
|
||||
---
|
||||
|
||||
### D-144: Sirius (GJ 244A / S-067) as Reach capital — seat of the Concord Assembly
|
||||
- **Date:** 2026-03-14
|
||||
- **Decision:** Sirius is the political capital of the Settled Reach and the seat of the Concord Assembly. It is a hub system (5 apertures, 5 gate connections) in the institutional core, settled in wave_1, 8.6 ly from Sol. Its real-world prominence (brightest star in Earth's sky) maps to its in-setting political centrality. Marked as `generation_priority: campaign_anchor`.
|
||||
- **Rationale:** The capital needs to be a recognizable name that players immediately associate with importance. Sirius's existing topology (hub, 5 connections) already makes it structurally central. Wave_1 settlement means it has the institutional depth to house the Assembly. The symbolic weight of the brightest star as the seat of power writes itself.
|
||||
- **Cross-reference:** [D-143](#d-143-gd-calendar-epoch--gate-discovery-2300-ad-as-year-0) (timeline), [D-036](#d-036-sova-transit-district--van-maanens-star-system-as-v01-setting) (v0.1 setting)
|
||||
|
||||
---
|
||||
|
||||
### D-147: Aesthetic taste as character personality trait — shared root for cosmetic and environmental expression
|
||||
- **Date:** 2026-03-17
|
||||
- **Decision:** Characters have an `aesthetic_taste` personality trait (preferred palette, style leanings) that naturally expresses in both personal appearance and living space. This is NOT a cosmetic→apartment pipeline — hair color does not map to wall color. Instead, taste is a shared root: someone who gravitates toward teal will pick teal clothing AND own a teal vase. The apartment generator reads the character's taste trait (alongside economic position from #615 and cultural context from #679); the character customisation screen lets the player express that same taste through appearance choices. Neither system depends on the other — both read the same underlying trait.
|
||||
- **Rationale:** The naive approach (pipe cosmetic choices into apartment generator) creates a crude "team color" mapping that feels artificial. The elegant approach: taste is a personality attribute, like traits or skills. It manifests independently in multiple contexts. This keeps #619 (customisation) and #617 (apartment) architecturally independent while producing coherent identity expression. The taste trait is also reusable: NPC aesthetic preferences, gift preferences, "does this room feel like home" comfort checks, cultural style variations.
|
||||
- **Dependency implication:** #619 does NOT block #617. Both read the character's taste trait independently. The taste trait definition belongs to the character data model (server), not to either consuming system.
|
||||
- **Information boundary (D-010):** `aesthetic_taste` is a public trait — visible to other entities and the client. NPCs can observe the player's taste (e.g. gift relevance, comfort assessment). This is not private knowledge behind the information boundary.
|
||||
- **Source:** Sprint 27 planning pass — Q-WTF-040 resolution
|
||||
- **Raised by:** Project lead (taste-as-shared-root framing), Gestalt (ColorHint concept evolved into trait), Paula (culture + economics as primary apartment drivers)
|
||||
- **Dissent:** Ozzie argued for direct cosmetic→apartment pipeline. Tyre and Paula argued for no connection at all. The taste trait is the synthesis: connection through personality, not through data pipeline.
|
||||
- **Cross-reference:** [D-125](#d-125-world-is-quietly-responsive--gradient-of-caring-by-social-proximity) (quiet responsiveness), [D-134](architecture.md#d-134-full-character-customisation--hair-clothing-colors-at-tile-scale) (full character customisation), [D-136](architecture.md#d-136-first-settled-reach-moment-auto-generated-apartment--insert-activation) (first game moment), ticket #617 (auto-generated apartment), ticket #619 (full character customisation)
|
||||
- **Resolves:** Q-WTF-040
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
### Content Pattern Note: Generator-compatible overheard conversation format (ticket #664)
|
||||
- **Date:** 2026-03-17
|
||||
- **Status:** Content pattern noted — pending formal D-record (check with Qatux before claiming ID)
|
||||
- **Pattern:** `content/npc-conversations/overheard.ron` introduces a new content type: a pool of NPC-to-NPC overheard conversations parameterized by `role_pair` and `zone_types` (matching zone-type template role IDs from D-142). No named NPC references. Culture-neutral text that accepts culture modifier at assembly time. Replaces `overheard.yaml.deprecated` (v0.1 hand-authored pool with named NPCs, superseded by D-122).
|
||||
- **Format fields:** `id`, `zone_types[]`, `role_pair(a, b)`, `register` (Work|Social|Gossip), `relationship_context` (Colleague|Acquaintance|Friend|Superior|Subordinate), `topic`, `lines[(speaker:A|B, text)]`, `knowledge_payload (Option<String>)`
|
||||
- **Occlusion authoring rules:** D-078 rules apply unchanged — front-load key info, short declarative sentences, no pronoun-first openers, each turn self-contained.
|
||||
- **Runtime resolution:** Generator selects conversations where two nearby NPCs match `role_pair` and `zone_types`. Knowledge payload is exposed to player inference layer (partial occlusion reduces but cannot eliminate inference value of a fully-heard payload).
|
||||
- **Schema location:** `server/src/npc/overheard.rs :: OverheardPool` — TBD pending #663 struct changes.
|
||||
- **Raised by:** Paula (Sprint 27, ticket #664)
|
||||
- **Decision needed:** Whether to formalize this as D-NNN or treat as sub-pattern of D-142. Recommend D-record since it introduces the `knowledge_payload` field as a new ambient information delivery mechanism distinct from existing dialogue architecture (D-028).
|
||||
|
||||
---
|
||||
|
||||
*44 decisions. Last updated: 2026-03-17 (D-147 aesthetic taste trait; content pattern note for overheard.ron format added)*
|
||||
|
||||
@@ -58,7 +58,7 @@ How the team works: composition, naming, workflow.
|
||||
- `wiki/_meta/` — naming conventions, style guide, cross-reference index
|
||||
- **Design principles:** (1) Game-first, not encyclopedia-first — every entry serves the content pipeline. (2) Hierarchical with cross-references via IDs, not file paths. (3) Metadata-rich YAML frontmatter enabling programmatic queries. (4) Template-driven — new entries follow category templates. (5) Every entry has a `status` field: `proposed` → `draft` → `canonical`.
|
||||
- **Governance:** Miri owns wiki structure (new categories, templates, structural decisions). Anyone can create entries within their domain following templates. Qatux maintains the index and cross-references.
|
||||
- **Cross-reference:** Setting ([D-036](content.md#d-036-sova-transit-district--krenn-system-as-v01-setting))
|
||||
- **Cross-reference:** Setting ([D-036](content.md#d-036-sova-transit-district--van-maanens-star-system-as-v01-setting))
|
||||
- **Raised by:** Miri (Round 2 proposal with full directory structure and 7 YAML schemas), project lead (non-negotiable, directive #5)
|
||||
- **Dissent:** None
|
||||
|
||||
|
||||
@@ -187,7 +187,7 @@ Narrative, NPCs, dialogue, templates, setting, worldbuilding, and storyteller me
|
||||
- **Context:** Rural zone spec behaviors reference sky, weather, and diurnal heat — only valid on a planetary surface, not inside a station. The current `ZoneSpec` struct has no field for environment context. Without it, the generator can't distinguish surface-rural from station-rural, and behavior strings may be incoherent for the location.
|
||||
- **Question:** Should `ZoneSpec` include a `location_context` enum (Surface/Station/Vessel) that the generator uses to filter or modify environment-specific behaviors? Or should zone specs be authored per-context (e.g. `rural-surface.ron`, `rural-station.ron`)?
|
||||
- **Implications:** Affects all zone spec authoring going forward. The generator's ability to extrapolate from minimal input depends on knowing whether "rural" means open sky or sealed corridors.
|
||||
- **Cross-reference:** D-012 (chunk-based map), D-036 (Krenn/Sova setting), D-104/D-105 (heritage roots), #609 (zone identity spec)
|
||||
- **Cross-reference:** D-012 (chunk-based map), D-036 (Van Maanen's Star/Sova setting), D-104/D-105 (heritage roots), #609 (zone identity spec)
|
||||
- **Assigned to:** Tyre, Miri
|
||||
|
||||
---
|
||||
@@ -197,12 +197,35 @@ Narrative, NPCs, dialogue, templates, setting, worldbuilding, and storyteller me
|
||||
- **Status:** Resolved — D-139 (Sprint 26, #633)
|
||||
- **Raised:** Sprint 25, ticket #630 review discussion
|
||||
- **Priority:** High (blocks scaling beyond hand-authored content)
|
||||
- **Context:** Current behavior pools are hand-authored per culture×zone×role combination (`typical_behaviors` arrays in zone spec RON files). At ~50 behaviors per role × 4 roles × N zone types × M cultures, this is O(roles × zones × cultures) custom content. Each cell is effectively a unique location — "rural zone spec" is really "Krenn rural settlement content" with the name filed off. This doesn't scale to multiple cultures or zone types.
|
||||
- **Question:** Should the generator compose observable behaviors from smaller primitives instead of drawing from pre-written complete sentences? Proposed decomposition: (1) **role action templates** — generic observable stage directions per role, culture-neutral, (2) **culture modifier sets** — culture-specific flavoring (Krenn mannerisms, speech patterns, social norms) that overlay role actions, (3) **context tags** — on-shift, off-duty, break-room, social-site-type that filter/weight which behaviors are available. The generator assembles these at runtime.
|
||||
- **Context:** Current behavior pools are hand-authored per culture×zone×role combination (`typical_behaviors` arrays in zone spec RON files). At ~50 behaviors per role × 4 roles × N zone types × M cultures, this is O(roles × zones × cultures) custom content. Each cell is effectively a unique location — "rural zone spec" is really "Van Maanen's Star rural settlement content" with the name filed off. This doesn't scale to multiple cultures or zone types.
|
||||
- **Question:** Should the generator compose observable behaviors from smaller primitives instead of drawing from pre-written complete sentences? Proposed decomposition: (1) **role action templates** — generic observable stage directions per role, culture-neutral, (2) **culture modifier sets** — culture-specific flavoring (Van Maanen's Star mannerisms, speech patterns, social norms) that overlay role actions, (3) **context tags** — on-shift, off-duty, break-room, social-site-type that filter/weight which behaviors are available. The generator assembles these at runtime.
|
||||
- **Resolution:** Yes. D-139 defines the three-layer composable behavior model: `BehaviorPrimitive` (role actions with context tags), `BehaviorModifier` (culture overlays), and `BehaviorContext` (on-shift/off-duty/social/any filtering). The `assemble_behaviors()` function composes at runtime. Generator spike updated to use assembly when `behavior_primitives` are present, falling back to `typical_behaviors` for backward compatibility. Copy team (#634) authors the decomposed format.
|
||||
- **Cross-reference:** #630 (behavior pool expansion), #633 (server: composition engine), #634 (copy: decomposed content format), D-121 (voice is culture-driven), D-122 (all NPCs generated), D-139 (composable behavior assembly)
|
||||
- **Assigned to:** Tyre, Mellanie, Miri
|
||||
|
||||
---
|
||||
|
||||
*21 questions (7 resolved, 2 partially resolved, 12 open). Last updated: 2026-03-13 (Q-015 closed as obsolete per D-122)*
|
||||
### Q-WTF-039: Character creation — portrait render or tile-scale preview?
|
||||
- **Status:** Resolved → [D-146](scope.md#d-146-character-creation-preview--tile-scale-sprite-with-heavy-zoom)
|
||||
- **Question:** Does the character creation screen show a portrait render or a tile-scale in-world preview of the player character? Affects #618 (CK3-style character creation screen) team assignment: portrait render is a visual team deliverable; tile-scale preview is client.
|
||||
- **Resolution:** Tile-scale sprite with heavy zoom. The creation screen shows the game sprite rendered at high resolution, zoomed in so cosmetic details are clearly visible. Same approach as Rimworld: one rendering pipeline, no separate portrait system. #618 stays as a single client ticket. Resolved by [D-146](scope.md#d-146-character-creation-preview--tile-scale-sprite-with-heavy-zoom).
|
||||
- **Assigned to:** Tyre (architecture), confirmed by project lead
|
||||
- **Source:** Sprint 27 planning pass (2026-03-17)
|
||||
|
||||
### Q-WTF-040: Do creation choices trace into the generated apartment?
|
||||
- **Status:** Resolved → [D-147](content.md#d-147-aesthetic-taste-as-character-personality-trait--shared-root-for-cosmetic-and-environmental-expression)
|
||||
- **Question:** If the player picks hair colour and clothing in #619, does the generator use those choices when laying out the starting apartment (furniture style, colour palette)? Affects #617 scope and dependency.
|
||||
- **Resolution:** Not directly. Cosmetic choices do not pipeline into the apartment generator. Instead, characters have an `aesthetic_taste` personality trait that independently informs both appearance choices and living space. Someone who likes teal picks teal clothing AND owns a teal vase — but through shared taste, not data coupling. #619 does NOT block #617. Resolved by [D-147](content.md#d-147-aesthetic-taste-as-character-personality-trait--shared-root-for-cosmetic-and-environmental-expression).
|
||||
- **Assigned to:** Gestalt (systems), Paula (narrative), confirmed by project lead
|
||||
- **Source:** Sprint 27 planning pass (2026-03-17)
|
||||
|
||||
### Q-WTF-041: What should the player feel looking at the span gate from their apartment?
|
||||
- **Status:** Open
|
||||
- **Question:** The First Settled Reach moment (D-136) is apartment + insert activation. The player's apartment has a view of the span gate. What emotional register should this view hit? Awe? Routine familiarity? Unease? This shapes the visual design of the apartment scene and the insert's first content.
|
||||
- **Affects:** #626 (setting delivery — both layers). Blocks implementation until the emotional target is defined.
|
||||
- **Needs:** Gore (thematic framing), Ozzie (player experience), Miri (setting grounding), Araminta (visual direction)
|
||||
- **Source:** Where's the Fun? Workshop, Round 5 (2026-03-05)
|
||||
|
||||
---
|
||||
|
||||
*24 questions (10 resolved, 2 partially resolved, 12 open). Last updated: 2026-03-17 (Q-WTF-039, Q-WTF-040 resolved, Q-WTF-041 added; recount)*
|
||||
|
||||
@@ -85,8 +85,9 @@ Game concept, prototype boundaries, production pipeline, and feature decisions.
|
||||
- **Source:** Wiki Review Workshop R4
|
||||
|
||||
### Q-039: Gate topology generation
|
||||
- **Status:** Open
|
||||
- **Status:** Resolved → D-095 (amended), star-map.json, systems.db
|
||||
- **Question:** How should the world generator produce gate (wormhole) network topology for 300 worlds? The wiki-review workshop proposed: gate connectivity = Sacred (what connects), which worlds connect = Profane (what separates), accessible world count = Middle Kingdom (where the player navigates). Small-world network properties, hub-and-spoke vs mesh topology, and Sacred/Profane constraints on gate placement are all unresolved. D-012 covers chunk-based map architecture but predates the 300-world model.
|
||||
- **Resolution:** 301-system star map generated and populated. Topology is alien-determined (horizon station infrastructure), producing a small-world network with hub-and-spoke characteristics: 3 hub systems (5 apertures), junction nodes (3-4 apertures), loop members (2), and spur ends (1). The distribution was sculpted through iterative passes (`generate-star-map.py`, `sculpt-star-map.py`, `tune-star-map-topology.py`, `patch-core-sector.py`) to produce realistic network properties. Gate connections are stored in `star-map.json` (334 edges) and `server/data/systems.db` (system_gates table). Sacred/Profane framing resolved: connections are Sacred (alien-given, not human-chosen); what humans do with them is Profane.
|
||||
- **Assigned to:** Tyre, Nigel
|
||||
- **Source:** Wiki Review Workshop R4
|
||||
|
||||
@@ -100,4 +101,4 @@ Game concept, prototype boundaries, production pipeline, and feature decisions.
|
||||
|
||||
---
|
||||
|
||||
*15 questions (1 resolved, 3 partially resolved, 11 open). Last updated: 2026-03-07 (Q-058 added — voice pipeline Phase 3 dependency)*
|
||||
*15 questions (2 resolved, 3 partially resolved, 10 open). Last updated: 2026-03-14 (Q-039 resolved — gate topology generated)*
|
||||
|
||||
@@ -8,7 +8,7 @@ Tracked questions awaiting discussion or resolution. Split by domain, mirroring
|
||||
|------|--------|-----------|
|
||||
| [questions-architecture.md](questions-architecture.md) | Technical foundation | Q-001, Q-006, Q-009, Q-018, Q-019, Q-020, Q-021, Q-022, Q-023, Q-029, Q-030, Q-046, Q-059 |
|
||||
| [questions-perception.md](questions-perception.md) | Player observation | Q-003, Q-014, Q-016, Q-024, Q-025, Q-026, Q-051, Q-053, Q-054 |
|
||||
| [questions-content.md](questions-content.md) | Narrative, NPCs, setting | Q-010, Q-012, Q-013, Q-015, Q-017, Q-028, Q-031, Q-033, Q-040, Q-041, Q-042, Q-043, Q-044, Q-045, Q-047, Q-048, Q-049, Q-050, Q-052, Q-056, Q-057 |
|
||||
| [questions-content.md](questions-content.md) | Narrative, NPCs, setting | Q-010, Q-012, Q-013, Q-015, Q-017, Q-028, Q-031, Q-033, Q-040, Q-041, Q-042, Q-043, Q-044, Q-045, Q-047, Q-048, Q-049, Q-050, Q-052, Q-056, Q-057, Q-WTF-039, Q-WTF-040, Q-WTF-041 |
|
||||
| [questions-scope.md](questions-scope.md) | Game concept, prototype | Q-002, Q-004, Q-005, Q-007, Q-008, Q-011, Q-027, Q-032, Q-034, Q-035, Q-036, Q-037, Q-038, Q-039, Q-058 |
|
||||
|
||||
## Status Summary
|
||||
@@ -17,9 +17,9 @@ Tracked questions awaiting discussion or resolution. Split by domain, mirroring
|
||||
|--------|-------|----------|---------|------|
|
||||
| Architecture | 13 | 7 | 1 | 5 |
|
||||
| Perception | 9 | 5 | 1 | 3 |
|
||||
| Content | 21 | 5 | 2 | 14 |
|
||||
| Scope | 14 | 1 | 3 | 10 |
|
||||
| **Total** | **57** | **18** | **7** | **32** |
|
||||
| Content | 24 | 10 | 2 | 12 |
|
||||
| Scope | 15 | 2 | 3 | 10 |
|
||||
| **Total** | **61** | **24** | **7** | **30** |
|
||||
|
||||
*Updated 2026-03-05: Q-011 resolved (D-117/D-115/D-122), Q-034 partially resolved (D-117), Q-037 partially resolved (D-119), Q-033 partially resolved/reframed (D-122) — Where's the Fun? Workshop*
|
||||
|
||||
@@ -35,4 +35,4 @@ Tracked questions awaiting discussion or resolution. Split by domain, mirroring
|
||||
|
||||
When in doubt about where a question belongs: if it constrains **how we build**, it's architecture. If it defines **what the player observes or knows**, it's perception. If it defines **narrative, NPCs, dialogue, or setting**, it's content. If it defines **what we ship or how big it is**, it's scope.
|
||||
|
||||
*54 questions. Last updated: 2026-02-28 (split from single file into domain files).*
|
||||
*61 questions. Last updated: 2026-03-17 (Q-WTF-039, Q-WTF-040, Q-WTF-041 added to content domain; full recount).*
|
||||
|
||||
+29
-5
@@ -225,12 +225,12 @@ What we're building: game concept, design pillars, prototype definition, map spe
|
||||
|
||||
### D-115: Character creation scoped to skills + bookmark for v0.2
|
||||
- **Date:** 2026-03-05
|
||||
- **Decision:** v0.2 character creation is limited to two elements: skills (what the character is good at) and bookmark (which starting scenario/location the character inhabits). Family, culture, and religion are deferred from character creation. Culture is available in the game through the starting location (see [D-128](content.md#d-128-culture-implicit-in-starting-location--krenn-system-equals-krenn-culture)), not as a creation slider.
|
||||
- **Decision:** v0.2 character creation is limited to two elements: skills (what the character is good at) and bookmark (which starting scenario/location the character inhabits). Family, culture, and religion are deferred from character creation. Culture is available in the game through the starting location (see [D-128](content.md#d-128-culture-implicit-in-starting-location--van-maanens-star-system-equals-van-maanens-star-culture)), not as a creation slider.
|
||||
- **Rationale:** Skills and bookmark are the minimum needed to differentiate playthroughs. Adding family/culture/religion at creation gates content that is better delivered through gameplay. Religion in particular is NOT a game system (D-116).
|
||||
- **Source:** Where's the Fun? Workshop, Round 4 Interview, Decision 2
|
||||
- **Raised by:** Team Leader (Jeroen)
|
||||
- **Dissent:** None
|
||||
- **Cross-reference:** [D-128](content.md#d-128-culture-implicit-in-starting-location--krenn-system-equals-krenn-culture) (culture implicit in location)
|
||||
- **Cross-reference:** [D-128](content.md#d-128-culture-implicit-in-starting-location--van-maanens-star-system-equals-van-maanens-star-culture) (culture implicit in location)
|
||||
|
||||
### D-116: Religion is not a game system
|
||||
- **Date:** 2026-03-05
|
||||
@@ -242,7 +242,7 @@ What we're building: game concept, design pillars, prototype definition, map spe
|
||||
|
||||
### D-117: Tycoon is the v0.2 bookmark — zero investigation content
|
||||
- **Date:** 2026-03-05
|
||||
- **Decision:** The v0.2 bookmark is the tycoon — a small business owner in the Krenn System. v0.2 ships zero investigation content. The detective and smuggler framing from v0.1 is explicitly abandoned for v0.2. The tycoon naturally blends career models: active management, remote investment via insert (WFH model), and one-off deals (gig model). Investigation content will be revisited when the life-sim foundation is proven stable.
|
||||
- **Decision:** The v0.2 bookmark is the tycoon — a small business owner in Van Maanen's Star. v0.2 ships zero investigation content. The detective and smuggler framing from v0.1 is explicitly abandoned for v0.2. The tycoon naturally blends career models: active management, remote investment via insert (WFH model), and one-off deals (gig model). Investigation content will be revisited when the life-sim foundation is proven stable.
|
||||
- **Rationale:** v0.1's detective/smuggler frame produced the wrong game. The tycoon bookmark is thematically and mechanically richer: economic complicity, life-sim attachment loops, and narrative emergence from everyday decisions. Clean break from investigation content removes the frame that distorted v0.1.
|
||||
- **Source:** Where's the Fun? Workshop, Round 4 Interview, Decision 4
|
||||
- **Raised by:** Team Leader (Jeroen)
|
||||
@@ -259,7 +259,7 @@ What we're building: game concept, design pillars, prototype definition, map spe
|
||||
|
||||
### D-119: Generator spike confirmed for Sprint 25 — critical path
|
||||
- **Date:** 2026-03-05
|
||||
- **Decision:** The Sprint 25 generator spike is the confirmed first deliverable. If the generator cannot produce usable output, nothing else matters. If it can, everything else has a foundation. The generator proof-of-life gates all subsequent v0.2 development. Sprint 25 prerequisites that must exist before or during the spike: zone identity spec (Miri), one culture profile for Krenn System / Station Sova (Miri), and NpcBlueprint struct design (Tyre). Estimated timeline (Tyre): 7 sprints to proof-of-life playtest (generated location + legible characters + tycoon bookmark from creation to Day 3).
|
||||
- **Decision:** The Sprint 25 generator spike is the confirmed first deliverable. If the generator cannot produce usable output, nothing else matters. If it can, everything else has a foundation. The generator proof-of-life gates all subsequent v0.2 development. Sprint 25 prerequisites that must exist before or during the spike: zone identity spec (Miri), one culture profile for Van Maanen's Star / Station Sova (Miri), and NpcBlueprint struct design (Tyre). Estimated timeline (Tyre): 7 sprints to proof-of-life playtest (generated location + legible characters + tycoon bookmark from creation to Day 3).
|
||||
- **Rationale:** The v0.1 lesson established that building without a proven generator produces the wrong game. The sprint 25 spike tests whether the generator can produce auto-generated locations at scale with legible characters — the translation risk mitigation before anything else.
|
||||
- **Source:** Where's the Fun? Workshop, Round 5 Interview, Decision 22
|
||||
- **Raised by:** Tyre (proposal), Team Leader (confirmed)
|
||||
@@ -276,4 +276,28 @@ What we're building: game concept, design pillars, prototype definition, map spe
|
||||
|
||||
---
|
||||
|
||||
*24 decisions (15 active, 9 superseded). Last updated: 2026-03-05 (D-114–D-120 added; D-014, D-027, D-039, D-065, D-087, D-089, D-091 superseded — Where's the Fun? Workshop)*
|
||||
---
|
||||
|
||||
### D-145: Base building DLC — GJ 902 unclaimed moon as player settlement site
|
||||
- **Date:** 2026-03-15
|
||||
- **Decision:** The unsettled system GJ 902 (south_reach, hop 7, K-type dead-end) contains a habitable moon with an iron core orbiting a gas giant. This is deliberately left unclaimed as prep for a future base building DLC where players could claim and settle it. The marginally habitable planet in the same system provides contrast; the moon is the prize.
|
||||
- **Rationale:** Having a genuinely good piece of unclaimed real estate in the star map gives the base building DLC a natural entry point with existing lore context. The dead-end topology and quiet corridor explain why nobody has claimed it yet.
|
||||
- **Source:** Wiki writing session, 2026-03-15
|
||||
- **Raised by:** Jeroen
|
||||
|
||||
---
|
||||
|
||||
### D-146: Character creation preview — tile-scale sprite with heavy zoom
|
||||
- **Date:** 2026-03-17
|
||||
- **Decision:** The character creation screen shows the player character's game sprite at heavy zoom — the same top-down tile-scale rendering used in gameplay, rendered at high resolution so it holds up when zoomed in. No separate portrait rendering system. Cosmetic choices (hair, clothing, colors) update the zoomed sprite in real time. Rimworld uses this exact approach: the character customisation screen shows the same pawn sprite rendered larger, with clothing/equipment layers visible.
|
||||
- **Rationale:** The tile-scale sprite IS the player's character for the entire game. Showing it zoomed in character creation: (1) sets accurate expectations for in-game appearance, (2) reuses the production sprite/animation pipeline — zero new rendering infrastructure, (3) validates that cosmetic customisation (#619) reads correctly at game scale, (4) keeps #618 as a single client ticket with no visual-team split. A separate portrait system would be a one-off rendering context (different camera, lighting, asset pipeline) that serves no other game feature. "CK3-style" in the bookmark concept refers to the bookmark structure, not the portrait aesthetic. Portraits can be added later as an additive feature if needed.
|
||||
- **Team implication:** Ticket #618 (CK3-style character creation screen) stays as a single `client` team ticket. No split required.
|
||||
- **Source:** Sprint 27 planning pass — Q-WTF-039 resolution
|
||||
- **Raised by:** Tyre (architecture), Paula (narrative), Gestalt (systems), confirmed by project lead
|
||||
- **Dissent:** Ozzie argued for portrait render (emotional attachment). Overruled: tile-scale at heavy zoom provides sufficient character identity without a second rendering pipeline.
|
||||
- **Cross-reference:** [D-115](#d-115-character-creation-scoped-to-skills--bookmark-for-v02) (creation scope), [D-134](architecture.md#d-134-full-character-customisation--hair-clothing-colors-at-tile-scale) (full character customisation), [D-136](architecture.md#d-136-first-settled-reach-moment-auto-generated-apartment--insert-activation) (first game moment), ticket #618 (CK3-style character creation screen)
|
||||
- **Resolves:** Q-WTF-039
|
||||
|
||||
---
|
||||
|
||||
*26 decisions (17 active, 9 superseded). Last updated: 2026-03-17 (D-146 tile-scale heavy zoom)*
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
---
|
||||
title: "DevOps Procedures"
|
||||
description: "Build, test, lint, and CI procedures for the Settled Reach project — Makefile targets, worktree setup, server/client builds"
|
||||
type: architecture
|
||||
status: active
|
||||
---
|
||||
|
||||
# DevOps Procedures
|
||||
|
||||
Operational procedures for building, testing, and running The Settled Reach.
|
||||
|
||||
Vendored
+41
@@ -0,0 +1,41 @@
|
||||
---
|
||||
title: "" # Display name (e.g., "Fog Shader Architecture")
|
||||
description: "" # One-line summary for context filtering (e.g., "How fog-of-war rendering works: texture pipeline, shader, and performance")
|
||||
type: architecture # architecture | design | briefing | workshop | test-plan | test-report | audit
|
||||
status: active # active | draft | archived | superseded
|
||||
ticket: "" # Ticket reference (e.g., "#430")
|
||||
decision_refs: [] # e.g., [D-059, D-015]
|
||||
author: "" # Primary author agent or person
|
||||
created: YYYY-MM-DD
|
||||
updated: YYYY-MM-DD
|
||||
---
|
||||
|
||||
# {Title}
|
||||
|
||||
## Overview
|
||||
|
||||
{What this system/component is, why it exists, how it fits into the architecture.}
|
||||
|
||||
---
|
||||
|
||||
## Current State
|
||||
|
||||
{What is implemented now, what changed since the original design.}
|
||||
|
||||
---
|
||||
|
||||
## Design
|
||||
|
||||
{Technical details: data flow, interfaces, algorithms, constraints.}
|
||||
|
||||
---
|
||||
|
||||
## Decision References
|
||||
|
||||
{Link to relevant D-records and explain how they constrain this design.}
|
||||
|
||||
---
|
||||
|
||||
## Open Questions
|
||||
|
||||
{Anything unresolved. Link to Q-records if filed.}
|
||||
Vendored
+32
@@ -0,0 +1,32 @@
|
||||
---
|
||||
title: "" # Display name (e.g., "Gestalt - Project Briefing")
|
||||
description: "" # One-line summary for context filtering (e.g., "Systems design agent context: v0.2 pivot, generator-first, relevant decisions")
|
||||
type: briefing # architecture | design | briefing | workshop | test-plan | test-report | audit
|
||||
status: active # active | draft | archived | superseded
|
||||
agent: "" # Agent name this briefing is for
|
||||
updated: YYYY-MM-DD
|
||||
---
|
||||
|
||||
# {Agent} - Project Briefing
|
||||
|
||||
## Current Project State
|
||||
|
||||
{High-level project status and direction.}
|
||||
|
||||
---
|
||||
|
||||
## Key Changes for Your Role
|
||||
|
||||
{What's changed since the last briefing that affects this agent's work.}
|
||||
|
||||
---
|
||||
|
||||
## Relevant Decisions
|
||||
|
||||
{Bulleted list of D-records this agent needs to know about.}
|
||||
|
||||
---
|
||||
|
||||
## Current Sprint Tasks
|
||||
|
||||
{What this agent should focus on now.}
|
||||
Vendored
+35
@@ -0,0 +1,35 @@
|
||||
---
|
||||
title: "" # Display name (e.g., "Monologue Content Architecture")
|
||||
description: "" # One-line summary for context filtering (e.g., "Authoring contract for internal monologue: categories, triggers, volume targets")
|
||||
type: design # architecture | design | briefing | workshop | test-plan | test-report | audit
|
||||
status: active # active | draft | archived | superseded
|
||||
ticket: "" # Ticket reference (e.g., "#253")
|
||||
decision_refs: [] # e.g., [D-016, D-032]
|
||||
author: "" # Primary author agent or person
|
||||
created: YYYY-MM-DD
|
||||
updated: YYYY-MM-DD
|
||||
---
|
||||
|
||||
# {Title}
|
||||
|
||||
## Purpose
|
||||
|
||||
{What this document defines and who should use it.}
|
||||
|
||||
---
|
||||
|
||||
## Specification
|
||||
|
||||
{The design itself: rules, formats, examples, constraints.}
|
||||
|
||||
---
|
||||
|
||||
## Examples
|
||||
|
||||
{Concrete examples showing correct usage.}
|
||||
|
||||
---
|
||||
|
||||
## Decision References
|
||||
|
||||
{Link to relevant D-records and explain how they constrain this design.}
|
||||
Vendored
+28
@@ -0,0 +1,28 @@
|
||||
---
|
||||
title: "" # Display name (e.g., "Fog Rendering Visual Test Plan")
|
||||
description: "" # One-line summary for context filtering (e.g., "Test coverage for fog shader: gradient smoothness, alpha tuning, performance budgets")
|
||||
type: test-plan # architecture | design | briefing | workshop | test-plan | test-report | audit
|
||||
status: active # active | draft | archived | superseded
|
||||
ticket: "" # Ticket reference
|
||||
system_under_test: "" # What system/feature is being tested
|
||||
created: YYYY-MM-DD
|
||||
updated: YYYY-MM-DD
|
||||
---
|
||||
|
||||
# {Title}
|
||||
|
||||
## Scope
|
||||
|
||||
{What is being tested and what is excluded.}
|
||||
|
||||
---
|
||||
|
||||
## Test Cases
|
||||
|
||||
{Numbered test cases with expected results.}
|
||||
|
||||
---
|
||||
|
||||
## Environment
|
||||
|
||||
{Test environment requirements: live server, fixtures, headless, etc.}
|
||||
Vendored
+35
@@ -0,0 +1,35 @@
|
||||
---
|
||||
title: "" # Display name (e.g., "Where's the Fun? Workshop")
|
||||
description: "" # One-line summary for context filtering (e.g., "Multi-agent workshop on v0.2 direction: tycoon bookmark, generator-first, 24 decisions")
|
||||
type: workshop # architecture | design | briefing | workshop | test-plan | test-report | audit
|
||||
status: active # active | draft | archived | superseded
|
||||
participants: [] # Agent names involved
|
||||
rounds: 0 # Number of discussion rounds
|
||||
decisions_produced: [] # D-records produced (e.g., [D-114, D-117])
|
||||
created: YYYY-MM-DD
|
||||
updated: YYYY-MM-DD
|
||||
---
|
||||
|
||||
# {Title}
|
||||
|
||||
## Brief
|
||||
|
||||
{What question this workshop set out to answer.}
|
||||
|
||||
---
|
||||
|
||||
## Participants
|
||||
|
||||
{Who was involved and what role each played.}
|
||||
|
||||
---
|
||||
|
||||
## Outcomes
|
||||
|
||||
{Key decisions made, with D-record references.}
|
||||
|
||||
---
|
||||
|
||||
## Open Items
|
||||
|
||||
{Anything deferred or unresolved.}
|
||||
@@ -1,3 +1,15 @@
|
||||
---
|
||||
title: "Evaluation: Godot 4 Client + Rust Simulation Server Architecture"
|
||||
description: "Technical evaluation of Godot 4 + Rust (gdext + bevy_ecs) architecture — gdext maturity, ECS standalone usage, bridge design patterns, serialization, and risk register"
|
||||
type: architecture
|
||||
status: active
|
||||
ticket: ""
|
||||
decision_refs: [D-010, D-011, D-012, D-017, D-018, D-019]
|
||||
author: "Tyre"
|
||||
created: 2026-02-09
|
||||
updated: 2026-02-09
|
||||
---
|
||||
|
||||
# Evaluation: Godot 4 Client + Rust Simulation Server Architecture
|
||||
|
||||
**Author:** TYRE (Technical Architect)
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
---
|
||||
title: "Flying Taxi Over Cityscape — Architecture Analysis"
|
||||
description: "Feasibility analysis of flying vehicle gameplay using the three-scope z-layer architecture — confirms support with renderer gaps identified"
|
||||
type: architecture
|
||||
status: active
|
||||
ticket: ""
|
||||
decision_refs: [D-049]
|
||||
author: "Tyre"
|
||||
created: YYYY-MM-DD
|
||||
updated: YYYY-MM-DD
|
||||
---
|
||||
|
||||
# Flying Taxi Over Cityscape — Architecture Analysis
|
||||
|
||||
Author: Tyre (architecture) | Sprint: 6 | Ref: D-049, z-layer-gap-analysis.md
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
---
|
||||
title: "Fog Shader Architecture — #430 (D-059)"
|
||||
description: "Shader-driven fog system architecture — FogState autoload, fragment shader spec, texture pipeline (CPU blur + RGBA8), fog entities, and zone temperature tinting"
|
||||
type: architecture
|
||||
status: active
|
||||
ticket: "#430"
|
||||
decision_refs: [D-059, D-049, D-046, D-077, D-015]
|
||||
author: "Tyre"
|
||||
created: YYYY-MM-DD
|
||||
updated: YYYY-MM-DD
|
||||
---
|
||||
|
||||
# Fog Shader Architecture — #430 (D-059)
|
||||
|
||||
Ticket: #430 | Decision: D-059 | Sprint: 6
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
---
|
||||
title: "Gemma 2 Re-voicing: Compliance & Implementation Framework"
|
||||
description: "Licensing compliance, AI disclosure framework, modding policy, and operational safety architecture for Gemma 2 integration in the re-voicing dialogue system"
|
||||
type: architecture
|
||||
status: draft
|
||||
ticket: ""
|
||||
decision_refs: []
|
||||
author: "Gemini"
|
||||
created: 2026-03-07
|
||||
updated: 2026-03-07
|
||||
---
|
||||
|
||||
# Gemma 2 Re-voicing: Compliance & Implementation Framework
|
||||
|
||||
**Status:** Reference
|
||||
@@ -56,7 +68,7 @@ Mods can tap into **Step 1 (Semantic Core)** generation without access to **Step
|
||||
|
||||
- **Modder's Workflow:** Modders write standard, functional "Semantic Lines."
|
||||
- **The Hybrid System:** If a modded NPC is in a "Vanilla" location, the system can pull from a pre-cached library of "Cultural Injectors" that have already been safely pre-generated.
|
||||
- **The Result:** The modder doesn't get to prompt the LLM, but their characters can still use high-quality, pre-verified "Krenn" or "Ruthless" voice templates.
|
||||
- **The Result:** The modder doesn't get to prompt the LLM, but their characters can still use high-quality, pre-verified "Van Maanen's Star" or "Ruthless" voice templates.
|
||||
|
||||
### AI Dialogue & Modding Policy (EULA)
|
||||
|
||||
@@ -73,7 +85,7 @@ Mods can tap into **Step 1 (Semantic Core)** generation without access to **Step
|
||||
As we move into the technical validation phase (comparing Gemma 2 2B vs. Phi-3-mini), the spike must evaluate:
|
||||
|
||||
- **[ ] Safety Floor:** Do either model's internal filters refuse to process dark fantasy themes or combat logs?
|
||||
- **[ ] Stylistic Adherence:** How reliably do "Injector Clauses" (e.g., `[Bold]`, `[Krenn Culture]`) shift the output of the 2B model?
|
||||
- **[ ] Stylistic Adherence:** How reliably do "Injector Clauses" (e.g., `[Bold]`, `[Van Maanen's Star Culture]`) shift the output of the 2B model?
|
||||
- **[ ] Hardware Overhead:** Measured CPU/RAM impact of the background worker thread on target consumer hardware.
|
||||
- **[ ] Non-LLM Fallback:** Verification that the "Re-voicing" layer can be toggled OFF without breaking game state.
|
||||
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
---
|
||||
title: "InteractionMemory Knowledge Graph Schema Design"
|
||||
description: "Schema extension for tracking player-NPC conversation history in the knowledge graph — walk-away consequences, confrontation tracking, and monologue prerequisite integration"
|
||||
type: architecture
|
||||
status: active
|
||||
ticket: "#442"
|
||||
decision_refs: [D-041, D-064, D-063, D-028]
|
||||
author: ""
|
||||
created: YYYY-MM-DD
|
||||
updated: YYYY-MM-DD
|
||||
---
|
||||
|
||||
# InteractionMemory Knowledge Graph Schema Design
|
||||
|
||||
**Ticket:** #442 | **Sprint:** 7 | **Priority:** MEDIUM
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
---
|
||||
title: "Line Pool Format Specification"
|
||||
description: "YAML format spec for dialogue and monologue line pools — file structure, tag enums, four-layer filtering pipeline, ID format, validation rules, and Rust loader interface"
|
||||
type: architecture
|
||||
status: active
|
||||
ticket: "#308"
|
||||
decision_refs: [D-028, D-032, D-035, D-041]
|
||||
author: ""
|
||||
created: YYYY-MM-DD
|
||||
updated: YYYY-MM-DD
|
||||
---
|
||||
|
||||
# Line Pool Format Specification
|
||||
|
||||
**Ticket:** #308 | **Sprint:** 7 | **Priority:** HIGH (blocks #326, #305)
|
||||
|
||||
@@ -1,6 +1,18 @@
|
||||
---
|
||||
title: "Proposed Architecture: LLM-Powered Voice Synthesis"
|
||||
description: "Re-voicing architecture for dynamic NPC dialogue using a local LLM as a stylistic enhancement layer — injector system, priority queue, and optional AI-enhanced toggle"
|
||||
type: architecture
|
||||
status: superseded
|
||||
ticket: ""
|
||||
decision_refs: ["D-138"]
|
||||
author: "Gemini"
|
||||
created: 2026-03-07
|
||||
updated: 2026-03-07
|
||||
---
|
||||
|
||||
# Proposed Architecture: LLM-Powered Voice Synthesis
|
||||
|
||||
**Status:** Proposed
|
||||
**Status:** Superseded by [D-138](../../decisions/content.md#d-138-llm-re-voicing-pipeline-for-npc-voice) and [LLM Voice Pipeline Workshop](../workshops/llm-voice-pipeline/workshop-outcomes.md)
|
||||
**Author:** Gemini (synthesizing a design sparring session with Jeroen)
|
||||
**Date:** 2026-03-07
|
||||
|
||||
@@ -24,7 +36,7 @@ Our proposed solution is to treat dynamic dialogue not as a generation task, but
|
||||
|
||||
### Analogy: Dialogue as an `i18n` System
|
||||
|
||||
The core of this design is to think of character voice as a "language." Our simple, non-LLM template system provides the default "language" (`en-US`)—a clear, functional line of text that serves the gameplay. The LLM's job is to "translate" this line into a specific character's "language" (`en-KRENN-RUTHLESS`).
|
||||
The core of this design is to think of character voice as a "language." Our simple, non-LLM template system provides the default "language" (`en-US`)—a clear, functional line of text that serves the gameplay. The LLM's job is to "translate" this line into a specific character's "language" (`en-VMS-RUTHLESS`).
|
||||
|
||||
This immediately enables a powerful player-facing feature:
|
||||
|
||||
@@ -52,7 +64,7 @@ The character persona is constructed for the LLM using a manageable library of *
|
||||
- **Example `[Bold]`:** `"Your delivery is direct and confident."`
|
||||
|
||||
- **Cultural Injectors (`~5-10` clauses):** Mapped to origin, defining the cultural "flavor" or dialect.
|
||||
- **Example `[Krenn Culture]`:** `"Your speech is formal and avoids contractions."`
|
||||
- **Example `[Van Maanen's Star Culture]`:** `"Your speech is formal and avoids contractions."`
|
||||
|
||||
## 5. The Composition Engine: Priority & Blending
|
||||
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
---
|
||||
title: "Risk Assessment: Godot 4 + Rust/ECS via GDExtension"
|
||||
description: "Adversarial risk assessment of the Godot+Rust architecture — gdext instability, thread safety, ECS scaling concerns, alternative approaches, and kill switch criteria"
|
||||
type: architecture
|
||||
status: active
|
||||
ticket: ""
|
||||
decision_refs: [D-010]
|
||||
author: "Troblum"
|
||||
created: 2026-02-09
|
||||
updated: 2026-02-09
|
||||
---
|
||||
|
||||
# Risk Assessment: Godot 4 + Rust/ECS via GDExtension
|
||||
|
||||
**Author:** TROBLUM (Technical Consultant / Stress-Tester)
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
---
|
||||
title: "Seed Configuration Schema — Design Document"
|
||||
description: "Schema and generation algorithm for deterministic world instantiation from seed value — pool draws, template assignments, triangles, entanglement, contraband, and starting knowledge"
|
||||
type: architecture
|
||||
status: draft
|
||||
ticket: "#394"
|
||||
decision_refs: [D-010, D-024, D-025, D-027, D-029, D-034, D-035, D-036, D-037, D-041]
|
||||
author: "Tyre"
|
||||
created: 2026-02-13
|
||||
updated: 2026-02-13
|
||||
---
|
||||
|
||||
# Seed Configuration Schema — Design Document
|
||||
|
||||
**Ticket:** #394
|
||||
@@ -486,7 +498,7 @@ content/
|
||||
├── global/
|
||||
│ └── knowledge/
|
||||
│ └── contraband.yaml # Contraband type definitions
|
||||
├── campaigns/main/systems/krenn/stations/sova/districts/transit/
|
||||
├── campaigns/main/systems/van-maanens-star/stations/sova/districts/transit/
|
||||
│ ├── npcs/*.yaml # NPC profiles (candidates for pool draws)
|
||||
│ ├── triangles/*.yaml # Triangle definitions (instantiated by seed)
|
||||
│ ├── locations/*.yaml # Location definitions
|
||||
|
||||
@@ -0,0 +1,119 @@
|
||||
# v0.1 YAML Content Audit
|
||||
|
||||
**Date:** 2026-03-17
|
||||
**Ticket:** #672
|
||||
**Author:** Hoshe (QA)
|
||||
**Sprint:** 27
|
||||
|
||||
## Summary
|
||||
|
||||
63 YAML files surveyed across `server/content/`, `server/data/templates/`, and `client/data/`.
|
||||
|
||||
- **Deprecated:** 14 files — pure named NPC / detective arc content, no generator value
|
||||
- **Convertible:** 25 files — useful structure or data worth extracting to RON generator format
|
||||
- **Already-superseded:** 4 files — role-based templates predating RON format, replaced by zone-type RON files
|
||||
- **Infrastructure (no action):** 20 files — gauntlet, schemas, client UI, geography hierarchy, manifest
|
||||
|
||||
**Do not delete anything in this document.** Disposition requires explicit team review per ticket #672.
|
||||
|
||||
---
|
||||
|
||||
## Deprecated
|
||||
|
||||
Pure detective arc or named NPC content. No generator value. Recommend **archive** (move to `docs/archive/v01-content/`) rather than deletion.
|
||||
|
||||
| File | Why deprecated | Named NPCs |
|
||||
|------|---------------|------------|
|
||||
| `server/content/global/knowledge/ring.yaml` | All facts tied to named NPC actions (Kael's missed verification, Kael's corridor access, Voss/office confrontation, Sera's avoidance of Torek). No role-neutral facts. | Kael Davan, Sera Venn, Torek Lintar, Voss, Naia Tamm |
|
||||
| `server/content/global/knowledge/behavioral.yaml` | Named NPC behavioral tells: Kael's lying tell, Kael's behavior change, Sera's avoidance pattern, Sera's deflection topics, Sera's kiosk habit, Sera's manifest knowledge. All keyed to specific characters. | Kael, Sera, Torek |
|
||||
| `server/content/global/knowledge/relationship.yaml` | Named NPC relationship facts: Kael-Naia partnership, Torek's financial arrangement. No generic relationship fact patterns. | Kael, Naia, Torek |
|
||||
| `server/content/global/knowledge/entity-attributes.yaml` | Explicitly lists "Kael Davan" and "Kael" as example entity attribute values. The entire file is about named NPC attributes. | Kael Davan |
|
||||
| `server/content/global/knowledge/progress.yaml` | Detective investigation milestone facts (`characters: [detective]`). E.g. "Detective filed first manifest discrepancy evidence". Detective-exclusive, no smuggler or generator path. | detective archetype only |
|
||||
| `server/content/global/knowledge/awareness.yaml` | All facts reference the detective-vs-smuggler tension: `detective_presence`, `detective_investigating_ring`, `commission_audit_scheduled`. Not applicable to generated NPC knowledge. | detective, smuggler archetypes only |
|
||||
| `server/content/modules/tier1/smuggling_ring_v0_1.yaml` | Full v0.1 drama module with named NPC cast (Kael, Naia, Sera, Voss, Torek). Kael's exit plan, dual-lens player experience. The module schema itself (drama_module.schema.yaml) may be worth keeping, but this specific content instance is named-NPC only. | Kael Davan, Naia Tamm, Sera Venn, Voss, Torek Lintar, Devra |
|
||||
| `server/content/npc-conversations/overheard.yaml` | **Self-labeled LEGACY CONTENT** in the file header: "All entries in this file reference named NPCs… not served at runtime." Already flagged by the copy team; superseded by ticket #664 (zone-type-aware overheard generator). | Kael, Sera, Naia, Voss, Nils, Maret Korr, Lera |
|
||||
| `server/content/campaigns/main/systems/van-maanens-star/stations/sova/districts/transit/triangles/worried-partner.yaml` | Named NPC triangle: Kael Davan, Naia Tamm, Devra. Members reference `npc:kael-davan` directly. | Kael Davan, Naia Tamm, Devra |
|
||||
| `server/content/campaigns/main/systems/van-maanens-star/stations/sova/districts/transit/triangles/hub-power.yaml` | References Kael-adjacent narrative (hub power / ring pressure). Named NPC members. | Kael (indirect) |
|
||||
| `server/content/campaigns/main/systems/van-maanens-star/stations/sova/districts/transit/triangles/bar-tensions.yaml` | Named NPC triangle: Lera Sessik (bar owner), Resha (regular), Pell (bartender). Members reference `npc:lera-sessik` directly. | Lera Sessik, Resha, Pell |
|
||||
| `server/content/campaigns/main/systems/van-maanens-star/stations/sova/districts/transit/environmental/the-last-shift.yaml` | Environmental text for The Last Shift bar. 10 named NPC references. Lera, Sera, etc. character-specific text. | Lera, Sera |
|
||||
| `server/content/campaigns/main/systems/van-maanens-star/stations/sova/districts/transit/ticker/the-last-shift.yaml` | Ticker pool with `dual_lens` commentary for detective vs. smuggler archetypes specifically. Dual-lens framing assumes named player arcs. | smuggler/detective archetypes |
|
||||
| `server/content/campaigns/main/systems/van-maanens-star/stations/sova/districts/transit/routines/schedules.yaml` | Stub file (2 lines, comment only). No content. | none |
|
||||
|
||||
---
|
||||
|
||||
## Convertible
|
||||
|
||||
Useful data or structure worth extracting into the RON generator format. Disposition: **convert** (port specific patterns to RON zone-type files or generator schemas before archiving).
|
||||
|
||||
| File | What's worth extracting | Conversion target |
|
||||
|------|------------------------|-------------------|
|
||||
| `server/content/global/knowledge/knowledge.yaml` | Knowledge fact schema: `fact_id`, `description`, `typical_confidence`, `characters`, `notes`. Generic investigation knowledge patterns (ring structure, exit plan, organizational knowledge). The fact ID taxonomy and confidence level system are the most reusable. | Generator knowledge schema for zone-type fact pools |
|
||||
| `server/content/global/knowledge/social.yaml` | Social positioning fact patterns (`bar_regular_status`, `social_circle_member`, `faction_affiliation`). These are role-neutral patterns that any NPC social site could produce. | Role-based social knowledge pools |
|
||||
| `server/content/global/knowledge/location.yaml` | Location knowledge fact patterns: access points, operational significance, safe houses. The location knowledge taxonomy maps to zone-type location specs. | Zone-type location knowledge schemas |
|
||||
| `server/content/global/knowledge/world.yaml` | World-level knowledge patterns: faction presence, station governance, lattice tech context. These are world-building facts any NPC could know. | World knowledge pools for zone-type culture profiles |
|
||||
| `server/content/global/knowledge/contraband.yaml` | Contraband knowledge structure: ring existence, component types, operational methods. The schema structure (ring_exists → ring_lattice_components → ring_medical_components → ring_vault_location) is a good template for role-based secret knowledge escalation. | Role-based secret knowledge schemas for zone-type ring roles |
|
||||
| `server/content/global/enums/triggers.yaml` | Monologue trigger type enum: `enter_location`, `observe_npc`, `observe_event`, etc. These values are still used by the current monologue system (D-035). Named NPC examples in descriptions are incidental. | Already in use; clean up named NPC examples from descriptions only |
|
||||
| `server/content/global/enums/topics.yaml` | Dialogue topic types. The enum values themselves are still relevant for NPC conversation routing. Named NPC examples in descriptions are incidental. | Already in use; clean up named NPC examples from descriptions only |
|
||||
| `server/content/global/enums/motivations.yaml` | NPC functional motivation archetypes: HANDLER, OPERATOR, PERIPHERAL, OBSERVER, UNKNOWN. These role-archetypes map directly to zone-type role pools and could seed generator role taxonomy. | Zone-type role archetype vocabulary |
|
||||
| `server/content/global/enums/access-tiers.yaml` | Access tier definitions (public/private/restricted/secure/classified). The tier system is still used by the knowledge graph. Named NPC examples in tier descriptions can be removed. | Already in use; strip named NPC examples |
|
||||
| `server/content/global/enums/patterns.yaml` | NPC personality pattern types. Useful for zone-type culture profiles. | Zone-type culture profile generator |
|
||||
| `server/content/global/enums/situations.yaml` | Situation types for NPC behavioral context. Useful for zone-type activity schemas. | Zone-type activity/situation vocabulary |
|
||||
| `server/content/global/enums/activities.yaml` | Activity types used in daily routine generation. Still referenced by the current DailyRoutine system. | Already in use |
|
||||
| `server/content/global/enums/moods.yaml` | Mood type enum. Still used by MoodState system. | Already in use |
|
||||
| `server/content/global/enums/trust-tiers.yaml` | Trust tier definitions (0–10 scale with named tiers). Still used by RelationshipGraph trust levels. | Already in use |
|
||||
| `server/content/campaigns/main/systems/van-maanens-star/stations/sova/districts/transit/templates/smuggling-ring.yaml` | Social site template structure: capacity, roles, operational notes. The YAML schema maps to the RON `ZoneTypeTemplate.social_site_types` structure (D-142). Worth porting as a reference for `rural_agricultural.ron` social site entries. | RON zone-type social_site_types pattern |
|
||||
| `server/content/campaigns/main/systems/van-maanens-star/stations/sova/districts/transit/templates/bar.yaml` | Bar social site template. Same as above — schema maps to D-142 structure. | RON zone-type social_site_types for bar/hospitality zones |
|
||||
| `server/content/campaigns/main/systems/van-maanens-star/stations/sova/districts/transit/templates/logistics-hub.yaml` | Logistics hub template. Useful reference for `industrial_freight.ron` social site types. | RON zone-type social_site_types for industrial zones |
|
||||
| `server/content/global/factions/concord-assembly.yaml` | Faction structure definition. Faction identifiers, cultural values, and institutional roles are usable as zone-type culture profile ingredients. | Zone-type culture profile vocabulary (6 files) |
|
||||
| `server/content/global/factions/guardians-of-autonomy.yaml` | Same as above | Same |
|
||||
| `server/content/global/factions/syndics.yaml` | Same as above | Same |
|
||||
| `server/content/global/factions/the-ring.yaml` | Same as above | Same |
|
||||
| `server/content/global/factions/the-unbound.yaml` | Same as above | Same |
|
||||
| `server/content/global/factions/veil-institute.yaml` | Same as above | Same |
|
||||
| `server/content/campaigns/main/systems/van-maanens-star/stations/sova/districts/transit/environmental/the-terminal.yaml` | Environmental text for The Terminal logistics hub. 1 detective reference; the rest is location flavor text, signage, and readable objects. The environmental text schema is a useful template for zone-type flavor text pools. | Zone-type environmental text schema |
|
||||
| `server/content/campaigns/main/systems/van-maanens-star/stations/sova/districts/transit/environmental/maintenance-corridors.yaml` | Environmental text for maintenance corridors. No named NPC references. Pure location flavor. The schema (signs, terminals, documents, graffiti) maps to zone-type flavor text. | Zone-type environmental text schema |
|
||||
|
||||
---
|
||||
|
||||
## Already-superseded
|
||||
|
||||
These files were authored before the RON zone-type system. The zone-type RON files (`server/content/global/zone-types/`) and the D-142 `ZoneTypeTemplate` struct now serve the same purpose with better generator integration. Disposition: **delete** after confirming no Rust code still loads them.
|
||||
|
||||
| File | Superseded by |
|
||||
|------|--------------|
|
||||
| `server/data/templates/dock-worker.yaml` | Role definitions in `ZoneTypeTemplate.roles` within RON zone-type files |
|
||||
| `server/data/templates/logistics-hub.yaml` | Social site definitions in RON zone-type files |
|
||||
| `server/data/templates/terminal-social-site.yaml` | Social site definitions in RON zone-type files |
|
||||
| `server/data/templates/terminal-triangle-01.yaml` | Triangle definitions will move to RON format via #663 |
|
||||
|
||||
**Edge case:** verify with `grep -r "data/templates" server/src/` that no Rust code still loads these paths before deletion. The `generator_spike.rs` binary uses `content/global/` paths, not `data/templates/`.
|
||||
|
||||
---
|
||||
|
||||
## Infrastructure — no action required
|
||||
|
||||
These files are active infrastructure, not deprecated v0.1 content.
|
||||
|
||||
| File(s) | Status |
|
||||
|---------|--------|
|
||||
| `server/content/gauntlet/` (4 files) | Test world specifications — active, do not touch |
|
||||
| `server/content/schemas/drama_module.schema.yaml` | JSON schema for drama modules — may be reusable if drama module format is retained |
|
||||
| `server/content/content.yaml` | Server content manifest — active |
|
||||
| `project.yaml` | Project metadata — active |
|
||||
| `client/data/dialogue-theme.yaml` | Client UI theming — active |
|
||||
| `client/data/ui-strings.yaml` | Client UI microcopy — active |
|
||||
| `server/content/campaigns/main/campaign.yaml` | Campaign metadata (structural) — active |
|
||||
| `server/content/campaigns/main/systems/van-maanens-star/system.yaml` | Geographic hierarchy — active |
|
||||
| `server/content/campaigns/main/systems/van-maanens-star/stations/sova/station.yaml` | Geographic hierarchy — active |
|
||||
| `server/content/campaigns/main/systems/van-maanens-star/stations/sova/districts/transit/district.yaml` | Geographic hierarchy — active |
|
||||
| `server/content/campaigns/main/systems/van-maanens-star/stations/sova/districts/transit/locations/` (5 files) | Location definitions for Sova Transit — active world geography |
|
||||
|
||||
---
|
||||
|
||||
## Recommended disposition priority
|
||||
|
||||
1. **Immediate:** Strip named NPC examples from descriptions in `enums/triggers.yaml`, `enums/topics.yaml`, `enums/access-tiers.yaml` (these are actively used, the named examples create false impressions about the current system).
|
||||
2. **Before v0.2 content sprint:** Convert social site template YAMLs (bar, logistics-hub, smuggling-ring) to inform RON `ZoneTypeTemplate.social_site_types` entries. The schemas align closely.
|
||||
3. **v0.2 content sprint:** Archive `deprecated` files (move, don't delete — the named NPC narrative design remains valuable as reference material for future hand-authored arcs).
|
||||
4. **After #663 lands:** Verify `data/templates/` files are unreferenced, then delete.
|
||||
5. **After #664 lands:** Remove `npc-conversations/overheard.yaml` (already not served; #664 replaces it).
|
||||
@@ -1,3 +1,15 @@
|
||||
---
|
||||
title: "Z-Layer Rendering Pipeline — Gap Analysis"
|
||||
description: "Gap analysis for multi-floor z-layer rendering — y-sort occlusion contract, airborne rendering, lower floor compositing, fog interaction, and performance budgets"
|
||||
type: architecture
|
||||
status: active
|
||||
ticket: ""
|
||||
decision_refs: [D-049]
|
||||
author: "Tyre"
|
||||
created: YYYY-MM-DD
|
||||
updated: YYYY-MM-DD
|
||||
---
|
||||
|
||||
# Z-Layer Rendering Pipeline — Gap Analysis
|
||||
|
||||
Author: Tyre (architecture) | Sprint: 6 | Decision: D-049 amendment
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
---
|
||||
title: "Asset Pipeline Index"
|
||||
description: "Master index linking all asset pipelines (audio, visual, video) with structure and conventions"
|
||||
type: design
|
||||
status: active
|
||||
---
|
||||
|
||||
# Asset Pipeline Index
|
||||
|
||||
Centralized tracking for all production assets across pipelines. Each pipeline has its own index, palette (style bible), and per-category asset tables.
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
---
|
||||
title: "Audio Asset Template"
|
||||
description: "Row and detailed entry templates for audio asset documentation"
|
||||
type: design
|
||||
status: active
|
||||
---
|
||||
|
||||
# Audio Asset Template
|
||||
|
||||
## Table Row Format
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
---
|
||||
title: "Sprite Asset Template"
|
||||
description: "Row and detailed entry templates for sprite and visual asset documentation"
|
||||
type: design
|
||||
status: active
|
||||
---
|
||||
|
||||
# Sprite Asset Template
|
||||
|
||||
## Table Row Format
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
---
|
||||
title: "Video Asset Template"
|
||||
description: "Row and detailed entry templates for video asset documentation"
|
||||
type: design
|
||||
status: active
|
||||
---
|
||||
|
||||
# Video Asset Template
|
||||
|
||||
## Table Row Format
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
---
|
||||
title: "Audio Asset Pipeline"
|
||||
description: "Audio pipeline index with category status, generation tools, bus architecture, and sprint scope"
|
||||
type: design
|
||||
status: active
|
||||
---
|
||||
|
||||
# Audio Asset Pipeline
|
||||
|
||||
Status: **Active** — Sprint 7 (first audio sprint)
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
---
|
||||
title: "Ambient Audio Assets"
|
||||
description: "Zone-based ambient loop assets for station base and zone overlays with generation and layering specs"
|
||||
type: design
|
||||
status: active
|
||||
---
|
||||
|
||||
# Ambient — Audio Assets
|
||||
|
||||
Zone-based ambient loops. Station base plays globally; overlays crossfade based on player zone (hard tile boundary, 1.5-2s audio tween).
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
---
|
||||
title: "Audio Palette"
|
||||
description: "Sonic identity guide covering insert-tech and organic families, station palette, bus architecture, and generation approach"
|
||||
type: design
|
||||
status: active
|
||||
---
|
||||
|
||||
# Audio Palette
|
||||
|
||||
The sonic identity of The Settled Reach. Living document — updated as the audio language evolves.
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
---
|
||||
title: "SFX Audio Assets"
|
||||
description: "World sound effect assets for footsteps, NPC murmur, and environmental events with generation specs"
|
||||
type: design
|
||||
status: active
|
||||
---
|
||||
|
||||
# SFX — Audio Assets
|
||||
|
||||
World sound effects: footsteps, environmental events, impacts. Event-driven, often positional (AudioStreamPlayer2D).
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
---
|
||||
title: "UI Audio Assets"
|
||||
description: "Interface sound assets for cursor, implant, monologue chimes, and weapon aim with generation specs"
|
||||
type: design
|
||||
status: active
|
||||
---
|
||||
|
||||
# UI — Audio Assets
|
||||
|
||||
Interface sounds triggered by player interaction, insert systems, and cognitive events. Non-positional (AudioStreamPlayer). Routes to UI Sounds bus.
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
---
|
||||
title: "Video Asset Pipeline"
|
||||
description: "Video pipeline index for trailers and cutscenes, deferred to post-v0.1 milestones"
|
||||
type: design
|
||||
status: active
|
||||
---
|
||||
|
||||
# Video Asset Pipeline
|
||||
|
||||
Status: **Stub** — no video assets planned for v0.1.
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
---
|
||||
title: "Video Palette"
|
||||
description: "Motion and editing style guide for video production, to be established post-v0.1"
|
||||
type: design
|
||||
status: active
|
||||
---
|
||||
|
||||
# Video Palette
|
||||
|
||||
Status: **Stub** — no video production planned for v0.1.
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
---
|
||||
title: "Visual Asset Pipeline"
|
||||
description: "Visual pipeline index covering sprites, furniture, tilesets, icons, and effects with render pipeline overview"
|
||||
type: design
|
||||
status: active
|
||||
---
|
||||
|
||||
# Visual Asset Pipeline
|
||||
|
||||
Status: **Stub** — awaiting first visual sprint.
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
---
|
||||
title: "Visual Palette"
|
||||
description: "Art direction guide covering camera angle, entity colours, environmental neutrality, and functional warmth"
|
||||
type: design
|
||||
status: active
|
||||
---
|
||||
|
||||
# Visual Palette
|
||||
|
||||
Status: **Stub** — reference art direction workshop output for current guidance.
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
---
|
||||
title: "Architecture Audits"
|
||||
description: "Index and methodology reference for adversarial two-round architecture audits. Documents the review format, scope, reviewer roles, and audit history."
|
||||
type: audit
|
||||
status: active
|
||||
created: 2026-02-11
|
||||
updated: 2026-02-11
|
||||
---
|
||||
|
||||
# Architecture Audits
|
||||
|
||||
## Audit Pattern: Adversarial Two-Round Review with Code Review
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
---
|
||||
title: "Architecture Review — Sprint 1"
|
||||
description: "Full adversarial two-round architecture audit by Tyre and Troblum covering all 40 confirmed decisions, implementation, and risk profile. Architecture rated GREEN; knowledge graph and observer pipeline identified as underspecified critical systems."
|
||||
type: audit
|
||||
status: archived
|
||||
created: 2026-02-11
|
||||
updated: 2026-03-05
|
||||
---
|
||||
|
||||
# Architecture Review Audit — The Settled Reach
|
||||
|
||||
**Date:** 2026-02-11
|
||||
|
||||
Binary file not shown.
@@ -1,3 +1,12 @@
|
||||
---
|
||||
title: "Araminta - Project Briefing"
|
||||
description: "Visual art director responsible for zone visual grammar, tile palettes, entity color system, and placeholder art pipeline — generator-critical visual deliverables for v0.2"
|
||||
type: briefing
|
||||
status: active
|
||||
agent: Araminta
|
||||
updated: 2026-03-13
|
||||
---
|
||||
|
||||
# Araminta - Project Briefing
|
||||
Last updated: 2026-03-13
|
||||
|
||||
@@ -39,7 +48,7 @@ The visual system shifts from designing layouts for three hand-crafted social si
|
||||
- D-119: Generator spike Sprint 25 — Araminta's zone visual grammar is a prerequisite
|
||||
- D-122: All NPCs generated — visual system must handle generator-created entities
|
||||
- D-126: Full character customisation (hair, clothing, colours)
|
||||
- D-128: Culture implicit in starting location — visual language should communicate Krenn culture
|
||||
- D-128: Culture implicit in starting location — visual language should communicate Van Maanen's Star culture
|
||||
- D-131: First Settled Reach moment = apartment + insert activation — visual priority
|
||||
- D-135: Setting delivery via both layers (visual + insert) in parallel
|
||||
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
---
|
||||
title: "Dudley - Project Briefing"
|
||||
description: "Backend/engine implementation agent on standby — covers Rust simulation server, ECS model, and bevy_ecs architecture decisions"
|
||||
type: briefing
|
||||
status: active
|
||||
agent: Dudley
|
||||
updated: 2026-03-13
|
||||
---
|
||||
|
||||
# Dudley - Project Briefing
|
||||
Last updated: 2026-03-13
|
||||
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
---
|
||||
title: "Gestalt - Project Briefing"
|
||||
description: "Systems designer owning verb vocabulary, NpcBlueprint spec, skills-outcomes model, consequence mechanics, and behavior primitives for the v0.2 generator pipeline"
|
||||
type: briefing
|
||||
status: active
|
||||
agent: Gestalt
|
||||
updated: 2026-03-13
|
||||
---
|
||||
|
||||
# Gestalt - Project Briefing
|
||||
Last updated: 2026-03-13
|
||||
|
||||
@@ -6,7 +15,7 @@ The Settled Reach: top-down immersive sim, single-character perspective, asymmet
|
||||
|
||||
## v0.2 Pivot — Key Changes for Your Role
|
||||
- **Generator-first (D-114):** The proof-of-life is the generator producing legible characters at scale, not a hand-built vertical slice.
|
||||
- **Tycoon bookmark (D-117):** Zero investigation content for v0.2. Tycoon (small business owner) is the starting state in the Krenn System.
|
||||
- **Tycoon bookmark (D-117):** Zero investigation content for v0.2. Tycoon (small business owner) is the starting state in Van Maanen's Star.
|
||||
- **All NPCs generated (D-122):** No hand-authored named NPCs. The FRIEND pattern (D-034) survives as a generator template instruction set, not an authoring assignment.
|
||||
- **Broad verb vocabulary (D-130):** Life verbs, not tycoon-specific — all career types use the same verb set.
|
||||
- **Consequence model (D-132):** Dual-scale — Rimworld-style sharp events + DF-style slow accumulation simultaneously.
|
||||
|
||||
+10
-1
@@ -1,3 +1,12 @@
|
||||
---
|
||||
title: "Gore - Project Briefing"
|
||||
description: "Thematic design lead responsible for the 'is this enough?' central question, consequence arc design, contentment axis, and ensuring generated NPC lives carry moral weight"
|
||||
type: briefing
|
||||
status: active
|
||||
agent: Gore
|
||||
updated: 2026-03-13
|
||||
---
|
||||
|
||||
# Gore - Project Briefing
|
||||
Last updated: 2026-03-13
|
||||
|
||||
@@ -43,7 +52,7 @@ Consult `docs/sprints/` for active sprint briefing.
|
||||
### v0.2 thematic design:
|
||||
1. **Tycoon thematic frame** — what is the tycoon's version of "is this enough?" A small business owner who started something. What are they pursuing? What have they already accepted? Design the thematic question the tycoon bookmark poses.
|
||||
2. **Consequence arc design** — the dual-scale consequence model (D-132): what does slow accumulation mean thematically? Reputation as conscience. Debt as consequence. Relationship erosion as moral record. Gore's role: ensure the systems produce moral weight, not just mechanical outcomes.
|
||||
3. **Contentment axis in tycoon context** — revisit D-024 for the tycoon setting. What does NPC contentment mean for a logistics worker vs a small business owner in the Krenn System?
|
||||
3. **Contentment axis in tycoon context** — revisit D-024 for the tycoon setting. What does NPC contentment mean for a logistics worker vs a small business owner in Van Maanen's Star?
|
||||
4. **Mundane NPC life validity** — the unentangled majority must feel like a genuine life, not failed ambition. This is more important in v0.2 where ALL NPCs are generated and must carry this.
|
||||
|
||||
**Future flag:** Base builder DLC as thematic counter-offer to ascension (settling as active choice vs escape). Not now — but keep design space open.
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
---
|
||||
title: "Hoshe - Project Briefing"
|
||||
description: "QA and test infrastructure agent — owns generator output validation, integration tests, content schema validation, and legibility test criteria for the v0.2 generator spike"
|
||||
type: briefing
|
||||
status: active
|
||||
agent: Hoshe
|
||||
updated: 2026-03-13
|
||||
---
|
||||
|
||||
# Hoshe - Project Briefing
|
||||
Last updated: 2026-03-13
|
||||
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
---
|
||||
title: "Justine - Project Briefing"
|
||||
description: "CI and build pipeline agent — owns release pipeline, content validation infrastructure, pre-commit hooks, and build tooling for both client and server"
|
||||
type: briefing
|
||||
status: active
|
||||
agent: Justine
|
||||
updated: 2026-03-13
|
||||
---
|
||||
|
||||
# Justine - Project Briefing
|
||||
Last updated: 2026-03-13
|
||||
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
---
|
||||
title: "Mellanie - Project Briefing"
|
||||
description: "Copy and voice pipeline agent — owns culture-primary voice cards, tycoon monologue, AI content pipeline voice constraints, and authored UI/environmental text"
|
||||
type: briefing
|
||||
status: active
|
||||
agent: Mellanie
|
||||
updated: 2026-03-13
|
||||
---
|
||||
|
||||
# Mellanie - Project Briefing
|
||||
Last updated: 2026-03-13
|
||||
|
||||
@@ -32,13 +41,13 @@ The copy pipeline fundamentally shifts from hand-authoring specific NPC profiles
|
||||
- D-021: Official title "The Settled Reach"
|
||||
- D-028: Dialogue architecture — tagged line pool selection architecture survives
|
||||
- D-035: Converged tag taxonomy (6+3) — authoring format
|
||||
- D-036: Sova Transit District / Krenn System — setting for all content
|
||||
- D-036: Sova Transit District / Van Maanen's Star — setting for all content
|
||||
- D-037: Contraband = unlicensed lattice components — world content flavor
|
||||
- D-117: Tycoon bookmark — one starting type for v0.2 (not smuggler/detective)
|
||||
- D-121: Voice is culture-driven, job as modifier (inverted from prior assumption)
|
||||
- D-122: All NPCs generated — NPC content via AI templating, not hand-authoring
|
||||
- D-123: Generative AI for NPC content templating via culture vectors
|
||||
- D-128: Culture implicit in starting location — Krenn System = Krenn culture
|
||||
- D-128: Culture implicit in starting location — Van Maanen's Star = Van Maanen's Star culture
|
||||
- D-131: First Settled Reach moment = apartment + insert activation
|
||||
- D-134: Groundhog Day alarm clock homage (first day only) — Mellanie writes the monologue
|
||||
|
||||
@@ -46,8 +55,8 @@ The copy pipeline fundamentally shifts from hand-authoring specific NPC profiles
|
||||
Consult `docs/sprints/` for active sprint briefing.
|
||||
|
||||
### v0.2 voice pipeline (critical path items):
|
||||
1. **Culture-primary voice cards for Krenn System** — the primary pipeline deliverable. Blocked by Miri's culture profile. Once Miri delivers the Krenn culture profile (D-128), Mellanie formalises it as a voice card: tone register, formality norms, emotional expression, verbal tics, what Krenn people sound like under stress vs at ease. This feeds the AI content pipeline (D-123).
|
||||
2. **Job-as-modifier voice spec** — how does being a small business owner modify the Krenn base voice? What does a tycoon sound like vs a logistics worker vs a bar owner? Design the modifier layer (D-121).
|
||||
1. **Culture-primary voice cards for Van Maanen's Star** — the primary pipeline deliverable. Blocked by Miri's culture profile. Once Miri delivers the Van Maanen's Star culture profile (D-128), Mellanie formalises it as a voice card: tone register, formality norms, emotional expression, verbal tics, what Van Maanen's Star people sound like under stress vs at ease. This feeds the AI content pipeline (D-123).
|
||||
2. **Job-as-modifier voice spec** — how does being a small business owner modify the Van Maanen's Star base voice? What does a tycoon sound like vs a logistics worker vs a bar owner? Design the modifier layer (D-121).
|
||||
3. **Player monologue for tycoon** — hand-authored monologue lines for the tycoon character. Voice, tone, what they notice, what they care about. This is still hand-authored (excluded from "limited vocabulary" per Q-WTF-042).
|
||||
4. **Day 1 content** — alarm clock homage (D-134), insert activation moment (D-131). These are authored set-pieces.
|
||||
5. **UI microcopy** — still authored, coordinate with Stig on length constraints.
|
||||
|
||||
+21
-12
@@ -1,42 +1,51 @@
|
||||
---
|
||||
title: "Miri - Project Briefing"
|
||||
description: "Worldbuilding and lore agent — owns zone identity spec, Van Maanen's Star culture profile, setting briefs, and wiki taxonomy; critical-path prerequisites for the generator spike"
|
||||
type: briefing
|
||||
status: active
|
||||
agent: Miri
|
||||
updated: 2026-03-13
|
||||
---
|
||||
|
||||
# Miri - Project Briefing
|
||||
Last updated: 2026-03-13
|
||||
|
||||
## Current Project State
|
||||
The Settled Reach: top-down immersive sim, single-character perspective, asymmetric information core mechanic, Rimworld-style storyteller. 137+ confirmed decisions. Where's the Fun? Workshop complete (2026-03-05) — 24 decisions locked. v0.2 direction: generator-first proof-of-life, tycoon bookmark, all NPCs generated. Sprint 25 generator spike confirmed as critical path. **Miri's zone identity spec and Krenn culture profile are generator prerequisites — these are on the critical path.**
|
||||
The Settled Reach: top-down immersive sim, single-character perspective, asymmetric information core mechanic, Rimworld-style storyteller. 137+ confirmed decisions. Where's the Fun? Workshop complete (2026-03-05) — 24 decisions locked. v0.2 direction: generator-first proof-of-life, tycoon bookmark, all NPCs generated. Sprint 25 generator spike confirmed as critical path. **Miri's zone identity spec and Van Maanen's Star culture profile are generator prerequisites — these are on the critical path.**
|
||||
|
||||
## v0.2 Pivot — Key Changes for Your Role
|
||||
The workshop confirmed Sova Transit District as the v0.2 setting (tycoon bookmark in the Krenn System) and resolved the culture architecture gap in Miri's favour.
|
||||
The workshop confirmed Sova Transit District as the v0.2 setting (tycoon bookmark in Van Maanen's Star) and resolved the culture architecture gap in Miri's favour.
|
||||
|
||||
**What changes:**
|
||||
- D-027 vertical slice (smuggler + detective) is superseded. No named NPCs (Kael Davan, Sera Venn, Naia, Maret) as production content — D-122.
|
||||
- Detective institutional chain of command is deferred — no investigation content for v0.2.
|
||||
- Character selection roster (Q-011) reframed: skills + bookmark (CK3 style), not a character roster with named starting characters.
|
||||
- Culture is no longer deferred: D-128 resolves it. Culture is implicit in starting location. Krenn System = Krenn culture. The player doesn't select culture — they select a starting location and inherit it.
|
||||
- Culture is no longer deferred: D-128 resolves it. Culture is implicit in starting location. Van Maanen's Star = Van Maanen's Star culture. The player doesn't select culture — they select a starting location and inherit it.
|
||||
|
||||
**What survives and gains priority:**
|
||||
- Sova Transit District as setting — tycoon bookmark is HERE (D-117)
|
||||
- Krenn System setting details (D-036) — all canonical
|
||||
- Van Maanen's Star setting details (D-036) — all canonical
|
||||
- Zone identity and culture profile — now generator prerequisites, highest priority
|
||||
- Contraband spec (D-037) — survives as world content (storyline, not investigation objective for v0.2)
|
||||
|
||||
**New critical path items (Miri prerequisites for generator spike):**
|
||||
- Zone identity spec — what zone types mean in the Settled Reach's social vocabulary
|
||||
- One culture profile: Krenn System / Station Sova — blocks voice pipeline, NPC gen, AI content pipeline
|
||||
- One culture profile: Van Maanen's Star / Station Sova — blocks voice pipeline, NPC gen, AI content pipeline
|
||||
|
||||
## Decisions Relevant to Your Role
|
||||
- D-005: Core concept — asymmetric information, single-character perspective
|
||||
- D-016: Internal monologue — character voice, unreliable narrator
|
||||
- D-017: Perception modes — lore-consistent
|
||||
- D-021: Official title "The Settled Reach"
|
||||
- D-036: Sova Transit District / Krenn System — canonical setting (survives unchanged)
|
||||
- D-036: Sova Transit District / Van Maanen's Star — canonical setting (survives unchanged)
|
||||
- D-037: Contraband = unlicensed lattice components — world content, not v0.2 investigation objective
|
||||
- D-040: Wiki taxonomy structure
|
||||
- D-114: v0.2 proof-of-life = generator + graphics
|
||||
- D-117: Tycoon is the v0.2 bookmark — small business owner in Krenn System
|
||||
- D-117: Tycoon is the v0.2 bookmark — small business owner in Van Maanen's Star
|
||||
- D-119: Generator spike Sprint 25 — Miri's zone identity spec + culture profile are prerequisites
|
||||
- D-122: All NPCs generated, no named hand-authored characters
|
||||
- D-123: Generative AI for NPC content templating via culture vectors
|
||||
- D-128: Culture implicit in starting location — Krenn System = Krenn culture
|
||||
- D-128: Culture implicit in starting location — Van Maanen's Star = Van Maanen's Star culture
|
||||
- D-135: Setting delivery via both layers (visual + insert) in parallel
|
||||
|
||||
## Open Questions Assigned to You
|
||||
@@ -44,13 +53,13 @@ The workshop confirmed Sova Transit District as the v0.2 setting (tycoon bookmar
|
||||
- Q-WTF-041: What should the player feel looking at the span gate from their apartment?
|
||||
|
||||
## Current Priorities
|
||||
**Zone identity spec and Krenn culture profile are on the critical path. These must exist before/during the generator spike.**
|
||||
**Zone identity spec and Van Maanen's Star culture profile are on the critical path. These must exist before/during the generator spike.**
|
||||
|
||||
1. **Zone identity spec** — what zone types mean in the Settled Reach's social vocabulary. Logistics hub, residential, commercial, transit corridor, restricted industrial, social venue. What does each zone communicate about the people who inhabit it? Blocks: generator zone template parameters, Araminta tile palettes.
|
||||
2. **Krenn System / Station Sova culture profile** — working-class pragmatic, ~180 years settled, compact consonant-heavy naming. Formalise as a structured culture vector document: tone, formality registers, emotional expression norms, values, slang register, what Krenn people do/don't discuss with strangers. Blocks: voice pipeline (Mellanie), NPC gen (Tyre), AI content pipeline (D-123).
|
||||
2. **Van Maanen's Star / Station Sova culture profile** — working-class pragmatic, ~180 years settled, compact consonant-heavy naming. Formalise as a structured culture vector document: tone, formality registers, emotional expression norms, values, slang register, what Van Maanen's Star people do/don't discuss with strangers. Blocks: voice pipeline (Mellanie), NPC gen (Tyre), AI content pipeline (D-123).
|
||||
3. **Tycoon bookmark setting brief** — what does Station Sova look like from a small business owner's perspective? What kind of business? What economic pressures? What does the tycoon's apartment reflect about their position? Blocks: Ozzie's Day 1 experience brief, Araminta's zone visuals.
|
||||
4. **Wiki taxonomy maintenance** — update wiki entries (Krenn System, Station Sova, Sova Transit District) to reflect v0.2 framing. Remove investigation-specific details from primary entries.
|
||||
5. **NPC naming conventions confirmation** — Krenn naming conventions documented in D-036 apply to ALL generated NPCs. Confirm the convention is suitable for generator-scale name creation.
|
||||
4. **Wiki taxonomy maintenance** — update wiki entries (Van Maanen's Star, Station Sova, Sova Transit District) to reflect v0.2 framing. Remove investigation-specific details from primary entries.
|
||||
5. **NPC naming conventions confirmation** — Van Maanen's Star naming conventions documented in D-036 apply to ALL generated NPCs. Confirm the convention is suitable for generator-scale name creation.
|
||||
|
||||
## Key Documents
|
||||
- decisions/content.md — D-036 (setting), D-037 (contraband), D-121 through D-132
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
---
|
||||
title: "Nigel - Project Briefing"
|
||||
description: "Replayability designer — owns generator variety spec, anti-metagaming design, seed-based population variance, and replayability test criteria for v0.2"
|
||||
type: briefing
|
||||
status: active
|
||||
agent: Nigel
|
||||
updated: 2026-03-13
|
||||
---
|
||||
|
||||
# Nigel - Project Briefing
|
||||
Last updated: 2026-03-13
|
||||
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
---
|
||||
title: "Oscar - Project Briefing"
|
||||
description: "Networking/multiplayer agent on standby — covers client-server IPC architecture, deterministic simulation sync, and future multiplayer design"
|
||||
type: briefing
|
||||
status: active
|
||||
agent: Oscar
|
||||
updated: 2026-03-13
|
||||
---
|
||||
|
||||
# Oscar - Project Briefing
|
||||
Last updated: 2026-03-13
|
||||
|
||||
|
||||
+10
-1
@@ -1,3 +1,12 @@
|
||||
---
|
||||
title: "Ozzie - Project Briefing"
|
||||
description: "Player experience designer — owns NPC legibility gut-checks, Phase Zero warmth spec, wow moment design, and tycoon Day 1 experience brief"
|
||||
type: briefing
|
||||
status: active
|
||||
agent: Ozzie
|
||||
updated: 2026-03-13
|
||||
---
|
||||
|
||||
# Ozzie - Project Briefing
|
||||
Last updated: 2026-03-13
|
||||
|
||||
@@ -38,7 +47,7 @@ The workshop revealed a core framing error: the game was built as a detective pu
|
||||
- D-122: All NPCs generated, no named hand-authored characters
|
||||
- D-125: Quietly responsive world — gradient of caring by social proximity
|
||||
- D-126: Full character customisation (hair, clothing, colours)
|
||||
- D-128: Culture implicit in starting location (Krenn System = Krenn culture)
|
||||
- D-128: Culture implicit in starting location (Van Maanen's Star = Van Maanen's Star culture)
|
||||
- D-129: Traits + observable behaviour as NPC personality surface
|
||||
- D-131: First Settled Reach moment = apartment + insert activation
|
||||
- D-132: Consequence model dual-scale (sharp events + slow accumulation)
|
||||
|
||||
+11
-2
@@ -1,3 +1,12 @@
|
||||
---
|
||||
title: "Paula - Project Briefing"
|
||||
description: "NPC architecture designer — owns FRIEND pattern generator spec, triangle template shapes, relationship arc design, and population split rationale for generated NPCs"
|
||||
type: briefing
|
||||
status: active
|
||||
agent: Paula
|
||||
updated: 2026-03-13
|
||||
---
|
||||
|
||||
# Paula - Project Briefing
|
||||
Last updated: 2026-03-13
|
||||
|
||||
@@ -34,14 +43,14 @@ The Settled Reach: top-down immersive sim, single-character perspective, asymmet
|
||||
- D-033: Entity color = relationship to player
|
||||
- D-034: THE FRIEND pattern — survives as generator template, not authoring assignment
|
||||
- D-035: Converged tag taxonomy — tag architecture survives
|
||||
- D-036: Sova Transit District / Krenn System — setting survives (tycoon bookmark is Krenn System)
|
||||
- D-036: Sova Transit District / Van Maanen's Star — setting survives (tycoon bookmark is Van Maanen's Star)
|
||||
- D-041: Knowledge Graph Data Model — 4-level confidence hierarchy, contradiction detection
|
||||
- D-114: v0.2 proof-of-life = generator + graphics
|
||||
- D-117: Tycoon bookmark, zero investigation content
|
||||
- D-122: All NPCs generated, no named hand-authored characters
|
||||
- D-123: Generative AI for NPC content templating via culture vectors
|
||||
- D-125: Quietly responsive world — gradient of caring by social proximity
|
||||
- D-128: Culture implicit in starting location (Krenn System = Krenn culture)
|
||||
- D-128: Culture implicit in starting location (Van Maanen's Star = Van Maanen's Star culture)
|
||||
- D-129: Traits + observable behaviour as NPC personality surface; relationships Sims + Rimworld style
|
||||
- D-132: Consequence replaces complicity as thematic frame; fully emergent moral arc
|
||||
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
---
|
||||
title: "Qatux - Project Briefing"
|
||||
description: "Decision archivist and documentation maintainer — owns all D/Q/R-records in decisions/, agent briefings, discussion rounds, diagrams, and Qdrant indexing"
|
||||
type: briefing
|
||||
status: active
|
||||
agent: Qatux
|
||||
updated: 2026-03-13
|
||||
---
|
||||
|
||||
# Qatux - Project Briefing
|
||||
Last updated: 2026-03-13
|
||||
|
||||
|
||||
+11
-2
@@ -1,3 +1,12 @@
|
||||
---
|
||||
title: "Si - Project Briefing"
|
||||
description: "Sprint and project manager — owns sprint planning, ticket tracking, v0.2 critical path dependency chain, and CI pipeline awareness for definition of done"
|
||||
type: briefing
|
||||
status: active
|
||||
agent: Si
|
||||
updated: 2026-03-13
|
||||
---
|
||||
|
||||
# Si - Project Briefing
|
||||
Last updated: 2026-03-13
|
||||
|
||||
@@ -19,14 +28,14 @@ All open questions - tracks as tickets for assignment and progress monitoring.
|
||||
The generator spike (D-119) is Sprint 25 and is the first deliverable. Everything gates on it.
|
||||
|
||||
**Prerequisites that must exist before/during the generator spike:**
|
||||
1. Miri: Zone identity spec + Krenn culture profile — blocks voice, NPC gen, AI pipeline
|
||||
1. Miri: Zone identity spec + Van Maanen's Star culture profile — blocks voice, NPC gen, AI pipeline
|
||||
2. Araminta: Zone visual grammar, tile palettes — blocked by Miri zone identity spec
|
||||
3. Tyre: NpcBlueprint struct design — generator output format
|
||||
4. Mellanie: Culture-primary voice cards — blocked by Miri culture profile
|
||||
|
||||
**Dependency chain:**
|
||||
```
|
||||
Miri: Zone Identity Spec + Krenn Culture Profile
|
||||
Miri: Zone Identity Spec + Van Maanen's Star Culture Profile
|
||||
|-- Araminta: zone visual grammar, tile palettes
|
||||
|-- Tyre: generator zone template parameters, NpcBlueprint
|
||||
|-- Mellanie: culture-primary voice cards
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
---
|
||||
title: "Stig - Project Briefing"
|
||||
description: "Client UI developer — owns Godot 4 UI implementation including character customisation screen, insert/HUD, dialogue panels, and fog/entity rendering integration"
|
||||
type: briefing
|
||||
status: active
|
||||
agent: Stig
|
||||
updated: 2026-03-13
|
||||
---
|
||||
|
||||
# Stig - Project Briefing
|
||||
Last updated: 2026-03-13
|
||||
|
||||
|
||||
+10
-1
@@ -1,3 +1,12 @@
|
||||
---
|
||||
title: "Tiger - Project Briefing"
|
||||
description: "Localization agent on standby — covers tagged line pool translation scope, culture voice card translation units, and Van Maanen's Star naming transliteration guides"
|
||||
type: briefing
|
||||
status: active
|
||||
agent: Tiger
|
||||
updated: 2026-03-13
|
||||
---
|
||||
|
||||
# Tiger - Project Briefing
|
||||
Last updated: 2026-03-13
|
||||
|
||||
@@ -13,7 +22,7 @@ STANDBY. This briefing will be populated when localization work begins.
|
||||
- Q-008: Licensing (open question - affects localization scope and supported languages)
|
||||
- **D-028: Tagged line pool dialogue system** — Localization advantages: each line is tagged with context metadata (access tier, relationship level, trust threshold, mood). Translators receive rich context. Lines are pooled, not tree-branched — translation scope is predictable.
|
||||
- **D-035: Converged tag taxonomy (6+3)** — 9 tags per line provide rich context for translators. 13 situations, 9 topics, 8 moods. Translation scope predictable from pool size.
|
||||
- **D-036: Sova Transit District / Krenn System** — Krenn naming conventions (compact, consonant-heavy). Localization note: proper nouns and slang terms need transliteration guides per target language.
|
||||
- **D-036: Sova Transit District / Van Maanen's Star** — Van Maanen's Star naming conventions (compact, consonant-heavy). Localization note: proper nouns and slang terms need transliteration guides per target language.
|
||||
- **D-121: Voice is culture-driven, job as modifier** — localization implication: culture voice cards are the primary translation unit, not individual NPC profiles. Single tycoon character type in v0.2 (D-117) reduces monologue translation scope vs. prior smuggler/detective dual-pool model (D-032 superseded for v0.2).
|
||||
|
||||
## Key Documents
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
---
|
||||
title: "Troblum - Project Briefing"
|
||||
description: "Performance and stress-testing agent — owns simulation tier budget validation, bevy_ecs component performance profiling, and generator-at-scale evaluation"
|
||||
type: briefing
|
||||
status: active
|
||||
agent: Troblum
|
||||
updated: 2026-03-13
|
||||
---
|
||||
|
||||
# Troblum - Project Briefing
|
||||
Last updated: 2026-03-13
|
||||
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
---
|
||||
title: "Tyre - Project Briefing"
|
||||
description: "Lead architect and technical owner — owns NpcBlueprint struct, generator spike (Sprint 25), simulation tiers, knowledge graph implementation, and the full build pipeline"
|
||||
type: briefing
|
||||
status: active
|
||||
agent: Tyre
|
||||
updated: 2026-03-13
|
||||
---
|
||||
|
||||
# Tyre - Project Briefing
|
||||
Last updated: 2026-03-13
|
||||
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
---
|
||||
title: "Access Tier Shift Design Document"
|
||||
description: "Rules for when and how player character access tiers change with NPCs during v0.1 play"
|
||||
type: design
|
||||
status: draft
|
||||
ticket: "#328"
|
||||
decision_refs: [D-028, D-033, D-035, D-062, D-063, D-064, D-075]
|
||||
author: "Paula"
|
||||
created: 2026-02-20
|
||||
updated: 2026-02-20
|
||||
---
|
||||
|
||||
# Access Tier Shift Design Document
|
||||
|
||||
**Ticket:** #328 | **Feeds:** #169 (Layer 1 access tier filtering, S15)
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
---
|
||||
title: "Character Build: The Smuggler"
|
||||
description: "Full character definition for the smuggler playable character including knowledge, relationships, and voice"
|
||||
type: design
|
||||
status: draft
|
||||
ticket: "#180"
|
||||
decision_refs: [D-005, D-016, D-027, D-028, D-032, D-034, D-035, D-037, D-041, D-053, D-065]
|
||||
author: ""
|
||||
created: 2026-02-19
|
||||
updated: 2026-02-19
|
||||
---
|
||||
|
||||
# Character Build: The Smuggler
|
||||
|
||||
**Ticket:** #180 | **Priority:** Critical | **Sprint:** 12
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
---
|
||||
title: "Character Definition Schema"
|
||||
description: "Canonical schema for playable character definitions covering identity, knowledge, relationships, and presentation"
|
||||
type: design
|
||||
status: draft
|
||||
ticket: "#179"
|
||||
decision_refs: [D-005, D-016, D-027, D-028, D-032, D-034, D-035, D-041, D-065]
|
||||
author: ""
|
||||
created: 2026-02-19
|
||||
updated: 2026-02-19
|
||||
---
|
||||
|
||||
# Character Definition Schema
|
||||
|
||||
**Ticket:** #179 | **Priority:** Critical | **Sprint:** 12
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
---
|
||||
title: "Content Directory Structure"
|
||||
description: "Source of truth for the content/ directory layout, schemas, validation pipeline, and mod-compatible conventions"
|
||||
type: design
|
||||
status: active
|
||||
ticket: "#384"
|
||||
decision_refs: [D-024, D-027, D-028, D-032, D-034, D-035, D-036, D-049, D-057]
|
||||
author: ""
|
||||
created: 2026-02-19
|
||||
updated: 2026-02-19
|
||||
---
|
||||
|
||||
# Content Directory Structure — The Settled Reach v0.1
|
||||
|
||||
**Ticket:** #384 (blocks #385: directory skeleton, #386: schema definitions)
|
||||
@@ -141,9 +153,9 @@ districts/sova-transit/
|
||||
|
||||
```yaml
|
||||
# districts/sova-transit/district.yaml
|
||||
canonical_id: "krenn.sova.transit"
|
||||
canonical_id: "van-maanens-star.sova.transit"
|
||||
display_name: "Sova Transit District"
|
||||
system: "krenn"
|
||||
system: "van-maanens-star"
|
||||
station: "sova"
|
||||
district: "transit"
|
||||
description: >
|
||||
@@ -181,12 +193,12 @@ npc_count: 17
|
||||
|
||||
| Canonical ID | Resolves to |
|
||||
|---|---|
|
||||
| `krenn.sova.transit.npc.kael-davan` | `districts/sova-transit/npcs/kael-davan.yaml` |
|
||||
| `krenn.sova.transit.npc.sera-venn` | `districts/sova-transit/npcs/sera-venn.yaml` |
|
||||
| `krenn.sova.transit.location.the-terminal` | `districts/sova-transit/locations/the-terminal.yaml` |
|
||||
| `krenn.sova.transit.location.the-last-shift` | `districts/sova-transit/locations/the-last-shift.yaml` |
|
||||
| `krenn.sova.transit.triangle.hub-power` | `districts/sova-transit/triangles/hub-power.yaml` |
|
||||
| `krenn.sova.transit.triangle.worried-knowledge` | `districts/sova-transit/triangles/worried-knowledge.yaml` |
|
||||
| `van-maanens-star.sova.transit.npc.kael-davan` | `districts/sova-transit/npcs/kael-davan.yaml` |
|
||||
| `van-maanens-star.sova.transit.npc.sera-venn` | `districts/sova-transit/npcs/sera-venn.yaml` |
|
||||
| `van-maanens-star.sova.transit.location.the-terminal` | `districts/sova-transit/locations/the-terminal.yaml` |
|
||||
| `van-maanens-star.sova.transit.location.the-last-shift` | `districts/sova-transit/locations/the-last-shift.yaml` |
|
||||
| `van-maanens-star.sova.transit.triangle.hub-power` | `districts/sova-transit/triangles/hub-power.yaml` |
|
||||
| `van-maanens-star.sova.transit.triangle.worried-knowledge` | `districts/sova-transit/triangles/worried-knowledge.yaml` |
|
||||
|
||||
### Type Segment Values
|
||||
|
||||
@@ -274,7 +286,7 @@ global/
|
||||
patterns.yaml # 9 thematic patterns (System A)
|
||||
motivations.yaml # 6 functional motivations (System B)
|
||||
regions/ # Star system / station metadata
|
||||
krenn.yaml # Krenn System profile (D-036)
|
||||
van-maanens-star.yaml # Van Maanen's Star profile (D-036)
|
||||
```
|
||||
|
||||
### Global Content Rationale
|
||||
@@ -432,7 +444,7 @@ wiki/
|
||||
locations/ # Location descriptions
|
||||
contraband/ # Contraband profiles
|
||||
technology/ # Technology descriptions
|
||||
world/ # World-building (Krenn System, Sova Station)
|
||||
world/ # World-building (Van Maanen's Star, Sova Station)
|
||||
authoring/ # Authoring guides and style references
|
||||
index.md # Wiki index
|
||||
```
|
||||
@@ -517,7 +529,7 @@ content/
|
||||
patterns.yaml
|
||||
motivations.yaml
|
||||
regions/
|
||||
krenn.yaml
|
||||
van-maanens-star.yaml
|
||||
districts/
|
||||
sova-transit/
|
||||
district.yaml
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
---
|
||||
title: "Content Structure — Canonical Template (v0.2+)"
|
||||
description: "Post-cleanup canonical directory layout for campaign content, superseding v0.1 content-directory-structure"
|
||||
type: design
|
||||
status: active
|
||||
ticket: "#656"
|
||||
decision_refs: [D-117, D-138]
|
||||
author: ""
|
||||
created: 2026-03-13
|
||||
updated: 2026-03-13
|
||||
---
|
||||
|
||||
# Content Structure — Canonical Template (v0.2+)
|
||||
|
||||
**Created:** 2026-03-13 (Sprint 26, #656 cleanup)
|
||||
@@ -26,7 +38,7 @@ content/
|
||||
campaigns/
|
||||
main/
|
||||
systems/
|
||||
{system-slug}/ # e.g. krenn/
|
||||
{system-slug}/ # e.g. van-maanens-star/
|
||||
system.yaml # System metadata
|
||||
stations/
|
||||
{station-slug}/ # e.g. sova/
|
||||
@@ -129,7 +141,7 @@ content/campaigns/main/systems/{system-slug}/
|
||||
|
||||
Culture files are the primary input for the voice pipeline. One file per culture, living at `content/global/culture-{name}.ron`.
|
||||
|
||||
**Use `content/global/culture-krenn.ron` as the authoring template — not `culture-krenn.example.ron`.** The example file is an older stub without voice pipeline fields.
|
||||
**Use `content/global/culture-van-maanens-star.ron` as the authoring template — not `culture-van-maanens-star.example.ron`.** The example file is an older stub without voice pipeline fields.
|
||||
|
||||
### Required fields (must be present)
|
||||
|
||||
@@ -201,18 +213,18 @@ voice_persona: Some(
|
||||
),
|
||||
```
|
||||
|
||||
Example negatives for Krenn (currently explicit in `culture-krenn.ron`):
|
||||
Example negatives for Van Maanen's Star (currently explicit in `culture-van-maanens-star.ron`):
|
||||
- Never corporate or institutional language
|
||||
- Never effusive, never polished, never deferential to rank
|
||||
- Never flowery or verbose
|
||||
- Never use family names in casual conversation
|
||||
- Never express deference to authority that hasn't earned it
|
||||
|
||||
`culture-krenn.ron` has a full NEVER block in `voice_persona`. All three culture files (Krenn, Vael, Osse) now include explicit NOT-lists. *(Updated Sprint 26 #653)*
|
||||
`culture-van-maanens-star.ron` has a full NEVER block in `voice_persona`. All three culture files (Van Maanen's Star, Vael, Osse) now include explicit NOT-lists. *(Updated Sprint 26 #653)*
|
||||
|
||||
### behavior_modifiers: status
|
||||
|
||||
All culture files (`culture-krenn.ron`, `culture-vael.ron`, `culture-osse.ron`) now populate `behavior_modifiers` with 11-12 clauses across all seven hint categories (`work_pace`, `physical_manner`, `social_signal`, `task_completion`, `environmental_scan`, `offduty_posture`, `authority_response`). The decomposed behavior system (#633/#634) shipped in Sprint 26. New culture files must populate this field. *(Updated Sprint 26 #634)*
|
||||
All culture files (`culture-van-maanens-star.ron`, `culture-vael.ron`, `culture-osse.ron`) now populate `behavior_modifiers` with 11-12 clauses across all seven hint categories (`work_pace`, `physical_manner`, `social_signal`, `task_completion`, `environmental_scan`, `offduty_posture`, `authority_response`). The decomposed behavior system (#633/#634) shipped in Sprint 26. New culture files must populate this field. *(Updated Sprint 26 #634)*
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
---
|
||||
title: "Contraband Specification — Lattice Components & Supply Chain"
|
||||
description: "Defines contraband types, supply chain mechanics, terminology, and detection/evasion methods for the smuggling ring"
|
||||
type: design
|
||||
status: active
|
||||
ticket: "#321"
|
||||
decision_refs: [D-017, D-036, D-037]
|
||||
author: "Miri"
|
||||
created: 2026-02-19
|
||||
updated: 2026-02-19
|
||||
---
|
||||
|
||||
# Contraband Specification — Lattice Components & Supply Chain
|
||||
**Ticket:** #321
|
||||
**Author:** Miri
|
||||
@@ -151,7 +163,7 @@ This question does not have a clean answer. The ring knows it doesn't have a cle
|
||||
From what's inferrable:
|
||||
- Local distribution: station residents, some district workers, a few customers from other districts on Sova
|
||||
- Off-station: the span gate delivers cargo to the planetary freight depot on Velen. Some product continues via Velen's distribution network to system population centers.
|
||||
- Regional: occasional higher-value shipments routed through the system to other ring nodes beyond Krenn System. The ring doesn't manage this leg.
|
||||
- Regional: occasional higher-value shipments routed through the system to other ring nodes beyond Van Maanen's Star. The ring doesn't manage this leg.
|
||||
|
||||
**The v0.1 scope:** The detective's investigation is concerned with the Sova Transit District operation. The broader network is context, not target. Discovering that the ring is part of a larger network is an investigation milestone, not the investigation conclusion.
|
||||
|
||||
|
||||
@@ -0,0 +1,353 @@
|
||||
# Cultural Migration Pressure Patterns — Governing Guidelines
|
||||
**Author:** Paula
|
||||
**Status:** Governing guidelines — outer sector system-writing reference
|
||||
**Created:** 2026-03-14
|
||||
**Scope:** All 301 systems. Core (~28 systems) already fully written. This document governs identity assignment for the remaining ~273 outer systems.
|
||||
|
||||
---
|
||||
|
||||
## Purpose
|
||||
|
||||
This document establishes the logic of cultural pressure that shaped the Settled Reach's outer sectors over six centuries of settlement. It is not a system-by-system assignment. It is a set of tendencies, gradients, and overlapping pressures that future writers use to give outer systems coherent identity without making the Reach feel like a patchwork of arbitrary decisions.
|
||||
|
||||
The central claim: the Reach is not culturally uniform, and its non-uniformity is not random. People migrated along gate paths because gates made it possible to follow your neighbors. Corporations extended logistics networks outward from their headquarters because supply chains flow along existing routes. Political communities sought compatible neighbors because governance philosophies find each other across hops. These pressures ran simultaneously, reinforced each other, sometimes contradicted each other, and produced a human geography that feels organic precisely because it is the product of many small individual decisions that aggregated into large patterns.
|
||||
|
||||
What this document gives you:
|
||||
- The four major cultural corridors and the logic that created them
|
||||
- The five industrial corridors and how they overlay on cultural ones
|
||||
- The political philosophy gradient and where each governance type concentrates
|
||||
- The breakaway direction: which sector's outer systems increasingly reject Assembly authority, who is driving that, and how it expresses itself
|
||||
- The authority gradient from Gateway to frontier fringe
|
||||
- Guidelines for exception density — how often to break the pattern, and when breaking it tells a story
|
||||
|
||||
---
|
||||
|
||||
## Foundational Logic: Why Migration Followed Gate Paths
|
||||
|
||||
Human migration patterns in the Reach were shaped by a single constraint that has no Earth analog: you can only go where a gate opens. This sounds obvious. Its implications are not.
|
||||
|
||||
On Earth, migration spread in all directions simultaneously from population centers. In the Reach, migration spread from Gateway outward along discrete paths. Early migrants did not choose a direction — they chose a gate, which determined their neighbors, which determined the cultural environment of their first year, which shaped who else followed. Cultural clustering is not a matter of deliberate planning. It is the product of chain migration along fixed paths, exactly as it operated in pre-industrial Earth but with the additional constraint that the path network was fixed at its founding and could never be altered.
|
||||
|
||||
The practical consequence: a community of, say, South Asian heritage at hop 3 in the east_reach attracted South Asian migrants from Gateway who had relatives there. That community at hop 3 founded a daughter colony at hop 4 along the same branch, which drew from the same cultural pool. Six hundred years later, the east_reach's innermost systems have a detectable South Asian cultural majority — not because anyone planned it, but because chain migration amplifies initial conditions.
|
||||
|
||||
This process is powerful and noisy. It is powerful because it operates over six centuries and hundreds of generations. It is noisy because:
|
||||
- Individual founders can be anyone regardless of the dominant cultural stream
|
||||
- Economic pull (resource finds, corporate employment, favorable conditions) draws migrants independent of cultural affinity
|
||||
- The Reach's founding ethic has always been strongly assimilationist — the Concord Assembly actively discouraged ethnically or nationally homogenous colonies during Wave 1 and 2
|
||||
- Catastrophe (company abandonment, Gate Silence events, population collapse) can reset cultural composition entirely
|
||||
- Perpetual-class founders sometimes persisted across waves, carrying earlier cultural composition into later settlements
|
||||
|
||||
The result is corridors, not blocks. A cultural corridor means the dominant cultural inflection in a region — the language that shows up in place names, the food culture, the architectural forms, the holiday calendar — not a monoculture. Expect blending at the margins and exceptions throughout.
|
||||
|
||||
Critically: not every system in a corridor needs a cultural identity at all. Systems can share any combination of culture, politics, and economics with their neighbours — or none. A democratic mining system next to a democratic Australian-heritage mining system: same politics, same economy, different cultural flavour. A Portuguese-heritage fishing world next to an unlabelled transit hub: different culture, different economy, but both Assembly-compliant. The axes are independent. A corridor might be 40-50% culturally inflected, 20-30% sharing politics or economics with neighbours but culturally generic, and the rest exceptions or mixed. All patterns track mixed, never exclusively.
|
||||
|
||||
Cultural mixing is bidirectional. A Chinese founding family on the Commonwealth (north) axis is normal — not an exception that needs special explanation. A Welsh mining cooperative in east_reach is normal. A Nigerian trading post in west_reach is normal. People followed economic opportunity, corporate contracts, and personal connections across all corridors regardless of the dominant cultural stream. The corridor identity describes which heritage is *most common* along a path, not which heritage is *allowed*. At inner hops (3-5) especially, where corporate and institutional settlement dominates, cross-corridor heritage is as common as corridor-dominant heritage. The corridor signal strengthens outward but never reaches monoculture.
|
||||
|
||||
---
|
||||
|
||||
## Part 1: The Four Cultural Corridors
|
||||
|
||||
The Reach has four primary cultural corridors radiating outward from the core. They map imperfectly but recognizably onto the sector structure: north_reach, south_reach, east_reach, and west_reach. The deep_frontier is where these corridors attenuate into a more mixed frontier culture.
|
||||
|
||||
### 1.1 The North Reach — Commonwealth Heritage Corridor
|
||||
|
||||
**Primary cultural inflection:** British Commonwealth diaspora — Australian, Canadian, South African, Indian, Nigerian, and smaller constituent cultures. The binding identity is not British so much as post-British: the shared experience of having passed through British institutional structures and emerged with something hybrid and pragmatic.
|
||||
|
||||
**Migration logic:** Gateway (GJ 71) sits at hop 0. Sirius (GJ 244A) at hop 1 is the Assembly seat — always cosmopolitan, never a cultural heartland. The north branch out of Gateway ran through early infrastructure hubs that attracted contract workers and institutional settlers. The particular institutions that dominated early north_reach settlement — civil engineering firms, administrative services companies, agricultural development syndicates — drew heavily from Commonwealth-origin populations because Commonwealth nations had been disproportionately involved in the terrestrial space development programs that preceded horizon gate discovery. This was self-reinforcing: Commonwealth-origin administrators brought Commonwealth-origin subordinates, who founded communities, which attracted more Commonwealth-origin migrants.
|
||||
|
||||
**Specific character:** The north_reach Commonwealth corridor is institutionally confident and procedurally formal. These are people who believe in bodies with charters, rules that are written down, and governance that looks legitimate even when it is being quietly manipulated. Their separatism, where it exists, tends to be expressed through institutional channels rather than rupture — petitions, referendums, constitutional arguments. They are skeptical of the Assembly but they are also people who created the Assembly's procedural framework, which creates a complicated loyalty.
|
||||
|
||||
**Anchor systems:** Lacaille 8760 (GJ 825) functions as a north_reach junction with strong institutional character consistent with this corridor. Wolf 359 (GJ 406) is a north_reach hub at hop 3 that should have a distinctly Commonwealth-bureaucratic feel.
|
||||
|
||||
**Where it fades:** By hop 6-7 in the north_reach, Commonwealth inflection starts losing to frontier mixing. By hop 9-10, it survives primarily in institutional naming conventions and architectural forms rather than living cultural practice. The deep_frontier north corridor has shed most of it.
|
||||
|
||||
**Key exception archetype:** An Indian or Nigerian founding family will appear several hops into the corridor before the dominant stream arrives, producing a system that feels tonally different from its neighbors. The founding family got there first by following a specific economic opportunity, not cultural affinity. These systems are not anomalies to be explained — they are what the corridor actually looks like in practice.
|
||||
|
||||
---
|
||||
|
||||
### 1.2 The South Reach — Iberian/Latin American and Southern African Corridor
|
||||
|
||||
**Primary cultural inflection:** Portuguese, Spanish, and Latin American heritage (Brazilian in particular) with a secondary stream of Southern African cultures (Zulu, Afrikaans, Xhosa). The two streams do not blend cleanly but they have been neighbors long enough to develop a shared aesthetic sensibility.
|
||||
|
||||
**Migration logic:** The south_reach's earliest accessible systems included several with unusually good agricultural and oceanic conditions. Farming and fishing communities from Brazil, Portugal, Mozambique, and the Cape region were disproportionately represented in Wave 1 and 2 agricultural settlement programs because the Concord Assembly's land-grant system in the Wave 1 period favored cooperative farming syndicates, which these cultures had strong institutional forms for. Ran (GJ 144), the core breadbasket world, became a major attractor for agricultural settlement programs and its cultural character already had this inflection. Systems along the south branch from Ran carried it outward.
|
||||
|
||||
**Specific character:** The south_reach is warmer in tone than the north — less procedurally formal, more relational. These communities put family and extended network relationships ahead of institutional affiliation. Governance tends to be negotiated between actual people rather than between representative bodies. This makes south_reach systems feel more human in some respects and more opaque in others — you cannot understand a south_reach system's politics without understanding who the founding families are and how their relationships have evolved.
|
||||
|
||||
Altair (GJ 768) and Lacaille (GJ 887) are south_reach checkpoint systems with this character established. The corridor strengthens as it extends from these systems.
|
||||
|
||||
**Where it fades:** South_reach cultural identity is actually more persistent than north_reach because of higher cultural_persistence scores — the relational/family-network culture resists dilution better than institutional culture does. But by hop 8-9, it attenuates. Ross 154 (GJ 729) in the west_reach is adjacent and shows some south-inflected blending, reflecting actual geographic proximity in the gate network.
|
||||
|
||||
**Key exception archetype:** A West African or East Asian founding community will appear in the middle of the south corridor wherever a major resource discovery or corporate site selection pulled a different demographic. These exceptions tend to be economically significant systems — the resource find is why the exception happened.
|
||||
|
||||
---
|
||||
|
||||
### 1.3 The East Reach — East Asian and South/Southeast Asian Corridor
|
||||
|
||||
**Primary cultural inflection:** Chinese (Mandarin-dominant, but Cantonese and regional variants present), Japanese, Korean, Vietnamese, Indonesian, and Filipino heritage. The corridor does not have a single dominant sub-culture — it is the most internally diverse of the four.
|
||||
|
||||
**Migration logic:** The east_reach's gate topology runs through several early industrial hubs. East Asian manufacturing and technological development communities were disproportionately represented in the Wave 2-3 period because the major Syndic combines that dominated east_reach colonization had corporate roots in East Asian industrial conglomerates. When a Syndic selects a founding population, it draws from its existing employee and contractor networks, which had demographic skews. The Lu Ban (GJ 15A) system's name already signals this — it was founded by a combine with Chinese heritage leadership. This combine's supply chain extended east.
|
||||
|
||||
**Specific character:** The east_reach has a strong technocratic sensibility — governance by expertise rather than inheritance or popular will. Education is highly valued. Social stratification tends to follow competence (in theory) and accumulated credentials (in practice). Perpetual-class figures in the east_reach are disproportionately technical specialists rather than political administrators. There is a meritocratic ideology here that the Guardians of Autonomy find simultaneously appealing (anti-hereditary privilege) and alarming (surveillance infrastructure justified by efficiency).
|
||||
|
||||
The Lattice Commission (ACB, GJ 559B) is at the core boundary of what becomes the east_reach — this is not coincidental. The Commission's ideological DNA has east_reach influences.
|
||||
|
||||
**Where it fades:** The east_reach is the most gate-connected of the outer sectors — its topology has more through-routes and junctions than the north or south. This means more mixing. East Asian cultural inflection is therefore most visible in Wave 1-3 systems and most diluted in Wave 4-5 systems, particularly at junctions where multiple migration streams intersect.
|
||||
|
||||
**Key exception archetype:** A South Asian or European founding community, appearing where an individual Syndic executive made a personal/political hiring decision at a founding moment. The east_reach has the most "founder as anomaly" exceptions because its colonization was most heavily corporate and individual corporate decisions made a larger proportional difference than democratic migration choices.
|
||||
|
||||
---
|
||||
|
||||
### 1.4 The West Reach — Northern/Central European and Central/Eastern European Corridor
|
||||
|
||||
**Primary cultural inflection:** German, Scandinavian, Dutch, and Central European (Polish, Czech, Hungarian) heritage, with a significant secondary stream from the Russian Federation successor states. The corridor has a colder-climate work-ethic character that transcends the specific nationalities.
|
||||
|
||||
**Migration logic:** The west_reach's earliest settled systems had harsher environmental conditions than the south or east branches — less agricultural potential, more extractive industrial character. Wave 1-2 west_reach settlement was dominated by mining, engineering, and heavy manufacturing communities that drew from populations with cultural comfort in those industries and in challenging physical environments. German and Scandinavian industrial communities were overrepresented in early wave_1 west settlement partly because European industrial consortiums held a larger share of the early horizon gate exploitation licenses than their population would predict.
|
||||
|
||||
Nova Roma (GJ 764) is the core MVG industrial base — its naming convention is Latin/Italian but its cultural subtext is Germanic industrial organization. The MVG supply chain extends west and southwest, which further reinforced west_reach industrial demographic concentration.
|
||||
|
||||
**Specific character:** West_reach culture is practically focused and often suspicious of political complexity. These communities want to know who is in charge, what the rules are, and whether the work is getting done. They are more comfortable with corporate governance than the south_reach, more skeptical of technocratic abstraction than the east_reach, and less patient with procedural formalism than the north_reach. They are not anti-intellectual — but they want expertise in service of practical outcomes, not expertise as legitimating ideology.
|
||||
|
||||
A strong cooperative tradition also runs through this corridor. Scandinavian and German cooperative economic structures were adapted to the west_reach's early extractive economy because individual prospectors cannot survive alone on a hostile world. This creates systems that are simultaneously individualistic (everyone earns their own standing) and communal (the community is the survival unit).
|
||||
|
||||
**Where it fades:** The west_reach corridor attenuates faster than the east because the west_reach has more dead_end systems where isolation produces local cultural divergence. Dead_end isolation of 300-500 years produces genuine cultural singularity — the west_reach has more of these than any other sector. Writers should treat deep west_reach dead_ends as genuinely local cultures that have evolved away from their founding heritage rather than preserved it.
|
||||
|
||||
---
|
||||
|
||||
## Part 2: Industrial Corridors
|
||||
|
||||
Industrial corridors are overlaid on cultural ones. They do not replace cultural identity; they modify economic character and governance relationship. A west_reach system in MVG's logistics chain is still west_reach in culture — but its economic fate is coupled to Nova Roma.
|
||||
|
||||
### 2.1 MVG Corridor — West_reach and Southwest
|
||||
|
||||
**Hub:** Nova Roma (GJ 764), hop 3 core.
|
||||
|
||||
**Logic:** MVG manufactures transit vehicles: trains, haulers, gate ferries, atmospheric craft. Their supply chain requires raw materials (west_reach mining), fabrication capacity (core and near-west), and distribution networks (everywhere). The west_reach's industrial culture makes it a natural fit for MVG's supplier ecosystem.
|
||||
|
||||
**Corridor character:** MVG-corridor systems have stable employment, corporate governance presence, and predictable economic output. They are not wealthy by Assembly standards — MVG squeezes margins — but they are rarely destitute. MVG's maintenance of infrastructure extends into the corridor, which means these systems have better transit infrastructure than comparable non-corridor systems. The tradeoff: MVG contract systems cede significant local governance autonomy to MVG's regional managers, who are almost always Perpetual-class.
|
||||
|
||||
**Extent:** Runs through the west_reach to approximately hop 7-8. Deep_frontier west_reach systems are beyond reliable MVG logistics reach and are independent of the corridor.
|
||||
|
||||
---
|
||||
|
||||
### 2.2 Gate Corporation Corridor — Distributed with North/East Bias
|
||||
|
||||
**Hub:** Renaissance (GJ 251), hop 2 core.
|
||||
|
||||
**Logic:** The Gate Corporation's service network is the closest thing the Reach has to universal infrastructure presence. Every inhabited system has a Gate Corporation gate maintenance team. But the depth of Gate Corporation involvement varies: core and inner systems get full teams with local offices; outer systems get rotating maintenance contracts. The Gate Corporation corridor refers to systems where Gate Corporation has operational bases, training academies, or major maintenance facilities — not just a gate.
|
||||
|
||||
**Corridor character:** Gate Corporation operational bases create a cosmopolitan local population of Gate Corp technical staff from across the Reach. These are among the most culturally mixed systems in their respective regions, because Gate Corp rotates staff from its Reach-wide pool. A Gate Corp operational base in the middle of the Commonwealth corridor will have a mixed-heritage population working alongside the local Commonwealth-heritage community. This creates interesting friction and interesting fusion.
|
||||
|
||||
**Extent:** Gate Corp operational bases are concentrated in junction and hub systems — logistically, that is where maintenance capacity is most efficiently placed. Writers should assume every junction and hub system at hops 3-7 has Gate Corp presence significant enough to affect local culture. Through-routes at those hops have lighter presence. Dead_ends may have only minimal rotating-contract service.
|
||||
|
||||
---
|
||||
|
||||
### 2.3 DSMC Mining Corridor — South_reach Extractive Branch
|
||||
|
||||
**Hub:** Sindri (GJ 3522), hop 2 core.
|
||||
|
||||
**Logic:** DSMC (Dorfhausen Sydney Mining Corporation) operates the Reach's heavy extraction infrastructure. Their operational area is the south_reach and the deep_frontier systems accessible from south_reach branches. Sindri is their operational headquarters; the mining corridor extends outward from it along south_reach gate paths.
|
||||
|
||||
**Corridor character:** DSMC systems have a specific character: high economic output, poor distribution_index (the value leaves, the workers stay), significant environmental impact, and high security presence (private security under DSMC contract). These are not pleasant systems to live in for residents without DSMC employment, but they are not post-apocalyptic either — DSMC maintains basic infrastructure because unhealthy workers are less productive. The Guardians of Autonomy have a strong presence in DSMC-corridor systems as a result, often as the de facto opposition to DSMC's corporate governance.
|
||||
|
||||
**Extent:** South_reach through hop 7-8. DSMC's capital investment in transport infrastructure means their corridor systems have better gate ferry service than comparable non-extraction systems, which creates a paradox: the most economically exploited systems are sometimes the most transit-accessible.
|
||||
|
||||
---
|
||||
|
||||
### 2.4 Prometheus Labs Corridor — East_reach Research Branch
|
||||
|
||||
**Hub:** Prometheus (GJ 702B), hop 2 core. Dead_end topology — deliberately isolated.
|
||||
|
||||
**Logic:** Prometheus Labs produces longevity hardware. Their research and development network extends into the east_reach's research-oriented systems, particularly those with Veil Institute academic affiliations. The Prometheus corridor is not a logistics chain — it is a research network. Systems in this corridor have Prometheus-affiliated labs, clinical trial facilities, or specialized biotech supply relationships.
|
||||
|
||||
**Corridor character:** Prometheus corridor systems are wealthier than average for their hop distance. Perpetual-class concentration is notably higher — research contracts attract Perpetuals, who accumulate there over time. This creates a governance dynamic where the long-lived residents' interests diverge significantly from the majority population's interests. The Unbound, who reject lattice technology entirely and have complicated views on longevity hardware, have a notable presence in some Prometheus corridor systems as a form of counter-culture reaction to the Perpetual concentration.
|
||||
|
||||
**Extent:** Primarily east_reach hops 3-6, with tendrils into north_reach research systems.
|
||||
|
||||
---
|
||||
|
||||
### 2.5 Syndic Agricultural Network — South_reach Breadbasket Extension
|
||||
|
||||
**Hub:** Ran (GJ 144), hop 1 core. Anchor of the Reach's food supply.
|
||||
|
||||
**Logic:** Agricultural Syndics extend outward from Ran along south_reach branches, developing new growing systems, fishery worlds, and processing hubs. This is the oldest industrial corridor in the Reach — Wave 1 settlement of the south branch was explicitly agricultural in purpose.
|
||||
|
||||
**Corridor character:** Agricultural network systems have the highest quality of life to economic output ratio in the Reach. Food production is less concentrated than mining or manufacturing, which means the value stays more local. Governance tends democratic or cooperative — farming syndicates have strong local governance traditions. The distribution_index is typically Equitable or Stratified rather than Captured or Extractive.
|
||||
|
||||
**Extent:** South_reach through hop 6-7, with the deepest systems representing the edge of reliable food-production viability. Beyond that, systems are net food importers.
|
||||
|
||||
---
|
||||
|
||||
## Part 3: Political Philosophy Gradient
|
||||
|
||||
Governance philosophy in the Reach is not randomly distributed. It clusters by corridor and by hop distance. The following table gives the tendencies — not rules, but strong defaults that writers deviate from intentionally.
|
||||
|
||||
| Region | Dominant governance tendency | Secondary tendency | What the Assembly means here |
|
||||
|--------|--------|------|------|
|
||||
| Core (hops 0-2) | Mixed/cosmopolitan; formally democratic | Corporate technocracy | Home of the Assembly; highest compliance |
|
||||
| North_reach inner (hops 3-5) | Democratic/parliamentary | Institutional conservative | Procedurally Assembly-aligned; questions its decisions, not its legitimacy |
|
||||
| North_reach outer (hops 6-8) | Parliamentary with independent tendency | Cooperative | Assembly as distant procedural body; compliance selective |
|
||||
| South_reach inner (hops 3-5) | Cooperative/syndic | Democratic | Assembly as relevant but not urgent; economic priorities dominate |
|
||||
| South_reach outer (hops 6-8) | Cooperative/syndic; some idealist/utopian | Local/autonomous | Assembly as a name on a document; effective independence on local matters |
|
||||
| East_reach inner (hops 3-5) | Technocratic/corporate | Democratic | Lattice Commission more relevant than Assembly; functional alignment |
|
||||
| East_reach outer (hops 6-8) | Technocratic; some kleptocratic emergence | Corporate | Assembly as procedural fiction; local technocracy runs things |
|
||||
| West_reach inner (hops 3-5) | Corporate/cooperative hybrid | Democratic | Assembly as protection against DSMC/MVG; instrumental loyalty |
|
||||
| West_reach outer (hops 6-8) | Corporate (extractive) or cooperative | Kleptocratic in isolated systems | Assembly as irrelevant; corridor corp or local strongman is actual governance |
|
||||
| Deep_frontier | Highly variable; oligarchic tendency | Idealist/utopian communities | Assembly as fiction or enemy; see Part 4 |
|
||||
|
||||
**Political philosophy cluster logic:** Each corridor's founding cultural stream brought its own governance traditions. The north_reach's Commonwealth heritage means parliamentary and representative systems are the default template, even when they have been corrupted or hollowed out. The south_reach's cooperative agricultural tradition means syndic-style governance is native rather than imposed. The east_reach's technocratic corporate founding means expertise-based hierarchy is the natural order. The west_reach's industrial cooperative tradition produces the hybrid — workers who want democratic control within an efficient corporate structure, and who have been fighting the pure corporate model for six centuries.
|
||||
|
||||
**Utopian/idealist pockets:** Every corridor has them. These are communities that left the corridor not because of economics but because of ideology. They wanted to try a different way. Most are small, most are in dead_end systems or accessible only through long routes, and most have had complicated histories — some flourishing, some collapsing, some drifting into authoritarianism. Do not cluster them in any particular sector. They are the exception that appears in every corridor at low density.
|
||||
|
||||
**Kleptocratic emergence:** Kleptocracy is not a founding governance philosophy. It is what happens to other governance types when isolation, resource capture, and Perpetual incumbency run together for long enough without challenge. It is therefore most common in deep_frontier dead_end systems that also have extractive economies. Writers should treat kleptocracy as the outcome of a trajectory, not a founding intention — someone's legitimate cooperative or corporate governance calcified around a small group's accumulated advantage.
|
||||
|
||||
---
|
||||
|
||||
## Part 4: The Breakaway Direction — The West_reach Dissenter Corridor
|
||||
|
||||
Of the four outer sectors, the west_reach is the direction of systemic Assembly resistance. This is not a sharp border. It is a gradient that begins around hop 4-5 in the west_reach and intensifies outward until, at the deep_frontier's western edge, Assembly authority is functionally nonexistent and openly contested.
|
||||
|
||||
### 4.1 Why West
|
||||
|
||||
The west_reach is the breakaway direction for several compounding reasons, none individually decisive:
|
||||
|
||||
**Industrial grievance.** The west_reach is the Reach's most extractive sector outside of south_reach DSMC territory. MVG's logistics chain runs through it, DSMC has extraction operations along its southern margin, and the Assembly's tax and regulatory framework has historically favored core manufacturing over frontier extraction. West_reach residents have three centuries of accumulated economic grievance that can be articulated in specific fiscal terms: the value leaves, the Assembly takes a percentage, and the west_reach retains the environmental damage and infrastructure deficit.
|
||||
|
||||
**Gate topology.** The west_reach's gate topology has more dead_end systems than any other sector. Dead_ends mean isolation. Isolation means Assembly authority attenuates faster because there is no through-traffic to maintain political contact. A dead_end system at hop 8 in the west_reach might have one Assembly contact visit per decade. In that context, the Assembly is not a government — it is a historical relationship.
|
||||
|
||||
**Founding culture friction.** The west_reach's Germanic/Scandinavian cooperative tradition creates communities that are deeply uncomfortable with distant institutional authority imposing rules on local arrangements. This is not anti-social — it is a strong preference for self-governance that the Assembly's expansion of regulatory authority has repeatedly run against. The narrative of the west_reach is: we built this ourselves, we run it ourselves, and the Assembly's claim to our revenues and our compliance is a levy we did not agree to and cannot effectively resist. Yet.
|
||||
|
||||
**Sol proximity and counterweight logic.** The western branch of the gate network connects to systems that are geographically closer to Sol in the stellar neighborhood, even if gate-hop-wise they are not closer to Gateway. There is a cultural memory in the west_reach's outer systems of the Secession period, when Earth's closure of the gate caused particular economic disruption in west_reach systems whose trade routes ran through the Sol aperture. This history cuts both ways: some west_reach systems resent Earth for the closure; others remember Earth as a more genuine trading partner than the Assembly has been. Both positions produce Assembly skepticism. Some outer west_reach communities have quietly opened diplomatic contact with Sol as a counterweight to Assembly pressure.
|
||||
|
||||
### 4.2 The Gradient
|
||||
|
||||
**West_reach inner (hops 3-5):** Reluctant members. These systems comply with Assembly governance frameworks, pay their assessments, send delegates to the Assembly. But they vote as a bloc on economic issues, frequently in opposition to the core majority. Their delegates have a reputation for procedural obstructionism and coalition-building with like-minded Assembly delegations from other sectors. They are politically sophisticated operators within the Assembly system who do not want to leave the system — they want to change its outcomes.
|
||||
|
||||
**West_reach outer (hops 6-8):** Effective autonomists. These systems nominally remain in the Concord Assembly. They have not filed secession declarations. They do not pay Assembly assessments reliably. Local governance makes locally relevant decisions without Assembly consultation. An Assembly enforcement action would require fleet projection to this distance, which the Assembly is reluctant to undertake for what are, by the Assembly's reckoning, minor compliance issues. The equilibrium is tolerated non-compliance: the Assembly does not declare them in breach; they do not push any single issue hard enough to force a confrontation.
|
||||
|
||||
**West_reach deep frontier and beyond (hops 9+):** Functional independence. These systems were settled recently enough that they never had meaningful Assembly compliance history to break from. Their relationship with the Assembly is theoretical. Some are unaware of the specific Assembly frameworks that nominally apply to them. Those that are aware typically regard them as irrelevant. A few actively define their identity in opposition to the Assembly — but even active opposition tends to be rhetorical rather than military, because none of these systems individually has the capacity for military confrontation with the Assembly fleet.
|
||||
|
||||
### 4.3 The Compact of Westphalia — The Breakaway Coalition
|
||||
|
||||
The major political force driving west_reach dissent is a faction that does not yet have formal name in the core systems' political discourse because the Assembly does not take it seriously enough to give it one. For purposes of this document, it is called the **Compact of Westphalia**. The name is deliberate: the Peace of Westphalia (1648) ended the Thirty Years' War by establishing the principle that sovereign states govern their own internal affairs without external interference. The west_reach's Germanic-heritage founding communities would know the reference. The Compact's members consider it precisely apt — a treaty that says: your internal governance is not our business, and ours is not yours, and neither of us answers to a distant authority that was not party to this agreement.
|
||||
|
||||
The Compact of Westphalia is not a government. It is a treaty of mutual recognition among approximately 30-40 west_reach and deep_frontier systems, centered around hops 6-9. Its members have agreed to:
|
||||
- Recognize each other's governance decisions as legitimate without Assembly oversight
|
||||
- Maintain common customs and transit arrangements (no internal gate tariffs)
|
||||
- Provide mutual defense against "external coercion" — language that can mean Assembly enforcement as easily as piracy
|
||||
- Not recognize Assembly assessments as legitimate claims on their economic output
|
||||
|
||||
The Compact of Westphalia is not trying to secede from the Reach in the way the Reach seceded from Earth. It is trying to make secession unnecessary by making the Assembly's authority over its members practically unenforceable. The difference matters: they are not building a rival government; they are building a zone where the Assembly's government does not reach.
|
||||
|
||||
**Compact leadership:** The Compact is run by a rotating council of system governors, with no permanent headquarters. The most politically active members tend to be the wave_3 and wave_4 systems in the deep_frontier west — old enough to have developed stable institutions, young enough that Assembly compliance was never deeply embedded. Several founding governors are Perpetual-class, which gives the Compact institutional memory and strategic patience. The Compact has been building its mutual recognition network for approximately 60-80 years — slowly enough to avoid triggering Assembly response, systematically enough that its informal membership is now too large to easily dismantle.
|
||||
|
||||
**What the Compact is not:** It is not monolithic. Member systems have widely varying governance types, from cooperative syndicates to corporate oligarchies to small-scale democratic republics. The Compact does not require governance conformity — that is actually part of its appeal. It is not anti-Earth: some members actively court Sol trade relationships; others have no Sol opinion; a small number are anti-Sol for Secession-history reasons. It is not militarist: it has no standing fleet, no unified military command. Individual members maintain local security forces.
|
||||
|
||||
**What the Compact wants:** Local governance recognized. Assembly assessment claims rejected. Gate Corporation service contracts maintained (the Compact is not anti-infrastructure). Freedom to trade with Sol if individual systems choose. The right to not participate in Assembly military projections outside their immediate neighborhood.
|
||||
|
||||
**The Assembly's position:** Official denial that the Compact exists as a political entity. Informal acknowledgment that it exists as a compliance problem. No current appetite for enforcement because enforcement would require fleet deployment that risks military conflict at a distance where supply lines are thin. The Assembly's actual strategy is to wait the Compact out, assuming that economic integration will eventually draw member systems back into compliance alignment. This strategy has not worked for 60-80 years and shows no signs of working.
|
||||
|
||||
---
|
||||
|
||||
## Part 5: The Central Authority Gradient
|
||||
|
||||
Assembly authority is not binary. It is a function of hop distance, gate topology, economic integration, and political history. The following table gives the rough authority gradient writers should use when determining how present the Assembly is in a system's daily life.
|
||||
|
||||
| Hop distance | Authority presence | What this means in practice |
|
||||
|---|---|---|
|
||||
| 0-2 (core) | Full and lived | Assembly sessions, Lattice Commission enforcement, Gate Corp presence, fleet access. Government is everywhere. |
|
||||
| 3-4 (inner reaches) | Structural and visible | Assembly delegates, regular fleet patrol, tax assessment compliance, Lattice Commission presence. Government is a real actor. |
|
||||
| 5-6 (mid reaches) | Institutional and intermittent | Assembly framework applies; enforcement is periodic; some systems are meaningfully non-compliant but not openly so. Government is a background presence. |
|
||||
| 7-8 (outer reaches) | Nominal and distant | Assembly claims jurisdiction; local governance makes most real decisions; enforcement would require dedicated effort. Government is a name on a document. |
|
||||
| 9+ (frontier fringe) | Theoretical or contested | Assembly authority is either unknown, ignored, or actively disputed. No regular fleet presence. No Lattice Commission enforcement. Government is a historical relationship. |
|
||||
|
||||
**Modifying factors that increase authority presence:**
|
||||
- Gate topology: hub and junction systems are more connected and therefore more integrated
|
||||
- MVG/Gate Corp corridor presence increases compliance because those corps operate within Assembly frameworks
|
||||
- Systems with Assembly Fleet bases have elevated presence regardless of hop distance
|
||||
- Recent activation (Wave 5) sometimes comes with increased Assembly engagement because early settlement involves Assembly-supported infrastructure grants
|
||||
|
||||
**Modifying factors that decrease authority presence:**
|
||||
- Dead_end topology — isolation reduces all external institutional presence
|
||||
- Compact of Westphalia membership (west_reach) — active coordination against compliance
|
||||
- Catastrophic history (company abandonment, Gate Silence) — Assembly authority was absent during the crisis and never fully re-established
|
||||
- Very long settlement history without institutional reinforcement — communities that have governed themselves for 400+ years develop their own governance legitimacy that is hard to displace
|
||||
|
||||
---
|
||||
|
||||
## Part 6: Exception Density Guidelines
|
||||
|
||||
These corridors are tendencies, not rules. What follows is guidance on how often to break the pattern and what kinds of exceptions tell the most interesting stories.
|
||||
|
||||
### 6.1 Base Exception Rates by Sector
|
||||
|
||||
| Sector | Suggested exception rate | Notes |
|
||||
|--------|-------------------------|-------|
|
||||
| Core (fully written) | n/a | Already hand-authored |
|
||||
| Inner reaches (hops 3-5) | ~20% of systems are cultural exceptions | High enough traffic that founder anomalies are common |
|
||||
| Mid reaches (hops 6-7) | ~15% exceptions | Corridor effects are stronger at mid-range |
|
||||
| Outer reaches (hops 8-9) | ~25% exceptions | Isolation produces divergence from both corridor and exception |
|
||||
| Deep frontier (hop 10+) | ~35% exceptions | Frontier cultures are genuinely distinct; corridor ancestry is genealogical, not cultural |
|
||||
|
||||
### 6.2 Exception Archetypes (with notes on when to use each)
|
||||
|
||||
**The Early Arrival.** A founding family of a cultural heritage inconsistent with the dominant corridor arrived first because they followed a specific economic opportunity — a resource survey, a corporate contract, a political exile. The system retains their cultural character despite being surrounded by corridor-dominant neighbors. Use when: you want a system that feels like an outlier in its neighborhood but has a clear historical explanation. The founding family name often persists as a place name.
|
||||
|
||||
**The Corporate Reset.** A mining boom, industrial facility siting, or Syndic development program brought a large new population that demographically overwhelmed the founding culture within 2-3 generations. The founding cultural layer survives only in place names, architectural details, and a handful of traditions. Use when: you want a system with visible cultural stratification — old-timers who remember the earlier culture, newcomers who built the economic character.
|
||||
|
||||
**The Refugee Colony.** A political crisis, environmental disaster, or corporate abandonment elsewhere in the Reach drove a concentrated migration of non-corridor heritage into a system. These arrivals brought strong cultural persistence because trauma-origin communities hold tightly to heritage. Use when: you want a system with a cultural identity that is explicitly defined against its origin — "we are the people who came from [place] because [thing happened]."
|
||||
|
||||
**The Idealist Exception.** A utopian, religious, or philosophical community deliberately settled at the edge of a corridor because they wanted distance from its cultural norms. The corridor may surround them but they are not of it. Use when: you want a system with a clear founding ideology that has drifted in interesting ways over generations. The ideology is always partially intact and partially unrecognizable by now.
|
||||
|
||||
**The Gate Silence Survivor.** A system that experienced Gate Silence — the gate went offline for years or decades — has had time to develop genuinely local culture that now sits uneasily between its corridor heritage and what it became in isolation. Use when: you want a system with historical trauma, cultural whiplash between isolation identity and reconnection, and deep suspicion of gate-dependent institutions.
|
||||
|
||||
**The Perpetual Founder Stamp.** A Perpetual-class individual of a non-corridor cultural background founded this system and has never left. Their personal cultural identity has shaped the system continuously for centuries. The system is a reflection of one person's cultural sensibilities amplified across generations of influence. Use when: you want a system with unusual internal coherence, intense founding-personality mythology, and a governance structure that is all but impossible to separate from the founder's continued presence.
|
||||
|
||||
### 6.3 Naming Variety
|
||||
|
||||
Cultural heritage should influence the *flavour* of a system's name, not make every name a literal Earth transplant. A corridor full of Portuguese place-names reads like a theme park. Real colonists name things after:
|
||||
|
||||
- **Earth geography** — transplanted place-names (Caparica, Karoo). These happen but should not dominate.
|
||||
- **Founding figures** — surnames of the expedition leader, the first governor, the Syndic executive who signed the charter. These are common and feel organic.
|
||||
- **Local features** — descriptive names based on what the colonists actually found: the colour of the star, a geographic feature of the habitable body, an atmospheric phenomenon. These are the most naturalistic.
|
||||
- **Corporate designations** — a company code or project name that stuck because no one bothered to rename it. Common in Wave 3-4 industrial systems.
|
||||
- **Events** — named after something that happened during founding: a disaster, a discovery, a political moment.
|
||||
- **Abstract or aspirational** — concepts, virtues, or aspirations the founders carried (Renaissance, Meridian, Bastion are core examples of this).
|
||||
- **Corrupted or evolved** — a name that started as one thing and drifted over centuries of local pronunciation and usage until its origin is no longer obvious.
|
||||
|
||||
The heritage shows in the *type* of name — a Portuguese-heritage system might name itself after a local river using Portuguese, or after the founding captain's surname — not in every system being named after an Earth city. Aim for no more than 30-40% direct Earth-geography transplants along any given corridor. The rest should be a mix of the above categories.
|
||||
|
||||
Bare singular names — a surname alone, a city name alone — feel like placeholders, not founding moments. People naming a star take it seriously. Prefer compound names that carry context: "Johannsen's Star" over "Johannsen," "Uusi Vantaa" over "Vantaa," "Puerto Rivera" over "Rivera," "Kampala Gate" over "Kampala." The modifier tells you something about the place or the people who named it — a topology, a language, an aspiration, a relationship to the original. Singular names work when the name itself is already evocative (Seiðrmaðr, Traagwater, Dokkum) or when the catalog designation stuck (Wolf 359, Kapteyn's Star). Note that a star is not a station — modifiers like "Station," "Port," or "Landing" name the whole system after one facility, which is a pars pro toto that happens naturally (the station was the first thing built, the name stuck) but should not be the default pattern. Mix facility-named systems with star-named ones ("Johannsen's Star"), geography-named ones ("New Ballarat"), and concept-named ones ("Seiðrmaðr").
|
||||
|
||||
### 6.4 What Exceptions Signal
|
||||
|
||||
An exception should always tell a story, even if the player/reader never learns that story explicitly. The exception creates a question: why is this system different from its neighbors? That question should be answerable if someone investigates, even if the answer is buried in a company archive or a 400-year-old land grant record. Exceptions that exist for no reason undermine the setting's sense of depth. Exceptions that exist for historically plausible reasons reinforce it.
|
||||
|
||||
Do not put exceptions adjacent to other exceptions without a connecting explanation. Two exceptions in a row either share a cause (in which case that cause is the real story) or feel like authorial randomness.
|
||||
|
||||
---
|
||||
|
||||
## Part 7: Application Summary
|
||||
|
||||
When writing an outer sector system:
|
||||
|
||||
1. **Identify the sector and hop distance.** This gives you the cultural corridor dominant inflection and authority presence level.
|
||||
|
||||
2. **Check gate topology.** Dead_end systems at high hop distance should lean toward divergence from corridor. Junction and hub systems at any hop should lean cosmopolitan.
|
||||
|
||||
3. **Check colonization wave.** Wave 1-2 systems have had maximum cultural drift time — their founding culture survives mostly in deep structure (naming, holiday calendar, architectural vocabulary). Wave 4-5 systems retain more of their founding character.
|
||||
|
||||
4. **Apply industrial corridor overlay.** Is this system in MVG's logistics chain? Gate Corp operational territory? DSMC extraction? Agricultural network? This modifies economic character and governance relationship to corps.
|
||||
|
||||
5. **Determine whether to apply an exception.** Use the exception rate for the hop tier. If applying an exception, select an archetype and construct the historical explanation before writing the page.
|
||||
|
||||
6. **Check west_reach dissenter gradient.** If west_reach, apply appropriate level of Assembly skepticism based on hop distance. Does this system have Compact of Westphalia affiliation? Formal (hops 7+) or sympathetic (hops 5-6)?
|
||||
|
||||
7. **Check the seven questions.** Every system should be able to answer: what do people do here, who holds power, what is the main tension, what does the Assembly mean here, what's the relationship to the nearest hub, what's the oldest living thing, and what is this system afraid of.
|
||||
|
||||
---
|
||||
|
||||
## Cross-References
|
||||
|
||||
- `docs/design/star-map.json` — gate topology data (301 nodes, 334 edges)
|
||||
- `wiki/star-systems/catalog.md` — all 301 systems with sector, wave, and topology tags
|
||||
- `decisions/content.md` — locked decisions on narrative archetypes, wave structure, colonization logic
|
||||
@@ -1,3 +1,15 @@
|
||||
---
|
||||
title: "Divergent Relationships"
|
||||
description: "Comparison of smuggler vs detective starting relationship webs, access tiers, and social site coverage"
|
||||
type: design
|
||||
status: draft
|
||||
ticket: "#183"
|
||||
decision_refs: [D-005, D-027, D-028, D-029, D-033, D-075]
|
||||
author: ""
|
||||
created: 2026-02-19
|
||||
updated: 2026-02-19
|
||||
---
|
||||
|
||||
# Divergent Relationships
|
||||
|
||||
**Ticket:** #183 | **Priority:** Critical | **Sprint:** 12
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
---
|
||||
title: "Entity Color System — Visual Specification"
|
||||
description: "Canonical palette and rendering rules for relationship-based entity colors derived from D-033"
|
||||
type: design
|
||||
status: active
|
||||
ticket: "#304"
|
||||
decision_refs: [D-033, D-043, D-044, D-048, D-049, D-059, D-060]
|
||||
author: "Araminta"
|
||||
created: 2026-02-20
|
||||
updated: 2026-02-20
|
||||
---
|
||||
|
||||
# Entity Color System — Visual Specification
|
||||
|
||||
**Version:** v0.1 (Sprint 14)
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
---
|
||||
title: "Environmental Text Visual Standards"
|
||||
description: "Visual rules for signage, terminals, and news tickers rendered as world-layer text in Sova Transit"
|
||||
type: design
|
||||
status: active
|
||||
ticket: "#334"
|
||||
decision_refs: [D-036, D-043, D-044, D-049, D-051, D-066]
|
||||
author: "Araminta"
|
||||
created: 2026-02-20
|
||||
updated: 2026-02-20
|
||||
---
|
||||
|
||||
# Environmental Text Visual Standards
|
||||
|
||||
**Version:** v0.1 (Sprint 14)
|
||||
@@ -43,7 +55,7 @@ All environmental text renders in **Michroma** — the same typeface as all othe
|
||||
| Font size | 11px | At 1080p base |
|
||||
| Z-layer | 2 (wall surface) or 4 (overhead) | Depends on mounting position |
|
||||
| Primary color | `#8899aa` | Concordat Standard signage |
|
||||
| Informal color | `#9aa890` | Krenn vernacular or personal notices |
|
||||
| Informal color | `#9aa890` | Van Maanen's Star vernacular or personal notices |
|
||||
| Opacity | 70% for formal, 65% for informal | World layer — subordinate to entities |
|
||||
| Case | ALL CAPS for formal zone signage | Standard for institutional text |
|
||||
| Case | Mixed case for informal and vernacular | More human, less bureaucratic |
|
||||
@@ -58,13 +70,13 @@ All environmental text renders in **Michroma** — the same typeface as all othe
|
||||
|
||||
### 2.4 Bilingual Sign Treatment
|
||||
|
||||
When a sign has both Concordat Standard and Krenn vernacular text:
|
||||
When a sign has both Concordat Standard and Van Maanen's Star vernacular text:
|
||||
- Concordat Standard: primary size (11px), 70% opacity
|
||||
- Krenn vernacular: secondary size (9px), 50% opacity, rendered below the primary line
|
||||
- Van Maanen's Star vernacular: secondary size (9px), 50% opacity, rendered below the primary line
|
||||
- Both in Michroma. The size + opacity difference signals language register without a separate "handwriting" font.
|
||||
- 2px vertical gap between language lines.
|
||||
|
||||
Only signs explicitly serving both audiences carry both languages. Official Commission signage is Concordat Standard only. The Last Shift menu and informal worker notices are Krenn vernacular only.
|
||||
Only signs explicitly serving both audiences carry both languages. Official Commission signage is Concordat Standard only. The Last Shift menu and informal worker notices are Van Maanen's Star vernacular only.
|
||||
|
||||
---
|
||||
|
||||
@@ -206,13 +218,13 @@ Entities are always visually dominant (D-044: entity > object > structure). Envi
|
||||
|
||||
| Location | Formal element | Informal element |
|
||||
|----------|---------------|-----------------|
|
||||
| The Terminal (logistics hub) | Concordat Standard | Krenn vernacular where workers have added personal notices |
|
||||
| The Last Shift (bar) | Concordat Standard (Commission notices, if any) | Krenn vernacular (menu, worker notices, personal signs) |
|
||||
| Maintenance corridors | Concordat Standard (safety markings) | Krenn vernacular (informal worker notes) |
|
||||
| The Terminal (logistics hub) | Concordat Standard | Van Maanen's Star vernacular where workers have added personal notices |
|
||||
| The Last Shift (bar) | Concordat Standard (Commission notices, if any) | Van Maanen's Star vernacular (menu, worker notices, personal signs) |
|
||||
| Maintenance corridors | Concordat Standard (safety markings) | Van Maanen's Star vernacular (informal worker notes) |
|
||||
| Cargo containers | Concordat Standard (manifests, labels) | None |
|
||||
| Personal effects area | Neither — no formal signage | Krenn vernacular if labeled |
|
||||
| Personal effects area | Neither — no formal signage | Van Maanen's Star vernacular if labeled |
|
||||
|
||||
**Decision rule:** Formal = the institution did it. Informal = a person did it. The institution writes in Concordat Standard. People write in Krenn vernacular. When you're not sure, ask who made the sign.
|
||||
**Decision rule:** Formal = the institution did it. Informal = a person did it. The institution writes in Concordat Standard. People write in Van Maanen's Star vernacular. When you're not sure, ask who made the sign.
|
||||
|
||||
---
|
||||
|
||||
@@ -220,7 +232,7 @@ Entities are always visually dominant (D-044: entity > object > structure). Envi
|
||||
|
||||
| Decision | Relevance |
|
||||
|----------|-----------|
|
||||
| D-036 | Sova Transit District / Krenn System. Concordat Standard vs Krenn vernacular framework. |
|
||||
| D-036 | Sova Transit District / Van Maanen's Star. Concordat Standard vs Van Maanen's Star vernacular framework. |
|
||||
| D-043 | "Functional warmth" art direction. Environmental text is world texture, not decoration. |
|
||||
| D-044 | Visual hierarchy. Environmental text is subordinate to entities at all times. |
|
||||
| D-049 | Z-level rendering stack. Layer assignments for all text types. |
|
||||
@@ -235,7 +247,7 @@ Entities are always visually dominant (D-044: entity > object > structure). Envi
|
||||
| Zone signage (secondary) | 30 | 1 | Concordat Standard |
|
||||
| Directional | 15 | 1, ALL CAPS | Concordat Standard |
|
||||
| Safety notice | 20 | 2 | Concordat Standard |
|
||||
| Informal posted notice | 20 | 3 | Krenn vernacular |
|
||||
| Informal posted notice | 20 | 3 | Van Maanen's Star vernacular |
|
||||
| Terminal active (per line) | 25 | Up to 12 | Either, per context |
|
||||
| News ticker (per segment) | 80 | 1 | Concordat Standard |
|
||||
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
---
|
||||
title: "Faction Mechanics Reference"
|
||||
description: "Quick reference for six-faction gameplay systems including resources, blind spots, and reputation mechanics"
|
||||
type: design
|
||||
status: active
|
||||
ticket: ""
|
||||
decision_refs: []
|
||||
author: ""
|
||||
created: 2026-02-19
|
||||
updated: 2026-02-19
|
||||
---
|
||||
|
||||
# Faction Mechanics Reference
|
||||
|
||||
Quick reference for how the six factions work as gameplay systems.
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
---
|
||||
title: "First 5 Minutes Experience Design"
|
||||
description: "Systemic opening sequence design for both characters covering triggers, beat sequences, and seed variants"
|
||||
type: design
|
||||
status: active
|
||||
ticket: "#259"
|
||||
decision_refs: [D-027, D-032, D-041]
|
||||
author: "Paula"
|
||||
created: 2026-02-19
|
||||
updated: 2026-02-19
|
||||
---
|
||||
|
||||
# First 5 Minutes Experience Design
|
||||
|
||||
**Ticket:** #259
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
---
|
||||
title: "Flat NPC Memorable Trait Pass"
|
||||
description: "Design for three flat NPCs (Pael, Ren, Tev) with memorable traits and plausible-misdirection dialogue"
|
||||
type: design
|
||||
status: draft
|
||||
ticket: "#307"
|
||||
decision_refs: [D-024, D-029]
|
||||
author: "Paula"
|
||||
created: 2026-02-19
|
||||
updated: 2026-02-19
|
||||
---
|
||||
|
||||
# Flat NPC Memorable Trait Pass
|
||||
|
||||
**Ticket:** #307 | **Priority:** High | **Sprint:** 12
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,3 +1,15 @@
|
||||
---
|
||||
title: "Insert/HUD Wireframe and Visual Specification — v0.1"
|
||||
description: "Neural lattice insert HUD layout, entity markers, border arrows, and interaction states for the diegetic UI"
|
||||
type: design
|
||||
status: active
|
||||
ticket: "#314"
|
||||
decision_refs: [D-013, D-014, D-019, D-031, D-033, D-048, D-049, D-051, D-056, D-057, D-059, D-065, D-066, D-117]
|
||||
author: "Araminta"
|
||||
created: 2026-02-24
|
||||
updated: 2026-03-13
|
||||
---
|
||||
|
||||
# Insert/HUD Wireframe and Visual Specification — v0.1
|
||||
|
||||
**Ticket:** #314
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
---
|
||||
title: "Interaction Verb Specification v0.1"
|
||||
description: "Seven interaction verbs, single context-sensitive action button, and verbs[] architecture for player-world interaction"
|
||||
type: design
|
||||
status: active
|
||||
ticket: "#402"
|
||||
decision_refs: [D-005, D-011, D-015, D-027, D-028, D-032, D-035, D-041, D-044, D-051, D-054, D-060]
|
||||
author: ""
|
||||
created: 2026-02-12
|
||||
updated: 2026-02-12
|
||||
---
|
||||
|
||||
# Interaction Verb Specification v0.1
|
||||
|
||||
**Ticket:** #402
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
---
|
||||
title: "Knowledge Flags — v0.1 Quick Reference"
|
||||
description: "Quick reference of valid fact IDs, prerequisite formats, and starting knowledge for monologue content authoring"
|
||||
type: design
|
||||
status: active
|
||||
ticket: "#309"
|
||||
decision_refs: [D-028, D-035, D-041, D-075]
|
||||
author: ""
|
||||
created: 2026-02-19
|
||||
updated: 2026-02-19
|
||||
---
|
||||
|
||||
# Knowledge Flags — v0.1 Quick Reference
|
||||
|
||||
**For:** Mellanie (content authoring), Paula (narrative design)
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
---
|
||||
title: "Knowledge Vocabulary for v0.1 Content"
|
||||
description: "Full specification of confidence levels, entity knowledge, fact categories, and prerequisite formats for the knowledge graph"
|
||||
type: design
|
||||
status: active
|
||||
ticket: "#368"
|
||||
decision_refs: [D-028, D-035, D-041, D-075]
|
||||
author: ""
|
||||
created: 2026-02-19
|
||||
updated: 2026-02-19
|
||||
---
|
||||
|
||||
# Knowledge Vocabulary for v0.1 Content
|
||||
|
||||
**Source:** D-041 (Knowledge Graph Data Model), D-035 (Tag Taxonomy), D-028 (Dialogue Architecture), D-075 (Dialogue Filtering)
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
---
|
||||
title: "Layer 2: Situation-to-Relationship-History Mapping"
|
||||
description: "How InteractionMemory maps to D-028 Layer 2 situation activation and relationship-aware greeting selection"
|
||||
type: design
|
||||
status: active
|
||||
ticket: "#170"
|
||||
decision_refs: [D-028, D-035]
|
||||
author: "Paula"
|
||||
created: 2026-02-21
|
||||
updated: 2026-02-21
|
||||
---
|
||||
|
||||
# Layer 2: Situation-to-Relationship-History Mapping
|
||||
|
||||
**Ticket:** #170 | **Sprint:** 15 | **Author:** Paula
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
---
|
||||
title: "Meridian Coverage Map — Sova Transit District"
|
||||
description: "Zone-by-zone Meridian network coverage map with gameplay implications for investigation and smuggling"
|
||||
type: design
|
||||
status: active
|
||||
ticket: "#335"
|
||||
decision_refs: [D-017, D-018, D-036, D-037]
|
||||
author: "Miri"
|
||||
created: 2026-02-19
|
||||
updated: 2026-02-19
|
||||
---
|
||||
|
||||
# Meridian Coverage Map — Sova Transit District
|
||||
**Ticket:** #335
|
||||
**Author:** Miri
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
---
|
||||
title: "Mirror Moment Design Document"
|
||||
description: "Seven core mirror moments where the same trigger fires different monologue for smuggler and detective"
|
||||
type: design
|
||||
status: active
|
||||
ticket: "#329"
|
||||
decision_refs: [D-032, D-034, D-039]
|
||||
author: ""
|
||||
created: 2026-02-19
|
||||
updated: 2026-02-19
|
||||
---
|
||||
|
||||
# Mirror Moment Design Document
|
||||
|
||||
**Ticket:** #329
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user