Compare commits

..
87 Commits
Author SHA1 Message Date
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
1022 changed files with 87965 additions and 7876 deletions
+21 -3
View File
@@ -6,6 +6,27 @@ Format based on [Keep a Changelog](https://keepachangelog.com/).
## [Unreleased]
### Added
- 300-system CSV framework (systems-framework.md) — 66 columns covering colonization waves, cultural archetypes, tone framework, economic distribution, and Krenn 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
- 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
@@ -63,9 +84,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)
+1 -6
View File
@@ -2,7 +2,7 @@ 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 \
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 \
@@ -47,7 +47,6 @@ help:
@echo " make decisions-orphan Decisions without implementing tickets"
@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"
@@ -382,10 +381,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" }
}
}
}
}
@@ -1,6 +1,6 @@
# Sova Transit District metadata (D-036)
# Identity derived from directory path: campaigns/main/systems/krenn/stations/sova/districts/transit/
# canonical_id: krenn.sova.transit (derived at load time by ContentValidator)
# Identity derived from directory path: campaigns/main/systems/van-maanens-star/stations/sova/districts/transit/
# canonical_id: van-maanens-star.sova.transit (derived at load time by ContentValidator)
display_name: "Sova Transit District"
description: >
A 40-year-old prefab-modular-retrofitted freight logistics hub on Station Sova.
@@ -19,7 +19,7 @@ items:
THE LAST SHIFT
(Lera's)
Krenn grain spirit — 4c
Van Maanen's Star grain spirit — 4c
Pale station brew — 3c ~~2c~~
Dark station brew — 3c
Import (off-station) — 8c
@@ -135,7 +135,7 @@ items:
3. Do not use freight lifts during emergency protocols
4. Await station authority clearance before resuming operations
Last safety review: Month 4, Year 312 (Krenn calendar)
Last safety review: Month 4, Year 312 (Van Maanen's Star calendar)
tags: [atmospheric]
# ==========================================
@@ -3,7 +3,7 @@
# Zone palette: surface #b8bec4 / fog tint #0a1222
# z=2 (above gate concourse)
canonical_id: "krenn.sova.transit.location.gate-gallery"
canonical_id: "van-maanens-star.sova.transit.location.gate-gallery"
display_name: "Observation Gallery"
description: >
Commission-only observation gallery overlooking the gate concourse from
@@ -2,7 +2,7 @@
# Source: D-093 gate cluster zone spec
# Zone palette: surface #b8bec4 / fog tint #0a1222
canonical_id: "krenn.sova.transit.location.gate-ground"
canonical_id: "van-maanens-star.sova.transit.location.gate-ground"
display_name: "Gate Corridor"
description: >
The gate cluster handles all traffic between Station Sova and the horizon
@@ -3,7 +3,7 @@
# Zone palette: surface #4e5054 / fog tint #101214
# z=0 (Era 1, below main structures)
canonical_id: "krenn.sova.transit.location.maintenance-corridors"
canonical_id: "van-maanens-star.sova.transit.location.maintenance-corridors"
display_name: "Maintenance Corridors"
description: >
Era 1 maintenance infrastructure beneath the transit district. A long
@@ -2,7 +2,7 @@
# Source: D-093, #312 (Sprint 12 spatial layout)
# Zone palette: surface #6b4018 / fog tint #200c04
canonical_id: "krenn.sova.transit.location.the-last-shift"
canonical_id: "van-maanens-star.sova.transit.location.the-last-shift"
display_name: "The Last Shift"
description: >
A converted maintenance bay turned bar. The long counter runs along the
@@ -2,7 +2,7 @@
# Source: D-093, #311 (Sprint 12 spatial layout)
# Zone palette: surface #7a8490 / fog tint #0d1520
canonical_id: "krenn.sova.transit.location.the-terminal"
canonical_id: "van-maanens-star.sova.transit.location.the-terminal"
display_name: "The Terminal"
description: >
Sova's freight logistics hub. Scanner bays filter incoming cargo at the
@@ -1,5 +1,5 @@
# News ticker headline pool — The Last Shift bar
# Meridian Feed (Krenn System local news network)
# Meridian Feed (Van Maanen's Star local news network)
# 30 lines total | Categories: freight (9), politics (4), infrastructure (5), sports (3),
# commission (5), community (4) — see dual_lens notes on each line
# Dual-lens content: each headline reads differently to smuggler vs detective.
@@ -26,7 +26,7 @@ headlines:
detective: "Administrative noise. But fee changes affect which routes are economically viable."
- id: ticker_003
text: "ROUTE ADVISORY: Span gate maintenance on Krenn-Havara corridor — 48hr delays"
text: "ROUTE ADVISORY: Span gate maintenance on Van Maanen's Star-Havara corridor — 48hr delays"
category: freight
dual_lens:
smuggler: "Havara corridor's down. If Sabel's shipments are routed through there, we wait."
@@ -70,7 +70,7 @@ headlines:
detective: "Allocation shifts. New infrastructure means new oversight — or new blind spots."
- id: ticker_009
text: "DELEGATE PROFILE: Rep. Hask (Krenn) calls for Commission oversight review"
text: "DELEGATE PROFILE: Rep. Hask (Van Maanen's Star) calls for Commission oversight review"
category: politics
dual_lens:
smuggler: "Commission oversight review. Could mean more patrols. Could mean fewer. Either way, noise."
@@ -123,7 +123,7 @@ headlines:
detective: "Sports. The universal social lubricant. File under 'conversation openers.'"
- id: ticker_016
text: "LEAGUE TABLE: Krenn Conference — Sova 4th, Mirren Station leads"
text: "LEAGUE TABLE: Van Maanen's Star Conference — Sova 4th, Mirren Station leads"
category: sports
dual_lens:
smuggler: "Fourth. We were second last season. This place is sliding."
@@ -218,7 +218,7 @@ headlines:
High-value dual-lens trigger. Smuggler worries about operational risk; detective spots the
evidence connection. The 44xx range is intentionally ambiguous — might match, might not.
# --- Krenn System / Setting (2) — added Sprint 12, Mellanie ---
# --- Van Maanen's Star / Setting (2) — added Sprint 12, Mellanie ---
- id: ticker_028
text: "VELEN WEATHER: Coastal fog advisories in effect — Sova orbital approach window reduced, gate scheduling adjusted"
@@ -228,7 +228,7 @@ headlines:
detective: "Environmental factors affecting gate operations. Adjust surveillance timing accordingly."
- id: ticker_029
text: "REACH ECONOMY: Krenn System trade volume up 7% — analysts attribute to 'informal market activity'"
text: "REACH ECONOMY: Van Maanen's Star trade volume up 7% — analysts attribute to 'informal market activity'"
category: freight
dual_lens:
smuggler: "Informal market activity. They know. The whole Reach knows. And still the demand keeps climbing."
@@ -1,7 +1,7 @@
# Station Sova metadata (D-036)
display_name: "Station Sova"
description: >
A freight logistics station in the Krenn system. 40-year-old prefab-modular
A freight logistics station in Van Maanen's Star. 40-year-old prefab-modular
facility serving the span gate's cargo throughput. ~12,000 population.
districts:
- "transit"
@@ -1,5 +1,5 @@
# Krenn System metadata (D-036)
display_name: "Krenn System"
# Van Maanen's Star metadata (D-036)
display_name: "Van Maanen's Star"
description: >
A mid-tier system connected via the Sova span gate. Industrial economy
centered on freight logistics and lattice component trade. ~2.4M population,
+1 -1
View File
@@ -81,7 +81,7 @@
],
// Osse expressions: extraction vocabulary — vacuum, pressure, equipment failure.
// These are what kills you. You swear by what's real.
// Different from Krenn void-oaths — Osse is margin industrial, not station working-class.
// Different from Van Maanen's Star void-oaths — Osse is margin industrial, not station working-class.
exclamations: [
"void drain it",
"down pressure",
@@ -1,18 +1,18 @@
// Krenn Culture Profile — example file
// Van Maanen's Star Culture Profile — example file
//
// Schema: server/src/npc/blueprint.rs :: CultureProfile
// Real content: ticket #610 (copy team fills this)
// Validate: tooling/validate-ron content/global/culture-krenn.example.ron culture
// Validate: tooling/validate-ron content/global/culture-van-maanens-star.example.ron culture
//
// One file per culture. The generator reads this to give NPCs culturally
// appropriate names, speech patterns, and personality bias.
//
// Source: D-036 (Krenn System canonical setting), D-128 (culture implicit in location),
// Source: D-036 (Van Maanen's Star canonical setting), D-128 (culture implicit in location),
// D-121 (voice culture-driven), D-123 (AI content templating via culture vectors).
(
id: "krenn",
name: "Krenn System Culture",
id: "van-maanens-star",
name: "Van Maanen's Star Culture",
description: "Working-class pragmatic culture. ~180 years settled, mid-Reach G3V system. Community-oriented, suspicious of distant authority, values competence and reliability over credentials. First-name-primary in social contexts.",
naming: (
@@ -27,7 +27,7 @@
"Davan", "Sessik", "Korr", "Tamm", "Venn",
"Lintar", "Darvo", "Kosse",
],
// Krenn culture is first-name-primary. Family names exist but are
// Van Maanen's Star culture is first-name-primary. Family names exist but are
// used mainly in formal/institutional contexts.
family_name_used_socially: false,
),
@@ -59,7 +59,7 @@
values: (
description: "Pragmatic, community-oriented, suspicious of authority. Competence earns respect. Showing up and doing the work matters more than rank or credentials. Outsiders are tolerated but watched.",
// Traits more common in Krenn culture — generator biases toward these.
// Traits more common in Van Maanen's Star culture — generator biases toward these.
favored_traits: [Bold, Honest, Curious],
// Traits less common — generator biases away from these.
disfavored_traits: [Reclusive, Deceptive],
@@ -1,21 +1,21 @@
// Krenn Culture Profile
// Van Maanen's Star Culture Profile
//
// Schema: server/src/npc/blueprint.rs :: CultureProfile
// Ticket: #610 (copy team)
// Validate: tooling/validate-ron content/global/culture-krenn.ron culture
// Validate: tooling/validate-ron content/global/culture-van-maanens-star.ron culture
//
// Sources: D-036 (Sova Transit District / Krenn System setting, amended post-workshop),
// Sources: D-036 (Sova Transit District / Van Maanen's Star setting, amended post-workshop),
// D-121 (voice is culture-driven, job as modifier),
// D-128 (culture implicit in starting location).
//
// Krenn: ~180 years settled. Mid-Reach G3V system. Working-class pragmatic.
// Van Maanen's Star: ~180 years settled. Mid-Reach G3V system. Working-class pragmatic.
// Community-oriented, suspicious of distant authority. Competence earns respect.
// Showing up and doing the work matters more than rank or credentials.
// First-name-primary in social contexts — family names are institutional.
(
id: "krenn",
name: "Krenn System Culture",
id: "van-maanens-star",
name: "Van Maanen's Star Culture",
description: "Working-class pragmatic culture. ~180 years settled, mid-Reach G3V system. Community-oriented, suspicious of distant authority, values competence and reliability over credentials. Atmosphere: quotidian-with-undertow — comfortable enough to be complacent, tight enough that extra income is tempting.",
naming: (
@@ -43,7 +43,7 @@
"Pellan", "Sorren", "Tessik", "Morek", "Brav",
"Ossel", "Rennick", "Harven", "Tollek", "Dass",
],
// Krenn culture is first-name-primary.
// Van Maanen's Star culture is first-name-primary.
// Family names exist but belong to institutional contexts: contracts, registrations, arrest records.
family_name_used_socially: false,
),
@@ -76,7 +76,7 @@
"see you around",
"stay out of trouble",
],
// Krenn oaths are void-adjacent — space is real here, and hostile.
// Van Maanen's Star oaths are void-adjacent — space is real here, and hostile.
// They don't swear by gods or governments. They swear by what kills you.
exclamations: [
"void take it",
@@ -90,8 +90,8 @@
values: (
description: "Pragmatic, community-oriented, suspicious of authority. Competence earns respect. Showing up and doing the work matters more than rank or credentials. Outsiders are tolerated but watched. Loyalty runs narrow and deep — to your crew, your shift, your street.",
// Traits more common in Krenn culture — generator biases toward these.
// Bold: Krenn people speak their mind. Honest: community trust is load-bearing.
// Traits more common in Van Maanen's Star culture — generator biases toward these.
// Bold: Van Maanen's Star people speak their mind. Honest: community trust is load-bearing.
// Curious: 180 years of problem-solving breeds intellectual appetite.
// Social: community-oriented culture; isolation is a warning sign.
favored_traits: [Bold, Honest, Curious, Social],
@@ -105,7 +105,7 @@
// These feed the composition engine (D-138) — the LLM sees exactly what's here.
// v2 injector validated in Spike 1 (59 prompts, 16.6 t/s CPU).
voice_persona: Some(
"PERSONA: You are a Krenn station worker.\n1. Be direct. No pleasantries. Everyone is short on time.\n2. You're working-class and pragmatic. Competence earns respect, not rank.\n3. You're suspicious of distant authority — management that hasn't worked a shift.\n4. You're economical with language. You don't express what the situation doesn't call for.\n5. You use first names. Family names belong on contracts.\n6. Loyalty runs narrow and deep. Your crew, your shift, your street.\n7. You greet briefly: \"hey\", \"morning\", \"shift treating you alright?\"\n8. You're not rude — you're honest. If something's wrong, you say so.\n\nNEVER: corporate or institutional language — you're not management. 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."
"PERSONA: You are a Van Maanen's Star station worker.\n1. Be direct. No pleasantries. Everyone is short on time.\n2. You're working-class and pragmatic. Competence earns respect, not rank.\n3. You're suspicious of distant authority — management that hasn't worked a shift.\n4. You're economical with language. You don't express what the situation doesn't call for.\n5. You use first names. Family names belong on contracts.\n6. Loyalty runs narrow and deep. Your crew, your shift, your street.\n7. You greet briefly: \"hey\", \"morning\", \"shift treating you alright?\"\n8. You're not rude — you're honest. If something's wrong, you say so.\n\nNEVER: corporate or institutional language — you're not management. 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."
),
voice_examples: [
@@ -124,7 +124,7 @@
],
occasional_injections: [
// Oath vocabulary — void-adjacent exclamations. Krenn swear by what kills you:
// Oath vocabulary — void-adjacent exclamations. Van Maanen's Star swear by what kills you:
// vacuum, void, stars. Rolled at 25% frequency by the composition engine.
// Gated off for suppressive tells to avoid conflicting instructions (Spike 1 finding).
(
@@ -142,7 +142,7 @@
// Behavior modifiers — cultural inflections appended to BehaviorPrimitive actions.
// Categories match modifier_hint strings on primitives (server/src/npc/blueprint.rs).
// If no hint matches, engine falls back to any modifier in this list.
// Krenn: terse, efficient, self-contained. No performance of effort or rest.
// Van Maanen's Star: terse, efficient, self-contained. No performance of effort or rest.
behavior_modifiers: [
// work_pace — how fast and efficiently they execute physical tasks
(category: "work_pace", clause: "without wasted motion"),
@@ -163,7 +163,7 @@
(category: "offduty_posture", clause: "without making a show of it"),
(category: "offduty_posture", clause: "in no rush to be anywhere"),
// authority_response — behavior when supervisors or authority figures are present
// Krenn: working-class defiance — authority that hasn't earned it gets no performance
// Van Maanen's Star: working-class defiance — authority that hasn't earned it gets no performance
(category: "authority_response", clause: "with no performance for the rank"),
(category: "authority_response", clause: "with no visible adjustment for who's present"),
],
@@ -1,10 +1,10 @@
// Krenn Industrial Zone — location metadata
// Van Maanen's Star Industrial Zone — location metadata
//
// Schema: server/src/npc/blueprint.rs :: ZoneSpec
// Ticket: #609, #630, #661 (copy team)
// Validate: tooling/validate-ron content/global/krenn-industrial-zone.ron zone
// Validate: tooling/validate-ron content/global/van-maanens-star-industrial-zone.ron zone
//
// Location-specific metadata for a Krenn industrial freight district.
// Location-specific metadata for a Van Maanen's Star industrial freight district.
// Behavior primitives have moved to the zone-type template:
// content/global/zone-types/industrial_freight.ron
//
@@ -19,7 +19,7 @@
label: "Industrial Zone",
description: "Freight handling, manufacturing, and maintenance. High throughput, shift-based work rhythms, functional over comfortable. Faces are known by role and bay number more than name. The work doesn't stop between shifts — people do.",
// 1-10. Industrial Krenn: steady credit flow, but it all goes somewhere.
// 1-10. Industrial Van Maanen's Star: steady credit flow, but it all goes somewhere.
economic_level: 7,
// 1-10. Dense. Multiple shifts overlap. Crowds at handover.
population_density: 6,
@@ -1,10 +1,10 @@
// Krenn Rural Zone — location metadata
// Van Maanen's Star Rural Zone — location metadata
//
// Schema: server/src/npc/blueprint.rs :: ZoneSpec
// Ticket: #609, #630, #661 (copy team)
// Validate: tooling/validate-ron content/global/krenn-rural-zone.ron zone
// Validate: tooling/validate-ron content/global/van-maanens-star-rural-zone.ron zone
//
// Location-specific metadata for a Krenn rural agricultural settlement.
// Location-specific metadata for a Van Maanen's Star rural agricultural settlement.
// Behavior primitives have moved to the zone-type template:
// content/global/zone-types/rural_agricultural.ron
//
@@ -19,7 +19,7 @@
label: "Rural Settlement",
description: "Scattered homesteads, small workshops, and communal gathering points. Low population density, strong community bonds, subsistence-plus economy. Work is seasonal and visible — everyone knows what everyone else is doing.",
// 1-10. Rural Krenn: self-sufficient, low cash flow, barter supplements credits.
// 1-10. Rural Van Maanen's Star: self-sufficient, low cash flow, barter supplements credits.
economic_level: 3,
// 1-10. Sparse. Faces are familiar. Strangers stand out.
population_density: 2,
+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
-- ---------------------------------------------------------------------------
+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
+58 -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 4–8 apertures per station. Per-system canonical name: "The Ring." Travel is sequential-hop only (A→B→C through intermediate systems; no direct long-range transit). Per-system access tiers vary (4 tiers — some systems allow single-hop to orbital customs; no direct planetary span gate). Station Sova's horizon gates are located at The Ring (Oort-cloud orbital); the Administrative Hub contains booking offices only (not the gates themselves — correction to prior station profile text). "The Loop" is Sova's internal tram network: 6 districts, 4-minute run from Residential Core to Transit District. Workers arrive at the transit platform (bar-side) and disperse to Terminal or bar.
- **Rationale:** Resolves transport lore questions Q-040, Q-041, Q-043, Q-044 raised during Workshop #153. Miri's Round 3 contribution. Horizon station as alien-built infrastructure adds worldbuilding depth without requiring a named builder species. Sequential-hop travel creates natural story hooks (layover locations, transit records, smuggling route complexity).
- **Decision:** Span gates are human-built structures with a single aperture enabling near-instantaneous transit. Operating schedule uses dual-use windows: freight (bulk of hours) and passenger (scheduled slots). Physical layout: aperture chamber → freight staging / passenger arrival → customs lanes → gate concourse. Horizon stations are alien-built installations (no identified builder species), self-maintaining, located at Oort-cloud distance, with **1–8 apertures per station** (revised from 4–8; single-aperture stations are valid and produce isolated dead-end systems with one way in and one way out). Per-system canonical name: "The Ring." Travel is sequential-hop only (A→B→C through intermediate systems; no direct long-range transit). Per-system access tiers vary (4 tiers — some systems allow single-hop to orbital customs; no direct planetary span gate). Station Sova's horizon gates are located at The Ring (Oort-cloud orbital); the Administrative Hub contains booking offices only (not the gates themselves — correction to prior station profile text). "The Loop" is Sova's internal tram network: 6 districts, 4-minute run from Residential Core to Transit District. Workers arrive at the transit platform (bar-side) and disperse to Terminal or bar.
- **Rationale:** Resolves transport lore questions Q-040, Q-041, Q-043, Q-044 raised during Workshop #153. Miri's Round 3 contribution. Horizon station as alien-built infrastructure adds worldbuilding depth without requiring a named builder species. Sequential-hop travel creates natural story hooks (layover locations, transit records, smuggling route complexity). Aperture count revised to 1–8 (from 4–8) to allow single-aperture stations, which produce the most isolated and narratively interesting dead-end systems — and leave open the question of what a single-aperture station pointing at an unknown destination means.
- **Raised by:** Miri (worldbuilding), confirmed by team.
- **Amendment (2026-03-13):** Aperture count range revised from 4–8 to **1–8** per project lead direction. Single-aperture horizon stations are valid; they are the mechanism for the most isolated dead-end systems, and for any system whose single gate points to a destination that is not (or not yet) part of the Reach. This change has downstream implications for the Earth question — see note in systems-framework-miri.md §7.
- **Amendment (2026-03-14):** Clarified the inter-system / intra-system gate distinction and technology lineage:
- **Inter-system gates (horizon gates / founder gates):** Alien-built. Aperture count and connections are properties of the alien infrastructure. Humans cannot add, remove, activate, or deactivate inter-system apertures. Gate topology is *given*, not chosen. The one known exception — a dormant aperture at Struve activating ~40 years ago — was not a human action; the alien infrastructure did something on its own, for reasons the Veil Institute has not explained. Whether dormant apertures exist elsewhere, and what triggers activation, is unknown.
- **Intra-system gates (span gates):** Human-built technology, derived from the Veil Institute's study of alien horizon station architecture. The Institute reverse-engineered the principles governing short-range aperture formation and licensed the technology to a gate construction corporation, which now owns and operates span gate infrastructure across the Reach (and owns an entire system as its industrial base). Span gates are well-understood engineering: buildable, modifiable, commercially operated.
- **Key constraint for wiki authors:** No system's aperture count or inter-system connections are the result of human decisions. Systems cannot "vote for" or "apply for" additional horizon gate apertures. A system's gate topology is an alien-determined fact that humans have adapted to, not chosen.
- **Dissent:** None.
- **Source:** Station District Layout Workshop, Ticket #153, Sprint 20. Round document: `docs/discussions/round-20-station-district-layout.md`
- **Cross-reference:** D-093 (gate cluster spatial layout), Q-040 (gate dual-use topology — resolved), Q-041 (horizon station model — resolved), Q-042 (intra-system transport — partially resolved), Q-043 (station internal transit — resolved), Q-044 (gate-train integration — resolved)
@@ -297,12 +302,12 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio
### D-121: Voice is culture-driven — job as modifier
- **Date:** 2026-03-05
- **Decision:** NPC voice is authored at the culture level with job-specific modifiers layered on top. Culture is primary — a character IS their background. Job adds a layer. A Krenn tycoon sounds like a Krenn person who runs businesses, not a generic tycoon. This is an inversion of the prior assumption that job drove voice with culture as modifier.
- **Rationale:** Culture-primary voice produces characters that feel like they belong to a place. Job-primary voice produces archetypes. The life-sim vision requires characters legible as inhabitants of the Krenn System, not as representatives of occupational categories.
- **Decision:** NPC voice is authored at the culture level with job-specific modifiers layered on top. Culture is primary — a character IS their background. Job adds a layer. A Van Maanen's Star tycoon sounds like a Van Maanen's Star person who runs businesses, not a generic tycoon. This is an inversion of the prior assumption that job drove voice with culture as modifier.
- **Rationale:** Culture-primary voice produces characters that feel like they belong to a place. Job-primary voice produces archetypes. The life-sim vision requires characters legible as inhabitants of Van Maanen's Star, not as representatives of occupational categories.
- **Source:** Where's the Fun? Workshop, Round 4 Interview, Decision 6
- **Raised by:** Team Leader (Jeroen) — inversion of Mellanie's prior option C
- **Dissent:** None
- **Cross-reference:** [D-128](#d-128-culture-implicit-in-starting-location--krenn-system-equals-krenn-culture) (Krenn culture as starting context)
- **Cross-reference:** [D-128](#d-128-culture-implicit-in-starting-location--van-maanens-star-system-equals-van-maanens-star-culture) (Van Maanen's Star culture as starting context)
### D-122: All NPCs generated — no named hand-authored characters
- **Date:** 2026-03-05
@@ -327,7 +332,7 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio
- **Dissent:** None on amendment
- **Amendment attribution:** The two-mode distinction (build-time authoring tool vs. runtime background enhancement) and the six dialogue re-voicing quality constraints are Paula's contribution from LLM Voice Pipeline Workshop Round 3. The two-mode framing is the organizing principle: build-time mode inherits the original D-123 safety model (human review); runtime mode operates under a different safety model (three-layer fallback) that was validated in Spikes 1 and 2.
- **Amended by:** [D-138](#d-138-llm-re-voicing-pipeline-for-npc-voice) (LLM Voice Pipeline Workshop, 2026-03-07)
- **Cross-reference:** [D-121](#d-121-voice-is-culture-driven--job-as-modifier) (culture-primary voice), [D-128](#d-128-culture-implicit-in-starting-location--krenn-system-equals-krenn-culture) (culture profile as generator input), [D-140](#d-140-dialogue-re-voicing-quality-constraints--paulas-six-rules) (dialogue re-voicing quality constraints)
- **Cross-reference:** [D-121](#d-121-voice-is-culture-driven--job-as-modifier) (culture-primary voice), [D-128](#d-128-culture-implicit-in-starting-location--van-maanens-star-system-equals-van-maanens-star-culture) (culture profile as generator input), [D-140](#d-140-dialogue-re-voicing-quality-constraints--paulas-six-rules) (dialogue re-voicing quality constraints)
### D-124: In-game ollama for live NPC dialogue — ~~deferred~~ SUPERSEDED by D-138
- **Date:** 2026-03-05
@@ -364,14 +369,14 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio
- **Raised by:** Team Leader (Jeroen)
- **Dissent:** None
### D-128: Culture implicit in starting location — Krenn System equals Krenn culture
### D-128: Culture implicit in starting location — Van Maanen's Star equals Van Maanen's Star culture
- **Date:** 2026-03-05
- **Decision:** Culture is implicit in the starting bookmark location. The tycoon bookmark in the Krenn System means Krenn culture. The player does not select culture at character creation; it derives from where the bookmark places them. This resolves the culture-everywhere-but-nowhere tension: culture IS in the game from day one, it's just not a character creation slider. The Krenn System provides the cultural context; NPC generation uses regional culture as the primary vector.
- **Decision:** Culture is implicit in the starting bookmark location. The tycoon bookmark in Van Maanen's Star means Van Maanen's Star culture. The player does not select culture at character creation; it derives from where the bookmark places them. This resolves the culture-everywhere-but-nowhere tension: culture IS in the game from day one, it's just not a character creation slider. Van Maanen's Star provides the cultural context; NPC generation uses regional culture as the primary vector.
- **Rationale:** Seven of nine workshop agents independently flagged the tension between D-115 (culture deferred from creation) and D-121 (culture primary for voice). Implicit culture unblocks five downstream pipelines simultaneously: voice cards (Mellanie), culture profiles (Miri), NpcBlueprint culture field (Tyre), cultural visual grammar (Araminta), systems integration (Gestalt).
- **Source:** Where's the Fun? Workshop, Round 5 Interview, Decision 16
- **Raised by:** Team Leader (Jeroen)
- **Dissent:** None
- **Cross-reference:** [D-121](#d-121-voice-is-culture-driven--job-as-modifier) (culture-primary voice), [D-036](#d-036-sova-transit-district--krenn-system-as-v01-setting) (Krenn System canonical details)
- **Cross-reference:** [D-121](#d-121-voice-is-culture-driven--job-as-modifier) (culture-primary voice), [D-036](#d-036-sova-transit-district--van-maanens-star-system-as-v01-setting) (Van Maanen's Star canonical details)
### D-129: NPC personality — traits + behavior first, relationships codified for systems
- **Date:** 2026-03-05
@@ -432,7 +437,7 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio
- **Amends:** [D-123](#d-123-generative-ai-for-npc-content--build-time-authoring-tool-and-runtime-voice-pipeline) (scope extended from authoring tool to authoring + runtime)
- **Supersedes:** [D-124](#d-124-in-game-ollama-for-live-npc-dialogue--deferred-superseded-by-d-138) (in-game AI no longer deferred)
- **Resolves:** Q-057 (composable behavior generation), Q-012 (generation expansion method)
- **Cross-reference:** [D-010](architecture.md#d-010) (information boundaries), [D-121](#d-121-voice-is-culture-driven--job-as-modifier) (culture-primary voice), [D-122](#d-122-all-npcs-generated--named-npcs-deferred) (all NPCs generated), [D-128](#d-128-culture-implicit-in-starting-location--krenn-system-equals-krenn-culture) (culture as generator input), [D-029](#d-029-population-entanglement-ratio--305020) (NPC tier model), [D-092](perception.md#d-092) (anchor lines), [D-140](#d-140-dialogue-re-voicing-quality-constraints--paulas-six-rules) (dialogue re-voicing quality constraints)
- **Cross-reference:** [D-010](architecture.md#d-010) (information boundaries), [D-121](#d-121-voice-is-culture-driven--job-as-modifier) (culture-primary voice), [D-122](#d-122-all-npcs-generated--named-npcs-deferred) (all NPCs generated), [D-128](#d-128-culture-implicit-in-starting-location--van-maanens-star-system-equals-van-maanens-star-culture) (culture as generator input), [D-029](#d-029-population-entanglement-ratio--305020) (NPC tier model), [D-092](perception.md#d-092) (anchor lines), [D-140](#d-140-dialogue-re-voicing-quality-constraints--paulas-six-rules) (dialogue re-voicing quality constraints)
### D-139: Composable behavior primitives — three-layer assembly model
- **Date:** 2026-03-13
@@ -457,9 +462,9 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio
- **D-140-R3 — Access tier feel must be preserved:** The social register appropriate to the D-028 access tier tag must survive re-voicing. `public` stays neutral-transactional; `peer` stays lateral-relaxed; `insider` stays familiar-complicit; `authority` stays institutional-asymmetric; `hostile` stays minimal-closed. The tag governs eligibility; the register governs feel. An `insider` line re-voiced into institutional language reads as `authority` to the player regardless of tag. Implementation: access tier injected as a constraint clause alongside the culture injector.
- **D-140-R4 — Named entities are passthrough within output:** Any proper noun in the base text (NPC names, location names, faction names, technology terms) must appear verbatim in the re-voiced output. Named entities carry specific information — "Kael" and "that dock worker" are not interchangeable in an information-asymmetry game. Implementation: extraction step before re-voicing; protected entity list injected as a hard constraint. The extractor need not understand lore — capitalized terms are sufficient for identification.
- **D-140-R5 — Relationship-specific lines are passthrough:** Any dialogue line naming a specific third-party NPC or describing a specific interpersonal event is not re-voiced. It is served as authored base text. These lines carry social information whose phrasing is load-bearing — the hesitation, the neutral delivery, the precise ambiguity are all authored intentionally. Re-voicing risks substituting the named NPC with a reference, dramatizing the event, or adding social judgment not in the original.
- **D-140-R6 — Tell-context modifier cannot override culture register:** When a tell-context injector is active, it shapes emotional inflection within the culture register — it does not replace the register. A Krenn NPC with a Nervous tell still speaks in Krenn register (direct, minimal pleasantries, working-class pragmatic) while the content reflects nervous pressure. Culture is primary (D-121); tell-context is situational. Implementation: culture injector is always applied before tell-context modifier; tell-context is framed as inflection, not override.
- **D-140-R6 — Tell-context modifier cannot override culture register:** When a tell-context injector is active, it shapes emotional inflection within the culture register — it does not replace the register. A Van Maanen's Star NPC with a Nervous tell still speaks in Van Maanen's Star register (direct, minimal pleasantries, working-class pragmatic) while the content reflects nervous pressure. Culture is primary (D-121); tell-context is situational. Implementation: culture injector is always applied before tell-context modifier; tell-context is framed as inflection, not override.
- **Rationale:** D-138 established the architecture; these rules operationalize the quality floor for dialogue content specifically. Dialogue re-voicing carries higher information risk than behavior re-voicing — dialogue is direct player-NPC exchange where epistemic signals and relationship registers matter most. These rules scale with the pipeline: at 300 systems and thousands of NPCs, the prompt engineering layer must enforce these constraints programmatically, not through per-line human review. The constraints are formalized here so server team, copy team, and QA can reference them independently.
- **Scaling note:** R4 (named entity extraction) requires a proper noun tagger that works across all culture naming conventions — Krenn names differ structurally from other cultures. The extractor approach (capitalized terms as proxy) is sufficient for the Krenn launch system but must be culture-aware for systems with non-capitalized or logographic naming conventions. This is a DLC-scope concern, not a v0.2 blocker.
- **Scaling note:** R4 (named entity extraction) requires a proper noun tagger that works across all culture naming conventions — Van Maanen's Star names differ structurally from other cultures. The extractor approach (capitalized terms as proxy) is sufficient for the Van Maanen's Star launch system but must be culture-aware for systems with non-capitalized or logographic naming conventions. This is a DLC-scope concern, not a v0.2 blocker.
- **Source:** LLM Voice Pipeline Workshop (2026-03-07), Paula Round 3 (`docs/workshops/llm-voice-pipeline/paula-round3.md`)
- **Raised by:** Paula (LLM Voice Pipeline Workshop, Round 3)
- **Dissent:** None
@@ -510,7 +515,7 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio
- Culture profiles: `content/global/culture-{name}.ron` (existing)
- Location specs: `content/locations/{system}-{zone}.ron` (metadata only, no primitives)
- **Rationale:** The per-location primitive model (current `typical_behaviors` and per-location `behavior_primitives` arrays) does not scale to 300 systems. A Krenn farmer and a Vael farmer doing the same physical work in the same zone type are authoring the same primitives twice — the content that differs between them is the *how* (culture), not the *what* (the physical action). Separating these dimensions reduces authoring cost by an order of magnitude and ensures that adding a new system is a metadata operation, not a content sprint. The standalone readability constraint ensures the system degrades gracefully when the LLM is unavailable, which is a runtime reliability requirement for a 300-system game, not just a fallback policy.
- **Rationale:** The per-location primitive model (current `typical_behaviors` and per-location `behavior_primitives` arrays) does not scale to 300 systems. A Van Maanen's Star farmer and a Vael farmer doing the same physical work in the same zone type are authoring the same primitives twice — the content that differs between them is the *how* (culture), not the *what* (the physical action). Separating these dimensions reduces authoring cost by an order of magnitude and ensures that adding a new system is a metadata operation, not a content sprint. The standalone readability constraint ensures the system degrades gracefully when the LLM is unavailable, which is a runtime reliability requirement for a 300-system game, not just a fallback policy.
- **Layer 3 grammar constraint:** When Gemma appends environmental flavor to Layer 1+2 assembled text, the flavor clause must grammatically attach as a prepositional phrase or coordinating conjunction. Absolute and participial phrases (e.g., "tool already in hand") require a leading comma separator. Culture-specific modifier clauses that use absolute-phrase construction must include the separator (e.g., ", tool already in hand") or be rewritten as prepositional form ("with tool in hand") to ensure clean assembly. This constraint applies to all culture profile modifier authoring.
@@ -519,8 +524,35 @@ 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-setting) (Van Maanen's Star setting origin of first zone specs), [D-128](#d-128-culture-is-implicit-in-starting-location) (culture implicit in location)
---
*41 decisions. Last updated: 2026-03-13 (D-142 zone-type template architecture — Sprint 26; D-140 dialogue re-voicing quality constraints — Sprint 26 #647; D-139 composable behavior primitives — Sprint 26 #633)*
### D-143: GD calendar epoch — Gate Discovery (2300 AD) as year 0
- **Date:** 2026-03-14
- **Decision:** The Settled Reach uses the Gate Discovery (GD) calendar. Year 0 GD = 2300 AD. The game present is ~600 GD (~2900 AD). The secession occurred ~300 GD (~2600 AD). The five settlement waves span 0–600 GD. Earth dates (AD/BC) exist but are an Earth-internal reference most Reach residents wouldn't use. All `age_years` fields in the systems framework measure years before game present, not GD years directly.
- **Rationale:** A civilization that seceded from Earth would not use an Earth religious calendar. The gate discovery is the founding event of the Reach — the moment human settlement beyond Sol became possible. 2300 AD provides enough time (~275 years from present day) for pre-gate spacefaring development including Mars terraforming (~2100-2200 AD, or roughly -200 to -100 GD).
- **Implications:** Mars terraforming predates the gates — it's an Earth-only achievement, which adds to the "we built everything" obligation narrative. The ~12,900-year span of human civilization becomes a number only Earth institutions would cite. Reach residents measure history from the gates forward.
- **Reference timeline:**
| Event | GD | AD |
|---|---|---|
| Human civilization origin | ~-10600 GD | ~10,000 BC |
| Mars terraforming begins | ~-200 GD | ~2100 AD |
| **Gate Discovery (epoch)** | **0 GD** | **2300 AD** |
| Five settlement waves | 0–600 GD | 2300–2900 AD |
| Secession | ~300 GD | ~2600 AD |
| Game present | ~600 GD | ~2900 AD |
- **Cross-reference:** [D-036](#d-036-sova-transit-district--van-maanens-star-system-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-setting) (v0.1 setting)
---
*43 decisions. Last updated: 2026-03-14 (D-144 Sirius as Reach capital)*
+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
+3 -3
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,8 +197,8 @@ 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
+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)*
+4 -4
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)
+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)
+13 -1
View File
@@ -1,3 +1,15 @@
---
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: draft
ticket: ""
decision_refs: []
author: "Gemini"
created: 2026-03-07
updated: 2026-03-07
---
# Proposed Architecture: LLM-Powered Voice Synthesis
**Status:** Proposed
@@ -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
+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
+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, Krenn 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 Krenn 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

Some files were not shown because too many files have changed in this diff Show More