Compare commits

...
152 Commits
Author SHA1 Message Date
jpmschweitzerandClaude Opus 4.6 2a3c6b4d12 chore(meta): release v0.1.27
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 12:36:55 +01:00
jpmschweitzer 06d9abbc63 Merge remote-tracking branch 'origin/copy'
# Conflicts:
#	content/npc-conversations/overheard.yaml
#	server/content/global/zone-types/administrative_civil.ron
#	server/content/global/zone-types/administrative_judicial.ron
#	server/content/global/zone-types/archaeological_site.ron
#	server/content/global/zone-types/commercial_market.ron
#	server/content/global/zone-types/commercial_transit.ron
#	server/content/global/zone-types/detention_facility.ron
#	server/content/global/zone-types/diplomatic_elite.ron
#	server/content/global/zone-types/entertainment_hospitality.ron
#	server/content/global/zone-types/entertainment_venue.ron
#	server/content/global/zone-types/extraction_platform.ron
#	server/content/global/zone-types/extraction_space.ron
#	server/content/global/zone-types/extraction_surface.ron
#	server/content/global/zone-types/industrial_manufacturing.ron
#	server/content/global/zone-types/industrial_processing.ron
#	server/content/global/zone-types/medical_facility.ron
#	server/content/global/zone-types/military_garrison.ron
#	server/content/global/zone-types/port_fishing.ron
#	server/content/global/zone-types/port_maritime.ron
#	server/content/global/zone-types/port_space.ron
#	server/content/global/zone-types/port_surface.ron
#	server/content/global/zone-types/research_station.ron
#	server/content/global/zone-types/residential_dispersed.ron
#	server/content/global/zone-types/residential_station.ron
#	server/content/global/zone-types/residential_surface.ron
#	server/content/global/zone-types/rural_aquaculture.ron
#	server/content/global/zone-types/rural_orbital.ron
#	server/content/global/zone-types/rural_pastoral.ron
#	server/content/global/zone-types/security_checkpoint.ron
#	server/content/global/zone-types/wilderness_frontier.ron
#	server/content/npc-conversations/overheard.ron
#	server/content/npc-conversations/overheard.yaml
#	server/content/npc-conversations/overheard.yaml.deprecated
#	tooling/validate-ron
2026-03-17 12:31:38 +01:00
jpmschweitzerandClaude Opus 4.6 034c1c6e37 fix(simulation): apply PR #94 review suggestions
- validate_ron: add eligible_roles referential integrity check against
  defined RoleSpec.id values in zone-type templates
- v01-yaml-content-audit.md: fix grep path from data/templates to
  server/data/templates in the superseded-files verification command
- pre-commit hook: comment out nonexistent check-decision-ids script
  to stop per-commit warnings until the script is implemented

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 12:25:07 +01:00
jpmschweitzerandClaude Opus 4.6 3a86b8bdad fix(copy): address PR #93 review — content fixes
Warnings fixed:
- Delete orphaned overheard.yaml (Hoshe)
- Remove validate-ron line 60 spurious single-slash regex (Hoshe+Paula)
- Replace "the car" with "the departure point" in diplomatic_elite (Miri)
- Soften dock worker accusation in ovh_ifr_003 (Miri)
- Fix relationship_context Colleague→Superior in ovh_hos_002 (Miri)

Suggestions applied:
- Fix CHANGELOG count 15→16 conversations
- Update review doc status to "all issues resolved"
- Add economic/density comment to 5 files missing it
- Fix military_garrison Social→OffDuty context on mess table primitive
- Rewrite residential_station trait-description as observable behavior
- Add gatebuilder ruin note to archaeological_site header

