Tickets: - ci (7): #854, #855, #856, #857, #858, #859, #723 - server (9): #853, #860, #862, #863, #874, #877, #878, #789, #847 - client (6): #866, #869, #870, #872, #873, #875 - copy (3): #861, #865, #876 Themes: asset pipeline discipline, PROTOCOL_VERSION removal (D-192), D-167 HeritageRoot purge, D-032 smuggler/detective enum audit, New Game regression fix + merge-path test coverage, copy wiki residue purge, bookmark save-state, generator quality patches. Debt surfaced from Q/D-record sweep: Q-095 Commission name, D-167 and D-032 residue, plus spring-cleaning pulls from stale backlog (#789, #847, #723, #862). #868 cancelled (superseded by #874 + #875).
103 lines
6.3 KiB
Markdown
103 lines
6.3 KiB
Markdown
# 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 <id>` 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 `<City-A>-<City-B>` 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 <small-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
|
|
```
|