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>
8.6 KiB
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)
- Content directory structure:
- 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 extendsserver/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.yamlorcontent/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.mddesign 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):
tea pr create --repo jpmschweitzer/settled-reach --login schweitz --title "feat(simulation): description" --description "body" --base main --head server