chore(meta): plan Sprint 38: Depth
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) <noreply@anthropic.com>
This commit is contained in:
@@ -58,6 +58,9 @@
|
|||||||
"Bash(ruff check)",
|
"Bash(ruff check)",
|
||||||
"Bash(tests/run-*)",
|
"Bash(tests/run-*)",
|
||||||
|
|
||||||
|
"Bash(mkdir -p docs/sprints/*)",
|
||||||
|
"Write(docs/sprints/*)",
|
||||||
|
|
||||||
"Bash(chmod *)",
|
"Bash(chmod *)",
|
||||||
"Bash(ls *)",
|
"Bash(ls *)",
|
||||||
"Bash(find *)",
|
"Bash(find *)",
|
||||||
|
|||||||
Binary file not shown.
@@ -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 <id>` 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
|
||||||
|
```
|
||||||
@@ -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 <id>` 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
|
||||||
|
```
|
||||||
@@ -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
|
||||||
|
```
|
||||||
@@ -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
|
||||||
|
```
|
||||||
@@ -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 <id>` 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<X> 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::<T>()` 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
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user