diff --git a/docs/sprints/sprint-4/ci.md b/docs/sprints/sprint-4/ci.md new file mode 100644 index 000000000..76612d494 --- /dev/null +++ b/docs/sprints/sprint-4/ci.md @@ -0,0 +1,55 @@ +# Sprint 4: Feel — CI Tasks + +**Goal:** Content conversion and authoring begins — wiki to YAML, content packs, monologue pool + +**Branch:** `ci` +**Agents:** Justine (build/deploy), Hoshe (QA) + +## New Tickets + +| # | Title | Priority | Blocked by | +|---|-------|----------|------------| +| #393 | Pre-commit FactId typo check | medium | — | + +Use `db/connectors/ticket show ` for full details. + +## Key Decisions + +- `decisions/content.md` — D-035 (tag taxonomy, FactId references in dialogue/monologue) +- `decisions/architecture.md` — D-030 (testability architecture) + +## Notes + +**Pre-commit FactId typo check (#393):** + +Grep-based pre-commit hook validating FactId references in YAML content files against canonical `content/global/knowledge/facts.yaml`. Cheap v0.1 bridge until full cross-reference validation lands in v0.2 content tooling (C9). + +- **What exists:** + - Content schema validation: `make validate-content` (Sprint 3, #392) — checks YAML structure + - Canonical facts file: location TBD (either in `content/global/knowledge/` or `wiki/knowledge/facts.md` — coordinate with copy team on migration plan) + - Pre-commit hook infrastructure: check `.git/hooks/` or `.husky/` directory (if not present, this ticket creates it) +- **What to deliver:** Pre-commit hook script (bash/python) that: + 1. Extracts all FactId references from YAML files in `content/` (searches for `prerequisite:` maps, `fact_id:` fields, or similar per schema) + 2. Reads canonical FactId list from source of truth file + 3. Fails commit if any referenced FactId is not in canonical list + 4. Prints clear error: "Unknown FactId 'foo_bar' referenced in content/campaigns/.../detective/arrival.yaml line 47" +- **Scope:** Structural validation only. Does NOT validate knowledge state progression logic (e.g., "can this FactId actually reach KnowsDetails?"). That's v0.2 semantic validation. +- **Integration:** Runs automatically on `git commit`. Should be fast (<100ms) — this is a hot-path check that authors encounter frequently. Consider caching canonical FactId list. +- **Files:** `.git/hooks/pre-commit` or `.husky/pre-commit` (create if missing), validation script in `tooling/validate-factids.sh` or similar + +This is a quality-of-life improvement for content authors. Prevents typos from reaching the repo and getting caught only when the game tries to load content. + +## Dependency Chain + +``` +#393 (FactId typo check) → standalone (quality-of-life for content authors) +``` + +No blockers. No blocking other tickets. Can be implemented any time during Sprint 4. + +## PR Workflow + +When ready to submit, create a PR with `tea` CLI. **All flags are required** to avoid TTY prompts (see CLAUDE.md "Gitea access" section): +```bash +tea pr create --repo jpmschweitzer/settled-reach --login schweitz --title "feat(ci): description" --description "body" --base main --head ci +``` diff --git a/docs/sprints/sprint-4/client.md b/docs/sprints/sprint-4/client.md new file mode 100644 index 000000000..c6936df3a --- /dev/null +++ b/docs/sprints/sprint-4/client.md @@ -0,0 +1,51 @@ +# Sprint 4: Feel — Client Tasks + +**Goal:** Content conversion and authoring begins — wiki to YAML, content packs, monologue pool + +**Branch:** `client` +**Agents:** Stig (client dev), Tyre (architecture), Hoshe (QA) + +## Carry-over from Sprint 3 + +| # | Title | Status | Notes | +|---|-------|--------|-------| +| #405 | Interaction prompt — client extensible prompt system | in_progress | Stig has this. Server-side blocker (#404) is done. | + +## New Tickets + +None. Sprint 4 is content-focused. Client work resumes in Sprint 5 when content systems need rendering support. + +## Key Decisions + +- `decisions/architecture.md` — D-020 (IPC protocol, ObserverSnapshot) +- Workshop outputs: v0.1 interaction verb spec (#402, done in Sprint 3) + +## Notes + +**Interaction prompt (#405 carry-over):** + +Client-side interaction prompt designed for extensibility. v0.1: single context-sensitive E prompt. Architecture supports v0.2 multi-verb menu. + +- **What exists:** + - Server proximity detection + `InteractionOptions` component (#404, done in Sprint 3) + - ObserverSnapshot v3 protocol extension (sends interaction data to client) + - Existing HUD rendering at `client/scripts/rendering/hud.gd` +- **What to deliver:** Client-side prompt system that reads `InteractionOptions` from server state and displays appropriate UI. v0.1 behavior: show "E: Talk" or "E: Examine" (picks first/best verb automatically). Must be architecturally ready for v0.2 multi-verb context menu without rewrite. +- **Integration:** Ties into existing input handling (`client/scripts/autoloads/input_handler.gd`). When E is pressed and prompt is active, send interaction command to server via IPC bridge. +- **Files:** New GDScript file at `client/scripts/rendering/interaction_prompt.gd`, integration into existing `hud.gd` +- **Definition of done:** Prompt appears when player is near interactable entity. Pressing E triggers interaction. Prompt updates when available verbs change. No multi-verb menu yet (that's v0.2) but architecture supports it. + +This is the last client infrastructure piece before content rendering begins. Sprint 5 will have dialogue rendering, knowledge panel UI, and other content-driven features. + +## Dependency Chain + +``` +#405 (interaction prompt) → Sprint 5 dialogue rendering +``` + +## PR Workflow + +When ready to submit, create a PR with `tea` CLI. **All flags are required** to avoid TTY prompts (see CLAUDE.md "Gitea access" section): +```bash +tea pr create --repo jpmschweitzer/settled-reach --login schweitz --title "feat(client): description" --description "body" --base main --head client +``` diff --git a/docs/sprints/sprint-4/copy.md b/docs/sprints/sprint-4/copy.md new file mode 100644 index 000000000..94fa4d909 --- /dev/null +++ b/docs/sprints/sprint-4/copy.md @@ -0,0 +1,121 @@ +# Sprint 4: Feel — Copy Tasks + +**Goal:** Content conversion and authoring begins — wiki to YAML, content packs, monologue pool + +**Branch:** `copy` +**Agents:** Mellanie (author), Paula (narrative), Gestalt (systems) + +## Carry-over from Sprint 3 + +| # | Title | Status | Notes | +|---|-------|--------|-------| +| #405 | Interaction prompt — client extensible prompt system | in_progress | Client team ticket. Stig has this; copy team dependency only. | + +## New Tickets + +| # | Title | Priority | Blocked by | +|---|-------|----------|------------| +| #373 | Add smuggler-perspective FactId progression text | high | — | +| #383 | NPC-format briefs for both PCs — Concept A v0.1 | high | — | +| #398 | Wiki → YAML content conversion (Sova NPCs) | high | — | +| #399 | Monologue content pool — minimum viable (~200 lines) | high | — | +| #301 | Wiki taxonomy and structure — full future-ready schema | medium | — | +| #319 | Krenn System wiki entry — first star system | medium | #301 | +| #378 | Create environmental text examples file | medium | #319 | +| #395 | News ticker headline pool | medium | — | + +Use `db/connectors/ticket show ` for full details. + +## Key Decisions + +- `decisions/content.md` — D-032 (separate monologue pools per character), D-034 (THE FRIEND pattern), D-035 (converged tag taxonomy), D-036 (Sova Transit District setting), D-037 (contraband specification) +- `decisions/architecture.md` — D-028 (dialogue architecture — tagged line pools) +- Workshop outputs: `docs/workshops/content-gap-analysis_v0_1/SUMMARY.md`, `TICKETS.md` + +## Open Questions to Resolve Early + +None. All blockers for Sprint 4 copy work resolved in Sprint 3. #261 (Dual Lens Authoring Guide), #382 (Smuggler voice card), #381 (PC-as-NPC spec), and #385-#386 (content infrastructure) are all done. + +## Notes + +**FactId progression text (#373):** + +The smuggler and detective experience different knowledge progressions for many facts. Where the detective starts with KnowsNothing and works toward KnowsDetails, the smuggler may start with KnowsSomething or KnowsDetails. + +- **What exists:** `wiki/knowledge/facts.md` contains canonical FactId definitions with detective-centric progression text. Entity attribute definitions are at `content/global/knowledge/entity-attributes.yaml` (task #388 will populate this). +- **What to deliver:** Add smuggler-perspective text for all facts where the smuggler's knowledge path differs. Format: add `smuggler_perspective` field to fact entries. ~15-25 facts need dual-lens treatment based on workshop analysis. +- **Integration:** These feed into monologue line prerequisite gates (D-035 monologue tags include `prerequisite` map). + +**PC-as-NPC briefs (#383):** + +When you play the smuggler, the detective exists as an NPC in the world (and vice versa). This ticket creates NPC-format behavior profiles for both characters in their "other mode." + +- **What exists:** #381 (PC-as-NPC unified spec, done) defines the structural requirements. Character voice cards exist for both PCs. +- **What to deliver:** 5-7 routine entries each, reverse dual-lens observation notes (what the other character sees when observing you), basic behavior scripts. These are NPC profiles but don't need full 10-axis depth — PCs are special-case NPCs. +- **Blocks:** #401 (PC-as-NPC content authoring — the full line pool) depends on these briefs being written first. + +**Wiki → YAML conversion (#398):** + +The 17 Sova NPCs currently exist as wiki markdown profiles. This ticket converts them to engine-readable YAML in `content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/`. + +- **What exists:** + - Content directory structure: `content/campaigns/main/systems/krenn/stations/sova/districts/transit/` (created in Sprint 3) + - YAML schema: `content/_schema/npc.schema.yaml` (Sprint 3) + - Wiki profiles: `wiki/npcs/*.md` (17 NPCs with 10-axis breakdowns, relationship webs, routine sketches) + - Validation tooling: `make validate-content` (Sprint 3, #392) +- **What to deliver:** One YAML file per NPC following the schema. Includes routine YAML layer (Paula Gap 3 from workshop), triangle fork decision points (Gap 4), location references, relationship metadata. +- **Integration:** These NPCs populate templates (#390) and appear in triangles (#391). **Blocks #408** (YAML content loader Phase 2 — the server can't load real NPCs until they exist in YAML form). +- **Note:** This is mechanical conversion work enriched with the structured layers from the workshop. Not authoring new NPCs — translating existing profiles to the canonical format. + +**Monologue pool (#399):** + +Minimum viable monologue content: ~100 lines per character (smuggler + detective), ~200 total. + +- **What exists:** + - Directory structure: `content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/` and `.../smuggler/` (Sprint 3) + - Schema: `content/_schema/monologue.schema.yaml` (Sprint 3, includes all D-035 tags) + - Authoring guide: #261 (Dual Lens Authoring Guide, done in Sprint 3) + - Voice cards: smuggler voice card (#382, done) + - Location catalog: Sova Transit District has 3 social sites (The Terminal, The Last Shift, maintenance corridors) +- **What to deliver:** YAML files with categorized lines per location + character. Categories from workshop: arrival observations, NPC routine commentary, environmental flavor, contradiction hints, idle reflections, tutorial/orientation. Each line tagged with D-035 taxonomy: `character`, `trigger`, `prerequisite` (if gated), dual-lens notes. +- **Integration:** Server's monologue system (exists, tested in Sprint 2-3) selects lines from these pools based on game state. This is the first real content load. +- **Authoring priority:** Follows Mellanie authoring order from workshop — arrival + environmental flavor first (establishes sense of place), then NPC commentary (exercises observation triggers), then knowledge-gated lines (tests prerequisite system). + +**Environmental text examples (#378):** + +Create `wiki/authoring/environmental-text-examples.md` with 4 text types: bar menu, safety notice, news ticker cycle, corridor graffiti. Krenn System-voiced (working-class pragmatic, freight-logistics culture) with cultural notes + monologue pairings (smuggler + detective perspectives). + +- **Blocked by:** #319 (Krenn System wiki entry, now in Sprint 4). Complete #301 → #319 first. +- **Purpose:** Reference examples for future content authors. Not consumed by game engine — authoring documentation. + +**News ticker headlines (#395):** + +~20 dual-lens headlines for the Meridian news feed at The Last Shift bar. Mix: freight/commodity data, Assembly politics, local infrastructure, sports, Commission advisories. + +- **What exists:** The Last Shift location is defined. News ticker as environmental element is sketched in location notes. +- **What to deliver:** YAML file at `content/campaigns/main/systems/krenn/stations/sova/districts/transit/locations/the-last-shift-ticker.yaml` with headline pool. Each headline works as dual-lens monologue trigger (detective sees political context, smuggler sees market/operational intel). +- **Integration:** v0.1 may render this as static background text. v0.2 ticker system will cycle headlines. Content is authored dual-lens from day one so the system upgrade is data-driven, not content rewrite. + +## Dependency Chain + +``` +#373 (FactId smuggler text) → standalone (feeds #399 prerequisite content) +#383 (PC-as-NPC briefs) → #401 (PC-as-NPC authoring, Sprint 5) +#398 (Wiki → YAML NPCs) → #408 (server content loader Phase 2) +#399 (Monologue pool) → standalone (first real content load) +#395 (News ticker) → standalone +#301 (Wiki taxonomy) → standalone +#319 (Krenn System entry) → #301 +#378 (Environmental examples) → #319 +``` + +**Critical path:** #398 is the blocking ticket for server team's #408. Everything else is parallel. + +**Parallel work:** #373, #383, #399, #395 can all proceed independently. + +## PR Workflow + +When ready to submit, create a PR with `tea` CLI. **All flags are required** to avoid TTY prompts (see CLAUDE.md "Gitea access" section): +```bash +tea pr create --repo jpmschweitzer/settled-reach --login schweitz --title "feat(content): description" --description "body" --base main --head copy +``` diff --git a/docs/sprints/sprint-4/joint.md b/docs/sprints/sprint-4/joint.md new file mode 100644 index 000000000..3cbd9a391 --- /dev/null +++ b/docs/sprints/sprint-4/joint.md @@ -0,0 +1,125 @@ +# Sprint 4: Feel — Joint Tasks + +**Goal:** Content conversion and authoring begins — wiki to YAML, content packs, monologue pool + +**Agents:** Cross-team coordination (SI, Team Leader) + +## Sprint Overview + +Sprint 4 is the transition from infrastructure to content. Sprint 1-3 built the engine, the bridge, the rendering pipeline, the content directory structure, and the schema validation. Sprint 4 populates the content directory with real authored material and builds the server-side loader that brings that content into the game. + +This is the first sprint where **content authoring and systems implementation happen in parallel**. The copy team writes YAML files. The server team makes the game consume them. The client team finishes the last infrastructure piece (interaction prompts). The CI team adds authoring quality-of-life tooling. + +## Team Breakdown + +| Team | Ticket Count | Focus | +|------|--------------|-------| +| copy | 6 | FactId dual-lens text, PC-as-NPC briefs, Wiki→YAML NPC conversion, monologue pool (~200 lines), environmental examples, news ticker | +| server | 9 | Content loader Phase 2, YAML population (enums/attributes/pools/templates/triangles), seed schema design, tooling (RON converter, line previewer) | +| client | 1 | Interaction prompt carry-over from Sprint 3 | +| ci | 1 | Pre-commit FactId typo check | + +## Critical Path + +The critical path runs through content population → content loading: + +``` +Copy team #398 (Wiki→YAML NPCs) ─┐ +Server team #387 (enums) ├─→ Server team #408 (content loader Phase 2) → content in-game +Server team #388 (entity attrs) │ +Server team #389 (pools) │ +Server team #390 (templates) │ +Server team #391 (triangles) ┘ +``` + +**#408 is the integration point.** It is blocked by 6 tickets (5 server YAML population + 1 copy NPC conversion). Once #408 lands, the game can load v0.1 content. + +All other tickets (copy #373/#383/#399/#395, server #394/#403/#407, client #405, ci #393) are parallel work that improves authoring, adds content variety, or cleans up carry-overs. + +## Sprint Completion Proof + +Sprint 4 is done when: + +1. **Content files exist and validate:** `make validate-content` passes with real v0.1 content (not stubs) +2. **Server loads content:** `cargo run` (server binary) successfully loads NPCs, templates, triangles, dialogue pools from YAML without errors +3. **Monologue pool is playable:** Launch game, move detective or smuggler to a location, observe location-triggered monologue from the ~200-line pool +4. **Interaction prompt works:** Walk detective near Sera Venn (or smuggler near Kael Davan), see "E: Talk" prompt, press E to trigger interaction (dialogue rendering not required — server receives interaction event is sufficient proof) +5. **FactId typo check protects authors:** Attempt to commit a YAML file with invalid FactId → pre-commit hook rejects it with clear error message + +**Observable criteria:** You can walk the detective through Sova Transit District, see authored monologue text in the HUD, approach an NPC and see the interaction prompt. The content exists in YAML, the server loaded it, the client rendered it. + +## Integration Risks + +**Copy ↔ Server handoff (#398 → #408):** + +The copy team writes NPC YAML files. The server team implements the loader. Risk: schema mismatch or missing fields discovered late. + +**Mitigation:** Server team implements #387-#391 (YAML population) first. This tests the full schema → loader pipeline with known-good data before copy team's #398 (NPC conversion) lands. If the loader works with templates/triangles/enums, it will work with NPCs. + +**Timeline dependency:** + +#408 (content loader Phase 2) is blocked by 6 tickets. If any of #387-#391 or #398 slip, #408 cannot start. + +**Mitigation:** Server team can implement #408 skeleton against partial data (load just enums, or just templates). Copy team's #398 can land incrementally (convert 5 NPCs, then 10, then all 17). Incremental integration reduces end-of-sprint risk. + +**Client carry-over (#405):** + +Stig has #405 in progress from Sprint 3. This ticket is not blocking anything in Sprint 4, but it is blocking Sprint 5 dialogue rendering. + +**Mitigation:** If #405 carries over again, dialogue rendering in Sprint 5 slips. Flag this as a risk to Team Leader if progress stalls. + +## Test Alignment (D-030) + +Sprint 4 is in **Phase 2** of the testability roadmap (sprint 3-4: integration tests). + +Key test requirements for this sprint: + +- **Content validation:** `make validate-content` is the gate. No YAML file merges without passing validation. +- **Content loader integration test:** Server team (#408) must include integration test: load a minimal YAML content set, instantiate NPCs in ECS World, verify entity creation. +- **Monologue pipeline integration test:** Trigger location-entry event → verify monologue line selection from pool → verify correct line based on tags (character, location, trigger type). +- **IPC stability:** Client #405 (interaction prompt) must not break existing bridge protocol tests from Sprint 1-3. + +Hoshe's involvement: QA review on #408 (content loader — this is a critical integration point) and #392 validation (ensure `make validate-content` catches schema violations). + +## Open Questions + +None. All Sprint 4 blockers were resolved in Sprint 3: +- #261 (Dual Lens Authoring Guide) → done +- #381 (PC-as-NPC spec) → done +- #382 (Smuggler voice card) → done +- #384 (Content directory design doc) → done +- #385 (Content directory skeleton) → done +- #386 (Content schema definitions) → done +- #392 (Validation CLI) → done + +One potential blocker flagged: copy team #378 (environmental text examples) is blocked by #319 (wiki authoring guide structure, backlog). Team Leader should decide: defer #378 to Sprint 5, or promote #319 into Sprint 4. + +## PR Workflow + +All teams use `tea` CLI for PR creation. **All flags are required** to avoid TTY prompts (see CLAUDE.md "Gitea access" section): + +```bash +# Copy team +tea pr create --repo jpmschweitzer/settled-reach --login schweitz --title "feat(content): description" --description "body" --base main --head copy + +# Server team +tea pr create --repo jpmschweitzer/settled-reach --login schweitz --title "feat(simulation): description" --description "body" --base main --head server + +# Client team +tea pr create --repo jpmschweitzer/settled-reach --login schweitz --title "feat(client): description" --description "body" --base main --head client + +# CI team +tea pr create --repo jpmschweitzer/settled-reach --login schweitz --title "feat(ci): description" --description "body" --base main --head ci +``` + +## Sprint Retrospective Prep + +Questions for end-of-sprint review: + +1. Did the content → loader handoff work smoothly? Any schema mismatches discovered late? +2. How much of the monologue pool was authored? Does ~200 lines feel like enough variety for v0.1? +3. Did incremental integration (partial NPCs, partial loader) reduce risk or add coordination overhead? +4. Is the line previewer CLI (#407) actually useful for content authors, or is it over-engineering? +5. Did #405 (interaction prompt) carry over again? If yes, why? + +These questions feed into Sprint 5 planning. diff --git a/docs/sprints/sprint-4/server.md b/docs/sprints/sprint-4/server.md new file mode 100644 index 000000000..d3cc044a5 --- /dev/null +++ b/docs/sprints/sprint-4/server.md @@ -0,0 +1,133 @@ +# Sprint 4: Feel — Server Tasks + +**Goal:** Content conversion and authoring begins — wiki to YAML, content packs, monologue pool + +**Branch:** `server` +**Agents:** Dudley (simulation), Tyre (architecture), Hoshe (QA) + +## New Tickets + +| # | Title | Priority | Blocked by | +|---|-------|----------|------------| +| #408 | YAML content loader Phase 2 — real content loading | high | #387, #388, #389, #390, #391, #398 | +| #387 | Create global/enums/ YAML files from D-035 | medium | — | +| #388 | Create global/knowledge/entity-attributes.yaml | medium | — | +| #389 | Create pools.yaml for v0.1 seed-time selection | medium | — | +| #390 | Create template YAML files with role slot definitions | medium | — | +| #391 | Create triangle YAML files for 5 v0.1 triangles | medium | — | +| #394 | Seed configuration schema design | medium | — | +| #403 | YAML → RON converter tool | medium | — | +| #407 | Line previewer CLI | medium | — | + +Use `db/connectors/ticket show ` for full details. + +## Key Decisions + +- `decisions/content.md` — D-024 (NPC 10-axis model), D-025 (social sites), D-028 (dialogue architecture), D-035 (tag taxonomy) +- `decisions/architecture.md` — D-020 (IPC protocol), D-026 (simulation tiers), D-030 (testability) +- Workshop outputs: `docs/workshops/content-gap-analysis_v0_1/SUMMARY.md` + +## Notes + +**Content loader Phase 2 (#408):** + +Content loader was stubbed in Sprint 2-3. Phase 2 extends it to load real content from YAML files populated by copy team's conversion work and the C4-C8 YAML population tickets below. + +- **What exists:** + - Content directory structure: `content/` with full nested hierarchy (Sprint 3, #385) + - Schema files: `content/_schema/*.schema.yaml` (Sprint 3, #386) + - Validation tooling: `make validate-content` (Sprint 3, #392) + - Stub loader: likely in `server/src/` (check for existing content loading code from Sprint 2-3) +- **What to deliver:** Extend content loader to read and instantiate real district content, NPC profiles, dialogue pools, templates, triangles. This is the bridge from authored YAML files to runtime ECS entities. +- **Blocked by:** #387-#391 (YAML population tickets — can't load content that doesn't exist) + #398 (copy team NPC conversion). +- **Integration:** Feeds NPC ECS entities into simulation. Works with existing `server/src/npc/` module (mod.rs, relationships.rs, routine.rs). Likely creates or extends `server/src/simulation/content_loader.rs`. +- **Note:** This is NOT an authoring ticket. You're implementing the loader that reads files other people write. The copy team authors content; you make the server consume it. + +**YAML population tickets (#387-#391):** + +Five parallel tasks that populate `content/global/` and `content/campaigns/.../transit/` directories with v0.1 data. These are mechanical data-entry tickets implementing schemas from Sprint 3 and taxonomy from D-035. + +All five use existing schema files from `content/_schema/` and validate via `make validate-content`. + +**#387 (Enums):** +- **File:** `content/global/enums/situations.yaml`, `topics.yaml`, `moods.yaml`, `triggers.yaml`, `access-tiers.yaml`, `activities.yaml` +- **Content:** 13 situations, 9 topics, 8 moods, 9 triggers, 5 access tiers, activities list (from Gestalt routine format + Miri cultural patterns) +- **Source:** D-035 appendices, workshop Gap Analysis outputs +- **Purpose:** These are the canonical enum values referenced by all dialogue and monologue tags + +**#388 (Entity attributes):** +- **File:** `content/global/knowledge/entity-attributes.yaml` +- **Content:** 16 canonical entity attribute keys (14 original from D-024, 4 new, 2 renamed per workshop Appendix A7) +- **Format:** Machine-readable attribute definitions. All observer→target. +- **Purpose:** Knowledge graph attribute vocabulary + +**#389 (Pools):** +- **File:** `content/global/pools.yaml` or `content/campaigns/main/systems/krenn/stations/sova/pools.yaml` (decide per workshop design doc #384) +- **Content:** v0.1 single-candidate pools: friend_smuggler (kael-davan), friend_detective (sera-venn), bar_regulars, compromised_inspector, primary_contraband +- **Purpose:** Seed-time selection system. Architecture supports N candidates; v0.1 has 1 each for deterministic testing. v0.2 expands to real pools. + +**#390 (Templates):** +- **Files:** `content/campaigns/main/systems/krenn/stations/sova/districts/transit/templates/logistics-hub.yaml`, `bar.yaml`, `smuggling-ring.yaml` +- **Content:** 3 social site templates. Each declares named role slots with count ranges, required flags, pool references, triangle constraints. +- **Purpose:** Template instantiation system (D-025 social sites). NPCs fill roles. + +**#391 (Triangles):** +- **Files:** `content/campaigns/main/systems/krenn/stations/sova/districts/transit/triangles/hub-power.yaml`, `worried-knowledge.yaml`, `bar-tensions.yaml`, `worried-partner.yaml`, `informant-question.yaml` +- **Content:** 5 v0.1 triangles per workshop synthesis. T1 (hub-power, active fork), T2 (worried-knowledge, active fork), T3 (bar-tensions, passive), T4 (worried-partner, active fork), T5 (informant-question, passive). +- **Purpose:** Atomic units of social intrigue (D-024). Self-contained fork points for storyteller activation. + +**Seed configuration schema (#394):** + +Design document (not implementation) for the seed configuration schema. Defines what the randomizer produces at game-start: FRIEND selections, social site population, compromised NPC, contraband type, entanglement overrides. + +- **Deliverable:** `docs/architecture/seed-configuration-schema.md` design document +- **Scope:** v0.1 has single-candidate pools but architecture must support N-candidate randomization for v0.2 replayability +- **Purpose:** This is the handoff contract between "what content authors define" (pools, templates, triangles) and "what the game instantiates" (specific NPCs, specific relationships, specific activated triangles) +- **Note:** Design doc only. Implementation comes in Sprint 5+. + +**YAML → RON converter (#403):** + +Build-time converter tool: reads content YAML, emits RON. Lives in `tooling/content-converter/` (create new crate). Runs as `make content-ron`. + +- **What exists:** `tooling/` directory at repo root +- **What to deliver:** Rust binary crate that parses YAML content files and serializes to RON. v0.1 scope: proof-of-concept for one content type (e.g., NPC profiles or dialogue pools). +- **Integration:** NOT on critical path — engine consumes YAML in v0.1. RON is future-proofing for runtime performance (RON deserialization is faster than YAML). Build system integration via Makefile target. +- **Note:** This is infrastructure tooling, not game logic. Parallel work, low priority. + +**Line previewer CLI (#407):** + +CLI tool to preview monologue/dialogue line selection for a given game state. Lives in `tooling/line-previewer/` (create new crate). + +- **What exists:** `tooling/` directory +- **What to deliver:** Rust CLI that simulates line selection. Input: YAML content files + synthetic game state (character, location, knowledge state, mood, active NPCs). Output: which lines would be selected and why (shows tag matching, prerequisite evaluation, weighted selection). +- **Purpose:** Authoring tool for copy team. Lets Mellanie/Paula test "does this line trigger when I expect it to?" without running the full game. +- **Integration:** Reads same YAML schema as content loader. Uses same selection logic (can share code with dialogue/monologue systems or reimplement simplified version). Not part of game runtime — pure tooling. +- **Blocked by:** #386 (content schema, done) and #392 (validation CLI, done) — needs to parse same YAML format. + +## Dependency Chain + +``` +#387 (enums) → #408 (content loader Phase 2) +#388 (entity attributes) → #408 +#389 (pools) → #408 +#390 (templates) → #408 +#391 (triangles) → #408 +#398 (copy: Wiki→YAML NPCs) → #408 + +#408 (content loader) → real content in-game + +#394 (seed schema design doc) → standalone (design only) +#403 (YAML→RON converter) → standalone (future-proofing) +#407 (line previewer CLI) → standalone (authoring tool) +``` + +**Critical path:** #387-#391 + #398 (copy team) all feed into #408. Until #408 lands, the server can't load v0.1 content. + +**Parallel work:** All five YAML population tickets (#387-#391) are independent and can proceed in parallel. #403 and #407 are standalone tooling — not blocking anything. + +## PR Workflow + +When ready to submit, create a PR with `tea` CLI. **All flags are required** to avoid TTY prompts (see CLAUDE.md "Gitea access" section): +```bash +tea pr create --repo jpmschweitzer/settled-reach --login schweitz --title "feat(simulation): description" --description "body" --base main --head server +```