From 6fb788d428465d67fa02510997f281f0c884ee0c Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Fri, 24 Apr 2026 13:16:24 +0200 Subject: [PATCH] chore(meta): plan Sprint 38: Depth MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Generation pipeline focus — map all layers from planetary heightmaps to walkable tile environments, build bare-minimum free camera viewer, close Sprint 37 test/infra debt. Character and apartment work formally parked behind the full generation cascade. 13 tickets across 5 teams (planning: 1, server: 4, client: 5, copy: 1, ci: 2). Added Write(docs/sprints/*) and Bash(mkdir) permissions for sprint planning. Co-Authored-By: Claude Opus 4.6 (1M context) --- .claude/settings.json | 3 ++ docs/backups/settledreach.db.backup | Bin 1044480 -> 1081344 bytes docs/sprints/sprint-38/ci.md | 41 ++++++++++++++++ docs/sprints/sprint-38/client.md | 71 ++++++++++++++++++++++++++++ docs/sprints/sprint-38/copy.md | 35 ++++++++++++++ docs/sprints/sprint-38/planning.md | 60 +++++++++++++++++++++++ docs/sprints/sprint-38/server.md | 62 ++++++++++++++++++++++++ 7 files changed, 272 insertions(+) create mode 100644 docs/sprints/sprint-38/ci.md create mode 100644 docs/sprints/sprint-38/client.md create mode 100644 docs/sprints/sprint-38/copy.md create mode 100644 docs/sprints/sprint-38/planning.md create mode 100644 docs/sprints/sprint-38/server.md diff --git a/.claude/settings.json b/.claude/settings.json index 66794950e..1000fe155 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -58,6 +58,9 @@ "Bash(ruff check)", "Bash(tests/run-*)", + "Bash(mkdir -p docs/sprints/*)", + "Write(docs/sprints/*)", + "Bash(chmod *)", "Bash(ls *)", "Bash(find *)", diff --git a/docs/backups/settledreach.db.backup b/docs/backups/settledreach.db.backup index df6af6760a0cae429436d32c6b2aa156a85c1b7a..1c1ca4beb1e6246f4caa73b40a4c342639ea9fc0 100644 GIT binary patch delta 35964 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 delta 5669 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�Vq*@t zt(@4-ZDl8Ot@>pDus?Fp{4H#}-!4e_I(E~qElWu4=P)nLEUzQG6JTX#xZE7sq`%#1 zHIA1hoQpj(?ZJf9H0EIUI@yEk?23q<;4t6D@oid@3Z=c`Ja&&g&8tg`!gC`R?(Ajx zR%$;*1{(hF$imp+nt7V^OL2C;cdU}g?VZg|eCO56UaXT0=@`)JXM_Xh`!gkcKZ8nB zdl?^}Cmpe`0iXOx23eW6djz|2JH6{ih3A_-Q^SM0eEOXs|N0M~n`z2-M2$K+J00uf zaE0mUsw=h{L(Y*qf8+Dic_Js9$wtDNPfh*2@I15Bh6Pq5QtE$HnVt|WE!wjG2Z$Ru A1poj5 diff --git a/docs/sprints/sprint-38/ci.md b/docs/sprints/sprint-38/ci.md new file mode 100644 index 000000000..47c10fdd5 --- /dev/null +++ b/docs/sprints/sprint-38/ci.md @@ -0,0 +1,41 @@ +# Sprint 38: Depth — CI Tasks + +**Goal:** Map the generation pipeline from planetary heightmaps to walkable tile environments, formally park character/apartment work behind the full cascade, and close test/infra debt from Sprint 37. + +**Branch:** `sprint-38/ci` +**Agents:** Justine (build/deploy) + +## New Tickets + +| # | Title | Priority | Blocked by | +|---|-------|----------|------------| +| #887 | Add decisions-orphan-tickets CLI | low | — | +| #888 | Switch meta.schema_version to monotonic semver | low | — | + +Use `tooling/db/ticket show ` for full details. + +## Notes + +**#887 — decisions-orphan-tickets CLI** +- `tickets.decision_ref` is free-text — a typo'd D-ID or renumbered decision silently orphans tickets. +- Build a CLI tool that scans all tickets with a `decision_ref`, validates each against `decisions/*.md`, and reports orphans. +- Output: list of tickets pointing at nonexistent or mismatched D-IDs. + +**#888 — meta.schema_version to monotonic semver** +- Current `meta.schema_version` stores a SHA-1 of `server/data/systems-schema.sql`. Two SHAs can't be ordered — you can't tell which is newer. +- Switch to a monotonic semver string (e.g. `1.0.0`, `1.1.0`). This enables future savegame migration lineage: a save file can record its schema version and determine what migrations to apply. +- Update `import_economics.py` stamp logic and `tooling/check-systems-db-stamp` validation. + +## Dependency Chain + +``` +#887 (orphan-tickets CLI) → standalone +#888 (schema_version semver) → standalone +``` + +## PR Workflow + +When ready to submit, create a PR with `tea` CLI: +```bash +tea pr create --repo jpmschweitzer/settled-reach --login schweitz --title "chore(ci): sprint 38 ci" --description "body" --base main --head sprint-38/ci +``` diff --git a/docs/sprints/sprint-38/client.md b/docs/sprints/sprint-38/client.md new file mode 100644 index 000000000..0cb044706 --- /dev/null +++ b/docs/sprints/sprint-38/client.md @@ -0,0 +1,71 @@ +# Sprint 38: Depth — Client Tasks + +**Goal:** Map the generation pipeline from planetary heightmaps to walkable tile environments, formally park character/apartment work behind the full cascade, and close test/infra debt from Sprint 37. + +**Branch:** `sprint-38/client` +**Agents:** Stig (dev), Tyre (arch), Hoshe (QA) + +## New Tickets + +| # | Title | Priority | Blocked by | +|---|-------|----------|------------| +| #898 | Free camera viewer — WASD pan + scroll zoom, implant/atlas/map access | high | — | +| #882 | Strip archetype-driven client code | medium | — | +| #879 | Revive fog state behavioral tests | medium | — | +| #867 | dialogue_box confrontation_monologue signal bug | medium | — | +| #871 | Pre-existing test failures — umbrella triage | medium | — | + +Use `tooling/db/ticket show ` for full details. + +## Key Decisions + +- `decisions/architecture.md` — D-169 (implant UI components), D-170 (HUD visibility) +- Implant component library: `client/ui/implant/` (ImplantPanel, ImplantHeader, etc.) +- HUD layer manager: `client/scripts/autoloads/hud_groups.gd` + +## Notes + +**#898 — Free camera viewer (bare minimum, throwaway)** +- The rendering system is up in the air — this viewer is iterative/disposable. Do not over-engineer. +- Current camera is locked to `GameState.player_position` (`client/scripts/autoloads/game_state.gd:18`). +- Decouple: add a debug/observer mode where camera position is independent of player entity. +- Controls: WASD/arrow key pan, scroll-to-zoom. That's it. +- The observer needs access to: implants (D-169/D-170 UI system), atlas, and map. Wire up existing `HudGroups` app paths (`implant/map`, `implant/wiki/gttr`, etc.). +- No player entity needed. No server-side observer entity. Just a free camera over whatever tile data exists. +- Key files: `client/main.gd` (camera setup), `client/scripts/autoloads/game_state.gd` (player_position), `client/scripts/autoloads/hud_groups.gd` (implant app switching). + +**#882 — Strip archetype client code** +- Follow-up to server #878 (done). `CharacterArchetype` trace is Phase 6 filler. +- Find all client references to archetype enums/types and remove them. +- #878 already removed the server side — client should have no remaining consumers. + +**#879 — Revive fog state behavioral tests** +- `test_fog_sprint22.gd` was deleted in Sprint 37 (#870 parse-error cleanup). +- Contained unique behavioral tests: `EXP_EXPLORED` persistence after leaving LOS, grow-only bounds invariant. +- Rewrite against current `FogState` API. Prefer live Gauntlet testing over mocks per testing preferences. + +**#867 — dialogue_box confrontation signal bug** +- `signal_fired` remains false after `_on_option_pressed(0)` on a confrontation option. +- `_start_confrontation_beat` likely not firing in headless test mode. +- Check signal wiring in `client/ui/dialogue_box.gd`. + +**#871 — Pre-existing test failures umbrella triage** +- 13 suites affected. For each: investigate, determine if it's stale assertion or real regression, then either fix inline or create a child ticket. +- Per feedback rules: broken tests need a fix or a dated ticket, never a shrug. + +## Dependency Chain + +``` +#898 (free camera viewer) → standalone, start immediately +#882 (strip archetype code) → standalone (#878 done) +#879 (fog tests) → standalone +#867 (signal bug) → standalone +#871 (test triage) → standalone, spawns child tickets +``` + +## PR Workflow + +When ready to submit, create a PR with `tea` CLI: +```bash +tea pr create --repo jpmschweitzer/settled-reach --login schweitz --title "feat(client): sprint 38 client" --description "body" --base main --head sprint-38/client +``` diff --git a/docs/sprints/sprint-38/copy.md b/docs/sprints/sprint-38/copy.md new file mode 100644 index 000000000..74b7f0fcc --- /dev/null +++ b/docs/sprints/sprint-38/copy.md @@ -0,0 +1,35 @@ +# Sprint 38: Depth — Copy Tasks + +**Goal:** Map the generation pipeline from planetary heightmaps to walkable tile environments, formally park character/apartment work behind the full cascade, and close test/infra debt from Sprint 37. + +**Branch:** `sprint-38/copy` +**Agents:** Mellanie (author), Paula (narrative), Gestalt (systems) + +## New Tickets + +| # | Title | Priority | Blocked by | +|---|-------|----------|------------| +| #884 | Copy-team review: wiki/corporations authored by server in #860 | medium | — | + +Use `tooling/db/ticket show 884` for full details. + +## Notes + +**#884 — Wiki corporations review** +- Sprint 37 server ticket #860 had Dudley author/modify 21 `wiki/corporations/*.md` files to resolve the economy-db coverage gate. +- Per team scope rules, `wiki/` is copy-team territory. These files need a voice/lore review pass. +- Check: naming consistency, tone/voice alignment with existing wiki style, lore accuracy, factual consistency with economics data in `tooling/economy-db/`. +- Light-touch — fix voice issues and flag lore contradictions, don't rewrite from scratch. + +## Dependency Chain + +``` +#884 (wiki corps review) → standalone +``` + +## PR Workflow + +When ready to submit, create a PR with `tea` CLI: +```bash +tea pr create --repo jpmschweitzer/settled-reach --login schweitz --title "content(wiki): sprint 38 copy" --description "body" --base main --head sprint-38/copy +``` diff --git a/docs/sprints/sprint-38/planning.md b/docs/sprints/sprint-38/planning.md new file mode 100644 index 000000000..eea989c77 --- /dev/null +++ b/docs/sprints/sprint-38/planning.md @@ -0,0 +1,60 @@ +# Sprint 38: Depth — Planning Tasks + +**Goal:** Map the generation pipeline from planetary heightmaps to walkable tile environments, formally park character/apartment work behind the full cascade, and close test/infra debt from Sprint 37. + +**Branch:** `sprint-38/planning` +**Agents:** Gestalt (systems), Tyre (technical), Miri (worldbuilding), Qatux (documenter), SI (project manager) + +## New Tickets + +| # | Title | Priority | Blocked by | +|---|-------|----------|------------| +| #897 | Generation pipeline cascade — map all layers, produce D-records | high | — | + +Use `tooling/db/ticket show 897` for full details. + +## Key Decisions + +- `decisions/architecture.md` — D-110 (signed z-levels), D-108 (MobileChunk) +- `decisions/scope.md` — development cascade phases (CLAUDE.md §Development Cascade) + +## Notes + +**#897 — Generation pipeline cascade D-records** + +This is the load-bearing planning ticket for the sprint. The team keeps cycling back to character and apartment topics before the generation pipeline is complete. This ticket produces the authoritative reference that prevents that. + +**What exists:** +- Galactic → system → planetary heightmaps: done (`tooling/planet-gen/generate_atlas.py`, `planet_simulation.py`) +- Atlas markers with city placement, roads, rail, rivers: done (`markers.json` per body) +- Generator data model in `server/src/simulation/generator.rs`: complete type hierarchy (DistrictSkeleton, BlockSkeleton, FloorZone, ChunkLayout, etc.) but ALL generation logic is stubs — no code actually produces filled instances +- `server/src/simulation/chunk_streaming.rs`: chunk load/unload system exists but has nothing to load +- `server/src/bin/generator_spike.rs`: spike binary, likely exploratory + +**What this ticket must deliver:** +1. A complete map of every generation layer from planetary heightmap to walkable tile environment: what the layer is, what generates it, what its inputs and outputs are, what exists vs. what's missing +2. D-records in `decisions/` for each layer — at minimum one D-record defining the full pipeline, possibly per-layer records if they're complex enough +3. Ticket dependency chain: create tickets for missing pipeline layers and set up `ticket_deps` so that character work (#694, #619) and apartment work (#681, #682) are explicitly blocked by the generation pipeline tickets +4. Update existing stale tickets that reference premature work (e.g. #615 tycoon starting state, #616 economic verb vocabulary) — either re-scope them behind generation pipeline blockers or defer them with a note + +**Discussion structure:** +- Round 1 (inventory): What exists at each scale? What does each generator produce? Where are the gaps? +- Round 2 (proposals): For each gap, what's the minimum viable generator? What are the inputs/outputs? What decisions are needed? +- Round 3 (convergence): Lock D-records, create tickets, wire dependencies + +**Output:** D-records in `decisions/`, ticket dependency graph, updated blockers on character/apartment tickets. + +## Dependency Chain + +``` +#897 (generation cascade D-records) → standalone, blocks everything downstream + → creates blocker tickets for #694, #619, #681, #682 + → unblocks #899 (district skeleton server ticket) +``` + +## PR Workflow + +When ready to submit, create a PR with `tea` CLI: +```bash +tea pr create --repo jpmschweitzer/settled-reach --login schweitz --title "plan(scope): generation pipeline cascade D-records" --description "body" --base main --head sprint-38/planning +``` diff --git a/docs/sprints/sprint-38/server.md b/docs/sprints/sprint-38/server.md new file mode 100644 index 000000000..246f74625 --- /dev/null +++ b/docs/sprints/sprint-38/server.md @@ -0,0 +1,62 @@ +# Sprint 38: Depth — Server Tasks + +**Goal:** Map the generation pipeline from planetary heightmaps to walkable tile environments, formally park character/apartment work behind the full cascade, and close test/infra debt from Sprint 37. + +**Branch:** `sprint-38/server` +**Agents:** Dudley (dev), Tyre (arch), Hoshe (QA) + +## New Tickets + +| # | Title | Priority | Blocked by | +|---|-------|----------|------------| +| #899 | District skeleton generator — Phase 1 implementation | high | #897 | +| #885 | Multiple baseline tests panic with Bevy Resource-does-not-exist | medium | — | +| #892 | Expand check-systems-db-stamp to cover naming helpers | medium | — | +| #886 | Generator polish: suffix monotony auto-fix + cultural-history prompting | low | — | + +Use `tooling/db/ticket show ` for full details. + +## Key Decisions + +- `decisions/architecture.md` — D-110 (signed z-levels), D-108 (MobileChunk) +- Generator data model: `server/src/simulation/generator.rs` defines the full type hierarchy + +## Notes + +**#885 — Bevy baseline panics (fix first)** +- 6 tests fail on clean main with `Resource does not exist` panics. Confirmed not a sprint regression — present at commit f0465e40. +- @hoshe assigned. This is the first ticket to close — other server work should not land on a broken test baseline. +- Likely missing `.init_resource::()` or `.insert_resource(T::default())` calls in test setup. + +**#892 — Stamp expansion for naming helpers** +- `tooling/check-systems-db-stamp` only tracks `generate_atlas.py` source. The naming pipeline (`gemma_naming.py`, `naming_core.py`) is not covered — changes to naming helpers won't trigger stale-stamp detection. +- Add these files to the `GENERATOR_SOURCES` dict in `tooling/check-systems-db-stamp`. +- Mirror the change in the `/pr-push` skill's source-file watch list. + +**#886 — Generator polish (suffix monotony + cultural-history)** +- Follow-up to Sprint 37 #853. Two partial items remain: + - §3 suffix monotony: `gemma_naming.py` detects clustering but doesn't auto-fix. Add retry logic. + - §6 cultural-history prompting: explicit history context in the few-shot prompt for richer names. + +**#899 — District skeleton generator Phase 1 (BLOCKED by #897)** +- DO NOT start until the planning ticket #897 closes and the generation cascade D-records exist. +- The data model in `server/src/simulation/generator.rs` is complete: `DistrictSkeleton`, `BlockSkeleton`, `BlockPlacement`, `FloorZone`, `ZonePalette`, etc. All generation logic is stubs. +- Phase 1 scope: given a city entry from `markers.json` + `planet_class` + economy node, produce a filled `DistrictSkeleton` with real block assignments, setting types, zone palettes. +- No chunk-level tile generation yet — skeleton structure only. +- Key integration: `chunk_streaming.rs` consumes chunk data. The skeleton feeds into chunk fill (Phase 2, future sprint). + +## Dependency Chain + +``` +#885 (Bevy panics) → standalone, fix first +#892 (stamp expansion) → standalone +#886 (generator polish) → standalone +#899 (district skeleton) → blocked by #897 (planning) +``` + +## PR Workflow + +When ready to submit, create a PR with `tea` CLI: +```bash +tea pr create --repo jpmschweitzer/settled-reach --login schweitz --title "feat(simulation): sprint 38 server" --description "body" --base main --head sprint-38/server +```