Follow-up tickets: #695, #696, #697

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 12:19:34 +01:00
jpmschweitzerandClaude Opus 4.6 c7a1164ae1 docs(simulation): audit and flag v0.1 YAML content (#672)
Survey 63 YAML files across content/, data/templates/, and client/data/:
14 deprecated (named NPC detective arc), 25 convertible (reusable schemas,
enums, factions), 4 already-superseded, 20 infrastructure. No deletions —
flag-only audit with recommended disposition priorities.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 12:02:35 +01:00
jpmschweitzerandClaude Opus 4.6 51febc9ab6 chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 10:58:17 +01:00
jpmschweitzerandClaude Opus 4.6 c30baee373 feat(db): add cross-culture name pool collision checking to validate-ron
New --check-name-collisions mode scans all culture-*.ron files and
reports given/family names appearing in multiple culture pools.
Exits 1 on collision with machine-readable output. Sprint 26 review
caught 6 overlaps manually — this automates the check.

Ticket: #665

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 10:58:00 +01:00
jpmschweitzerandClaude Opus 4.6 d9c2811842 feat(content): replace overheard.yaml with generator-compatible RON format
Archives the 48 hand-authored overheard conversations that referenced
deleted named NPCs (Kael, Sera, Torek). New RON pool format is
parameterized by role pair and zone type, culture-neutral, with
knowledge_payload for investigative value. 15 sample conversations
across 5 zone types. Adds content pattern note to decisions/content.md.

Ticket: #664

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 10:57:49 +01:00
jpmschweitzerandClaude Opus 4.6 9a89d0cc7c feat(content): author 29 zone-type behavior templates
Completes the zone-type template library (31 total with the 2 existing).
Each file has ~4 roles x ~15 culture-neutral behavior primitives with
context tags and modifier_hints per D-142. 2,210 new primitives across
rural, industrial, port, extraction, commercial, administrative,
research, medical, military, security, entertainment, residential,
detention, archaeological, wilderness, and diplomatic zone types.

Ticket: #662

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 10:57:37 +01:00
jpmschweitzerandClaude Opus 4.6 18afede4f2 feat(simulation): add cargo audit to CI/review pipeline (#637)
Add `make audit` target running `cargo audit` with an advisory ignore for
RUSTSEC-2025-0141 (bincode, tracked by #636). Wire audit into `make pre-pr`
and `make pre-pr-server`. Add conditional cargo audit to the pre-commit hook
(triggers only when Cargo.toml/Cargo.lock are staged).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 10:40:15 +01:00
jpmschweitzerandClaude Opus 4.6 aa79dd97e7 fix(simulation): Clippy cleanup and CI enforcement (#635)
Fix all Clippy warnings across the server codebase (2411 insertions, 1341
deletions). Raise type-complexity-threshold to 750 and too-many-arguments
to 12 in .clippy.toml for idiomatic Bevy ECS system signatures. The server
now passes `cargo clippy -- --deny warnings` cleanly.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 10:33:15 +01:00
jpmschweitzerandClaude Opus 4.6 7f7706442a feat(simulation): add ZoneTypeTemplate and LocationSpec structs for D-142 (#663)
Implement the zone-type template architecture: ZoneTypeTemplate (behavior
pools per zone category), LocationSpec (instance metadata with role weights),
SocialSiteTypeSpec, RoleWeight, and LocationSocialSite. Add deserialization
tests for rural_agricultural.ron and industrial_freight.ron. Existing ZoneSpec
kept for backward compatibility.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 10:32:42 +01:00
jpmschweitzerandClaude Opus 4.6 b2ef56440f refactor(simulation): move content/ under server/ (#669)
Content files (RON templates, YAML campaigns, gauntlet data) are consumed
exclusively by the server. Colocate them at server/content/ and update all
path references in Rust source, tooling scripts, and schema files.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 10:31:20 +01:00
jpmschweitzerandClaude Opus 4.6 c0669489ff fix(docs): recount all question domain files for PR #92 round 3
Full recount across all 4 question domain files. Content: 10 resolved
(not 9), 12 open (not 13). Scope: 15 total (not 14, Q-058 was missing
from count). Grand total: 61 questions. Both questions.md summary table
and questions-content.md footer now match actual header counts.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 09:27:02 +01:00
jpmschweitzerandClaude Opus 4.6 604360620b fix(docs): address PR #92 review round 2
- Add Q-WTF-039/040/041 to questions-content.md row in README.md
- Update questions.md master index: add Q-WTF entries, fix counts
  (57→60 total, content 21→24), update footer
- Add #623 cancelled note to round-21 ticket inventory
- Add Q-WTF-041 design pass to sprint-28 candidates list

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 09:16:21 +01:00
jpmschweitzerandClaude Opus 4.6 a69c75d4ae fix(docs): address PR #92 review comments
- Fix D-134 cross-references to point to architecture.md (not content.md)
- Fix stale #620 reference in D-147 body (now #679)
- Fix content.md footer count (44, not 45)
- Add D-145, D-146, D-147 to decisions/README.md index
- Add Q-WTF-041 entry to questions-content.md (was referenced but untracked)
- Fix sprint-28-candidates.md totals line
- Align spelling to British "customisation" throughout new decisions
- Add information boundary classification to D-147 (public trait, per D-010)
- Add "first message" instruction to proposer rules in sprint-start skill

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 08:26:58 +01:00
jpmschweitzerandClaude Opus 4.6 8db83b1589 fix(skills): add proposer/executor roles for planning team spawns
Sprint 27 planning session exposed that discussion agents (Ozzie) can
unilaterally write decisions and modify the DB before consensus is
reached. Add step 8d-planning to /sprint-start that classifies agents
as proposers (analyze only) or executors (SI, Qatux — wait for
consensus). Also add planning to valid team branches.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 08:15:35 +01:00
jpmschweitzerandClaude Opus 4.6 0d18c76dfa feat(docs): assign teams to v0.2 story tickets (#614-#626)
Resolve Q-WTF-039 (tile-scale heavy zoom, not portrait — D-146) and
Q-WTF-040 (aesthetic taste trait as shared root — D-147). Split #617
into server generator + client rendering, split #620 into server
culture resolution + client location picker. Sprint 28 candidate list
with 7 unblocked tickets.

Ticket: #676

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 08:10:29 +01:00
jpmschweitzerandClaude Sonnet 4.6 2fddf8b6ca chore(meta): plan Sprint 27: Scale
9 tickets assigned. Teams: server (5), copy (3), planning (1).
Sprint goal: extend zone-type template library from 2 to 31 zone types,
wire server structs for D-142, eliminate Clippy debt.

New ticket #676 created: assign teams to v0.2 story backlog (#614-#626).
Tickets #669 and #672 reassigned from maintenance to server.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 22:47:55 +01:00
jpmschweitzerandClaude Opus 4.6 9855a16a74 chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 22:33:39 +01:00
jpmschweitzerandClaude Opus 4.6 55fd30f692 fix(docs): rename GJ-7547 from Wag-'n-Bietjie to Skemeraand
"Twilight evening" — fits the corridor position (hop 22, one before
Abzu at terminus) without looking cartoonish next to the gravitas
of the deep frontier. Updated index.md etymology, GTTR entry,
Abzu references, and deep frontier regional index.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 22:17:49 +01:00
jpmschweitzerandClaude Opus 4.6 a28979dcb3 feat(docs): write 61 deep_frontier GTTR entries + regional index
Complete Drifter's Guide coverage for the Deep Frontier.
61 new entries from hop 3 (Cairnside) to hop 23 (Abzu),
plus updated gttr-deep.md index with all 61 deep systems.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 22:13:48 +01:00
jpmschweitzerandClaude Opus 4.6 ec4576b6aa feat(docs): write 51 west_reach GTTR entries + regional index
Complete Drifter's Guide coverage for the West Reach corridor.
51 new entries from hop 4 (Kapteyn's Star) to hop 17 (Yttermark),
plus updated gttr-west.md index with all 53 west systems.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 22:13:38 +01:00
jpmschweitzerandClaude Opus 4.6 a853e1ccb4 feat(docs): write 50 east_reach GTTR entries + regional index
Complete Drifter's Guide coverage for the East Reach corridor.
50 new entries from hop 4 (Nová Tržnice) to hop 9 (Xa Vời),
plus updated gttr-east.md index with all 54 east systems.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 22:12:48 +01:00
jpmschweitzerandClaude Opus 4.6 1f3151d8b4 feat(docs): write 52 south_reach GTTR entries + regional index
Complete Drifter's Guide coverage for the South Reach corridor.
52 new entries from hop 3 (Travessia) to hop 8 (Punta del Sol),
plus updated gttr-south.md index with all 53 south systems.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 22:12:19 +01:00
jpmschweitzerandClaude Opus 4.6 95c5bebdee feat(docs): write 49 north_reach GTTR entries + regional index
Complete Drifter's Guide coverage for the North Reach corridor.
49 new entries from hop 3 (Crown's Hollow) to hop 12 (Rekohu),
plus updated gttr-north.md index with all 55 north systems.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 22:08:53 +01:00
jpmschweitzerandClaude Opus 4.6 26d73e9ddd feat(docs): write The Narrows (GJ-875) — last placeholder system
Unsettled through-route at hop 14 between Paso Largo and Travessia.
This was the final PLACEHOLDER stub in the star systems wiki.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 10:36:50 +01:00
jpmschweitzerandClaude Opus 4.6 5a7cabe694 feat(docs): write 18 deep_frontier star system wiki pages (hops 13-23)
Replace PLACEHOLDER stubs with full prose for the deep corridor chain:
GJ-201 (unsettled junction), Paso Largo, Orchard's End, Sonnenkap,
Travessia, Kettenschmied, Pedra Seca, Claraboia, GJ-3943 (unsettled),
GJ-726 (unsettled), Eerste Wacht (wave_2 anomaly), Nova Estrada,
Helderoog, Entremeio, Candeia, Wag-'n-Bietjie (wave_2 anomaly),
Abzu (terminus). Also updates Dalim (GJ-127A) cross-references.

Fixes duplicate Passagem name (GJ-147 renamed to Entremeio) and
Entrocamento typo (corrected to Entroncamento).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 10:18:23 +01:00
jpmschweitzerandClaude Opus 4.6 7546fb0ad2 feat(docs): write 10 south_reach star system wiki pages (hops 5-6)
Replace PLACEHOLDER stubs with full prose for: Mocamedes (GJ-644C),
Porto Fechado (GJ-785), Entroncamento (GJ-3323), Passagem (GJ-473A),
Retiro (GJ-536), Mavela (GJ-644A), Solandar (GJ-827), Posto Avancado
(GJ-829), Farol (GJ-83.1), The Lantern (GJ-388, unsettled hub).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 10:18:01 +01:00
jpmschweitzerandClaude Opus 4.6 7a5398758f feat(docs): write 6 north_reach star system wiki pages (hops 5-6)
Replace PLACEHOLDER stubs with full prose for: Fenwick's Lantern
(GJ-285), Dunmore Stillwater (GJ-300), Uusi Vantaa (GJ-3820),
Harrowfield (GJ-588), Kelburn Crossing (GJ-216A), Greymantle (GJ-638).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 10:17:47 +01:00
jpmschweitzerandClaude Opus 4.6 307b77df46 fix(docs): review cleanup — frontmatter, templates, index links, workshop stub
- Add YAML frontmatter to nordmark-skog.md and talbrau.md
- Update star-system template to match actual 300-page structure
- Fix 10 broken companion star links in star-systems/index.md
- Add workshop-outcomes.md stub for paused GJ 6711 workshop

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 08:53:18 +01:00
jpmschweitzerandClaude Opus 4.6 a3baec4b04 feat(docs): add Calloway Distillery and thrds corporation pages, corporation template
Write full wiki pages for the two missing north_reach corporations
referenced in the corporations index. Content derived from existing
system pages (GJ-3325 Calloway Reach, GJ-475 Braemar). Add
corporation template to wiki/_templates/.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 08:53:06 +01:00
jpmschweitzerandClaude Opus 4.6 5402435045 fix(docs): review cleanup — broken anchors, typo, status updates, db backup
- Fix 3 broken D-036/D-128 anchor slugs in decisions/content.md
- Fix typo: Stalowsia → Stalownia in stalownia-kowalski.md
- Mark proposed-llm-voice.md as superseded (D-138)
- Mark smuggler-moral-arc.md and smuggler-voice-card.md as v0.1-only
- Snapshot settledreach.db after planning branch merge

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 01:24:27 +01:00
jpmschweitzerandClaude Opus 4.6 cfd6ba973c fix(content): rename Vargr system to Sindri (GJ 3522)
Rename to avoid association with Traveller RPG species name.
GJ catalog ID unchanged. Updates system page, Drifter's Guide,
cross-references from Kensho and Renaissance, catalog, index,
and cultural migration design doc.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 01:24:13 +01:00
jpmschweitzerandClaude Opus 4.6 a301fdab47 fix(content): purge all remaining Krenn references
Replace every occurrence of "Krenn" with "Van Maanen's Star" (or
contextual variants like VMS for locale codes, Van Maanen for proper
noun contexts). Covers CHANGELOG, briefings, workshop docs, sprint
briefings, environmental text examples, templates, ticker content,
and architecture docs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 01:24:04 +01:00
jpmschweitzerandClaude Opus 4.6 1782592dfd chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 00:51:56 +01:00
jpmschweitzerandClaude Opus 4.6 a20447ab81 docs(diagrams): add star map topology and coordinate SVGs
Two star map visualizations: topology view (hop-based layout)
and real-coordinate view (spatial positions).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 00:51:38 +01:00
jpmschweitzerandClaude Opus 4.6 53a0e3f6b5 docs(workshops): add Abzu carry-out proposals (unresolved)
Round 6: four agents responded to the project lead's challenge
"what do you walk away with?" Gore proposed Threshold Attunement
and Attend verb (too philosophical, not literal enough). Gestalt
proposed vigil_vocabulary flag and Establish Watch verb. Nigel
proposed cross-playthrough WATCHER persistence flag. Ozzie
proposed door-measuring as retroactive evidence reading (thin
but visceral). Lead verdict: "too much philosophy too little
lootbox" — parking this for later. The reward design is TBD.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 00:51:31 +01:00
jpmschweitzerandClaude Opus 4.6 c8cead39f3 docs(workshops): add Abzu mechanics design
Round 5: Gestalt translated world texture into playable verbs.
Watch Investment Counter (hidden 0-100), six player verbs
(Watch, Investigate, Converse, File, Document, Depart), bleed
tile states, Adams & Ford entry as accumulated field notes,
investment-scaled gate departure monologue, storyteller
de-escalation. Project lead noted: "extraordinary world texture
and zero playable verbs" — this document fills that gap.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 00:51:20 +01:00
jpmschweitzerandClaude Opus 4.6 c765158b59 docs(workshops): add GJ 6711 final syntheses with Abzu naming
Round 4: final positions incorporating the name Abzu and all
challenge results. Locked decisions: high-bleed as failed vigil
canon, vigil predates human tenure, Institute paralyzed by
faction conflict, non-resolution principle. Araminta added
upwelling lighting gradient, departure transit spec, Mode 3
Institute transient vocabulary. Paula endorsed Option C for
the inner envelope. Miri specified six sealed envelope additions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 00:51:10 +01:00
jpmschweitzerandClaude Opus 4.6 9e7c83b969 docs(workshops): add GJ 6711 stress test challenges
Round 3: all four agents challenged the sealed envelope against
existing Builder/Interstitium/Gate lore. Key finding: no
contradictions with canon. All four independently converged on
high-bleed gates = failed vigil signal. All four endorsed the
vigil predating human tenure. Inner sealed envelope identified
as required for implementation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 00:51:02 +01:00
jpmschweitzerandClaude Opus 4.6 403b168ced docs(workshops): add sealed envelope and project lead direction
The sealed envelope: canonical internal truth about what the
vigil watches — observation is load-bearing, the founding
settlers were recruited, the doors accommodate non-human
shift-takers. Project lead direction: verbatim creative
decisions and critiques across all workshop rounds. Everything
up for grabs when the lead changes their fickle mind.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 00:50:49 +01:00
jpmschweitzerandClaude Opus 4.6 1f48bebe77 docs(workshops): add GJ 6711 cross-pollination syntheses
Round 2: each agent read all four briefs and synthesized.
Key convergences: the doors as load-bearing detail, Adams &
Ford entry as mechanic, community warmth-without-origin.
Nigel self-cut "memory-without-event" archetype. Paula revised
tier 4 from "they know" to "they've stopped asking."

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 00:50:40 +01:00
jpmschweitzerandClaude Opus 4.6 84d537cd4d docs(workshops): add GJ 6711 initial briefs — four perspectives
Round 1 of the Abzu workshop: Miri (worldbuilding), Paula
(narrative), Nigel (replayability), Araminta (visual design)
each produced independent briefs for the furthest system at
hop 23. Key seeds: Adams & Ford commission frame, the four
investigative frames, the "picture won't close" mechanic,
K-type amber palette, and the doors that are 10-15% too tall.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 00:50:32 +01:00
jpmschweitzerandClaude Opus 4.6 cfd3706fca feat(docs): write batch 20 — deep_frontier hops 10-12, 17 systems
5 settled, 12 unsettled (71% empty):
- Ouplaas (GJ 528A) — wave_2 Afrikaans, 400 years at hop 10
- Saudade (GJ 1267) — voluntary exile-adjacents near Recanto
- Fluchtburg (GJ 428A) — Assembly military deserters
- Fernlicht (GJ 61) — scholar-exile community, G-type at hop 12
- Einde (GJ 407) — industrial accident refugees, dead end

Attractive unclaimed worlds: GJ 524 (G-type garden world),
GJ 5, GJ 69, GJ 853A (mineral deposits), GJ 868 (disputed
"Encontro" between two Portuguese communities).

Marginal/unattractive: GJ 394, 146, 177, 3403, 354A, 656, 616.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 23:02:11 +01:00
jpmschweitzerandClaude Opus 4.6 7018cf9a00 fix(docs): batch 19 review — soften Commission presence at GJ-482B
Travessa (hop 8) had an active customs presence described, exceeding
the nominal/distant authority gradient for this depth. Changed to
passive record-keeping through Syndic office filings.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 21:15:47 +01:00
jpmschweitzerandClaude Opus 4.6 8a3d9efe34 feat(docs): write batch 19 — deep_frontier hops 8-9, 18 systems
Afrikaans deep north: Droëland (GJ 914A), Skuilplek (GJ 722)
Germanic deep frontier: Leuchtturm (GJ 142), Vorposten (GJ 309),
  Helle Wacht (GJ 598), Randgebiet (GJ 349), Neugrund (GJ 675),
  Altgrund (GJ 189), Tiefenbach (GJ 174)
Portuguese south deep: Sertão (GJ 138), Travessa (GJ 482B),
  Pedra Funda (GJ 204), Dois Sóis (GJ 707), Recanto (GJ 556),
  Encruzilhada (GJ 211)
Unsettled: GJ 324A, GJ 425A, GJ 167

Five "fleeing from" narratives: Commission regulatory crackdown
(Skuilplek), theological schism (Pedra Funda), political exile
(Recanto), Compact dissidents (Helle Wacht), Gate Silence
survivors (Encruzilhada). Plus Secession-era flight (Tiefenbach)
and refugee absorption (Altgrund).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 21:14:19 +01:00
jpmschweitzerandClaude Opus 4.6 f141448a17 fix(docs): batch 18 review — fix 14 errors from Paula audit
Profile table spectral classes corrected to match DB star_type for:
GJ-183, GJ-661B, GJ-508A, GJ-603, GJ-92, GJ-434, GJ-49, GJ-117,
GJ-169, GJ-286, GJ-3442, GJ-1235, GJ-356A (13 systems).

Prose fixes where Miri wrote around invented spectral types:
GJ-92 (G0V→K-type), GJ-434 (G8Vvar→M-dwarf flare), GJ-49 (K5V→M-dwarf),
GJ-117 (K1V→M-dwarf), GJ-169 (K7V→M-dwarf), GJ-286 (K0IIIvar→G-type).

Structural fixes:
- GJ-508A: "three stops back" → "one gate back" (Breëvlei is adjacent)
- GJ-2097: authority gradient softened with wave_2 age justification

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 18:22:29 +01:00
jpmschweitzerandClaude Opus 4.6 ee82ae8276 chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 18:20:46 +01:00
jpmschweitzerandClaude Opus 4.6 ed5477c826 feat(docs): add Compact of Westphalia faction page
Mutual recognition treaty among ~30-40 west_reach systems at hops 6-16.
Covers origin, four core principles, rotating council structure,
membership tiers, Assembly response, economic infrastructure, and the
internal treaty-vs-government tension. Cross-referenced with Ostmark,
Freiholt, Altmark, Groenland, Echternach, and VGV.

Added Regional Factions section to factions index.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 18:20:10 +01:00
jpmschweitzerandClaude Opus 4.6 e4a074ea33 docs(docs): rebuild catalog.md and star-systems/index.md
Both files were severely outdated (~hop 5 coverage). Rebuilt from
database + star-map.json + wiki page names. Now covers all 301
systems, 227 named, organized by sector and hop distance.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 18:17:43 +01:00
jpmschweitzerandClaude Opus 4.6 fa3fbbc04b feat(docs): write batch 18 — reassigned deep_frontier and corridor extension systems
18 systems across all sectors, hops 5-9:
- North: Waterkant, Breëvlei, GJ 3988 (unsettled), Stilwater, Mossbank
- South: Ribeirão, Nascente, GJ 92 (unsettled)
- East: GJ 434 (unsettled), Dernier Quai, GJ 117 (unsettled)
- West: Marktfeld, Bestevaer (Dutch ocean world), Lichtung
- Deep frontier: Knotenpunkt, Posto Avançado, Weitblick, Último Farol

Includes 14 systems reassigned from deep_frontier into named corridors
at hops 5-7, plus 4 remaining deep_frontier at hop 7.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 18:17:33 +01:00
jpmschweitzerandClaude Opus 4.6 39dec24162 feat(docs): add Vins de Grand Vide corporation doc
West_reach négociant wine cooperative at Confluent (GJ 395). 350-year
distribution network, Grand Vide Classé certification system, 60+
member estates. Updated corporations index.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 16:19:39 +01:00
jpmschweitzerandClaude Opus 4.6 14320b5856 feat(docs): write named sector deep corridor pages (batch 17)
Eight systems completing named sector coverage: Xa Vời (GJ 3612,
east_reach hop 9), Eisfeld (GJ 3586, hop 10), Confluent (GJ 395,
hop 10 wine region + Vins de Grand Vide), Dunkelholz (GJ 615,
hop 11), GJ 4056 (unsettled hop 12), Echternach (GJ 127B, hop 13
Luxembourgish), Bout du Chemin (GJ 282A, hop 15 French), Grenzstein
(GJ 807, hop 16 frontier).

French and Luxembourgish heritage added to west_reach deep corridor.
60+ named châteaux at Confluent.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 16:19:28 +01:00
jpmschweitzerandClaude Opus 4.6 07fd60b5c5 docs(docs): add D-145 base building DLC scope decision
GJ 902 unclaimed habitable moon designated as future player
settlement site for base building DLC.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 15:53:34 +01:00
jpmschweitzerandClaude Opus 4.6 312c0001c0 feat(docs): write south_reach deep corridor wiki pages (batch 16)
Thirteen south_reach systems at hops 7-8: Espinho (GJ 1075, unusual
star observatory), Okahandja (GJ 27, Herero pastoral), GJ 325B
(unsettled asteroid field), Encrucijada (GJ 393, new 5-gate hub),
Quilombo (GJ 423B, Afro-Brazilian self-governance), Velha Guarda
(GJ 4A, 400-year Cape Verdean), Fragua (GJ 567, Kowalski downstream),
Aguas Bravas (GJ 688, Canarian fishing), GJ 902 (unsettled habitable
moon), Puerto Último (GJ 197), Mirante (GJ 435), Roça Nova (GJ 67),
Punta del Sol (GJ 737B).

GJ 902 set to unsettled in database — habitable moon reserved for
future base building DLC (D-145).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 15:53:23 +01:00
jpmschweitzerandClaude Opus 4.6 e17863f8c0 feat(docs): write Shimanami wiki page (batch 15)
GJ 848 — east_reach through-route at hop 8 between Oshima and Dài Lộ.
F-type star, wave_3 extraction settlement outgrowing Oshima's
administrative charter after 300 years.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 14:58:34 +01:00
jpmschweitzerandClaude Opus 4.6 09c84c2f1e feat(docs): write north_reach terminus wiki pages (batch 14)
Three north_reach systems at hops 7-8: Wagtoring (GJ 410, Oude Kraal
outstation), Dunmore (GJ 653, Scottish mining through-route),
Caledonia's End (GJ 95, binary dead-end terminus).

Fixed star type headers to match READ-ONLY profiles (M→K for GJ 410
and GJ 653, binary→G for GJ 95).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 14:07:44 +01:00
jpmschweitzerandClaude Opus 4.6 a64baf9ac5 fix(docs): correct cross-reference errors in Bergtor and Sonnwend
Bergtor (GJ 505A): GJ 454 described as "stub without significant
industrial development" — corrected to reflect Steinfeld's active
quarrying economy. Sonnwend (GJ 320): GJ 798 described as "a stub" —
corrected to acknowledge Brückenau's through_route topology.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 13:49:32 +01:00
jpmschweitzerandClaude Opus 4.6 a16b76ea3d feat(docs): add Nordmark Skog and Talbräu corporation docs
West_reach forestry corporation (Stillvakt) and brewing cooperative
(Brückenau). Updated corporations index.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 13:49:17 +01:00
jpmschweitzerandClaude Opus 4.6 079a5e7adc feat(docs): write west_reach corridor wiki pages (batch 13)
Six west_reach systems at hops 7-8: Stillvakt (GJ 534, Nordmark Skog
timber), Haltefenn (GJ 1248, ancient peat bog), Vindkast (GJ 414A,
wind-scoured prospectors), Kopparhytta (GJ 542, copper smelting),
Steinfeld (GJ 454, alpine quarrying), Brückenau (GJ 798, Talbräu
brewing waystation).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 13:49:10 +01:00
jpmschweitzerandClaude Opus 4.6 a9de660895 chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 13:35:34 +01:00
jpmschweitzerandClaude Opus 4.6 5826e2499e feat(docs): add Ferreira Monteiro and Stalownia Kowalski corporation docs
Trade arbitration firm (Matamba) and heavy equipment manufacturer
(Nowa Huta). Updated corporations index with both entries.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 13:21:24 +01:00
jpmschweitzerandClaude Opus 4.6 8e5953455c feat(docs): write south_reach corridor wiki pages (batch 12)
Ten south_reach systems at hops 5-6: Matamba (GJ 884, Ferreira Monteiro
home), Inhambane (GJ 54, grain corridor), Isibaya (GJ 905, livestock
market), GJ 695A (unsettled), Kaapse Baai (GJ 213, spice trade),
Mwangaza (GJ 693, textile corridor), Dzimbahwe (GJ 4053, stone
architecture), Vuurkloof (GJ 35, geothermal), Várzea (GJ 299,
floodplain agriculture), Nowa Huta (GJ 896A, Stalownia Kowalski).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 13:21:18 +01:00
jpmschweitzerandClaude Opus 4.6 b467d4bdbd feat(docs): write inner hub wiki pages and Mercado corporation doc
Five inner stubs (hops 3-4) written with extra care for topographic
position and narrative opportunity:
- Travessia (GJ 1156): core/south_reach gateway junction, home of
  Mercado Travessia supermarket chain
- Crown's Hollow (GJ 661A): British monarchy in exile, European
  royalty purge refugees, Kiyomi-Battenberg-Windsor dynasty
- Cairnside (GJ 892): wave_5 materials science research settlement
  in the Cairn pocket, studying variable star conditions
- Nová Tržnice (GJ 105A): Czech free-port commercial bazaar at
  east_reach junction, hundreds of small manufacturers
- Schuilhoek (GJ 68): wave_3 Dutch farming community hidden in
  Cairn pocket for 300 years across four cultivated worlds

GJ 68 settlement_wave updated from wave_5 to wave_3 in database.
Mercado Travessia corporation doc and index entry added.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 12:03:04 +01:00
jpmschweitzerandClaude Opus 4.6 9bc5cb21a5 fix(tooling): star map 16:9 ratio, circular fade, trimmed margins
Canvas now 16:9 with circle filling height. Radial fade gradient uses
userSpaceOnUse for true circular shape. Hop 15+ folded into final ring.
Margins trimmed to fit content.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 11:17:19 +01:00
jpmschweitzerandClaude Opus 4.6 a6ce4797d8 fix(tooling): star map generator outputs both SVG and PNG
Script now auto-converts to PNG after generating SVG. Tries magick,
convert, or rsvg-convert in order.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 11:12:02 +01:00
jpmschweitzerandClaude Opus 4.6 f9373be3ba feat(tooling): add star map SVG generator
Reproducible concentric-ring star map: Gateway at center, hop rings
radiating outward, sectors in cardinal wedges (N/E/S/W), alternating
band colors per sector, hop 15+ folded into final ring with fade-out
zone. Sol pinned due west.

Run: python3 tooling/generate-star-map-svg.py
Output: docs/diagrams/design/star-map-concentric.svg

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 11:05:34 +01:00
jpmschweitzerandClaude Opus 4.6 172040fb5d feat(docs): write east_reach deep corridor wiki pages (batch 11)
Kaur's Observatory, Seongho, Tình Yên, Purnima (sandhya dyes),
Marunong, Clearwater Station, Tam Giang, Jeonnam (Old Table brand),
Dagat (Dagat Blue dye), Suối Vàng (dây vàng wirework). Hops 6-8,
Vietnamese/Korean/Filipino/Bengali-Indian heritage mix.

Reviewed by Paula — fixed 2 star type header mismatches (Seongho
and Jeonnam catalog artifacts corrected to G-type).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 09:58:43 +01:00
jpmschweitzerandClaude Opus 4.6 00de36a4b7 fix(data): replace deprecated GJ 702A with 1221-DXP9 in star registry
GJ 702A was a deprecated binary system entry. Replace with GJ 1221,
a real catalog star — DXP9 peculiar magnetic white dwarf at 20.03 ly.
Dead-end topology connecting to EZ Aqr (GJ 866A).

Updates: star-map.json, systems.db, gj-catalog-real.json, catalog.md,
EZ Aqr topology reference. New wiki entry and Drifter's Guide entry.
System count restored to 301.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 09:53:31 +01:00
jpmschweitzerandClaude Opus 4.6 4b82d73c4e feat(docs): add Calloway Distillery and thrds to corporation index
Two north_reach brands with reach-wide flavor presence: Calloway
single malt whisky from GJ 3325, thrds cold-weather technical
clothing from Braemar (GJ 475).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 09:43:20 +01:00
jpmschweitzerandClaude Opus 4.6 31997827b9 feat(docs): write north_reach outer ring wiki pages (batch 10)
Mabaso Junction, Ashfield, Carrington's Post, Braemar (thrds),
Gemini Point, Calloway Reach (whisky), Prospect Hill, Oude Kraal,
Holgersen's Landing, Ngata's Star. Hops 5-7, includes brand
flavor (thrds clothing, Calloway single malt, Ngata jade).

Reviewed by Paula — fixed 5 topology errors: Mabaso supply routing,
Gemini Point header type, Prospect Hill stub misclassification,
Holgersen's Landing false cross-reference, Ngata's Star inverted
supply dependency.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 09:43:12 +01:00
jpmschweitzerandClaude Opus 4.6 594de35d99 feat(wiki): complete Drifter's Guide for hops 0-3
Write 14 new Guide entries completing hop 2 (Cairn) and all hop 3
systems with wiki content: Okafor Station, Tanegashima, Altair, EZ Aqr,
Johannsen's Star, Lalande, Ross 154, Wolf 359, Yongjin, Caldwell Point,
Suzhou, Puerto Rivera, Kensho.

Also: write Kensho wiki entry (Miri, reviewed by Paula), delete
deprecated GJ-702A placeholder, update core chapter with Kensho rating.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 09:33:01 +01:00
jpmschweitzerandClaude Opus 4.6 203721d56c fix(wiki): correct Freiholt and Randsholm header star types
Both had M-type headers but K4V in their READ-ONLY profiles.
Changed to K-type to match.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 09:24:36 +01:00
jpmschweitzerandClaude Opus 4.6 ab45618c15 chore(wiki): add find-stubs script for batch planning
Replaces manual Explore agent searches with a fast Python script
that finds unwritten wiki stubs by sector and hop range. Reads
star-map.json for topology and wiki stubs for star type/sector/wave.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 09:24:28 +01:00
jpmschweitzerandClaude Opus 4.6 0141287297 feat(wiki): write west_reach outer ring wiki pages (batch 9)
Ten systems at hops 7-9: Gammelstad, Thorvaldsen's Circuit,
Sonnwend, Nyrheim, Bergtor, Stilmark, Groenland, Halvøy,
Lichtbrücke, Ostmark. Compact of Westphalia heartland — includes
agricultural breadbaskets (Sonnwend, Groenland) and founding
member Ostmark. Paula review fix for Stilmark wave timing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 09:24:20 +01:00
jpmschweitzerandClaude Opus 4.6 c283deeca6 feat(wiki): write east_reach outer ring wiki pages (batch 8)
Ten systems at hops 6-8: Hwaseong, Devereux Point, Yeongwol,
Lam's Prospect, Songjiang, Hạ Long, Murakami's Lantern, Chandra
Deep, Oshima, Dài Lộ. Includes Paula review fixes for Kovács Loop
agricultural attribution, Murakami/Dài Lộ hop-distance anomaly
framing, and Oshima wave timing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 21:46:35 +01:00
jpmschweitzerandClaude Opus 4.6 b043de73c5 feat(wiki): add Drifter's Guide to the Reach — core systems and index
Write 21 new Guide entries for all core systems (24 total with the 3
existing), plus the Guide index with preface and 6 sector chapter files
(core complete, cardinal stubs in Guide voice).

In-universe publication by Adams & Ford Publishing Syndicate. Voice
inspired by Douglas Adams — homage, not pastiche.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 21:22:36 +01:00
jpmschweitzerandClaude Opus 4.6 985f87916e feat(wiki): write south_reach inner ring wiki pages (batch 7)
Ten systems at hops 3-4: Lalande, Confluência, Zenzele, Ribeiro's
Star, Kruger 60, Carvalhais, Crux Station, 96 Piscium, Morales'
End, Koeberg. Includes Paula review fixes for gate list naming,
header star types, and hop count arithmetic.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 21:14:52 +01:00
jpmschweitzerandClaude Opus 4.6 a4a0e86c4e feat(wiki): write north_reach mid ring wiki pages (batch 6)
Ten systems at hops 4-5: Pemberton's Loop, Nkosi's Bridge, UV Ceti,
Lindström Station, Okoro's Claim, Havnfjord, Koskinen's Reach,
Dunbar, Ashworth Junction, Holmgren's Passage. Includes Paula
review fixes for Assembly routing reference and header star type.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 20:15:21 +01:00
jpmschweitzerandClaude Opus 4.6 4ac58e0968 feat(wiki): add Adams & Ford Publishing and Drifter's Guide template
New corporation page for Adams & Ford Publishing (GJ 280A).
Drifter's Guide template and initial entries for Tau Ceti,
Sirius, and Gateway. Updated corporations index.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 19:49:42 +01:00
jpmschweitzerandClaude Opus 4.6 5cc340628e feat(wiki): write north_reach inner ring wiki pages (batch 5)
Ten systems at hops 3-4: Wolf 359, New Ballarat, Johannsen's Star,
Tanegashima, Puerto Rivera, Lacaille, Okafor Station, Kampala Gate,
Singh's Landing, Uusi Vantaa. Includes Paula review fixes for
supply chain accuracy, topology cross-references, and wave_5
procedural culture framing. Updates naming guidelines in
cultural-migration-pressure.md.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 19:49:29 +01:00
jpmschweitzerandClaude Opus 4.6 f3cef86e5f feat(docs): write west_reach mid ring wiki pages (batch 4, hops 6-7)
10 systems: Rana, Torsby, Meridian, Rødvik, Bakshi Spur, Seiðrmaðr,
Eisentor, Altmark, Pereira's Rest, Traagwater. Notable additions:
Seiðrmaðr as innovative skunkworks dead_end (Tiefwerk AG), Altmark as
5-gate hub with Compact financial integration, Eisentor as unsettled
4-gate junction with tripartite governance. Paula review fixes applied.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 19:13:16 +01:00
jpmschweitzerandClaude Opus 4.6 876c024bf5 feat(docs): write west_reach inner ring wiki pages (batch 3, hops 3-5)
10 systems: Caldwell Point, Grünfeld, Solheim, Kapteyn's Star,
Brennan's Drift, Voss, Port Mäkelä, Dokkum, Neustadt, Kraków Junction.
Paula review fixes applied: Kapteyn's Star topology corrected (Caldwell
Point not adjacent), routing directionality fixed in Brennan's Drift,
spur_end definition corrected in Port Mäkelä, Solheim calibration note
cleaned, Dokkum food transit clarified.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 18:44:05 +01:00
jpmschweitzerandClaude Opus 4.6 4abaaa446a feat(docs): write east_reach mid ring wiki pages (batch 2, hops 5-6)
10 systems: Relay 7, Jinghu, p Eridani, Thornfield Station, Port
Desrochers, Gliese 667, Binh Trang, Kovács Loop, Whitfield Crossing,
Novaya Zarya. Paula review fixes applied: GJ-908 hop anomaly flagged,
p Eridani missing gate connection added, Kovács Loop routing claim
tightened, Binh Trang junction characterization corrected.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 17:59:12 +01:00
jpmschweitzerandClaude Opus 4.6 38a056a879 feat(docs): write east_reach inner ring wiki pages (batch 1, hops 3-5)
10 systems: EZ Aqr, Suzhou, Bridgepoint, Matsue, Korhonen, Changwon,
Taishan, Samuels Reach, Miryang, Kurashiki. Paula review fixes applied:
3 header star-type corrections, Kurashiki topology fix, Taishan/Matsue
prose corrections.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 16:33:08 +01:00
jpmschweitzerandClaude Opus 4.6 a31aaaa8d4 docs(docs): add bidirectional cultural mixing guideline to migration pressure doc
Corridors are migration tendencies, not ethnic boundaries. Cross-corridor
heritage at any hop distance is normal and expected.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 16:32:57 +01:00
jpmschweitzerandClaude Opus 4.6 2aa7f7c6e7 feat(docs): write 7 west_reach outer-sector wiki pages
Ross 154 (GJ 729), Hansestadt (GJ 832), Freiholt (GJ 453),
Randsholm (GJ 775), Alshain (GJ 771A), Langemark (GJ 42),
Yttermark (GJ 529).

Germanic/Scandinavian corridor from hop 3 to hop 17 — Compact
of Westphalia signatories at hops 7-9, fully autonomous beyond.
Yttermark at hop 17 is the deepest system in the Settled Reach.
Includes Paula review fixes: topology cross-references, header
type correction, Hansestadt routing clarification.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 15:57:37 +01:00
jpmschweitzerandClaude Opus 4.6 58f7d0bfc0 feat(docs): write 7 east_reach outer-sector wiki pages
Yongjin (GJ 34B), Haodu (GJ 566A), Shenwei (GJ 3379),
Tanaka Station (GJ 555), Kaelong (GJ 172), Trung's Crossing
(GJ 3533), Mabuhay (GJ 1073).

East Asian corridor from hop 3 to hop 9 — technocratic
governance, corporate-cooperative hybrids, credential-based
advancement. Includes Paula review fixes: review count math,
wave_1 timeline correction, header type fix, Haodu rename.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 15:57:28 +01:00
jpmschweitzerandClaude Opus 4.6 0967992a01 feat(docs): write 4 south_reach outer-sector wiki pages
Caparica (GJ 1002), Karoo (GJ 222A), Kumasi (GJ 86),
Rionegro (GJ 3250).

Iberian/Southern African corridor from hop 4 to hop 8, with
West African Early Arrival exception (Kumasi) and DSMC ore
hauler corridor through Van Maanen's Star.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 13:18:28 +01:00
jpmschweitzerandClaude Opus 4.6 6b3e91c325 feat(docs): write 9 north_reach outer-sector wiki pages
Fremantle (GJ 273), Athabasca (GJ 1289), Carnarvon (GJ 680),
Enugu (GJ 75), Ratnagiri (GJ 575A), Pemberton (GJ 194B),
Murchison (GJ 716), Moyale (GJ 1292), Rekohu (GJ 770).

Commonwealth corridor from hop 4 to hop 12, with Early Arrival
exceptions (Cape, Igbo, Indian, East African heritage) and a
Gate Silence Survivor at the terminus.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 13:18:19 +01:00
jpmschweitzerandClaude Opus 4.6 39f385c7fb docs(docs): add naming variety and axis independence to migration framework
Adds Section 6.3 (Naming Variety) with guidelines for avoiding
theme-park naming — max 30-40% Earth transplants, mix in founder
names, local features, corporate designations, and evolved forms.

Also adds foundational note clarifying that culture, politics, and
economics are independent axes along corridors: systems can share
any combination with neighbours without cultural branding.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 12:33:04 +01:00
jpmschweitzerandClaude Opus 4.6 58423eafa9 docs(docs): add cultural migration pressure governing guidelines
High-level design doc for outer sector system-writing. Covers:
- Four cultural corridors (Commonwealth north, Iberian/Southern African
  south, East Asian east, Germanic/Scandinavian west)
- Five industrial corridors (MVG, Gate Corp, DSMC, Prometheus, Ag Syndics)
- Political philosophy gradient by sector and hop distance
- Compact of Westphalia breakaway coalition in the west_reach
- Central authority gradient from core to frontier
- Exception density guidelines and six exception archetypes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 11:39:25 +01:00
jpmschweitzerandClaude Opus 4.6 b8d897c0e0 feat(docs): write Tessera and Vargr wiki pages, complete all core systems
Tessera (GJ 3877) — Compact/Records, institutional memory, 5-aperture hub
Vargr (GJ 3522) — Mining/DSMC, 3-aperture junction with MVG/GateCorp stakes

Written by Miri agents, reviewed by Paula with fixes applied:
- Registry authority reframed as accumulated soft power, not constitutional grant
- Perpetual/Syndic categories collapsed correctly
- Silence topic ambiguity signal added (directed vs undirected drift)
- Kensho description hedged (stub system, no established facts)
- Five centuries → three centuries (wave_2 timeline correction)
- DSMC observer-of-observers asymmetry made explicit
- Commission/Guardians misclassification mechanism expanded
- Capital investment discrepancy attribution deepened

All 28 core systems now have full prose. Stub section removed from index.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 10:49:12 +01:00
jpmschweitzerandClaude Opus 4.6 8d056d1d3f docs(docs): update star systems index after final 4 pages written
Move Parallax, Keid, Ross 128, Lu Ban from stub to fully written.
Add Tessera, Vargr, Cairn as remaining stubs needing prose.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 10:30:24 +01:00
jpmschweitzerandClaude Opus 4.6 de69296340 feat(docs): write final 4 core system wiki pages
Parallax (GJ 280A) — media world, narrative manufacturing
Lu Ban (GJ 15A) — failed corp mixed industrial bazaar
Keid (GJ 166A) — garden world, ecological reservation
Ross 128 (GJ 447) — ocean world, fishing/research/tourism

Written by Miri agents, reviewed by Paula with fixes applied:
star type headers corrected, silence topics sharpened, MVG
territorial language made precise, Institute timeline clarified.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 10:29:47 +01:00
jpmschweitzerandClaude Opus 4.6 90964820d5 refactor(docs): move catalog index into star-systems directory
Renamed catalog-index.md to star-systems/catalog.md where it
belongs. Updated references in wiki root and star-systems index.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 10:14:40 +01:00
jpmschweitzerandClaude Opus 4.6 59b9a08f0f refactor(data): migrate 9 core binary pairs to single stars
Gate builders don't place two horizon stations in one star system.
Binary pairs (A/B components of same physical star) split to
independent stars. Each "move" system keeps its connections and
content, only the host star changes.

Migrations:
- GJ 559A (Rigil Kentaurus) -> GJ 768 (Altair) — rewritten for new star
- GJ 725A (Renaissance) -> GJ 251
- GJ 820A -> GJ 3877 (Tessera — compact/records world)
- GJ 570B -> GJ 1156
- GJ 783B -> GJ 299
- GJ 663B (Guniibuu B) -> GJ 1286 (Kensho — university world)
- GJ 338A -> GJ 4053
- GJ 280B -> GJ 3991
- GJ 15B -> GJ 4274

New system names and roles assigned:
- Tessera: founding compact + institutional records
- Kensho: university world, largest Institute presence
- Vargr: mining (DSMC, MVG/GC minority stakes)
- Parallax: media world (was Procyon)
- Lu Ban: failed corp / mixed industrial (was Groombridge 34)
- Altair: southern gateway (was Rigil Kentaurus)
- Keid: garden world / ecological reservation
- Ross 128: ocean world (fishing, research, tourism)

Also adds docs/design/gj-catalog-full.json (3801 GJ entries from
HYG v4.2) for future star assignment.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 10:13:58 +01:00
jpmschweitzerandClaude Opus 4.6 7153b3ed7b feat(docs): write 10 next-tier system wiki pages with full prose
Miri authored, Paula reviewed. Systems: Renaissance (Gate Corp HQ),
Nova Roma (MVG HQ), Prometheus (Prometheus Labs HQ), Proxima (first
colony), Rigil Kentaurus (south gateway), Barnard's Star (residential),
Lacaille (southern checkpoint), Cairn (unsettled 7-aperture anomaly),
Meridian (boomtown), Aurelius (academy).

Paula's priority fixes applied: header star_type corrections,
Prometheus calibration aligned with corporation page, Lacaille
hop-count error fixed, Rigil Kentaurus Institute absence restructured,
Aurelius naming clarified, Nova Roma silence sharpened, Renaissance
silence stakes specified, Meridian topology block added.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 08:51:08 +01:00
jpmschweitzerandClaude Opus 4.6 1fd97ff167 chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 04:04:28 +01:00
jpmschweitzerandClaude Opus 4.6 e5911838c0 chore(tooling): update tooling for GJ ID migration and wiki sync
Update wiki_sync.py and process-wiki-system-changes to remove
astronomical_id references. Add migrate-s-to-gj.py migration script.
Update generate-stubs.py and validate-ron for new schema.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 03:55:01 +01:00
jpmschweitzerandClaude Opus 4.6 71194902b8 docs(docs): add category index pages and clean up wiki root
Add index.md to: star-systems, corporations, factions, technology,
contraband, concepts. Each lists its contents with brief descriptions.

Rewrite wiki/index.md to link to category indexes instead of inlining
all entries. Regenerate catalog-index.md from DB (remove redundant
System ID column after S-number migration).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 03:52:40 +01:00
jpmschweitzerandClaude Opus 4.6 9d95dadc03 feat(docs): add corporation wiki pages
Gate Corporation (Renaissance/GJ 725A): span gate infrastructure
monopoly, Institute licensing relationship.

Mastroianni Vehicle Group (Nova Roma/GJ 764): transit vehicles and
trains for the gate network, Perpetual-class family dynasty.

Prometheus Labs (Prometheus/GJ 702B): longevity hardware and implants,
dead-end system, created the Perpetuals.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 03:52:29 +01:00
jpmschweitzerandClaude Opus 4.6 95c6f8cbe2 refactor(docs): replace S-numbers with GJ IDs in all 301 wiki pages
Remove S-number from page headers and replace S-number references in
topology sections with GJ astronomical IDs. Headers now show
"**GJ XXX** | type | sector" instead of "**GJ XXX** | S-NNN | type | sector".

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 03:52:20 +01:00
jpmschweitzerandClaude Opus 4.6 2b49ebfd46 refactor(data): migrate star-map.json from S-numbers to GJ IDs
Replace all S-XXX system identifiers with GJ astronomical IDs in
star-map.json nodes and edges. The astronomical_id field is removed
from nodes (now redundant with system_id). 301 nodes, 335 edges.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 03:42:07 +01:00
jpmschweitzerandClaude Opus 4.6 02e6a50c5a docs(docs): update gate lore for inter/intra distinction
founder-gates.md: account for dormant aperture activation (Struve).
span-gates.md: add Institute origin and Gate Corporation licensing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 03:41:58 +01:00
jpmschweitzerandClaude Opus 4.6 3e607090fb feat(docs): write 10 core system wiki pages with full prose
Sol, Gateway (Tau Ceti), Sirius, Ran — core 4 with full prose.
ACB, Struve, Cygni B, Arbour, Groombridge, Bastion — inner orbit 6.

Each page has DB-generated infobox (READ-ONLY) plus 5 authored prose
sections: supply dependency, faction notes, silence topic, narrative
hook, calibration note. Cross-system relationships established
(Bastion-ACB adjacency, Institute geographic pattern, Cygni B design
rights connecting to Gateway silence).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 03:41:51 +01:00
jpmschweitzerandClaude Opus 4.6 181baf9f11 docs(decisions): amend D-095 gate lore, resolve Q-039 topology
D-095: clarify inter-system gates are alien-determined (humans cannot
add/remove apertures). Intra-system span gates are Institute-derived
human tech licensed to the Gate Corporation. Dormant activations
(Struve) are alien infrastructure events, not human actions.

Q-039: resolved — 301-system star map generated with alien-determined
topology (334 edges, hub/junction/loop/spur distribution).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 03:41:39 +01:00
jpmschweitzerandClaude Opus 4.6 7f307c1225 feat(db): normalize star systems into multi-table schema with GJ primary keys
Replaces flat star_systems table with 7 normalized tables: star_systems,
system_gates (with hop_distance_from_gateway), system_history,
historical_events (1:N), system_economy, system_factions, system_culture.

Primary key is now the GJ astronomical ID (e.g., "GJ 244A") — S-number
identifiers removed entirely. The astronomical_id column is dropped as
redundant. Database moved to server/data/systems.db (ships with game).

10 core systems fully populated with structured data.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 03:41:29 +01:00
jpmschweitzer 23d9ff0a58 Merge remote-tracking branch 'origin/main' into planning
# Conflicts:
#	CHANGELOG.md
#	content/_meta/README.md
#	content/_meta/npc-authoring-style-guide.md
#	wiki/_templates/cultural-group.md
#	wiki/_templates/institution.md
#	wiki/_templates/star-system.md
#	wiki/characters/devra.md
#	wiki/characters/drin.md
#	wiki/characters/harek.md
#	wiki/characters/lera-sessik.md
#	wiki/characters/maret-korr.md
#	wiki/characters/naia-tamm.md
#	wiki/characters/nils-davan.md
#	wiki/characters/pell.md
#	wiki/characters/renn.md
#	wiki/characters/resha.md
#	wiki/characters/sabel.md
#	wiki/characters/sera-venn.md
#	wiki/characters/torek-lintar.md
#	wiki/characters/voss.md
#	wiki/star-systems/krenn/index.md
2026-03-14 00:24:53 +01:00
jpmschweitzerandClaude Opus 4.6 cb6d14ced4 feat(db): add wiki sync pipeline and process-wiki-system-changes
New data flow: wiki → star-map.json + SQLite.
- tooling/process-wiki-system-changes: unified script that reads
  wiki, updates star-map.json topology, syncs to SQLite
- tooling/db/wiki_sync.py: wiki frontmatter parser + SQLite upsert
- generate-stubs.py: updated for full-frontmatter wiki format
- Removed extract-csv.py (replaced by SQLite queries)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 00:23:59 +01:00
jpmschweitzerandClaude Opus 4.6 68fd61f71c refactor(data): slim star-map.json to topology-only, add Sol and star_systems schema
star-map.json now only carries topology fields (system_id,
astronomical_id, gate_topology, aperture/connections, hop distance)
plus edges. All per-system data lives in wiki frontmatter.

Added Sol as S-000/GJ 0 connected to Gateway. Added star_systems
table to schema for wiki sync mirror.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 00:23:49 +01:00
jpmschweitzerandClaude Opus 4.6 de3e04c7a1 feat(data): add 301 star system wiki stubs with full frontmatter
Wiki pages are the single source of truth for all per-system data.
Each stub contains all 68 columns in YAML frontmatter, pre-filled
from star-map.json for identity/infrastructure fields. Includes
Sol (S-000/GJ 0) and Van Maanen's Star (S-057/GJ 35) with Sova
station content.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 00:23:39 +01:00
jpmschweitzerandClaude Opus 4.6 e8263e209e refactor(data): rename Krenn to Van Maanen's Star
System S-057 assigned to real star GJ 35 (Van Maanen's Star, DG white
dwarf at 13.9 ly). Renamed across all content, server code, docs,
decisions, wiki lore, and config files. 224 files updated.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 00:23:26 +01:00
jpmschweitzerandClaude Opus 4.6 3ddbdf614b chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 00:16:15 +01:00
jpmschweitzerandClaude Opus 4.6 e56061ecbc docs(docs): add frontmatter to asset pipeline docs
Standardized YAML frontmatter on all 13 docs/assets/ files covering
audio, visual, and video pipeline docs, palettes, and templates.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 00:15:51 +01:00
jpmschweitzerandClaude Opus 4.6 bccdcfcdcb docs(docs): add frontmatter to all sprint briefings
Standardized YAML frontmatter on all 115 sprint briefing files across
sprints 1-26 with title, description, type, status, sprint number, and
team fields.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 00:15:45 +01:00
jpmschweitzerandClaude Opus 4.6 a5ce7fa603 docs(docs): add frontmatter to DEVOPS.md and scratchpad.md
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 00:15:38 +01:00
jpmschweitzerandClaude Opus 4.6 1e5a1fb23a docs(docs): add frontmatter to workshops README
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 00:01:58 +01:00
jpmschweitzerandClaude Opus 4.6 5805f68760 docs(docs): add frontmatter to wiki-review workshop
Standardized YAML frontmatter on all 43 files.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 00:01:44 +01:00
jpmschweitzerandClaude Opus 4.6 36d3bc2c2e docs(docs): add frontmatter to wheres-the-fun workshop
Standardized YAML frontmatter on all 47 files.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 00:01:35 +01:00
jpmschweitzerandClaude Opus 4.6 ba3ade434e docs(docs): add frontmatter to v01-gap-analysis workshop
Standardized YAML frontmatter on all 16 files.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 00:01:28 +01:00
jpmschweitzerandClaude Opus 4.6 563a295a90 docs(docs): add frontmatter to test-architecture workshop
Standardized YAML frontmatter on all 20 files.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 00:01:23 +01:00
jpmschweitzerandClaude Opus 4.6 9588133bbf docs(docs): add frontmatter to map-authoring, npc-ai, observer-snapshot, and save-load workshop briefs
Standardized YAML frontmatter on 4 workshop brief files.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 23:52:10 +01:00
jpmschweitzerandClaude Opus 4.6 2a6a023196 docs(docs): add frontmatter to llm-voice-pipeline workshop
Standardized YAML frontmatter on all 28 files.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 23:40:59 +01:00
jpmschweitzerandClaude Opus 4.6 da63a93446 docs(docs): add frontmatter to knowledge-graph-information-boundaries workshop
Standardized YAML frontmatter on all 10 files.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 23:40:51 +01:00
jpmschweitzerandClaude Opus 4.6 60ffe2e02a docs(docs): add frontmatter to knowledge-flow-npc-boundaries workshop
Standardized YAML frontmatter on all 12 files.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 23:40:44 +01:00
jpmschweitzerandClaude Opus 4.6 9a5c9c4408 docs(docs): add frontmatter to generator-architecture workshop
Standardized YAML frontmatter on all 38 files with title, description,
type, workshop, agent, and round fields.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 23:40:37 +01:00
jpmschweitzerandClaude Opus 4.6 983d8037d1 feat(docs): assign real GJ catalog stars to all 300 systems
Replaced fabricated designations with real Gliese-Jahreiss entries
sourced from HYG Database v4.1. Selection: 215 G/K/F + 75 M + 10
unusual (white dwarfs, flare stars, subdwarfs) = 300 systems.

Habitable star types (G/K/F) are preferred at each distance shell,
spreading usable planets wider through the network. M-dwarfs fill
remaining slots — station economies, mining, frontier outposts.

Distance range: 4.2-46.8 ly. 51 named stars including Tau Ceti
(Gateway), Alpha Centauri, Delta Pavonis, Barnard's Star, Sirius,
Procyon, Arcturus, Pollux, Vega, Fomalhaut.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 23:38:55 +01:00
jpmschweitzerandClaude Opus 4.6 90a1f56504 docs(docs): add GJ catalog index for all 300 star systems
Master reference of all Gliese-Jahreiss designations with links to
individual wiki pages. Grouped by catalog range (main, southern,
supplement 3/4, post-settlement). Includes named stars quick reference
with distances and spectral classes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 23:25:42 +01:00
jpmschweitzerandClaude Opus 4.6 3c39d1a35a feat(docs): add wiki stub system for 300 star systems
Generated wiki stubs at docs/wiki/systems/{GJ-id}/index.md for all
300 systems. Each stub has YAML frontmatter (54 machine-readable
columns) + markdown body (5 authored text sections) + derived fields.

13 columns pre-filled from star-map.json (identity, gate infrastructure,
location, wave, earth_proximity). 55 columns await authoring.

Includes:
- tooling/wiki/generate-stubs.py — template renderer, idempotent
- tooling/wiki/extract-csv.py — wiki→CSV extractor with fill rate report
- docs/design/star-systems.csv — initial CSV at 19.3% completion

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 23:24:17 +01:00
jpmschweitzerandClaude Opus 4.6 26276a59f4 feat(docs): assign GJ catalog IDs to all 300 star systems
All systems use Gliese-Jahreiss (GJ) designations as primary catalog.
35 real nearby stars assigned by proximity to Gateway; 265 fabricated
across GJ sub-catalogs (main, southern, supplement, post-settlement).

Notable assignments:
- Gateway (S-001): GJ 71 / Tau Ceti
- Alpha Centauri A/B (S-090): GJ 559A, binary junction at hop 3
- Delta Pavonis (S-265): GJ 780, core dead_end at hop 2

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 23:21:26 +01:00
jpmschweitzerandClaude Opus 4.6 45ba7a57e1 docs(docs): add frontmatter to character-creation, content-architecture, and control-interaction workshops
Standardized YAML frontmatter on 5 files across 3 workshop directories.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 23:10:34 +01:00
jpmschweitzerandClaude Opus 4.6 47204da1ab docs(docs): add frontmatter to art-direction-mood-board workshop
Standardized YAML frontmatter on all 23 files in the art direction
workshop with title, description, type, workshop, agent, and round
fields.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 23:10:27 +01:00
jpmschweitzerandClaude Opus 4.6 5f266ae002 chore(meta): merge main into planning, resolve CHANGELOG conflict
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 23:02:07 +01:00
jpmschweitzerandClaude Opus 4.6 8c4f734480 chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 22:57:57 +01:00
jpmschweitzerandClaude Opus 4.6 0f6bab4734 docs(docs): add star map d2 sector diagrams
Six sector maps (core, N/S/E/W reach, deep frontier) plus overview.
Generated from star-map.json — currently stale after topology tuning,
will be regenerated once naming pass is complete.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 22:57:41 +01:00
jpmschweitzerandClaude Opus 4.6 ff9014ffc0 feat(docs): add star map gate topology for 300 systems
300-node gate network with 334 edges, generated from seed config then
hand-balanced and tuned. Gateway (S-001) is the first hop from Earth
with 4 active + 1 dormant Sol aperture.

Final topology: 20% dead_end, 14% spur_end, 31% through_route,
10% loop_member, 19% junction, 6% hub. Frontier sectors have
distinct linear corridors; core is densely interconnected.

Includes generation pipeline (generate, sculpt, patch-core, tune),
seed config, and star-map-plan.md with algorithm documentation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 22:57:32 +01:00
jpmschweitzerandClaude Opus 4.6 7da62369ab docs(docs): add 300-system CSV framework and design iterations
Canonical framework (systems-framework.md) defines 66 columns for all
300 star systems, organized as wiki-ready sections. Covers colonization
waves, cultural archetypes, tone framework, economic distribution, and
Krenn validation criteria.

Includes all iteration rounds: Miri/Paula originals, cross-pollination
synthesis, Gestalt mechanical review, and final revisions removing grand
conspiracy in favor of fear-driven Earth-Reach secession narrative.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 22:57:23 +01:00
jpmschweitzerandClaude Opus 4.6 048e13b5bf docs(docs): amend D-095 aperture range to 1-8
Revised from 4-8 per Miri's worldbuilding input — single-aperture
dead-end systems are valid and narratively important for isolated
frontier outposts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 22:57:12 +01:00
jpmschweitzerandClaude Opus 4.6 1014680ebb docs(discussions): add frontmatter to all discussion rounds
Standardized YAML frontmatter on all 26 docs/discussions/ files with
title, description, type, status, round number, and created date.
All marked as archived.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 18:55:37 +01:00
jpmschweitzerandClaude Opus 4.6 9d2ab53302 docs(docs): add frontmatter to test plans, test reports, and audits
Standardized YAML frontmatter on 7 files across docs/test-plans/,
docs/test-reports/, and docs/audits/.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 18:55:30 +01:00
jpmschweitzerandClaude Opus 4.6 934d4df4b0 docs(docs): add frontmatter to all design docs
Standardized YAML frontmatter on all 40 docs/design/ files with title,
description, type, status, ticket, decision_refs, and author fields.
Covers specs, wireframes, voice cards, spatial layouts, and system
designs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 15:22:17 +01:00
jpmschweitzerandClaude Opus 4.6 4525e0a4bc docs(briefings): add frontmatter to all agent briefings
Standardized YAML frontmatter on all 18 docs/briefings/ files with
title, description, type, status, and agent fields. Each description
captures the agent's role and current focus areas.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 15:22:10 +01:00
jpmschweitzerandClaude Opus 4.6 3100190b40 docs(docs): add frontmatter to architecture docs
Standardized YAML frontmatter on all 10 docs/architecture/ files with
title, description, type, status, ticket, decision_refs, and author
fields. Enables context-aware document loading.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 15:22:03 +01:00
jpmschweitzerandClaude Opus 4.6 d830abf4b6 chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 15:01:10 +01:00
jpmschweitzerandClaude Opus 4.6 453983ffd2 chore(docs): remove content-converter and content-ron Makefile target
The YAML→RON converter and its make target are v0.1 artifacts superseded
by the v0.2 RON-first generator pipeline. content-ron/ was already
gitignored; this removes the tool that generated it.

Closes #667.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 15:00:46 +01:00
jpmschweitzerandClaude Opus 4.6 dfcd7bc96d chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 14:46:15 +01:00
jpmschweitzerandClaude Opus 4.6 a569313e14 docs(docs): add frontmatter templates for docs/ directory
New template system for project documentation with standardized
frontmatter (title, description, type, status, decision_refs).
Templates for architecture, design, briefing, workshop, and test-plan
document types. Enables context-aware loading alongside the existing
wiki template system.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 14:46:00 +01:00
jpmschweitzerandClaude Opus 4.6 f20c11a5a9 chore(docs): remove v0.1 hand-authored character files
Per D-122 (all NPCs generated), these 18 character profiles and roster
index are superseded by the generator pipeline. Keeping named NPCs in
the wiki anchors generators to specific patterns instead of exploring
the design space. The Kael Davan profile is preserved as a generator
quality exemplar in wiki/_templates/character-exemplar.md.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 14:45:53 +01:00
jpmschweitzerandClaude Opus 4.6 e496a99b56 docs(docs): add description frontmatter to all wiki entries
Every wiki entry now has a one-line description field for context-aware
loading. Covers factions, technology, concepts, contraband, locations,
star-systems, authoring guides, and triangles (29 files).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 14:45:33 +01:00
jpmschweitzerandClaude Opus 4.6 4d0e3d0f31 docs(docs): add description field to wiki templates and character exemplar
All 14 wiki templates now include a `description` frontmatter field for
context-aware document loading. Agents can filter by description before
loading full files, reducing context window pressure.

Added character-exemplar.md preserving the Kael Davan Tier 1 profile as
generator quality target (D-122). Updated GOVERNANCE.md to document the
new field in the entry creation workflow.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 14:45:21 +01:00
1488 changed files with 114383 additions and 9402 deletions
+64 -1
View File
@@ -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 28).
@@ -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 35
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:
+15 -1
View File
@@ -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
View File
@@ -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
+8 -8
View File
@@ -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:
-50
View File
@@ -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.
-954
View File
@@ -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**
-22
View File
@@ -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]+$"
}
}
}
-135
View File
@@ -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)" }
}
}
}
}
-288
View File
@@ -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."
}
}
}
-134
View File
@@ -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)"
}
}
}
}
}
-52
View File
@@ -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
}
}
}
-73
View File
@@ -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"
}
}
}
}
}
-54
View File
@@ -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"
}
}
}
-234
View File
@@ -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" }
}
}
}
}
-209
View File
@@ -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" }
}
}
}
}
-103
View File
@@ -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" }
}
}
}
}
-26
View File
@@ -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
}
}
}
-26
View File
@@ -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
}
}
}
-99
View File
@@ -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" }
}
}
}
}
+5
View File
@@ -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
View File
@@ -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-018Q-023, Q-029, Q-030, Q-046 |
| [questions-perception.md](questions-perception.md) | Observation questions | Q-003, Q-014, Q-016, Q-024Q-026, Q-051, Q-053, Q-054 |
| [questions-content.md](questions-content.md) | Narrative questions | Q-010, Q-012Q-015, Q-017, Q-028, Q-031, Q-033, Q-040Q-050, Q-052 |
| [questions-content.md](questions-content.md) | Narrative questions | Q-010, Q-012Q-015, Q-017, Q-028, Q-031, Q-033, Q-040Q-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-034Q-039 |
| [rejected.md](rejected.md) | Rejected alternatives | R-001 through R-010 |
+1 -1
View File
@@ -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
View File
@@ -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 48 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 **18 apertures per station** (revised from 48; 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 18 (from 48) 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 48 to **18** 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 0600 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 | 0600 GD | 23002900 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)*
+1 -1
View File
@@ -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
+27 -4
View File
@@ -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)*
+3 -2
View File
@@ -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)*
+5 -5
View File
@@ -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
View File
@@ -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-114D-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)*
+7
View File
@@ -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.
+41
View File
@@ -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.}
+32
View File
@@ -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.}
+35
View File
@@ -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.}
+28
View File
@@ -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.}
+35
View File
@@ -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)
+12
View File
@@ -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
+12
View File
@@ -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
+14 -2
View File
@@ -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
+12
View File
@@ -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)
+15 -3
View File
@@ -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)
+13 -1
View File
@@ -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
+119
View File
@@ -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 (010 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).
+12
View File
@@ -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
+7
View File
@@ -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.
+7
View File
@@ -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
+7
View File
@@ -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
+7
View File
@@ -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
+7
View File
@@ -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)
+7
View File
@@ -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).
+7
View File
@@ -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.
+7
View File
@@ -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).
+7
View File
@@ -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.
+7
View File
@@ -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.
+7
View File
@@ -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.
+7
View File
@@ -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.
+7
View File
@@ -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.
+9
View File
@@ -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.
+10 -1
View File
@@ -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
+9
View File
@@ -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
+10 -1
View File
@@ -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
View File
@@ -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.
+9
View File
@@ -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
+9
View File
@@ -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
+13 -4
View File
@@ -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
View File
@@ -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
+9
View File
@@ -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
+9
View File
@@ -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
View File
@@ -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
View File
@@ -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
+9
View File
@@ -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
View File
@@ -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
+9
View File
@@ -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
View File
@@ -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
+9
View File
@@ -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
+9
View File
@@ -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
+12
View File
@@ -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)
+12
View File
@@ -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
+23 -11
View File
@@ -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
+17 -5
View File
@@ -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)*
---
+13 -1
View File
@@ -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.
+353
View File
@@ -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
+12
View File
@@ -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
+12
View File
@@ -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)
+23 -11
View File
@@ -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.
+12
View File
@@ -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
+12
View File
@@ -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
+12
View File
@@ -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
+12
View File
@@ -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
+12
View File
@@ -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)
+12
View File
@@ -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)
+12
View File
@@ -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
+12
View File
@@ -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