# 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
143 lines
8.8 KiB
Markdown
143 lines
8.8 KiB
Markdown
---
|
|
title: "Sprint 4 — Server Briefing"
|
|
description: "YAML content loader phase 2, enum/attribute/pool/template population, seed schema design"
|
|
type: sprint
|
|
status: archived
|
|
sprint: 4
|
|
team: "server"
|
|
---
|
|
|
|
# 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 <id>` 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/van-maanens-star/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/van-maanens-star/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/van-maanens-star/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
|
|
```
|