From 822cf34bbc51a696767cb2c62d4c2c6b707798f9 Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Sun, 5 Apr 2026 08:17:28 +0200 Subject: [PATCH] chore(meta): plan Sprint 31: Bedrock MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase 1 wiki completion (cultural sweep, GTTR depth, star map popups) + infrastructure refactors (atlas.rs, main.gd, Python tooling). 8 tickets: copy (4), client (2), server (1), ci (1). Cascade dependencies locked: Phase 1→2→3→4→5→6. #693 cancelled (superseded by #704 compositor). Co-Authored-By: Claude Opus 4.6 (1M context) --- docs/backups/settledreach.db.backup | Bin 962560 -> 962560 bytes docs/sprints/sprint-31/ci.md | 57 ++++++++++++++++++++++ docs/sprints/sprint-31/client.md | 73 ++++++++++++++++++++++++++++ docs/sprints/sprint-31/copy.md | 70 ++++++++++++++++++++++++++ docs/sprints/sprint-31/joint.md | 45 +++++++++++++++++ docs/sprints/sprint-31/server.md | 57 ++++++++++++++++++++++ 6 files changed, 302 insertions(+) create mode 100644 docs/sprints/sprint-31/ci.md create mode 100644 docs/sprints/sprint-31/client.md create mode 100644 docs/sprints/sprint-31/copy.md create mode 100644 docs/sprints/sprint-31/joint.md create mode 100644 docs/sprints/sprint-31/server.md diff --git a/docs/backups/settledreach.db.backup b/docs/backups/settledreach.db.backup index a6fcdaba573cb7f37e82433a63efca679337b774..d79571e51358f161aac966e94414b79020438a99 100644 GIT binary patch delta 6246 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 UMA;r|FQsE-cwQL$tULC90b6SThX4Qo diff --git a/docs/sprints/sprint-31/ci.md b/docs/sprints/sprint-31/ci.md new file mode 100644 index 000000000..01bb4304d --- /dev/null +++ b/docs/sprints/sprint-31/ci.md @@ -0,0 +1,57 @@ +# Sprint 31: Bedrock — CI Tasks + +**Goal:** Complete Phase 1 wiki content (cultural sweep, GTTR depth, star map popups) and refactor accumulated complexity in atlas.rs, main.gd, and Python tooling. + +**Branch:** `sprint-31/ci` +**Agents:** Justine (build/deploy), Hoshe (QA) + +## New Tickets + +| # | Title | Blocked by | +|---|-------|------------| +| #777 | Add ruff linting + shared DB path module for Python scripts | — | + +Use `tooling/db/ticket show ` for full details. + +## Key Decisions + +- `decisions/process.md` — development process decisions + +## Notes + +### #777 ruff linting + shared DB path module (refactor) +Python scripts in `tooling/db/` lack linting and share duplicated patterns. + +**Deliver:** +1. **pyproject.toml** at repo root with ruff config (line length, target Python version, rule selection) +2. **Shared module** `tooling/db/common.py` extracting: + - `resolve_db_path()` — uses `PROJECT_DB_PATH` env var with parent-dir fallback + - `load_config()` — reads `tooling/db/config.json` + - `get_connection()` — returns WAL-mode SQLite connection +3. **Update all consumers** — `sqlite_connector.py`, `ticket`, `sprint`, `decisions_sync.py` to import from `common.py` instead of duplicating +4. **Pre-push hook integration** — add `ruff check tooling/` to the pre-push hook alongside GDScript and Rust checks +5. **Makefile target** — `make lint-python` running ruff + +**Key files:** +- `tooling/db/sqlite_connector.py` — current DB path resolution +- `tooling/db/ticket` — duplicated resolve pattern +- `tooling/db/sprint` — duplicated resolve pattern +- `tooling/db/decisions_sync.py` — duplicated resolve pattern +- `tooling/db-backup` — bash equivalent + +**Verify:** `ruff check tooling/` passes. All DB CLI commands still work +(`tooling/db/ticket count`, `tooling/db/sprint status`). + +## Dependency Chain + +``` +#777 (ruff + shared module) → standalone +``` + +## PR Workflow + +```bash +tea pr create --repo jpmschweitzer/settled-reach --login schweitz \ + --title "chore(ci): Sprint 31 — ruff linting + shared DB module" \ + --description "body" --base main --head sprint-31/ci +``` diff --git a/docs/sprints/sprint-31/client.md b/docs/sprints/sprint-31/client.md new file mode 100644 index 000000000..53498610f --- /dev/null +++ b/docs/sprints/sprint-31/client.md @@ -0,0 +1,73 @@ +# Sprint 31: Bedrock — Client Tasks + +**Goal:** Complete Phase 1 wiki content (cultural sweep, GTTR depth, star map popups) and refactor accumulated complexity in atlas.rs, main.gd, and Python tooling. + +**Branch:** `sprint-31/client` +**Agents:** Stig (UI), Tyre (architecture), Hoshe (QA) + +## New Tickets + +| # | Title | Blocked by | +|---|-------|------------| +| #780 | Star map click-through — wiki/GTTR popup on system select | — | +| #775 | Decompose main.gd and game_state.gd god objects | — | + +Use `tooling/db/ticket show ` for full details. + +## Key Decisions + +- `decisions/architecture.md` — D-013 (diegetic UI), D-020 (client architecture) +- `decisions/scope.md` — development cascade, Phase 1 deliverable + +## Notes + +### #780 Star map click-through (Phase 1 deliverable) +The star map insert module (#674, Sprint 30) renders 301 systems as a hop-ring +view with click-to-select. Currently selecting a system updates `_selected_system` +and shows the name in a basic info panel. + +**Deliver:** When a system is selected, show a popup/panel with: +- System name, star type, hop distance, corridor +- GTTR narrative excerpt (first paragraph of the wiki entry) +- Body count, population summary +- Adjacent systems (topology links) + +Data source: `client/data/star_map_data.json` already contains most fields. +For GTTR text, either embed excerpts in the JSON (via `tooling/generate-star-map-data.py`) +or load from a separate text file at runtime. + +**Key files:** +- `client/ui/star_map.gd` — existing star map (525 lines) +- `client/ui/star_map.tscn` — scene file +- `client/data/star_map_data.json` — 4363 lines, 301 systems +- `tooling/generate-star-map-data.py` — data generator (may need extending) + +### #775 Decompose main.gd and game_state.gd (refactor) +Gemini code review flagged these as god objects: +- `client/scripts/main.gd` (28KB) — UI management, input, state transitions +- `client/scripts/autoloads/game_state.gd` (19KB) — global state, snapshots + +**Approach:** Extract focused components. Suggested splits: +- `main.gd` → extract UI manager, insert state controller, input dispatcher +- `game_state.gd` → extract snapshot handler, character state, session state + +**Constraint:** GDScript autoload parse-order rule (documented in CLAUDE.md). +Autoloads can't reference `class_name` types at top level. Any new autoloads +must follow the `load()` inline pattern. Prefer non-autoload scripts where possible. + +## Dependency Chain + +``` +#780 (star map popup) → standalone, Phase 1 priority +#775 (decompose god objects) → standalone, refactor track +``` + +Independent — work in parallel. + +## PR Workflow + +```bash +tea pr create --repo jpmschweitzer/settled-reach --login schweitz \ + --title "feat(client): Sprint 31 — star map popup, main.gd decomposition" \ + --description "body" --base main --head sprint-31/client +``` diff --git a/docs/sprints/sprint-31/copy.md b/docs/sprints/sprint-31/copy.md new file mode 100644 index 000000000..23edf9f9f --- /dev/null +++ b/docs/sprints/sprint-31/copy.md @@ -0,0 +1,70 @@ +# Sprint 31: Bedrock — Copy Tasks + +**Goal:** Complete Phase 1 wiki content (cultural sweep, GTTR depth, star map popups) and refactor accumulated complexity in atlas.rs, main.gd, and Python tooling. + +**Branch:** `sprint-31/copy` +**Agents:** Mellanie (author), Paula (narrative), Miri (worldbuilding) + +## New Tickets + +| # | Title | Blocked by | +|---|-------|------------| +| #766 | Cultural diversity sweep — wiki naming and heritage asymmetry | — | +| #782 | Per-body GTTR entries for moons and stations | — | +| #774 | Enrich GJ-672 (Nova Estrada) and GJ-147 (Entremeio) wiki entries | — | +| #773 | Evaluate Iserlohn (GJ-532) planet name for IP originality | — | + +Use `tooling/db/ticket show ` for full details. + +## Key Decisions + +- `decisions/content.md` — D-NNN content decisions, cultural corridor system +- `decisions/scope.md` — development cascade, Phase 1 deliverable definition + +## Notes + +### #766 Cultural diversity sweep (largest ticket) +The cultural stereotyping audit (`docs/audits/cultural-stereotyping-audit.md`) flagged +multiple cultural groups with imbalanced representation. Afrikaans is the worst at ~15:1 +confirming:subverting ratio (Sprint 30 added Brandpunt as first subversion). This ticket +requires reviewing all cultural groups, identifying imbalances, and rewriting wiki entries +to add subversions. Work across all 5 corridors. The audit's recommendations (tech hubs, +academic centers, commercial dynasties, artistic communities) should guide the rewrites. + +**Scope rule:** This is a separate sprint's worth of work if done exhaustively. For this +sprint, focus on the top 3 most imbalanced groups and deliver concrete wiki rewrites for +at least 2 systems per group. File follow-up tickets for the remaining groups. + +### #782 Per-body GTTR entries +Many systems have only system-level GTTR. Significant moons and stations (pop >10K) need +their own entries. Existing patterns: `wiki/star-systems/GJ-*/gttr.md`. Prioritize hub +systems at hops 1-4 first (highest traffic, most gameplay relevance). + +### #774 Thin wiki entries +Paula's Sprint 30 review flagged Nova Estrada and Entremeio as noticeably thinner than +the batch standard. Enrich to match Kettenschmied-level quality (economic logic + human +cost in the same breath). + +### #773 Iserlohn IP evaluation +Miri's review flagged "Iserlohn" (GJ-532 planet name) as a potential Legend of the Galactic +Heroes reference. The real-German-city rationale is documented in the proposal notes. Make a +deliberate decision: keep with rationale, or rename to another Sauerland-region reference. + +## Dependency Chain + +``` +#766 (cultural sweep) → standalone, largest piece +#782 (per-body GTTR) → standalone, parallel track +#774 (thin entries) → standalone, quick +#773 (Iserlohn IP) → standalone, quick decision +``` + +All tickets are independent — work in parallel by agent. + +## PR Workflow + +```bash +tea pr create --repo jpmschweitzer/settled-reach --login schweitz \ + --title "data(copy): Sprint 31 — cultural sweep, GTTR depth, wiki quality" \ + --description "body" --base main --head sprint-31/copy +``` diff --git a/docs/sprints/sprint-31/joint.md b/docs/sprints/sprint-31/joint.md new file mode 100644 index 000000000..5dc3d986e --- /dev/null +++ b/docs/sprints/sprint-31/joint.md @@ -0,0 +1,45 @@ +# Sprint 31: Bedrock — Joint Notes + +**Goal:** Complete Phase 1 wiki content (cultural sweep, GTTR depth, star map popups) and refactor accumulated complexity in atlas.rs, main.gd, and Python tooling. + +## Sprint Completion Proof + +When Sprint 31 is done, you can: + +1. **Click any system** in the star map and see a popup with its name, star type, corridor, GTTR excerpt, body count, and adjacent systems +2. **Read culturally diverse wiki entries** — at least 2 subversion entries per top-3 imbalanced cultural groups +3. **Read GTTR entries for major moons and stations** — hub system bodies at hops 1-4 have individual entries +4. **Run `ruff check tooling/`** and get a clean pass +5. **Browse atlas.rs** and find subcommands in separate module files +6. **Browse main.gd** and find it under 15KB with responsibilities extracted + +## Phase 1 Context + +This sprint advances Phase 1 of the development cascade (epic #746). Phase 1 +deliverable: "Implant-ready Godot map of the Reach with click-throughs + wiki/GTTR popups." + +**What's done:** 301/301 systems, body catalogs, star map insert, GTTR coverage +**What this sprint adds:** Star map popups (#780), cultural quality (#766), GTTR depth (#782) +**What remains after this sprint:** Heightmaps (#778), planetary screenshots (#779), economic profiles (#781) — these need design discussion before implementation, targeted for Sprint 32. + +## Not In Scope + +The following are **Phase 2-6 work** and must NOT be started until Phase 1 is complete: +- Character creation production UI (#694) +- Location-to-culture resolution (#679) +- NPC personality surface area (#621) +- Tycoon starting state design (#615) +- Economic simulation +- Settlement generation + +The cascade is enforced in the ticket system: #747 (Phase 2) is blocked by #746 (Phase 1). + +## Refactor Rationale + +The three refactors (#775, #776, #777) are infrastructure work, not feature development. +They reduce complexity that compounds every sprint: +- `atlas.rs` (2000+ lines) — every atlas feature adds to a single file +- `main.gd` (28KB) + `game_state.gd` (19KB) — every client feature touches these +- Python tooling (5 files with duplicated DB path logic) — every new script copies the pattern + +Doing these now prevents the debt from growing further as Phase 1 content work continues. diff --git a/docs/sprints/sprint-31/server.md b/docs/sprints/sprint-31/server.md new file mode 100644 index 000000000..181679ddc --- /dev/null +++ b/docs/sprints/sprint-31/server.md @@ -0,0 +1,57 @@ +# Sprint 31: Bedrock — Server Tasks + +**Goal:** Complete Phase 1 wiki content (cultural sweep, GTTR depth, star map popups) and refactor accumulated complexity in atlas.rs, main.gd, and Python tooling. + +**Branch:** `sprint-31/server` +**Agents:** Dudley (simulation), Tyre (architecture), Hoshe (QA) + +## New Tickets + +| # | Title | Blocked by | +|---|-------|------------| +| #776 | Split atlas.rs subcommands into modules | — | + +Use `tooling/db/ticket show ` for full details. + +## Key Decisions + +- `decisions/architecture.md` — D-010 (server-authoritative), D-020 (Rust/bevy_ecs) + +## Notes + +### #776 Split atlas.rs subcommands into modules (refactor) +`server/src/bin/atlas.rs` is 2000+ lines containing all CLI subcommands in one +file. Each subcommand (author, commit-system, corridor-status, list-systems, +verify, next, show-system, etc.) should be extracted into its own module. + +**Approach:** +- Create `server/src/bin/atlas/` module directory +- Move `atlas.rs` → `server/src/bin/atlas/main.rs` (thin dispatch) +- Extract each `cmd_*` function into its own file: + - `author.rs` — `cmd_author`, `generate_body_matrix` + - `commit.rs` — `cmd_commit_system` + - `corridor_status.rs` — `cmd_corridor_status` + - `list.rs` — `cmd_list_systems`, `cmd_next`, `cmd_unfinished` + - `show.rs` — `cmd_show_system` + - `verify.rs` — `cmd_verify` +- Shared types/helpers stay in `main.rs` or a `common.rs` + +**Key file:** `server/src/bin/atlas.rs` (~2000 lines) + +**Verify:** `cargo build --bin atlas` must compile. `cargo test` must pass. +Run `tooling/atlas stats` and `tooling/atlas corridor-status` to verify CLI +still works after the split. + +## Dependency Chain + +``` +#776 (atlas split) → standalone +``` + +## PR Workflow + +```bash +tea pr create --repo jpmschweitzer/settled-reach --login schweitz \ + --title "refactor(simulation): Sprint 31 — split atlas.rs into modules" \ + --description "body" --base main --head sprint-31/server +```