# Sprint 36: Forge — Server Tasks **Goal:** Close Phase 3 Atlas (unified nav chain, brand corps, content refinement) and establish Phase 4 foundations (bookmark system, location-culture resolution, character creation skeleton). **Branch:** `sprint-36/server` **Agents:** Dudley (dev), Tyre (arch), Hoshe (QA) ## New Tickets | # | Title | Blocked by | |---|-------|------------| | #826 | Thread world seed into economy simulation | — | | #827 | Add brand_products, brand_inputs, system_fiscal schema + Phase 2 demand stubs | — | | #679 | Location-to-culture resolution system | — | | #614 | Bookmark definition system | — | | #829 | Build generate_brands pipeline — 10K minor brands from templates | — | | #848 | Retire v0.1 PoC NPC system and content/global/ | — | | #842 | Clean out orphaned NPC and environment interaction systems | — | | #726 | Configure cargo deny.toml for license and advisory checking | — | | #636 | Migrate bincode v1.x to v2.x | — | Use `tooling/db/ticket show ` for full details. ## Key Decisions - `decisions/content.md` — D-128 (culture implicit in starting location), D-115 (character creation scoped to skills + bookmark) - `decisions/scope.md` — D-117 (tycoon is the bookmark), D-115 (bookmark definition) - `decisions/economics.md` — D-189 (brand layer architecture), D-190 (brand volume calibration), D-185 (brands are not commodities) - `decisions/rejected.md` — R-012 (NPC ambient interaction system scrapped) ## Notes **#679 — Location-to-culture resolution system** - No culture resolution code exists in `server/src/`. This is greenfield. - D-128: culture is implicit in the starting bookmark location — Van Maanen's Star start = Van Maanen's Star culture. The server needs a function that takes a location identifier and returns a culture tag. - Blocks #680 (client location picker) and #621/#681 (downstream character init). Implement as a clean public function in a new module (e.g. `server/src/knowledge/culture.rs` or `server/src/settings/culture.rs`) — the client ticket depends on the type being stable. - Input: location/system id string. Output: culture tag. Source of truth: `server/data/systems.db` (geographic_sector → corridor → culture mapping). **#614 — Bookmark definition system** - No bookmark code exists. Greenfield. - A bookmark = skills + starting state + context. Tycoon is the first bookmark. Must define a data structure that the character creation screen (#618) can consume. - D-115: character creation is limited to skills + bookmark for now. Family, culture, religion are deferred. - Blocks #618 (client CK3-style character creation). Define the bookmark type and expose it via the bridge so the client can enumerate bookmarks. - Coordinate with Tyre on the struct shape before Stig starts #618. **#829 — Build generate_brands pipeline — 10K minor brands from templates** - New Rust binary in `server/src/bin/`. Model the existing `server/src/bin/generate_corporations/` for structure. - Reads `content/brands/brand_templates.toml` (authored in Sprint 35 #831). Generates 10,000 minor brand product rows. - D-189: 8 brand categories (terroir, heritage_craft, tech_premium, cultural, service_premium, commodity_branded, design_heritage, institutional). D-190: population-relative calibration — scale to ~80B Reach population. - Output writes to `server/data/systems.db` brand_products table (schema in #827). Coordinate with #827 to ensure schema is in place first. - Corridor-specific procedural name generation should reuse the existing naming infrastructure (`server/src/bin/generate_corporations/names.rs`). **#848 — Retire v0.1 PoC NPC system and content/global/** - R-012: the entire NPC ambient interaction model is scrapped. `server/src/npc/` contains the v0.1 PoC modules. - `content/global/` does not currently exist in the repo — confirm before deleting. Check `server/src/npc/` for live integration points before removing: `server/src/simulation/mod.rs` references several npc modules (vision, awareness, etc.). - Coordinate with #842 — both tickets touch the same area. Recommended order: #842 first (audit scope), then #848 (retire). Or assign both to same agent and do together. - Do NOT delete any code that is referenced by non-NPC simulation paths. Check `server/src/simulation/ticker.rs` and `server/src/tick_phases.rs` for what is currently active in the tick loop. **#842 — Clean out orphaned NPC and environment interaction systems** - Companion to #848. Scope: `server/src/npc/` orphaned modules, any `content/` directories with overheard.ron or zone-type conversation pools. - R-012 is the authoritative reference. Cross-check against `server/src/simulation/mod.rs` to identify what is actually still wired up vs. dead code. - After cleanup, `server/src/npc/` should contain only modules that are actively used by non-scrapped systems. **#726 — Configure cargo deny.toml for license and advisory checking** - `cargo-deny` is installed but there is no `deny.toml` in `server/`. The CI check is failing because of this. - Allowed licenses: MIT, Apache-2.0, BSD-2-Clause, BSD-3-Clause, ISC, Unlicense, Zlib, CC0-1.0. - Also configure advisory DB (RUSTSEC advisories). Target path: `server/deny.toml`. **#636 — Migrate bincode v1.x to v2.x** - `server/Cargo.toml` has `bincode = "1"`. RUSTSEC-2025-0141 flags v1.3.3 as unmaintained. - bincode v2.x has a different API — encode/decode functions changed. Grep all usage sites before upgrading: `grep -r "bincode::" server/src/`. - `server/src/bridge/` is the most likely consumer (IPC serialization). Verify v2 compatibility before bumping the version pin. - Low priority — no active vulnerability, no player-facing impact. ## Dependency Chain ``` #827 (brand schema) → #829 (generate_brands pipeline) #679 (location-culture) → [unblocks #680 client] #614 (bookmark system) → [unblocks #618 client] #842 (audit NPC orphans) → #848 (retire NPC system) [coordinate together] #726, #636, #826, #827 → standalone, parallel ``` ## PR Workflow ```bash tea pr create --repo jpmschweitzer/settled-reach --login schweitz \ --title "feat(server): sprint 36 — bookmarks, brands, NPC cleanup" \ --description "body" \ --base main --head sprint-36/server ```