# Sprint 37: Sweep — Server Tasks **Goal:** Spring-clean accumulated debt: asset pipeline discipline, PROTOCOL_VERSION removal, D-167/D-032 dead-code purge, New Game regression fix, copy wiki residue, bookmark save-state, and generator quality patches. **Branch:** `sprint-37/server` **Agents:** Dudley (dev), Tyre (arch), Hoshe (QA) ## New Tickets | # | Title | Priority | Blocked by | |---|-------|----------|------------| | #863 | Wire SelectedBookmark into SaveState | medium | — | | #874 | Drop PROTOCOL_VERSION on server (D-192) | medium | — | | #853 | Generator-patch follow-up: dedup, mountains, suffix, compass | medium | — | | #860 | Resolve 21 raw-commodity / system coverage gate gaps | medium | — | | #877 | Remove HeritageRoot type alias and Heritage enum variant (D-167) | medium | — | | #878 | Audit and purge dead smuggler/detective character enum (D-032) | medium | — | | #847 | Determinism smoke test for generate_atlas.py | low | — | | #789 | fix(simulation): storyteller activation_pass log DEBUG not WARN | low | — | | #862 | Refactor BookmarkPlugin to accept injected registry | low | — | Use `tooling/db/ticket show ` for full details. ## Key Decisions - `decisions/architecture.md` — D-192 (drop PROTOCOL_VERSION lockstep handshake), D-005 (IPC protocol) - `decisions/content.md` — D-167 (corridors replace heritage roots, 2026-03-24) - `decisions/perception.md` — D-032 (smuggler/detective enum obsolete post-D-117; D-121 culture-driven voice) ## Notes **#863 — Wire SelectedBookmark into SaveState** - Add `Serialize`, `Deserialize` derives to `SelectedBookmark` in `server/src/bookmark/mod.rs`. - Register `SelectedBookmark` as a serializable resource in `server/src/simulation/save_state.rs`. - Round-trip test: save with bookmark selected → load → `SelectedBookmark` survives. - Update bookmark spec §4.4 (`docs/architecture/sprint-36-bookmark-spec.md`) — remove the v0.2-deferred scope note. - Replaces inline TODO at `server/src/bookmark/mod.rs:95-99`. **#874 — Drop PROTOCOL_VERSION on server (D-192)** - Remove: `version` field from snapshot envelope in `server/src/bridge/types.rs`, `PROTOCOL_VERSION` constant, and version stamp in encode path. - Keep all field-presence and roundtrip behavioral tests. Tautological version-literal assertions were already deleted in Sprint 36. - Client ticket #875 is blocked by this — server PR merges first. - After this lands, genuine schema drift surfaces as MessagePack missing-field errors downstream. That is the intended signal. **#853 — Generator-patch follow-up** - Patch `tooling/planet-gen/generate_atlas.py` and `tooling/planet-gen/gemma_naming.py` for 7 systematic issues documented in `docs/design/atlas-generator-refinement-notes.md`: 1. Cross-body city name dedup (49 collisions — 'Jade Harbor' on 20 bodies, 'Fort Iron' on 10) 2. Cross-body mountain name dedup (186 bodies with empty names, 'Riverbend' on 39) 3. Suffix monotony (-rant/-berg clustering) 4. Compass-direction defaults — forbid 'Eastern X / Western Y' pattern in few-shot 5. Cultural crossmix gap — thread corridor + cultural-history context into naming prompt 6. River vocabulary bleeding from navigational terms (blocklist circumflex/contraflow) 7. Unnamed infrastructure — emit `-` convention for roads/rail at generation time - Verification: re-run Paula's analysis script after patching; confirm collision counts drop. **#860 — Resolve 21 coverage gate gaps** - `make economy-db` Phase 2 coverage gate fails on 21 raw-commodity/system gaps in tier1 corp tags. The brand layer (V-B01..V-B06) passes cleanly — this is upstream. - Identify the 21 specific gaps. Either backfill tier1 corp tags or relax the gate if gaps are intentional (e.g. commodity deliberately imported from outside the Reach). - `make economy-db` must pass end-to-end before Phase 2 demand simulation can run in anger. **#877 — Remove HeritageRoot + Heritage variant (D-167)** - D-167 (2026-03-24) retired the 7 abstract heritage roots in favor of corridors. Two dead stubs remain: - `pub type HeritageRoot = String;` at `server/src/simulation/generator.rs:76` - `ZonePaletteModifier::Heritage(HeritageRoot)` variant at `generator.rs:369` - Delete the type alias, drop the enum variant, remove all Heritage modifier construction sites. - Verify no external consumer before deleting. Same pattern as D-192 cleanup. **#878 — Audit and purge D-032 dead enum** - D-032 is marked "[Obsolete post-D-117: smuggler/detective eliminated. v0.2 uses culture-driven voice per D-121; this enum is unused.]" - Known reference sites: `server/src/bridge/types.rs`, `server/src/perception/observer/mod.rs`, `server/tests/archetype_monologue.rs`, and content schemas. - Audit first — some usages may be load-bearing (e.g. a wider pattern match). Remove confirmed-dead surface only. Do not mass-delete before reading each callsite. **#847 — Determinism smoke test for generate_atlas.py** - ~60 lines of bash or pytest. Place in `tests/` consistent with project test layout. - Run `generate_atlas.py --body --force --seed 42` twice; diff `markers.json` byte-for-byte. - Fails if output differs. Guardrail against determinism regressions in terrain analysis, city placement, A*, and naming. **#789 — Storyteller log level fix** - `activation_pass: no Simmering triangles — holding` fires as WARN every few seconds during early gameplay when no NPC relationships have escalated. This is normal state, not an error condition. - Change to DEBUG or TRACE. One-line fix. **#862 — BookmarkPlugin registry injection** - `BookmarkPlugin::build` calls `register_default_bookmarks(&mut registry)` unconditionally — no hook for a test registry. - Proposed: `BookmarkPlugin::new(registry)` injection. Default constructor still wires the canonical tycoon registry; injection variant is for tests and future TOML loading. - File: `server/src/bookmark/mod.rs:107-118`. Flagged in PR #132 review; accepted as follow-up. ## Dependency Chain ``` #874 (server PROTOCOL_VERSION drop) → unblocks #875 (client) #877, #878, #789, #847, #862 → standalone, parallel #863, #853, #860 → standalone, parallel ``` ## PR Workflow ```bash tea pr create --repo jpmschweitzer/settled-reach --login schweitz \ --title "refactor(server): sprint 37 — dead code purge, protocol cleanup, generator patches" \ --description "body" \ --base main --head sprint-37/server ```