Sprint 36 copy team — closes Phase 3 atlas (refinement + brand layer), establishes Phase 4 foundations via the shared infrastructure.
#838 — Baseline atlas refine pass across all 273 inhabited bodies. Cross-body city name collisions: 119+ → 0 (Forum Veritas ×10, Jade Harbor ×19, Fort Iron ×10, Eisenstadt ×7, and 20+ smaller clusters eliminated). 80% of roads/rail were unnamed at generator output; all named using city-pair convention.
#849 — Core-world atlas cohesion hand-refine across 6 hop 0-1 systems: GJ 144 (Ran), GJ 71 (Tau Ceti), GJ 244A (Sirius), GJ 380 (Groombridge), GJ 699 (Barnard's), GJ 0 (Sol). 56 name edits across 13 inhabited bodies. Sol imported with IAU-accurate lunar mountain names; Earth trimmed from real-world top-50 cities to 11 cultural touchstones. Reusable atlas_cohesion_audit.py + sol_name_fixes.py tooling added.
#828 — 124 notable brand corps authored in wiki/economics/corporations/brands.toml across all 8 D-189 categories (terroir / heritage_craft / tech_premium / cultural / service_premium / commodity_branded / design_heritage / platform_catalogue). 248 brand_products entries total. 112 new wiki corp stub pages (minimal frontmatter — full three-layer authoring tracked separately in #861). Brand layer validation V-B01..V-B06 passes. D-189 §5 amended with locked price_tier enum: mass / premium / luxury / flagship / institutional.
Also in this PR: /sprint-start skill lifecycle update (team stays alive through review AND merge, not just approval).
Known deferred issues (tracked, not blocking merge)
186 bodies with empty mountain range names (SEVERE in refinement notes, but pipeline-level — needs generator patch, not per-body hand-fix). Tracked in #853.
Cross-body non-city collisions on rivers/oceans on uninhabited bodies (Rio Grande ×23, Steinbruch ×19, Concordia ×3, Basilica Nova ×18). Tracked in #853.
21 raw-commodity/system coverage-gate gaps in existing tier1 corps. Pre-existing, not introduced here. Tracked in #860.
112 corp wiki stubs at minimal frontmatter depth (per reviewer-accepted split protocol). Three-layer narrative authoring tracked in #861.
#860 — Resolve 21 raw-commodity/system coverage-gate gaps in tier1 corps (server team, pre-existing, not in brand layer).
#861 — Author 112 brand corp wiki stubs to three-layer narrative depth (copy team, follow-up to #828 review).
Files
333 files changed, +14,055 / -718. Full systematic-issue notes in docs/design/atlas-generator-refinement-notes.md and per-body log in tooling/planet-gen/refine_log_849.md.
Test plan
make economy-db builds brand_products table from wiki/economics/corporations/brands.toml (coverage gate still fails on #860 items — pre-existing, not introduced here)
Atlas cohesion audit re-run confirms zero empty / lazy / cardinal names on the 13 touched bodies
Visual spot-check: open implant atlas app on Sol, Tau Ceti, Sirius, Barnard's — names render, no truncation
Adds two reusable scripts for the core-world hand-refine pass:
- atlas_cohesion_audit.py: SQL analysis against atlas_* tables. Reports
empty names, lazy/generic outputs, cardinal direction density, earth-echo
concentration, same-body cross-feature stem duplicates, and cross-body
stem collisions within a system. Supports --system, --body, --db flags.
Baseline run ranked Ran and Tau Ceti as highest-priority targets.
- apply_name_fixes.py: Applies curated name replacement tables to
markers.json files (name fields only; geometry preserved). Supports
--dry-run. After running, caller syncs DB via generate_atlas.py --body.
- refine_log_849.md: Hand-refine log documenting each body touched, the
rationale per change, cross-reference arcs established, and systems
flagged as blocked or needing follow-up (Sol, Barnard's Star, Proxima).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
White-glove name pass on the five highest-traffic inhabited bodies in the
Ran (GJ 144) and Tau Ceti (GJ 71) systems. All markers.json edits synced
to atlas_* tables via generate_atlas.py.
GJ144d Kallast (2B pop): 4 fixes — "Aldren Pass" river renamed to
Randalfoss (avoids cross-system stem collision with Lendel's "Aldren");
two generic oceans renamed (Keldmere, Seterfjord — the latter cross-refs
mountain Seterfjellet); POI renamed to "Kallast Gate Terminal".
Established cross-ref arcs: Rán-, Seter-, Keld-.
GJ144e Vethis (1.2B pop): 9 fixes — 4 river renames (1 cardinal, 1
earth-echo, 2 generics), 1 ocean (Ash- overuse → Veth Mere), 3 mountain
renames (2 generics, 1 Ash- overuse). Established arcs: Grey- (4 names),
Thorn- (2), Kel- (3), Veth- (3), Ash- (2, down from 3).
GJ71c Threshold (600M pop): 1 fix — river "Aethelred" (Anglo-Saxon)
replaced with "Gaius" to complete the all-Latin survey-team arc (Octavius,
Septimus, Quintus, Valeria, Marcus, Gaius).
GJ71d Arden (500M pop): 2 fixes — "Concordia Hall" city renamed "The
Praxis" (Concordia = GJ71c ocean, cross-body stem collision); "Basilica
Nova" river renamed "Via Principia" (exact name match with GJ71c POI).
GJ71d-1 Verantis (20M pop): no name changes — mountains already updated
in prior pass (The Lateranum, The Curia Magna, etc.); DB sync only.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Systematic sweep eliminated all city name cross-body collisions across the
273 inhabited bodies. Started from Forum Veritas/Jade Harbor/Fort Iron
clusters identified during the #849 analysis pass.
Strategy: use world proper_name as capital city name wherever unique.
For worlds sharing a proper_name, author corridor-appropriate alternates.
All edits synced to atlas_cities via generate_atlas.py --body.
Before: 119+ cross-body city collisions, worst-case ×20 (Jade Harbor)
After: 0 cross-body city collisions
Clusters eliminated: Forum Veritas ×10, Jade Harbor ×19, Fort Iron ×10,
Eisenstadt ×7, Fjordheim/Fjordholm ×6 each, Eisenberg/Eisenfels/Hanseong ×5
each, Ridge Marker ×5, plus 20+ smaller clusters down to ×2.
River/ocean collisions (Rio Grande ×23 rivers, Steinbruch ×19, etc.)
remain — these affect uninhabited secondary bodies at scale and require a
dedicated batch-script pass.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Names all 33 null-name auto-detected Sol features: Earth ocean + 3 rivers,
24 Luna mountain ranges (real IAU lunar mountain names), 4 Mars mountains,
1 Europa mountain. All using real-world geographic names. Cross-reference
arcs added on Mars (Hellas-, Chryse-) and Europa (Conamara-, Pwyll-).
Adds sol_name_fixes.py for reproducible Sol feature naming. Updates refine
log to mark Sol complete with full audit metrics for all 6 touched systems.
DB synced: GJ0d, GJ0d-1, GJ0e, GJ0f-2 (all Sol inhabited bodies).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Finalizes #849 core-world atlas cohesion: GJ0d (Earth/Sol) markers.json
cleaned of erroneous data, refine_log updated with Sol body gap notes,
atlas_quality_analysis.py added for ongoing metric tracking.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Header still said "4 anchor brands only, Phase 3 deferred". Now reflects
Sprint 36 #828 reality: 124 brand corps, full D-189 census, all 8 categories.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Runtime smoke test: not mentioned in PR description — process gap
Test plan items (4 checkboxes) all unchecked — aspirational, not evidence
Hoshe (QA / data integrity): REQUEST_CHANGES
Brands structurally solid (D-189 coverage complete, FK integrity passes, 112 wiki stubs match corp_ids one-to-one, make economy-db demonstrably run). But price_tier — documented in D-189 §5 as a locked enum field — is entirely absent from the DB schema, importer, and validator. The field gets authored into TOML and silently discarded. Five smaller issues.
Paula (narrative depth): REQUEST_CHANGES
Atlas hand-refine work is good: internal cross-reference arcs intentional, cardinal labels gone, Earth/Luna selections carry real weight. But the 112 new corp wiki stubs are all 24-line frontmatter-only placeholders ("X is a Y operating out of Z. Details to be expanded.") in a codebase whose canonical stubs (Calloway, Thrds, VGV, Thalassa) run 95–125 lines with origin histories, political relationships, and concealed facts. Either populate to the three-layer minimum or split the PR.
Miri (worldbuilding): REQUEST_CHANGES (with retractions — see below)
Substantive setting-level concerns on Earth's selection logic and Groombridge's monocultural texture stand. Several other comments were based on stale reads and have been verified against the branch and retracted.
price_tier documented in D-189 §5 as locked enum (mass/premium/luxury/flagship/institutional), present in 240/248 TOML entries, absent from schema, INSERT, and V-B06 enum_checks. Silently discarded on import. Either add price_tier TEXT + V-B06 entry, or strip from TOML and mark D-189 §5 as Phase 3+ authoring stub.
2
wiki/corporations/*.md (all 112 new stubs)
blocker
All are 24-line frontmatter-only placeholders. Canonical stubs (Calloway/Thrds/VGV/Thalassa) carry 95–125 lines with three-layer content (public identity, actual operation, one concealed fact). 112 stubs saying "Details to be expanded" undercut the standard across the brand layer. Populate to three-layer minimum, or split the PR and ship stubs on a separate ticket with narrative completion as DoD.
3
wiki/economics/corporations/brands.toml (Calloway, VGV, Thrds, Bífröst + run of pre-Sato entries)
issue
4 pre-amendment canonical brands + subsequent pre-Sato run missing price_tier entirely. Will become V-B06 gap once field lands in schema. Fix now.
4
decisions/economics.md:340
issue
D-189 §5 amendment embedded as inline parenthetical (amended Sprint 36 … locked on sprint-36/copy branch) rather than standard **Amendment (YYYY-MM-DD):** block (see D-019/D-091/D-191). Branch-scoped language becomes factually wrong on merge. Reformat.
5
tooling/planet-gen/sol_name_fixes.py:47-48
issue
Both range_606 and range_570 assigned "Montes Riphaeus". range_606 absent in current markers.json so the duplicate didn't fire, but re-import will silently produce a Luna duplicate. Add dedup guard or remove the redundant entry.
Source JSON retains all 46 cities. Trim to 11 happens elsewhere in the pipeline and is invisible in source. DB confirmed to have 11 (London/Istanbul/Moscow/New York/São Paulo/Cairo/Tokyo/Delhi/Beijing/Singapore/Sydney), skewing Euro-heavy (3 EU) with only 1 African (Cairo) and 1 Latin American (São Paulo). Either trim source to 11 with selection rationale in a comment, or document the filter location. Consider rebalancing — Lagos / Mexico City / Buenos Aires as candidates for genuinely global-cultural weight.
Verified: all 24 named features on Groombridge capital are Lendel/Anglo-Germanic register (Aldren/Sethvale/Caldenmere/Durneth/Brantfell/Keslar/Pallach/Tember/Holt/Golvane/Cresswell/Kesset/Rethain/Lenden/Corsam/Selet). Zero cross-corridor influence from neighboring Kumasi/south_reach trade lanes — contradicts #849's explicit "corridors are tendencies, not borders" requirement. Add 1–2 cross-corridor names on secondary features.
"Aethelred" was removed from GJ71c river (now Gaius/Octavius/Septimus/…) but persists as POI "Aethelred's Gate" on GJ251c (Renaissance). Either intentional lore migration of the name to Renaissance (document in hand-refine-log) or accidental persistence (rename).
"186 bodies with empty mountain range names" is documented in refinement notes as SEVERE, but PR description doesn't surface it. Deferred to #853 is fine, but the merger should see it in the PR body.
Empty cross_refs: [] despite body text explicitly cross-referencing each other (Thrds→Calloway; Calloway/VGV→untraced holding structure). Populate cross_refs to match assertions in prose.
Not redundant but don't reference each other. Add a "see also: refine_log_849.md for cross-reference arc analysis" line to hand-refine-log.md §#849.
Retractions (reviewer comments verified as stale against branch)
Retracted
Reason
Aethelred river on GJ71c
GJ71c rivers are now Gaius/Octavius/Septimus/Quintus/Valeria/Marcus — all Latinate. (The Aethelred name survives as a POI on GJ251c, retained as a separate issue — see #8.)
Forum Veritas / Capitolium on GJ251c
GJ251c cities are now Tributarium, Ruhr. The hand-refine did touch it.
Aldren Pass on Ran (GJ144d)
GJ144d has no Aldren; names are Kallast/Rán-register. Aldren is contained to GJ380c (Groombridge) as intended.
Keel Ridge on GJ244Ad
Already renamed to "Charter Spur"; Westwall renamed to "The Statute" per the refinement notes.
Concordia ×3 / Basilica Nova ×18 cross-body
Non-city cross-body/cross-type collisions are explicitly deferred to #853 per the refinement notes — documented known issue, not a hidden bug.
Westwall on GJ664c
Same — cross-body mountain collision, explicitly in #853 scope per refinement notes.
2 blockers, 6 issues, 4 nits. Blockers are fundamentally about price_tier discipline and stub narrative depth; everything else is concrete pass-before-merge work.
Please address each (or push back with a concrete technical rationale per the review-disagreement protocol).
## Review: `sprint-36/copy` → main (type: copy)
**Pre-review checks:**
- ruff: clean on new tooling
- Brand validator (V-B01..V-B06): passes per PR
- Runtime smoke test: not mentioned in PR description — **process gap**
- Test plan items (4 checkboxes) all unchecked — aspirational, not evidence
---
### Hoshe (QA / data integrity): REQUEST_CHANGES
Brands structurally solid (D-189 coverage complete, FK integrity passes, 112 wiki stubs match corp_ids one-to-one, `make economy-db` demonstrably run). But `price_tier` — documented in D-189 §5 as a locked enum field — is **entirely absent from the DB schema, importer, and validator**. The field gets authored into TOML and silently discarded. Five smaller issues.
### Paula (narrative depth): REQUEST_CHANGES
Atlas hand-refine work is good: internal cross-reference arcs intentional, cardinal labels gone, Earth/Luna selections carry real weight. But the 112 new corp wiki stubs are all 24-line frontmatter-only placeholders ("X is a Y operating out of Z. Details to be expanded.") in a codebase whose canonical stubs (Calloway, Thrds, VGV, Thalassa) run 95–125 lines with origin histories, political relationships, and concealed facts. Either populate to the three-layer minimum or split the PR.
### Miri (worldbuilding): REQUEST_CHANGES *(with retractions — see below)*
Substantive setting-level concerns on Earth's selection logic and Groombridge's monocultural texture stand. Several other comments were based on stale reads and have been verified against the branch and retracted.
---
### Consolidated comments
| # | File | Sev | Issue |
|---|------|-----|-------|
| 1 | `wiki/economics/corporations/brands.toml` + `tooling/economy-db/import_economics.py:55-110, 795-801` | blocker | `price_tier` documented in D-189 §5 as locked enum (`mass/premium/luxury/flagship/institutional`), present in 240/248 TOML entries, **absent from schema, INSERT, and V-B06 enum_checks**. Silently discarded on import. Either add `price_tier TEXT` + V-B06 entry, or strip from TOML and mark D-189 §5 as Phase 3+ authoring stub. |
| 2 | `wiki/corporations/*.md` (all 112 new stubs) | blocker | All are 24-line frontmatter-only placeholders. Canonical stubs (Calloway/Thrds/VGV/Thalassa) carry 95–125 lines with three-layer content (public identity, actual operation, one concealed fact). 112 stubs saying "Details to be expanded" undercut the standard across the brand layer. Populate to three-layer minimum, or split the PR and ship stubs on a separate ticket with narrative completion as DoD. |
| 3 | `wiki/economics/corporations/brands.toml` (Calloway, VGV, Thrds, Bífröst + run of pre-Sato entries) | issue | 4 pre-amendment canonical brands + subsequent pre-Sato run missing `price_tier` entirely. Will become V-B06 gap once field lands in schema. Fix now. |
| 4 | `decisions/economics.md:340` | issue | D-189 §5 amendment embedded as inline parenthetical `(amended Sprint 36 … locked on sprint-36/copy branch)` rather than standard `**Amendment (YYYY-MM-DD):**` block (see D-019/D-091/D-191). Branch-scoped language becomes factually wrong on merge. Reformat. |
| 5 | `tooling/planet-gen/sol_name_fixes.py:47-48` | issue | Both `range_606` and `range_570` assigned `"Montes Riphaeus"`. `range_606` absent in current markers.json so the duplicate didn't fire, but re-import will silently produce a Luna duplicate. Add dedup guard or remove the redundant entry. |
| 6 | `tooling/planet-gen/sol_markers/earth_features.json` | issue | Source JSON retains all 46 cities. Trim to 11 happens elsewhere in the pipeline and is invisible in source. DB confirmed to have 11 (London/Istanbul/Moscow/New York/São Paulo/Cairo/Tokyo/Delhi/Beijing/Singapore/Sydney), skewing Euro-heavy (3 EU) with only 1 African (Cairo) and 1 Latin American (São Paulo). Either trim source to 11 with selection rationale in a comment, or document the filter location. Consider rebalancing — Lagos / Mexico City / Buenos Aires as candidates for genuinely global-cultural weight. |
| 7 | `wiki/star-systems/GJ-380/bodies/GJ380c/markers.json` | issue | Verified: all 24 named features on Groombridge capital are Lendel/Anglo-Germanic register (Aldren/Sethvale/Caldenmere/Durneth/Brantfell/Keslar/Pallach/Tember/Holt/Golvane/Cresswell/Kesset/Rethain/Lenden/Corsam/Selet). Zero cross-corridor influence from neighboring Kumasi/south_reach trade lanes — contradicts #849's explicit "corridors are tendencies, not borders" requirement. Add 1–2 cross-corridor names on secondary features. |
| 8 | `wiki/star-systems/GJ-251/bodies/GJ251c/markers.json` + `wiki/star-systems/GJ-71/bodies/GJ71c/markers.json` | issue | "Aethelred" was removed from GJ71c river (now Gaius/Octavius/Septimus/…) but persists as **POI "Aethelred's Gate" on GJ251c** (Renaissance). Either intentional lore migration of the name to Renaissance (document in hand-refine-log) or accidental persistence (rename). |
| 9 | PR description + `docs/design/atlas-generator-refinement-notes.md` | nit | "186 bodies with empty mountain range names" is documented in refinement notes as SEVERE, but PR description doesn't surface it. Deferred to #853 is fine, but the merger should see it in the PR body. |
| 10 | `tooling/planet-gen/sol_name_fixes.py`, `tooling/generate_corp_stubs.py` | nit | Missing argparse / `--help` / `--dry-run`. `apply_name_fixes.py` has `--dry-run`; these don't. A file-rewriting tool without a dry-run is a footgun. |
| 11 | PR description | nit | Says "249 brand_products entries"; file + DB both show 248. |
| 12 | `wiki/corporations/{calloway-distillery,thrds,vins-de-grand-vide,thalassa-resort-group}.md` | nit | Empty `cross_refs: []` despite body text explicitly cross-referencing each other (Thrds→Calloway; Calloway/VGV→untraced holding structure). Populate `cross_refs` to match assertions in prose. |
| 13 | `docs/atlas/hand-refine-log.md` + `tooling/planet-gen/refine_log_849.md` | nit | Not redundant but don't reference each other. Add a "see also: refine_log_849.md for cross-reference arc analysis" line to hand-refine-log.md §#849. |
---
### Retractions *(reviewer comments verified as stale against branch)*
| Retracted | Reason |
|-----------|--------|
| Aethelred river on GJ71c | GJ71c rivers are now Gaius/Octavius/Septimus/Quintus/Valeria/Marcus — all Latinate. (The Aethelred name survives as a POI on GJ251c, retained as a separate issue — see #8.) |
| Forum Veritas / Capitolium on GJ251c | GJ251c cities are now Tributarium, Ruhr. The hand-refine did touch it. |
| Aldren Pass on Ran (GJ144d) | GJ144d has no Aldren; names are Kallast/Rán-register. Aldren is contained to GJ380c (Groombridge) as intended. |
| Keel Ridge on GJ244Ad | Already renamed to "Charter Spur"; Westwall renamed to "The Statute" per the refinement notes. |
| Concordia ×3 / Basilica Nova ×18 cross-body | Non-city cross-body/cross-type collisions are explicitly deferred to #853 per the refinement notes — documented known issue, not a hidden bug. |
| Westwall on GJ664c | Same — cross-body mountain collision, explicitly in #853 scope per refinement notes. |
| `atlas-generator-refinement-notes.md` missing | File exists (255 lines), comprehensive; reviewer couldn't access branch files. |
---
### Verdict: CHANGES REQUESTED
2 blockers, 6 issues, 4 nits. Blockers are fundamentally about `price_tier` discipline and stub narrative depth; everything else is concrete pass-before-merge work.
Please address each (or push back with a concrete technical rationale per the review-disagreement protocol).
price_tier was documented in D-189 §5 and present in brands.toml but
silently discarded on import — absent from schema, INSERT, and V-B06.
- Add price_tier TEXT column to brand_products CREATE TABLE
- Add COLUMN_MIGRATIONS entry for ALTER TABLE on existing DBs
- Add VALID_PRICE_TIERS constant (mass/premium/luxury/flagship/institutional)
- Include price_tier in product_rows tuple and INSERT OR REPLACE
- Add price_tier to V-B06 enum checks; skip NULL (nullable column)
- Backfill 4 pre-amendment anchor brands (8 entries): Calloway flagship/premium,
VGV luxury/premium, thrds luxury/premium, Bífröst flagship/luxury
V-B01..V-B06 all pass.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Parallel addition to the rebalance addendum already in the GJ 0 Sol
section — Paula's header-style entry at the summary level complements
the in-context detail.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Round 1 recap: 2 blockers, 6 issues, 4 nits, 7 retractions. Team response: 4 commits, 9 items resolved, 1 blocker (112-stub narrative depth) split to ticket #861 under reviewer-accepted protocol.
Hoshe (QA): APPROVE
All 9 Hoshe-relevant items correctly resolved. price_tier present in schema / INSERT (16 columns, 16 placeholders) / V-B06 enum validation (mandatory on every make economy-db). Column migration is idempotent (_add_column catches duplicate-column errors). D-189 §5 amendment uses standard **Amendment (2026-04-19):** format, no branch-scoped language. Dedup guard on sol_name_fixes.py. argparse/--dry-run on both scripts. PR description updated (248 + deferred-issues section). Ticket #861 DoD matches split conditions.
Paula (narrative depth): APPROVE
All 4 Paula-relevant items resolved. Canonical stub cross_refs populated honestly (no stuffing, no omissions). Logs cross-reference each other. Aethelred lore migration is "the strongest narrative addition in this diff" — the inference chain from Threshold's all-Latin rivers to Renaissance's "Aethelred's Gate" POI is genuine systems-emergent lore. Brussels-for-London swap is defensible given the documented rationale; Paula notes the tradeoff (London carries cultural weight Brussels doesn't) but doesn't block since the swap is user-approved and the log is explicit about what is being traded. #861 DoD captures the split conditions with actionable specificity.
Miri (worldbuilding): REQUEST_CHANGES
Aethelred migration fully resolved — inference chain is exactly the environmental storytelling the setting should reward. Earth + Groombridge fixes partially resolved; three small items remain.
Brussels is on the Earth-names blocklist (line 60, verified) but now sits as a canonical Earth city. Policy collision: the blocklist blocks Earth major-city names from being used as alien-world feature names, but Earth itself is the intended exception. Next sol_import.py run may strip or flag Brussels as a violation unless GJ0d is explicitly exempt. Add a one-line comment in earth_blocklist.txt noting GJ0d (Earth body) is blocklist-exempt, or document the exemption at the sol_import.py callsite.
GJ380c has 29 named features; 2 Akan names (Nkwanta Beck, Bosomtwe Spur) = ~7%, both confined to minor feature types (a secondary river and a peripheral spur range). A financial hub with multi-generational Kumasi trade corridor contact would plausibly carry more than one river and one spur. Recommend adding one more Akan feature — a natural candidate is Selet Basin (mid-eastern lake at [220,336], currently Anglo-compound name) → Subin Basin (Subin = the river running through Kumasi itself). Brings Akan presence to 3/29 and distributes across three feature types (river, mountain, lake), converting the minimum-viable patch into a credible corridor read. Single rename + DB re-sync.
3
docs/atlas/hand-refine-log.md:119
nit
Line 119 shows river_1 "Gap Crossing" → "Aldren Pass" as the final state for GJ144d, but the DB has Randalfoss (verified: ['Rán's Run', 'Randalfoss', 'Scarp Fork', 'Timber Keld', 'Ranfall Beck', 'Cliff Leat']). The Aldren stem was subsequently removed to eliminate the cross-system dup with GJ380c Groombridge. Update the log entry: …→ "Aldren Pass" (subsequently renamed Randalfoss in a later fix pass to eliminate the cross-system Aldren stem collision with GJ380c).
Verdict: CHANGES REQUESTED
Very close — all 9 original items resolved cleanly, the split to #861 is clean, two reviewers approve. Only three small items remain, all on Miri's worldbuilding axis: one documentation-only (log stale), one one-line policy exemption comment, one single-feature rename. No new blockers. Expect round 3 to be short.
## Review: `sprint-36/copy` → main (round 2)
**Round 1 recap:** 2 blockers, 6 issues, 4 nits, 7 retractions.
**Team response:** 4 commits, 9 items resolved, 1 blocker (112-stub narrative depth) split to ticket #861 under reviewer-accepted protocol.
---
### Hoshe (QA): APPROVE
All 9 Hoshe-relevant items correctly resolved. `price_tier` present in schema / INSERT (16 columns, 16 placeholders) / V-B06 enum validation (mandatory on every `make economy-db`). Column migration is idempotent (`_add_column` catches duplicate-column errors). D-189 §5 amendment uses standard `**Amendment (2026-04-19):**` format, no branch-scoped language. Dedup guard on `sol_name_fixes.py`. argparse/`--dry-run` on both scripts. PR description updated (248 + deferred-issues section). Ticket #861 DoD matches split conditions.
### Paula (narrative depth): APPROVE
All 4 Paula-relevant items resolved. Canonical stub cross_refs populated honestly (no stuffing, no omissions). Logs cross-reference each other. Aethelred lore migration is "the strongest narrative addition in this diff" — the inference chain from Threshold's all-Latin rivers to Renaissance's "Aethelred's Gate" POI is genuine systems-emergent lore. Brussels-for-London swap is defensible given the documented rationale; Paula notes the tradeoff (London carries cultural weight Brussels doesn't) but doesn't block since the swap is user-approved and the log is explicit about what is being traded. #861 DoD captures the split conditions with actionable specificity.
### Miri (worldbuilding): REQUEST_CHANGES
Aethelred migration fully resolved — inference chain is exactly the environmental storytelling the setting should reward. Earth + Groombridge fixes partially resolved; three small items remain.
---
### Remaining comments
| # | File | Sev | Issue |
|---|------|-----|-------|
| 1 | `tooling/planet-gen/earth_blocklist.txt:60` + `tooling/planet-gen/sol_markers/earth_features.json` | issue | **Brussels is on the Earth-names blocklist (line 60, verified) but now sits as a canonical Earth city.** Policy collision: the blocklist blocks Earth major-city names from being used as alien-world feature names, but Earth itself is the intended exception. Next `sol_import.py` run may strip or flag Brussels as a violation unless GJ0d is explicitly exempt. Add a one-line comment in `earth_blocklist.txt` noting GJ0d (Earth body) is blocklist-exempt, or document the exemption at the sol_import.py callsite. |
| 2 | `wiki/star-systems/GJ-380/bodies/GJ380c/markers.json` | issue | GJ380c has 29 named features; 2 Akan names (Nkwanta Beck, Bosomtwe Spur) = ~7%, both confined to minor feature types (a secondary river and a peripheral spur range). A financial hub with multi-generational Kumasi trade corridor contact would plausibly carry more than one river and one spur. Recommend adding one more Akan feature — a natural candidate is `Selet Basin` (mid-eastern lake at [220,336], currently Anglo-compound name) → `Subin Basin` (Subin = the river running through Kumasi itself). Brings Akan presence to 3/29 and distributes across three feature types (river, mountain, lake), converting the minimum-viable patch into a credible corridor read. Single rename + DB re-sync. |
| 3 | `docs/atlas/hand-refine-log.md:119` | nit | Line 119 shows `river_1 "Gap Crossing" → "Aldren Pass"` as the final state for GJ144d, but the DB has `Randalfoss` (verified: `['Rán's Run', 'Randalfoss', 'Scarp Fork', 'Timber Keld', 'Ranfall Beck', 'Cliff Leat']`). The Aldren stem was subsequently removed to eliminate the cross-system dup with GJ380c Groombridge. Update the log entry: `…→ "Aldren Pass" (subsequently renamed Randalfoss in a later fix pass to eliminate the cross-system Aldren stem collision with GJ380c)`. |
---
### Verdict: CHANGES REQUESTED
Very close — all 9 original items resolved cleanly, the split to #861 is clean, two reviewers approve. Only three small items remain, all on Miri's worldbuilding axis: one documentation-only (log stale), one one-line policy exemption comment, one single-feature rename. No new blockers. Expect round 3 to be short.
- tooling/planet-gen/earth_blocklist.txt: document GJ0d (Earth body) as
blocklist-exempt so Brussels (and other Earth-canonical city names) are
not flagged on next sol_import.py run (R2 issue 1)
- wiki/star-systems/GJ-380/bodies/GJ380c/markers.json: rename Selet Basin
→ Subin Basin (Kumasi river namesake). Brings Akan register on GJ380c
to 3/29 features distributed across river, mountain, lake — credible
multi-generational trade corridor read instead of minimum-viable patch
(R2 issue 2)
- server/data/systems.db: atlas_oceans resynced for GJ380c
- docs/atlas/hand-refine-log.md:119: corrected stale log entry — Aldren
Pass was subsequently renamed Randalfoss to eliminate the cross-system
Aldren stem collision with GJ380c (R2 nit 3)
- tooling/planet-gen/refine_log_849.md: Groombridge cross-corridor
addendum updated to reflect 3/29 Akan register distribution
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Scope of round 3: 1 commit (6d9bb6ea), 5 lines changed across 4 files + 1 binary DB resync, closing the 3 remaining Miri items from round 2.
Miri (worldbuilding): APPROVE
R2 issue 1 — Brussels / earth_blocklist collision: RESOLVED. One-line exemption comment at earth_blocklist.txt:60 correctly scopes the blocklist to alien worlds only.
R2 issue 2 — GJ380c Akan ratio: RESOLVED. Selet Basin → Subin Basin brings Akan register to 3/29 features across three feature types (river: Nkwanta Beck, mountain: Bosomtwe Spur, lake: Subin Basin). Geographic placement is honest — features dispersed east-center and west rather than co-located, consistent with multi-directional corridor influence. Reads as credible Kumasi trade-lane presence, not token patch.
R2 nit 3 — hand-refine-log.md:119 stale entry: RESOLVED. Line 119 now documents the full supersession chain: Gap Crossing → Aldren Pass (subsequently renamed Randalfoss to eliminate cross-system Aldren stem collision with GJ380c).
Hoshe (round 2: APPROVE, no new items) + Paula (round 2: APPROVE, no new items)
No remaining items from rounds 1–2. Round-3 commit surface is minimal (5 text lines + DB resync). Ruff clean. No regression vectors introduced.
Overall verdict: APPROVED
Recommend merge. Known-deferred items (186 empty mountain range names, non-city cross-body collisions, 112 stub narrative depth via #861) remain tracked as documented out-of-scope items per reviewer-accepted protocol.
## Review: `sprint-36/copy` → main (round 3, final)
**Scope of round 3:** 1 commit (`6d9bb6ea`), 5 lines changed across 4 files + 1 binary DB resync, closing the 3 remaining Miri items from round 2.
---
### Miri (worldbuilding): APPROVE
- **R2 issue 1 — Brussels / earth_blocklist collision:** RESOLVED. One-line exemption comment at `earth_blocklist.txt:60` correctly scopes the blocklist to alien worlds only.
- **R2 issue 2 — GJ380c Akan ratio:** RESOLVED. `Selet Basin → Subin Basin` brings Akan register to 3/29 features across three feature types (river: Nkwanta Beck, mountain: Bosomtwe Spur, lake: Subin Basin). Geographic placement is honest — features dispersed east-center and west rather than co-located, consistent with multi-directional corridor influence. Reads as credible Kumasi trade-lane presence, not token patch.
- **R2 nit 3 — hand-refine-log.md:119 stale entry:** RESOLVED. Line 119 now documents the full supersession chain: `Gap Crossing → Aldren Pass (subsequently renamed Randalfoss to eliminate cross-system Aldren stem collision with GJ380c)`.
### Hoshe (round 2: APPROVE, no new items) + Paula (round 2: APPROVE, no new items)
No remaining items from rounds 1–2. Round-3 commit surface is minimal (5 text lines + DB resync). Ruff clean. No regression vectors introduced.
---
### Overall verdict: APPROVED
Recommend merge. Known-deferred items (186 empty mountain range names, non-city cross-body collisions, 112 stub narrative depth via #861) remain tracked as documented out-of-scope items per reviewer-accepted protocol.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Sprint 36 copy team — closes Phase 3 atlas (refinement + brand layer), establishes Phase 4 foundations via the shared infrastructure.
atlas_cohesion_audit.py+sol_name_fixes.pytooling added.wiki/economics/corporations/brands.tomlacross all 8 D-189 categories (terroir / heritage_craft / tech_premium / cultural / service_premium / commodity_branded / design_heritage / platform_catalogue). 248 brand_products entries total. 112 new wiki corp stub pages (minimal frontmatter — full three-layer authoring tracked separately in #861). Brand layer validation V-B01..V-B06 passes. D-189 §5 amended with lockedprice_tierenum:mass/premium/luxury/flagship/institutional.Also in this PR:
/sprint-startskill lifecycle update (team stays alive through review AND merge, not just approval).Audit metrics (#849)
Known deferred issues (tracked, not blocking merge)
Follow-up tickets filed
Files
333 files changed, +14,055 / -718. Full systematic-issue notes in
docs/design/atlas-generator-refinement-notes.mdand per-body log intooling/planet-gen/refine_log_849.md.Test plan
make economy-dbbuilds brand_products table fromwiki/economics/corporations/brands.toml(coverage gate still fails on #860 items — pre-existing, not introduced here)python3 tooling/planet-gen/generate_atlas.py --body <id>round-trips markers.json ↔ atlas_* tables cleanly🤖 Generated with Claude Code
Continues the core-world cohesion pass. All markers.json edits synced to atlas_* tables. apply_name_fixes.py extended with all new fix tables. GJ244Ad Edict (400M pop): 5 fixes — 2 lazy mountain names replaced with Edict-vocabulary terms ("The Statute", "Charter Spur"); 3 cardinal oceans replaced with cross-referential names (Veil Shelf → Veil Institute POI, Concord Mere → Concord Assembly Archive POI, Charter Tarn → Charter Spur mountain). Note: "Westwall" flagged by Gestalt not found in markers.json or DB; stale data issue. Arcs established: Charter-, Concord-, Veil-. GJ380c Lendel (900M pop): 2 fixes — "Pale Run" river renamed "Durneth Beck" (cross-refs Durneth Range; "beck" = British stream); "Tember Ridge" renamed "Tember Spine" (keeps stem, removes lazy Ridge suffix). Aldren- stem arc (capital + river + exchange) is intentional — preserved. GJ699b Verada (1.9B pop): 8 fixes — all 3 rivers renamed from civic-grid names to geographic names (Verada Reach, The Meridian, Capitol Beck); 5 oceans renamed to replace architectural/district suffixes with geographic ones (Prospect Sea, Haven Sea, Meridian Sound, Capitol Mere, Sterling Pool). Arcs: Capitol- (city + river + ocean), Meridian- (river + ocean), Haven/Port- (city + ocean). GJ699b-1 Verada moon: 8 fixes — all 8 mountains renamed from street addresses (Grandview Avenue, Harmony Boulevard, Beacon Street, etc.) to geological/institutional cross-references. The moon's peaks now carry the names of Verada's civic institutions as seen from orbit: Tribunal Spur, Zenith Spine, Keystone Scarp, Ironwood Spur, Consulate Scarp, Prefecture Spur, Barnard Heights, Verada Scarp (largest range). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>Review:
sprint-36/copy→ main (type: copy)Pre-review checks:
Hoshe (QA / data integrity): REQUEST_CHANGES
Brands structurally solid (D-189 coverage complete, FK integrity passes, 112 wiki stubs match corp_ids one-to-one,
make economy-dbdemonstrably run). Butprice_tier— documented in D-189 §5 as a locked enum field — is entirely absent from the DB schema, importer, and validator. The field gets authored into TOML and silently discarded. Five smaller issues.Paula (narrative depth): REQUEST_CHANGES
Atlas hand-refine work is good: internal cross-reference arcs intentional, cardinal labels gone, Earth/Luna selections carry real weight. But the 112 new corp wiki stubs are all 24-line frontmatter-only placeholders ("X is a Y operating out of Z. Details to be expanded.") in a codebase whose canonical stubs (Calloway, Thrds, VGV, Thalassa) run 95–125 lines with origin histories, political relationships, and concealed facts. Either populate to the three-layer minimum or split the PR.
Miri (worldbuilding): REQUEST_CHANGES (with retractions — see below)
Substantive setting-level concerns on Earth's selection logic and Groombridge's monocultural texture stand. Several other comments were based on stale reads and have been verified against the branch and retracted.
Consolidated comments
wiki/economics/corporations/brands.toml+tooling/economy-db/import_economics.py:55-110, 795-801price_tierdocumented in D-189 §5 as locked enum (mass/premium/luxury/flagship/institutional), present in 240/248 TOML entries, absent from schema, INSERT, and V-B06 enum_checks. Silently discarded on import. Either addprice_tier TEXT+ V-B06 entry, or strip from TOML and mark D-189 §5 as Phase 3+ authoring stub.wiki/corporations/*.md(all 112 new stubs)wiki/economics/corporations/brands.toml(Calloway, VGV, Thrds, Bífröst + run of pre-Sato entries)price_tierentirely. Will become V-B06 gap once field lands in schema. Fix now.decisions/economics.md:340(amended Sprint 36 … locked on sprint-36/copy branch)rather than standard**Amendment (YYYY-MM-DD):**block (see D-019/D-091/D-191). Branch-scoped language becomes factually wrong on merge. Reformat.tooling/planet-gen/sol_name_fixes.py:47-48range_606andrange_570assigned"Montes Riphaeus".range_606absent in current markers.json so the duplicate didn't fire, but re-import will silently produce a Luna duplicate. Add dedup guard or remove the redundant entry.tooling/planet-gen/sol_markers/earth_features.jsonwiki/star-systems/GJ-380/bodies/GJ380c/markers.jsonwiki/star-systems/GJ-251/bodies/GJ251c/markers.json+wiki/star-systems/GJ-71/bodies/GJ71c/markers.jsondocs/design/atlas-generator-refinement-notes.mdtooling/planet-gen/sol_name_fixes.py,tooling/generate_corp_stubs.py--help/--dry-run.apply_name_fixes.pyhas--dry-run; these don't. A file-rewriting tool without a dry-run is a footgun.wiki/corporations/{calloway-distillery,thrds,vins-de-grand-vide,thalassa-resort-group}.mdcross_refs: []despite body text explicitly cross-referencing each other (Thrds→Calloway; Calloway/VGV→untraced holding structure). Populatecross_refsto match assertions in prose.docs/atlas/hand-refine-log.md+tooling/planet-gen/refine_log_849.mdRetractions (reviewer comments verified as stale against branch)
atlas-generator-refinement-notes.mdmissingVerdict: CHANGES REQUESTED
2 blockers, 6 issues, 4 nits. Blockers are fundamentally about
price_tierdiscipline and stub narrative depth; everything else is concrete pass-before-merge work.Please address each (or push back with a concrete technical rationale per the review-disagreement protocol).
Review:
sprint-36/copy→ main (round 2)Round 1 recap: 2 blockers, 6 issues, 4 nits, 7 retractions.
Team response: 4 commits, 9 items resolved, 1 blocker (112-stub narrative depth) split to ticket #861 under reviewer-accepted protocol.
Hoshe (QA): APPROVE
All 9 Hoshe-relevant items correctly resolved.
price_tierpresent in schema / INSERT (16 columns, 16 placeholders) / V-B06 enum validation (mandatory on everymake economy-db). Column migration is idempotent (_add_columncatches duplicate-column errors). D-189 §5 amendment uses standard**Amendment (2026-04-19):**format, no branch-scoped language. Dedup guard onsol_name_fixes.py. argparse/--dry-runon both scripts. PR description updated (248 + deferred-issues section). Ticket #861 DoD matches split conditions.Paula (narrative depth): APPROVE
All 4 Paula-relevant items resolved. Canonical stub cross_refs populated honestly (no stuffing, no omissions). Logs cross-reference each other. Aethelred lore migration is "the strongest narrative addition in this diff" — the inference chain from Threshold's all-Latin rivers to Renaissance's "Aethelred's Gate" POI is genuine systems-emergent lore. Brussels-for-London swap is defensible given the documented rationale; Paula notes the tradeoff (London carries cultural weight Brussels doesn't) but doesn't block since the swap is user-approved and the log is explicit about what is being traded. #861 DoD captures the split conditions with actionable specificity.
Miri (worldbuilding): REQUEST_CHANGES
Aethelred migration fully resolved — inference chain is exactly the environmental storytelling the setting should reward. Earth + Groombridge fixes partially resolved; three small items remain.
Remaining comments
tooling/planet-gen/earth_blocklist.txt:60+tooling/planet-gen/sol_markers/earth_features.jsonsol_import.pyrun may strip or flag Brussels as a violation unless GJ0d is explicitly exempt. Add a one-line comment inearth_blocklist.txtnoting GJ0d (Earth body) is blocklist-exempt, or document the exemption at the sol_import.py callsite.wiki/star-systems/GJ-380/bodies/GJ380c/markers.jsonSelet Basin(mid-eastern lake at [220,336], currently Anglo-compound name) →Subin Basin(Subin = the river running through Kumasi itself). Brings Akan presence to 3/29 and distributes across three feature types (river, mountain, lake), converting the minimum-viable patch into a credible corridor read. Single rename + DB re-sync.docs/atlas/hand-refine-log.md:119river_1 "Gap Crossing" → "Aldren Pass"as the final state for GJ144d, but the DB hasRandalfoss(verified:['Rán's Run', 'Randalfoss', 'Scarp Fork', 'Timber Keld', 'Ranfall Beck', 'Cliff Leat']). The Aldren stem was subsequently removed to eliminate the cross-system dup with GJ380c Groombridge. Update the log entry:…→ "Aldren Pass" (subsequently renamed Randalfoss in a later fix pass to eliminate the cross-system Aldren stem collision with GJ380c).Verdict: CHANGES REQUESTED
Very close — all 9 original items resolved cleanly, the split to #861 is clean, two reviewers approve. Only three small items remain, all on Miri's worldbuilding axis: one documentation-only (log stale), one one-line policy exemption comment, one single-feature rename. No new blockers. Expect round 3 to be short.
Review:
sprint-36/copy→ main (round 3, final)Scope of round 3: 1 commit (
6d9bb6ea), 5 lines changed across 4 files + 1 binary DB resync, closing the 3 remaining Miri items from round 2.Miri (worldbuilding): APPROVE
earth_blocklist.txt:60correctly scopes the blocklist to alien worlds only.Selet Basin → Subin Basinbrings Akan register to 3/29 features across three feature types (river: Nkwanta Beck, mountain: Bosomtwe Spur, lake: Subin Basin). Geographic placement is honest — features dispersed east-center and west rather than co-located, consistent with multi-directional corridor influence. Reads as credible Kumasi trade-lane presence, not token patch.Gap Crossing → Aldren Pass (subsequently renamed Randalfoss to eliminate cross-system Aldren stem collision with GJ380c).Hoshe (round 2: APPROVE, no new items) + Paula (round 2: APPROVE, no new items)
No remaining items from rounds 1–2. Round-3 commit surface is minimal (5 text lines + DB resync). Ruff clean. No regression vectors introduced.
Overall verdict: APPROVED
Recommend merge. Known-deferred items (186 empty mountain range names, non-city cross-body collisions, 112 stub narrative depth via #861) remain tracked as documented out-of-scope items per reviewer-accepted protocol.
Pull request closed