Files
settled-reach/docs/sprints/sprint-37/ci.md
T
jpmschweitzer 8b3baf511f chore(meta): plan Sprint 37: Sweep — 25-ticket spring-clean sprint
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).
2026-04-21 16:00:22 +02:00

89 lines
5.2 KiB
Markdown

# Sprint 37: Sweep — CI 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/ci`
**Agents:** Gestalt (systems), Hoshe (QA)
## New Tickets
| # | Title | Priority | Blocked by |
|---|-------|----------|------------|
| #854 | Generator-driven asset pipeline — regeneration discipline and versioning (epic) | high | — |
| #855 | systems.db regeneration with versioning awareness | high | #854 |
| #856 | Stamp systems.db with generator metadata (meta table) | high | #855 |
| #857 | Pre-push git hook for systems.db consistency | high | #856 |
| #858 | Extend /pr-push with rebase + regen + stage | high | #856 |
| #859 | Document the source-canonical rule (.claude/rules/asset-pipeline.md + DEVOPS) | medium | #856 |
| #723 | Add decision-to-ticket coverage report | medium | — |
Use `tooling/db/ticket show <id>` for full details.
## Key Decisions
No domain decisions gate this sprint's work. The asset pipeline epic creates new process conventions documented in `.claude/rules/asset-pipeline.md` (deliverable of #859).
## Notes
**#854 — Generator-driven asset pipeline (epic wrapper)**
- This epic establishes the mental model: `server/data/systems.db` is a read-only canonical snapshot, deterministically produced from source files (markers.json, *.toml, generator code). Direct DB edits are forbidden except when mirrored back to source.
- Children: #855#856#857 and #858 (parallel after #856) → #859 (docs, after #856).
- Driver: Sprint 36 had a binary conflict risk between two branches both committing systems.db changes. This epic prevents the class of problem going forward and establishes the versioning primitives the future savegame system will need.
- #854 itself has no code deliverable — it is the parent epic for tracking purposes. Work happens in children.
**#855 — systems.db regeneration with versioning awareness**
- Every generator (`import_economics.py`, `generate_atlas.py`, `generate_brands`) must be updated to accept a `--stamp` flag (or equivalent) that writes metadata to the DB after generation.
- The regeneration step should be idempotent: running it twice on the same sources produces identical output.
- Unblocks #856, #857, #858, #859.
**#856 — Stamp systems.db with generator metadata (meta table)**
- Add a `meta` table to `db/schema.sql`: columns `schema_version`, `generator_sha`, `generated_at`.
- Each generator writes its own row on completion.
- The stamp is what lets a future savegame DB record which canonical snapshot it derives from (migration lineage).
- Blocked by #855 (generators must be updated before stamping is meaningful).
**#857 — Pre-push git hook for systems.db consistency**
- Hook fires on `git push` and verifies: if `systems.db` is staged, its `meta.generator_sha` matches the current HEAD SHA of the generator source files.
- If not, rejects the push with a message: "systems.db is stale — run `make regen-db` before pushing."
- Install via `make install-hooks`. Document in #859.
**#858 — Extend /pr-push with rebase + regen + stage**
- The `/pr-push` skill runs before PR creation. Extend it to: (1) rebase on main, (2) run `make regen-db` if any generator source was modified in the branch, (3) stage the updated `systems.db`.
- This prevents the class of binary conflict where two branches both modify generator sources and commit separate DB snapshots.
- Parallel to #857 after #856 is done.
**#859 — Document the source-canonical rule**
- Deliverables:
1. `.claude/rules/asset-pipeline.md` — canonical rules file covering: what systems.db is, how to make a DB change, why direct edits are forbidden, the meta table stamp, the pre-push hook, why /pr-push regenerates.
2. `CLAUDE.md` hook — one-line reference under a new `### Asset pipeline` subsection pointing at the rules file.
3. `docs/DEVOPS.md` — short section on the pipeline: meta table, `make install-hooks`, regenerate-before-push workflow.
- Blocked by #856 (meta table must exist before documenting it).
**#723 — Decision-to-ticket coverage report**
- No schema change needed — `tickets.decision_ref` already exists.
- Deliverables:
1. `make decisions-coverage` — shows each D-record with its implementing ticket(s).
2. `make decisions-orphan` — shows D-records with no implementing tickets (verify existing target works).
3. `tooling/db/decision show D-159` — includes linked ticket IDs in output.
- The reverse link (decision → tickets) is a `SELECT` query, not a new column. Avoids fragile two-way sync.
- Standalone, parallel to the asset pipeline chain.
## Dependency Chain
```
#854 (epic) → no code
#855 (regen awareness) → #856 (meta table) → #857 (pre-push hook)
→ #858 (pr-push extension)
→ #859 (documentation)
#723 → standalone, parallel to all above
```
## PR Workflow
```bash
tea pr create --repo jpmschweitzer/settled-reach --login schweitz \
--title "ci: sprint 37 — asset pipeline discipline, decision coverage report" \
--description "body" \
--base main --head sprint-37/ci
```