Merge remote-tracking branch 'origin/planning'

This commit is contained in:
2026-02-19 13:10:30 +01:00
7 changed files with 634 additions and 0 deletions
+1
View File
@@ -7,6 +7,7 @@ Format based on [Keep a Changelog](https://keepachangelog.com/).
## [Unreleased]
### Added
- Sprint 12 "Build" briefings — 50 tickets across server, client, copy, visual, ci teams; production-layer foundations + all v0.1 copy authoring
- `.tmp/` gitignored repo directory for agent temp files — avoids Bash permission prompts during PR review comment posting
- `sed -n` blanket permission in shared settings
+70
View File
@@ -0,0 +1,70 @@
# Sprint 12: Build — CI Tasks
**Goal:** Lay the production-layer foundations — simulation tier system, sound event pipeline, visual grammar, and knowledge boundary enforcement — and complete all v0.1 copy authoring so content packs, opening hooks, and world-building docs are done.
**Branch:** `ci`
**Agents:** Justine (build/deploy)
## Carry-over from Sprint 11
None. Sprint 11 was 7/7 done.
## New Tickets
| # | Title | Blocked by |
|---|-------|------------|
| #343 | Ban HashMap in simulation crate via clippy | — |
| #344 | Set up tracing crate infrastructure | — |
| #346 | System dependency graph debug command | — |
| #527 | Add rng_seed field to ObserverSnapshot for deterministic replay | — |
Use `db/connectors/ticket show <id>` for full details.
## Key Decisions
- `decisions/architecture.md` — D-020 (Godot + Rust IPC, bridge types), D-041 (knowledge graph, observer snapshot contract)
- `decisions/scope.md` — D-030 (testing architecture — D-phase alignment)
## Notes
**#343 — Ban HashMap in simulation crate via clippy**
- Critical priority. Deterministic simulation requires deterministic iteration order; `std::collections::HashMap` does not guarantee this.
- Add `clippy::disallowed_types` to `.clippy.toml` (or `.cargo/config.toml`'s `[target.*.rustflags]` section) scoped to the `simulation` crate only.
- Approved alternatives: `BTreeMap` (ordered) or `IndexMap` from the `indexmap` crate (insertion-ordered, deterministic).
- This lint will surface existing violations. Each violation in `server/src/simulation/` needs a follow-up fix — file separate tickets for each if the count is large, or fix inline if small.
- CI must fail on new violations after this is merged.
**#344 — Set up tracing crate infrastructure**
- Add `tracing` and `tracing-subscriber` to `server/Cargo.toml`.
- Initialize in `server/src/main.rs` with a stdout subscriber in dev (pretty format) and JSON in CI.
- Add structured log points to: tick duration (`tracing::info!(tick_ms = ...)`), per-system timing (wrap heavy systems with `tracing::instrument`), bridge I/O metrics, tier transition events.
- This is prerequisite instrumentation for tier system debugging (Sprint 12 server work in #99).
- In CI (`make ci-server`), the JSON log output should be captured but not asserted on — just confirm the binary runs without panic.
**#346 — System dependency graph debug command**
- Implement a `--dump-schedule` CLI flag (or `make debug-schedule` Makefile target) that prints the bevy_ecs system ordering and component access patterns.
- Use bevy's `World::resource::<Schedules>()` or the `bevy_app::App::render_schedule_graph()` approach (check bevy 0.14/0.15 API — confirm current version in `server/Cargo.toml`).
- Output: plain text or DOT format listing systems in execution order with their component read/write access.
- CI integration: run on each PR, save output as artifact, diff against baseline to catch unintended system reordering.
- Lives in `server/src/main.rs` (flag) or a dedicated `server/src/debug.rs` module.
**#527 — Add rng_seed field to ObserverSnapshot for deterministic replay**
- The WRONG button (#507, done Sprint 11) writes `inputs.jsonl` and `seed.txt` for replay, but `seed.txt` currently writes `"unavailable"` because the server does not include `rng_seed` in `ObserverSnapshot`.
- Fix: add `rng_seed: Option<u64>` to the `ObserverSnapshot` struct in `server/src/bridge/types.rs`.
- Populate it from the simulation's RNG state on each tick. The RNG system lives in `server/src/simulation/rng.rs`.
- This is a server-side change committed from the CI branch. Coordinate with server team to avoid conflict on `bridge/types.rs` — or implement as a separate additive commit that merges cleanly.
- Completes the WRONG button capture loop. After this, replays can fully reproduce observed bugs.
## Dependency Chain
```
#343, #344, #346, #527 — all standalone, all parallel
```
## 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): Sprint 12 — HashMap lint, tracing infra, schedule debug, rng_seed fix" --description "body" --base main --head ci
```
+76
View File
@@ -0,0 +1,76 @@
# Sprint 12: Build — Client Tasks
**Goal:** Lay the production-layer foundations — simulation tier system, sound event pipeline, visual grammar, and knowledge boundary enforcement — and complete all v0.1 copy authoring so content packs, opening hooks, and world-building docs are done.
**Branch:** `client`
**Agents:** Stig (client dev), Tyre (architect), Hoshe (QA)
## Carry-over from Sprint 11
None. Sprint 11 was 7/7 done.
## New Tickets
| # | Title | Blocked by |
|---|-------|------------|
| #125 | Close-range stereo audio | #124 (server) |
| #126 | Medium-range visual indicators | — |
| #345 | Fix entity_renderer.gd field name bug | — |
| #447 | Resolve OQ-29: dialogue max-width pixel value | — |
Use `db/connectors/ticket show <id>` for full details.
## Key Decisions
- `decisions/architecture.md` — D-020 (IPC bridge), D-066 (dual-scale grid)
- `decisions/perception.md` — D-018 (three-range sound model), D-067 (recognition chime at cognitive delay onset), D-068 (5-bus audio architecture), D-069 (audio dip profiles), D-071 (ListeningFocus boost for eavesdropping)
## Open Questions to Resolve Early
- **OQ-29** (#447): Dialogue max-width pixel value. Resolve before any dialogue layout work. Fast resolution — pick a value, record the decision.
## Notes
**#125 — Close-range stereo audio**
- Blocked by #124 (server sound event system). Start once server delivers `sound_events` in `ObserverSnapshot`.
- The `audio_manager.gd` autoload (`client/scripts/autoloads/audio_manager.gd`) already exists from Sprint 8. This ticket wires it to the snapshot-driven event loop.
- Close-range events (RangeCategory::Close) map to 2D positional audio using Godot's `AudioStreamPlayer2D`. Screen-space coordinates from the entity's world position.
- Asset registry: `AudioAssetRegistry` maps event type (`Footstep`, `Voice`, etc.) to audio file. The 8 audio assets from D-038 (done Sprint 10) are available — use them.
- D-068 specifies the 5-bus architecture (Master, Ambient, World SFX, Player Actions, UI). Sound events go on the **World SFX** bus.
- D-069 audio dip: during confrontation, World SFX drops 46dB. The dip logic is in `audio_manager.gd` — confirm it's wired to the confrontation state flag.
**#126 — Medium-range visual indicators**
- Fog-edge directional indicators for sound events outside LOS (RangeCategory::Medium).
- Arrow or icon at the fog boundary, pointing toward sound source direction. Color-coded per D-018 and D-069: neutral `#c8d0e0`, voices `#e8c547`, danger `#d45d5d`.
- Triggers an internal monologue description (server-side, but client shows the indicator at the fog edge).
- Implementation: overlay node on top of `fog_renderer` (`client/scripts/rendering/fog_renderer.gd.uid` — confirm file name). Draw using `_draw()` or a dedicated indicator scene.
- Does not require #124 to be complete — can implement the indicator rendering standalone with mock data, then wire to snapshot.
- Visual spec for the fog-edge pulse design (#317, visual team) is in sprint but may not arrive before implementation. Use the D-018 color values as the reference.
**#345 — Fix entity_renderer.gd field name bug**
- Known bug: `entity_renderer.gd` references `entity.id` but the bridge protocol uses `entity.entity_id`.
- File: `client/scripts/rendering/entity_renderer.gd`.
- Fix the field name, add a regression test to the client test suite.
- Quick fix — do this first to unblock clean rendering for the sprint.
**#447 — Resolve OQ-29: dialogue max-width pixel value**
- Open question: what is the max pixel width for the dialogue box?
- Resolution approach: measure against the target resolution, pick a value that fits the grid. Document in `client/scripts/constants.gd` as `DIALOGUE_MAX_WIDTH`.
- Record the resolved value as a decision if it has downstream impact (it does — affects text wrapping in dialogue UI).
## Dependency Chain
```
#124 (server, sound events) → #125 (close-range stereo audio)
#126 (medium-range indicators) — standalone, parallel
#345 (field name bug) — quick fix, do first
#447 (OQ-29 resolution) — standalone, do early
```
## 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): Sprint 12 — sound pipeline, medium-range indicators, renderer fix" --description "body" --base main --head client
```
+211
View File
@@ -0,0 +1,211 @@
# Sprint 12: Build — Copy Tasks
**Goal:** Lay the production-layer foundations — simulation tier system, sound event pipeline, visual grammar, and knowledge boundary enforcement — and complete all v0.1 copy authoring so content packs, opening hooks, and world-building docs are done.
**Branch:** `copy`
**Agents:** Mellanie (author), Paula (narrative), Gestalt (systems), Miri (cultural consultant)
## Carry-over from Sprint 11
None. Sprint 11 was 7/7 done.
## New Tickets
### Foundation docs (unblock everything else — do these first)
| # | Title | Blocked by |
|---|-------|------------|
| #368 | Knowledge vocabulary for v0.1 content | — |
| #189 | Cultural generation guide — Miri | — |
| #302 | Sova Texture Appendix | — |
| #321 | Contraband specification — lattice components + supply chain | — |
| #179 | Character definition schema | — |
| #180 | Smuggler character build | — |
| #181 | Detective character build | — |
| #182 | Divergent starting knowledge | — |
| #183 | Divergent relationships | — |
| #322 | Detective institutional chain of command | — |
| #320 | Sova Station Profile | — |
| #336 | Span Gate Transit Schedule | — |
### Setting texture docs
| # | Title | Blocked by |
|---|-------|------------|
| #335 | Meridian Coverage Map for Sova Transit | #320 |
### Design pattern docs (already unblocked)
| # | Title | Blocked by |
|---|-------|------------|
| #332 | Contradiction arc design document — FRIEND pattern | — |
| #329 | Mirror moment design document | — |
| #259 | First 5 minutes experience design | — |
### Knowledge and vocabulary (Gestalt)
| # | Title | Blocked by |
|---|-------|------------|
| #309 | Knowledge state vocabulary for v0.1 | #368 |
### Content packs — Mellanie (depend on foundation docs and line previewer #193 from server)
| # | Title | Blocked by |
|---|-------|------------|
| #190 | Workplace content pack | #189, #193 (server), #302, #321, #311 (visual) |
| #191 | Bar content pack | #189, #193 (server), #302, #321, #312 (visual) |
| #192 | Smuggling ring content pack | #189, #193 (server), #302, #321, #313 (visual) |
### Opening content (depend on #309)
| # | Title | Blocked by |
|---|-------|------------|
| #260 | Opening hook content per character | #259 |
| #299 | Opening hook content — smuggler first 5 minutes | #309 |
| #300 | Opening hook content — detective first 5 minutes | #309 |
| #307 | Flat NPC memorable trait pass — 3 flat NPCs | — |
### Supporting content (depend on earlier tickets)
| # | Title | Blocked by |
|---|-------|------------|
| #306 | News ticker / Meridian feed content — 20-30 lines | #302 |
| #262 | Environmental text content | — |
| #331 | Diegetic insert flavor text — per character | — |
| #330 | Diegetic tutorial monologue lines — per character | #299, #300 |
| #194 | Generation pass expansion | — |
### Parent epic (close when all children done)
| # | Title | Blocked by |
|---|-------|------------|
| #369 | v0.1 Content Scoping Workshop Outputs (epic) | children above |
Use `db/connectors/ticket show <id>` for full details.
## Key Decisions
- `decisions/content.md` — D-023 (YAML content format), D-024 (three-tier content pipeline), D-025 (dialogue access tier model), D-028 (internal monologue pools per character), D-029 (THE FRIEND production NPC pattern), D-034 (D-029 confirmed), D-035 (knowledge state vocabulary), D-050 (Velen / Krenn system), D-062 (dialogue system architecture), D-063 (confrontation — same box different weight), D-064 (opening experience design)
- `decisions/perception.md` — D-016 (internal monologue system), D-032 (separate monologue pools per character)
- `decisions/scope.md` — D-027 (vertical slice), D-036 (Sova Transit District / Krenn as v0.1 setting), D-037 (contraband spec — unlicensed lattice components), D-039 (v0.1 wow moments — all 6)
- `decisions/architecture.md` — D-041 (knowledge graph — provides vocabulary foundation via Appendix A)
## Open Questions to Resolve Early
- **#368#309 dependency:** Gestalt writes vocabulary doc (#368) first. Paula/Mellanie need #309 (knowledge flags) before writing opening hooks #299/#300. Sequence: #368#309#299/#300.
- **Content pack dependency on visual spatial layouts:** #190/#191/#192 are blocked by #311/#312/#313 (Araminta's spatial layouts, visual team). These are a cross-team dependency. If visual spatial layouts slip, content packs must still proceed with draft versions and be finalized once layouts are confirmed.
## Notes
**Sequencing for the sprint — recommended wave order:**
Wave 1 (all parallel, no blockers):
- #368 (Gestalt) — knowledge vocabulary doc
- #189 (Miri) — cultural generation guide
- #302 (Miri) — Sova Texture Appendix
- #321 (Miri) — contraband spec
- #179/#180/#181 (Paula) — character definition schema and builds
- #182/#183 (Paula) — divergent knowledge/relationships
- #322 (Paula) — detective chain of command
- #320 (Miri) — Sova Station Profile
- #336 (Miri) — Span Gate Transit Schedule
- #332 (Paula) — Contradiction arc doc (FRIEND pattern)
- #329 (Paula) — Mirror moment doc
- #259 (Paula) — First 5 minutes experience design
- #307 (Mellanie) — Flat NPC memorable trait pass
- #262 (Mellanie) — Environmental text content
- #331 (Mellanie) — Diegetic insert flavor text
Wave 2 (after Wave 1 foundation docs):
- #335 (Miri) — Meridian Coverage Map (blocked on #320)
- #309 (Gestalt) — Knowledge state vocabulary (blocked on #368)
- #260 (Paula) — Opening hook content per character (blocked on #259)
- #306 (Mellanie) — News ticker / Meridian feed (blocked on #302)
Wave 3 (after Wave 2 + line previewer #193 from server + spatial layouts from visual):
- #190 (Mellanie) — Workplace content pack
- #191 (Mellanie) — Bar content pack
- #192 (Mellanie) — Smuggling ring content pack
- #299 (Mellanie/Paula) — Opening hook smuggler (blocked on #309)
- #300 (Mellanie/Paula) — Opening hook detective (blocked on #309)
Wave 4 (final):
- #330 (Mellanie) — Diegetic tutorial monologue (blocked on #299, #300)
- #194 (Mellanie) — Generation pass expansion (LLM-assisted, after packs exist)
**#368 — Knowledge vocabulary for v0.1 content**
- Owner: Gestalt. Source material: D-041 Appendix A (knowledge graph workshop synthesis).
- Deliver as a YAML or Markdown doc in `docs/design/` (or wherever content docs live).
- Categories: entity knowledge (identity, location, behavior, relationship, secret, contraband), world knowledge, prerequisite flag naming conventions (`knows:`, `suspects:`, `met:`, `has_seen:`).
- This is the foundation for #309 (Paula's knowledge flag list) which unblocks #299/#300.
**#189 — Cultural generation guide — Miri**
- Blocking dependency for all three content packs (#190, #191, #192).
- Sova Transit District / Krenn System is the FIRST concrete instance — Miri's output IS the v0.1 cultural voice.
- Covers: naming conventions, economic vocabulary (what do workers call credits, shifts, cargo), social norms, relationship dynamics in a Commission-regulated transit hub.
- D-036 confirms Sova Transit District as setting. D-050 establishes Velen/Krenn context.
**#302 — Sova Texture Appendix**
- 1-page appendix to the Sova setting brief. Fast to write, high leverage — unlocks #190, #191, #192, #306.
- (1) Slang glossary 1520 terms, (2) informal decoration (graffiti, stickers), (3) smells and sounds, (4) recurring social rituals.
- Write as companion to #189 in the same pass.
**#321 — Contraband specification**
- D-037 confirms: primary contraband = unlicensed lattice components (aftermarket neural mods bypassing Commission regulation).
- Deliverable: spec doc covering types, supply chain, street names, detection methods.
- Unlocks #190, #191, #192 — Mellanie needs this before writing any criminal-facing dialogue.
**#179/#180/#181 — Character definition schema and builds**
- #179: formal schema structure (what fields define a character — starting knowledge, relationships, access permissions, skill flags).
- #180/#181: Smuggler and Detective as the two concrete instances.
- These are design documents, not code. Owner: Paula.
- #182 (divergent starting knowledge) and #183 (divergent relationships) follow from #180/#181.
**#190/#191/#192 — Content packs**
- The three primary content packs. Each ~165280 lines.
- #190 Workplace: cargo workers, supervisors, shift change scripts, manifest disputes.
- #191 Bar: bartender, regulars, gossip pools, social dialogue (40% more lines than investigation).
- #192 Smuggling ring: criminals, trust-gated disclosure, coded language, paranoia.
- All blocked by: #189 (Miri), #193 (line previewer from server team), #302 (texture appendix), #321 (contraband spec), plus respective spatial layouts (#311, #312, #313 from visual team).
- The line previewer (#193) is a Rust CLI being built by server team this sprint. Coordinate with Dudley/Tyre on delivery timing.
**#299/#300 — Opening hook content**
- First 1015 tightly sequenced monologue lines per character.
- Smuggler: diegetic tutorial for movement, fog, NPC interaction. Establishes criminal motivation.
- Detective: different emotional register. Arrives into established rhythm. First NPC is adversarial by default.
- Blocked by #309 (knowledge flags) — lines need to fire on `knows:` prerequisites.
**#307 — Flat NPC memorable trait pass**
- 3 flat NPCs: Pael (maintenance tech), Ren (drifter), Tev (lookout).
- Each needs: one memorable observable trait, one "seems important but isn't" line, one visible routine.
- These are the investigation noise floor — without them the 30/50/20 structure (30% FRIEND, 50% background, 20% flat) collapses.
**#332 — Contradiction arc design document**
- Reusable pattern from THE FRIEND implementation (#297 Kael, #298 Sera — both done).
- Document the pattern: 3+ phases with distinct monologue registers, observable contradiction discoverable through observation (not dialogue).
- Owner: Paula. Already unblocked.
**#329 — Mirror moment design document**
- 1015 paired observation triggers. Same event, different character monologue.
- 7 core mirrors already designed (per ticket): The Friend's Routine, The Empty Corridor, The Overheard Argument, The Familiar Face, The Contraband Scan, The End of Shift, The Missing Person Notice.
- Owner: Paula. Already unblocked.
## Dependency Chain
```
#368 (knowledge vocab) → #309 (knowledge flags) → #299, #300 (opening hooks) → #330 (tutorial monologue)
#189 (Miri guide) + #302 (texture appendix) + #321 (contraband) + #193 (server) + #311/#312/#313 (visual) → #190, #191, #192 (content packs)
#259 (5 min design) → #260 (opening content per character)
#320 (station profile) → #335 (Meridian coverage map)
#179 → #180, #181 → #182, #183
#332, #329 — standalone (already unblocked)
#307, #262, #331, #336 — standalone
```
## 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(copy): Sprint 12 — complete v0.1 content authoring" --description "body" --base main --head copy
```
+92
View File
@@ -0,0 +1,92 @@
# Sprint 12: Build — Joint / Integration Notes
**Goal:** Lay the production-layer foundations — simulation tier system, sound event pipeline, visual grammar, and knowledge boundary enforcement — and complete all v0.1 copy authoring so content packs, opening hooks, and world-building docs are done.
**Sprint 12 ID:** 12
**Status:** planning (activate with `db/connectors/sprint start`)
---
## Pre-Sprint Decisions
No blocking open decisions. The following decisions are implemented this sprint and should be cross-referenced:
| Decision | Domain | Implementing ticket(s) |
|----------|--------|----------------------|
| D-041 (knowledge graph) | architecture | #138, #139 (KG access control) |
| D-018 (three-range sound) | perception | #124 (server), #125, #126 (client) |
| D-068 (5-bus audio architecture) | architecture | #125 (client wiring) |
| D-043049 (art direction suite) | perception | #303 (visual grammar doc) |
| D-033, D-052 (entity color) | perception/content | #303 section 3 (covers #304) |
| D-066 (dual-scale grid) | architecture | #93, #94, #99 (tier system spatial indexing) |
---
## Cross-Team Dependencies
| Dependency | From | To | Risk |
|------------|------|----|------|
| #124 (sound events in ObserverSnapshot) | server | client #125 | Medium — client can stub; wire when ready |
| #193 (line previewer CLI) | server | copy #190, #191, #192 | High — content packs cannot be finalized without tool |
| #303 (visual grammar) | visual | copy #190, #191, #192 via #311, #312, #313 | High — spatial layouts blocked until doc delivered |
| #311, #312, #313 (spatial layouts) | visual | copy #190, #191, #192 | Medium — wireframes unblock draft content |
| #527 (rng_seed in snapshot) | ci | server bridge/types.rs | Low — additive field, no conflict if added carefully |
**Coordination protocol:**
- Server team: signal when #124 (sound events) and #193 (line previewer) are merged to `server` branch. Copy and client teams are waiting.
- Visual team: deliver wireframe versions of #311, #312, #313 immediately after #303 is done (even if full tile maps come later) so copy team can start content packs.
- CI team on #527: coordinate with server on `bridge/types.rs` — confirm no concurrent edits. Add the field as an additive commit.
---
## Sprint Completion Proof
When Sprint 12 is done, the following is concretely observable:
1. **Simulation tier system:** Spawn the test world, set NPC count to 20. Only NPCs within range of the player have `ActiveSim`; distant NPCs have `BackgroundSim`. Promoting an NPC (by walking toward it) takes <5ms. Demoting takes <5ms. Observable in the debug overlay or log output.
2. **Sound event pipeline end-to-end:** In the gauntlet `dialogue_room`, an NPC conversation emits Voice sound events. Close-range events play 2D positional audio on the client World SFX bus. Medium-range events show a color-coded fog-edge directional indicator. No audio errors in the log.
3. **Knowledge boundary enforcement:** The observer query for an entity tagged `OwnerOnly` does not return that component's data for a non-owner observer. Verifiable via Hoshe's unit tests on #139.
4. **Visual grammar document:** `docs/design/visual-grammar-v01.md` exists with all 7 sections (color palette, entity sizing, entity color system, z-level stack, typography, animation tiers, insert overlay). All three spatial layout documents exist for The Terminal, The Last Shift, and the smuggling corridors.
5. **Line previewer CLI:** Running `cargo run --bin line_preview -- --character smuggler --knows smuggling_operation` against a content YAML returns matching lines and exits 0.
6. **v0.1 copy complete:** All copy tickets in this sprint are `done`. The content packs (#190, #191, #192), opening hooks (#299, #300), and all foundation docs (#189, #302, #321, #309) are committed to the `copy` branch.
7. **CI hardening:** `make ci-server` passes with `clippy::disallowed_types` enforced. `--dump-schedule` flag runs without panic. WRONG button `seed.txt` writes a valid u64, not `"unavailable"`.
---
## Test Plan Alignment (D-030)
Sprint 12 is in the integration phase (Sprints 912). Test focus:
- **Server:** Unit tests for tier system (#93, #94, #99) — promote/demote timing, `With<ActiveSim>` query correctness. Unit tests for access control (#139) — negative tests: blocked component not returned. Sound event emission tests (#124).
- **Client:** Audio playback tests for #125 — verify correct bus routing. Visual indicator tests for #126 — verify indicator renders at correct fog edge position.
- **CI:** Clippy lint enforcement (#343) — CI must fail on new HashMap usage in simulation crate. Tracing (#344) — binary runs without panic, log output captured.
---
## Decision Coverage Gaps (from sprint prepare)
The following confirmed decisions still have no implementing tickets. Flag to Team Leader if any block Sprint 12 work:
- D-031 (time system / game clock) — no ticket yet; relevant to tier transitions (#99) and NPC routines
- D-033 (entity color = relationship) — covered by #303 visual grammar section
- D-038 (audio in v0.1 — 8 files) — assets done (Sprint 10); integration via #124/#125 this sprint
- D-067 (recognition chime at cognitive delay onset) — no ticket; could be added if capacity permits
- D-068 (5-bus audio architecture) — implementing via #125 this sprint
---
## Notes for Sprint Start
To activate the sprint once planning is approved:
```bash
db/connectors/sprint start
```
This sets Sprint 12 to `active` and marks all sprint tickets as `in_progress` where appropriate. Teams should then run `db/connectors/sprint start-work --team <team>` for their full context dump.
+94
View File
@@ -0,0 +1,94 @@
# Sprint 12: Build — Server Tasks
**Goal:** Lay the production-layer foundations — simulation tier system, sound event pipeline, visual grammar, and knowledge boundary enforcement — and complete all v0.1 copy authoring so content packs, opening hooks, and world-building docs are done.
**Branch:** `server`
**Agents:** Dudley (simulation dev), Tyre (architect), Hoshe (QA)
## Carry-over from Sprint 11
None. Sprint 11 was 7/7 done.
## New Tickets
| # | Title | Blocked by |
|---|-------|------------|
| #93 | Tier marker components | — |
| #94 | Active tier simulation | #93 |
| #99 | Tier transition logic | #93 |
| #138 | Information tag schema | — |
| #139 | Component-level access control | #138 |
| #124 | Sound event system — server | — |
| #193 | Line previewer CLI | — |
Use `db/connectors/ticket show <id>` for full details.
## Key Decisions
- `decisions/architecture.md` — D-020 (Godot + Rust IPC), D-041 (Knowledge Graph data model), D-066 (dual-scale grid: 0.5m sim, 1m visual)
- `decisions/perception.md` — D-017 (perception modes), D-018 (three-range sound model)
- `decisions/scope.md` — D-027 (vertical slice), D-053 (movement stance system)
## Notes
**#93 — Tier marker components**
- Epic #40 (Simulation Tier System) is entirely unstarted — this is the entry point.
- Deliver three zero-sized marker components: `ActiveSim`, `BackgroundSim`, `StateSaved`.
- Add a `TierPlugin` that registers them. Tag-based: systems query `With<ActiveSim>` to scope work to nearby NPCs only.
- Lives in `server/src/simulation/tier.rs` (file exists; currently stubs the stance system — check before overwriting).
- Integration point: all NPC behavior systems in `server/src/simulation/` should gain `With<ActiveSim>` query filters once this exists.
**#94 — Active tier simulation**
- Full behavior systems (movement, perception, dialogue, monologue) run at 1020 ticks/sec for `ActiveSim` NPCs only.
- Practically: add `With<ActiveSim>` filter to the movement, pathfinding, observation, and monologue systems in `server/src/simulation/`.
- No new systems needed yet — this is scope-gating existing ones.
- Blocked by #93 (marker components must exist first).
**#99 — Tier transition logic**
- Promote `StateSaved → BackgroundSim → ActiveSim` when player approaches; demote on departure.
- Budget: 25ms reactivation. Use `SpatialIndex` trait (see `server/src/simulation/` — check if `SpatialIndex` already exists from earlier sprints; if not, #340 defines it but is still backlog — implement the naive Vec version inline for now).
- Tier transitions fire on position-change events. Wire to the existing movement system in `server/src/simulation/movement.rs`.
- Blocked by #93.
**#138 — Information tag schema**
- Completes the knowledge graph work from Sprints 23 (#361367 all done).
- Define `ObserverAccess` enum: `Public`, `OwnerOnly`, `FactionOnly(faction_id)`, `RelationshipGated(threshold)`, `KnowledgeGated(flag)`.
- Add as component metadata attribute — each ECS component that carries sensitive data gets an `#[access = ...]` annotation (or a companion `AccessRule` component).
- Lives in `server/src/knowledge/types.rs` (already exists — add to the existing types file).
- This schema is what #139 enforces.
**#139 — Component-level access control**
- Query filter layer: observer queries (the `observer/` module under `server/src/perception/`) must respect `ObserverAccess` tags before returning data.
- Implement as a filter function on the observer snapshot builder: `filter_by_access(observer_entity, component_access_rule, kg: &KnowledgeGraph) -> bool`.
- The `KnowledgeGraph` component (done, `server/src/knowledge/graph.rs`) provides the knowledge state needed for `KnowledgeGated` checks.
- Blocked by #138.
**#124 — Sound event system — server**
- `SoundEventEmitter` component: emits typed events (`Footstep`, `Voice`, `Machinery`, `Alert`, `Ambient`) with position, intensity, `RangeCategory` (Close/Medium/Long per D-018).
- `SoundEventQueue` resource: collects events each tick, fans out to subscribers (client bridge + NPC awareness).
- Wire into the bridge: sound events within player LOS range → included in `ObserverSnapshot` as a `sound_events` vec.
- Existing audio manager on client (`client/scripts/autoloads/audio_manager.gd`) expects a `sound_events` array in the snapshot — confirm field name matches.
- Unblocked (standalone). #125 on client is blocked on this.
**#193 — Line previewer CLI**
- Rust binary (`tooling/line-previewer` or `server/src/bin/line_preview.rs`) sharing code with the dialogue pipeline.
- MVP: (1) load YAML content pack, (2) set filter context via CLI flags (`--character smuggler --knows smuggling_operation`), (3) print matching lines, (4) `--explain` mode shows why each line matched/filtered, (5) sequence preview for ordered monologue.
- Shares `server/src/content/` types (`LinePool`, `ContentLoader`).
- This tool is what Mellanie needs before authoring content packs — unblocks #190, #191, #192.
## Dependency Chain
```
#93 (tier markers) → #94 (active sim) → #99 (tier transitions)
#138 (access schema) → #139 (access control)
#124 (sound events) — standalone, unblocks client #125
#193 (line previewer) — standalone, unblocks copy #190, #191, #192
```
## 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): Sprint 12 server — tier system, sound events, KG access control" --description "body" --base main --head server
```
+90
View File
@@ -0,0 +1,90 @@
# Sprint 12: Build — Visual Tasks
**Goal:** Lay the production-layer foundations — simulation tier system, sound event pipeline, visual grammar, and knowledge boundary enforcement — and complete all v0.1 copy authoring so content packs, opening hooks, and world-building docs are done.
**Branch:** `visual`
**Agents:** Araminta (art direction)
## Carry-over from Sprint 11
None. Sprint 11 was 7/7 done.
## New Tickets
| # | Title | Blocked by |
|---|-------|------------|
| #303 | v0.1 Visual Grammar Document | — |
| #252 | Placeholder art specification | — |
| #311 | Spatial layout: Logistics Hub (The Terminal) | #303 |
| #312 | Spatial layout: Bar (The Last Shift) | #303 |
| #313 | Spatial layout: Smuggling spaces and transition corridors | #303 |
Use `db/connectors/ticket show <id>` for full details.
## Key Decisions
- `decisions/perception.md` — D-043 (art direction — "functional warmth"), D-044 (visual hierarchy: entity > object > structure), D-045 (environmental neutrality — strict zero shift), D-046 (lighting — three-reference model), D-047 (two-tier animation system), D-048 (neural insert overlay visual design), D-049 (z-level rendering stack — 8 layers)
- `decisions/scope.md` — D-036 (Sova Transit District as v0.1 setting)
- `decisions/architecture.md` — D-066 (dual-scale grid: 0.5m simulation, 1m visual)
- `decisions/content.md` — D-052 (character favorite colors — object-layer identification)
## Notes
**#303 — v0.1 Visual Grammar Document**
- This is the sprint's single highest-leverage deliverable. It directly unblocks 11 downstream tickets: #304, #311, #312, #313, #314, #315, #316, #317, #318, #333, #334.
- One document, approximately 46 pages. Contents:
1. **Color palette** — three zone palettes (logistics hub: cool industrial, bar: warm amber, corridors: neutral) with explicit hex values. Cross-reference D-043 "functional warmth" and D-045 environmental neutrality (environment NEVER shifts to signal danger/safety — only entities carry emotional color).
2. **Entity sizing and proportions** — NPC rectangle dimensions at 1m visual grid. Player indicator. Static object sizing.
3. **Entity color system** — relationship states (D-033, D-052): unknown=teal `#4a9ebb`, known/friendly=green `#6bc9a6`, person-of-interest=amber `#e8c547`, hostile=red `#d45d5d`, static objects=grey `#8899aa`. This IS #304 content — write it as a section of #303, then close #304 as covered.
4. **Z-level layer assignments** — per D-049: 8 layers from floor (0) to UI overlay (7). Which layer gets tiles, NPCs, player, fog, UI elements.
5. **Typography baseline** — font (Michroma, introduced Sprint 10), sizes, weights for dialogue, monologue, environmental text, HUD.
6. **Animation tier baseline** — per D-047: Tier 1 (8-frame idle/walk loop for Active NPCs) vs Tier 2 (static sprite for Background NPCs).
7. **Neural insert overlay** — per D-048: the insert HUD aesthetic. Smuggler vs detective visual variants.
- Deliver as `docs/design/visual-grammar-v01.md` (or equivalent path in the visual branch).
- **Write this first.** Everything else in this sprint is blocked on it.
**#252 — Placeholder art specification**
- Define: tile size in pixels (at 1m visual grid per D-066), NPC sprite dimensions, animation frame count requirements, color palette constraints, file format.
- This is a short spec document (12 pages). Unblocks #133 (placeholder art pipeline implementation).
- Can be written in parallel with #303 — it feeds from the same decisions (D-043, D-044, D-066) but doesn't need #303 to be complete first.
**#311 — Spatial layout: Logistics Hub (The Terminal)**
- Tile-level floor plan for the logistics hub. Blocked by #303 (need the visual grammar before doing tile-level design).
- Contents: scanner bays, main corridor (chokepoint — key player observation position), manifest processing area, break room, supervisor office (window overlooking floor), restricted storage entrance.
- Include sightline analysis: which positions have LOS to which areas. This feeds #190 (Mellanie's workplace content pack) and is critical for investigation design.
- D-066 dual-scale grid: draw at 1m visual grid, note that simulation runs at 0.5m internally.
- Deliver as a diagram or annotated tilemap sketch in `docs/design/` with accompanying notes.
**#312 — Spatial layout: Bar (The Last Shift)**
- Converted maintenance staging area. Irregular layout is intentional — organic feel per D-043 "functional warmth."
- Key elements: long bar counter (high visibility from most positions), corner booth (key observation position — can see both entrance and bar), bathroom corridor (secondary exit, NPC private conversations), back room (staff only).
- Same sightline analysis as #311. Feeds #191 (bar content pack).
**#313 — Spatial layout: Smuggling spaces and transition corridors**
- The smuggling ring does NOT have a separate building. Operations run through:
1. Restricted storage within the logistics hub
2. Maintenance corridors (off main paths)
3. Dead-drop locations (3 specific spots)
4. Transition corridors between hub and bar district (~40m)
- Mark the corridors with expected NPC traffic density (sparse/moderate/busy affects how conspicuous player movement is).
- Feeds #192 (smuggling ring content pack).
**Cross-team note:** #311, #312, #313 are blockers for copy team's content packs (#190, #191, #192). Deliver these as early as possible after #303 is done. If full tile maps can't be finalized before content packs start, provide wireframe versions so Mellanie can proceed with draft content.
## Dependency Chain
```
#303 (visual grammar) → #311, #312, #313 (spatial layouts)
#252 (placeholder spec) — parallel, standalone
#311 → unblocks copy #190
#312 → unblocks copy #191
#313 → unblocks copy #192
```
## 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(visual): Sprint 12 — visual grammar, placeholder spec, spatial layouts" --description "body" --base main --head visual
```