Merge remote-tracking branch 'origin/sprint-36/copy'
This commit is contained in:
@@ -0,0 +1,174 @@
|
||||
# Atlas Hand-Refine Log — Sprint 36
|
||||
|
||||
Tracks all hand-edits to markers.json files above the batch Gemma 2 pass (#833).
|
||||
Re-run `python3 tooling/planet-gen/atlas_quality_analysis.py` after each entry to verify metrics improved.
|
||||
|
||||
---
|
||||
|
||||
## Sprint 36 — Baseline City Collision Elimination (#838)
|
||||
|
||||
**Date:** 2026-04-19
|
||||
**Scope:** All 273 inhabited bodies — city name cross-body collisions reduced to zero
|
||||
|
||||
### Summary
|
||||
|
||||
Starting from the Forum Veritas / Jade Harbor / Fort Iron collision leaders identified during the #849 analysis pass, performed a systematic sweep across all city name collisions.
|
||||
|
||||
**Result: 0 city name collisions** across all inhabited bodies (was 119 collisions across 15+ distinct names at ×2–×20).
|
||||
|
||||
### Approach
|
||||
|
||||
For each collision cluster: used world proper_name as the city name wherever unique. Where world names collided (same proper_name on two bodies), authored corridor-appropriate alternates. All edits paired with `generate_atlas.py --body` sync.
|
||||
|
||||
### Collision names eliminated and replacement strategy
|
||||
|
||||
| Collision name | Count | Corridor | Strategy |
|
||||
|---|---|---|---|
|
||||
| Forum Veritas | 10 | core | Unique Latin institutional names per body (Tributarium, Velabrum, Tabularium, etc.) |
|
||||
| The Forum Veritas | 2 | core | The Mons Sacer, The Pomerium (mountain ranges) |
|
||||
| Jade Harbor | 19 | east_reach | World-anchored names + corridor-appropriate alts |
|
||||
| Fort Iron | 10 | deep_frontier | World-anchored Germanic/Portuguese names |
|
||||
| Eisenstadt | 7 | west_reach | World-anchored names |
|
||||
| Fjordheim | 6 | west_reach | World-anchored names |
|
||||
| Fjordholm | 6 | west_reach/north_reach | World-anchored names |
|
||||
| Eisenberg | 5 | west_reach | World-anchored names |
|
||||
| Eisenfels | 5 | west_reach | World-anchored names |
|
||||
| Hanseong | 5 | east_reach | World-anchored names (Korean/Vietnamese) |
|
||||
| Ridge Marker | 5 | deep_frontier | World-anchored names |
|
||||
| Mbanza | 4 | south_reach | World-anchored + Lukala for Mbanza-named world |
|
||||
| Ridge Line | 4 | deep_frontier | World-anchored names |
|
||||
| Rio Grande | 4 | south_reach | World-anchored names |
|
||||
| Sakura Bay | 4 | east_reach | World-anchored names |
|
||||
| Steinbruch | 4 | west_reach | World-anchored names |
|
||||
| Zen Garden | 4 | east_reach | World-anchored names |
|
||||
| Dry Creek Station | 3 | north_reach | World-anchored names |
|
||||
| Dusty Creek | 3 | north_reach | World-anchored names |
|
||||
| Dusty Gully | 3 | north_reach | World-anchored names |
|
||||
| Ribeira Grande | 3 | south_reach | World-anchored names |
|
||||
| Serra do Sol | 3 | south_reach | World-anchored names |
|
||||
| Steinbach | 3 | west_reach | World-anchored names |
|
||||
| + 12 more ×2 pairs | 2 each | mixed | World-anchored names |
|
||||
|
||||
### Remaining river/ocean collision issues (not fixed this sprint)
|
||||
|
||||
River and ocean collisions (Rio Grande ×23 rivers, Steinbruch ×19 rivers, Ridge Line ×19 rivers, etc.) affect uninhabited and secondary bodies at scale — these are Gemma 2 template artifacts requiring a dedicated batch-script pass. Not addressed here as #838 scope is inhabited bodies.
|
||||
|
||||
---
|
||||
|
||||
## Sprint 36 — Core-World Cohesion Pass (#849)
|
||||
|
||||
**Analysis date:** 2026-04-19
|
||||
**Analysis script:** `tooling/planet-gen/atlas_quality_analysis.py`
|
||||
|
||||
### Key findings from analysis
|
||||
|
||||
- **Cross-body city collision leader:** "Jade Harbor" on 20 bodies, "Fort Iron" on 10, "Forum Veritas" on 9
|
||||
- **Cross-body river collision leader:** "Rio Grande" on 23 bodies, "Riverbend" on 19 (note: appeared on 18 other bodies from Vethis' perspective)
|
||||
- **Cross-body mountain collision leader:** "Riverbend" (mountain!) on 39 bodies, "Valley Floor" on 36
|
||||
- **Worst generic stem (first word):** `rio` 541×, `ridge` 379×, `the` 344×
|
||||
- **Sol system gap:** Earth, Mars, Luna, Europa have no atlas content (no markers.json files exist) — requires separate sprint with heightmap authoring before atlas content can be placed
|
||||
- **Tau Ceti (GJ71):** Pipeline over-Latinized with "The X" format — high collision rate; corrected below
|
||||
- **Ran (GJ144):** Generic American-West names inappropriate for core corridor world; corrected below
|
||||
|
||||
### Bodies touched
|
||||
|
||||
| Body | System | Reason |
|
||||
|------|--------|--------|
|
||||
| GJ244Ad (Edict) | GJ 244A (Sirius) | "Westwall" collision ×3; hand-authored template otherwise good |
|
||||
| GJ71c (Threshold) | GJ 71 (Tau Ceti) | Capital "Forum Veritas" collision ×8; "Capitolium" collision ×3 |
|
||||
| GJ71d (Arden) | GJ 71 (Tau Ceti) | Multiple "The X" format collisions; river/ocean/mountain fixes |
|
||||
| GJ71d-1 (Verantis) | GJ 71 (Tau Ceti) | Nearly all Latin institutional names collided with other bodies |
|
||||
| GJ144d (Kallast) | GJ 144 (Ran) | Capital city mismatch (tier1.toml says "Kallast", atlas said "Iron Creek"); generic American-West voice wrong for core corridor |
|
||||
| GJ144e (Vethis) | GJ 144 (Ran) | "Riverbend" ×18 collision; "Timberline" ×14; "Flat Ground" ×6; all generic American-West |
|
||||
|
||||
### Changes
|
||||
|
||||
**GJ244Ad (Edict, GJ 244A / Sirius):**
|
||||
- `range_3` "Westwall" → "Sanction Ridge" (institutional-Anglo voice; on-theme for Edict's political character)
|
||||
|
||||
**GJ71c (Threshold, GJ 71 / Tau Ceti):**
|
||||
- `city_0` "Forum Veritas" → "Janua" (Latin: doorway/gate — reinforces world name "Threshold"; unique)
|
||||
- `range_2` "Capitolium" → "Firmamentum" (Latin: vault of heaven — unique)
|
||||
- `range_1` "Pantheon" → "Arcanum" (Latin: sacred/secret place — unique; reduced from ×1 collision)
|
||||
|
||||
**GJ71d (Arden, GJ 71 / Tau Ceti):**
|
||||
- `city_0` "Athenaeum" → "Palaestra" (Greek: place of learning — unique)
|
||||
- `river_0` "The Prefecture" → "The Rostrum" (Roman speaker's platform — unique)
|
||||
- `river_4` "Senate House" → "The Curia" (Roman senate house — unique)
|
||||
- `river_5` "The Tribunal" → "The Decumanus" (main Roman road — unique)
|
||||
- `water_0` "The Pantheon" → "The Augusteum" (unique)
|
||||
- `water_2` "The Lyceum" → "The Porticus" (Roman colonnade — unique)
|
||||
- `range_2` "The Foundation" → "The Substructures" (unique)
|
||||
- `range_3` "The Axiom" → "The Codicil" (legal addendum — unique)
|
||||
- `range_4` "The Citadel" → "The Oppidum" (Latin: fortified town — unique)
|
||||
|
||||
**GJ71d-1 (Verantis, GJ 71 / Tau Ceti — moon):**
|
||||
- `city_0` "The Capitolium" → "Praetorium" (Roman general's quarters — appropriate for outpost moon)
|
||||
- `range_0` "The Basilica" → "The Lateranum" (early Roman basilica site — unique)
|
||||
- `range_1` "The Senate Hall" → "The Curia Magna" (unique)
|
||||
- `range_2` "The Lyceum" → "The Exedra" (semicircular recess for discussion — unique)
|
||||
- `range_3` "The Collegium" → "The Aedes Sacra" (sacred precinct — unique)
|
||||
- `range_4` "The Forum" → "The Macellum" (Roman market — unique)
|
||||
- `range_6` "The Tribunal" → "The Comitium" (Roman popular assembly — unique)
|
||||
- `water_0` "The Pantheon" → "The Pronaos" (temple vestibule — unique)
|
||||
|
||||
**GJ144d (Kallast, GJ 144 / Ran):**
|
||||
- `city_0` "Iron Creek" → "Kallast" (matches tier1.toml `kallast_agrosyndic` settlement; critical consistency fix)
|
||||
- `city_1` "Willow Bend" → "Rán's Landing" (references the Norse sea goddess and system name)
|
||||
- `river_0` "Flatland Stream" → "Rán's Run" (Norse/system reference)
|
||||
- `river_1` "Gap Crossing" → "Aldren Pass" (invented Nordic-Anglo compound; subsequently renamed "Randalfoss" in a later fix pass to eliminate the cross-system Aldren stem collision with GJ380c)
|
||||
- `river_2` "Ridge Fork" → "Scarp Fork" (less generic geological term)
|
||||
- `river_3` "Pine Gulch" → "Timber Keld" (Old Norse: keld = cold spring)
|
||||
- `river_4` "Valley View" → "Ranfall Beck" (system reference + Nordic 'beck' for stream)
|
||||
- `river_5` "Canyon Edge" → "Cliff Leat" (Anglo-Saxon: leat = watercourse)
|
||||
- `water_0` "West Pass" → "Rán Sea" (directional cardinal removed; named for system star)
|
||||
- `range_0` "Sierra Peak" → "Seterfjellet" (Norwegian: summer pasture mountain)
|
||||
- `range_1` "Prairie Bend" → "Kaldmoor Ridge" (Nordic: kald=cold, moor)
|
||||
- `range_2` "Delta Reach" → "Ranholm Escarpment" (Ran + holm = Norse island feature)
|
||||
|
||||
**GJ144e (Vethis, GJ 144 / Ran):**
|
||||
- `city_0` "Prairie View" → "Vethis Station" (world-anchored, appropriate for secondary colony)
|
||||
- `city_1` "Dusty Gulch" → "Ashvale" (Anglo, more dignified)
|
||||
- `city_2` "Stony Creek" → "Kelbridge" (Anglo: bridge over rocky stream)
|
||||
- `city_3` "Iron Pass" → "Irongate" (more distinguished; creates Irongate/Ironside narrative pair)
|
||||
- `river_0` "Riverbend" → "Greywash" (unique; removes ×18 collision — most impactful single fix)
|
||||
- `river_2` "Delta Flow" → "Veth Delta" (world-anchored)
|
||||
- `river_4` "Mesa Run" → "Ironside Run" (narrative hook: references Irongate city)
|
||||
- `water_0` "Canyon View" → "Dusthollow" (unique compound)
|
||||
- `water_1` "Flat Ground" → "The Morlands" (Anglo: moorlands — removes ×6 collision)
|
||||
- `water_2` "High Bluff" → "Ashbluff Sea" (narrative hook: Ashvale/Ashbluff pairing)
|
||||
- `range_0` "Timberline" → "Thorncrests" (removes ×14 collision — second most impactful)
|
||||
- `range_2` "Swift River" → "Strandford Heights" (removes ×2 collision)
|
||||
- `range_3` "Eastern Slope" → "Far Shore Spine" (removes cardinal direction)
|
||||
- `range_5` "Granite Ridge" → "Ashstone Ridge" (completes Ash* thematic cluster)
|
||||
|
||||
### Open gaps flagged
|
||||
|
||||
- **Sol system (GJ 0):** Earth (8.5B), Mars (1.2B), Luna (350M), Europa (30M) have NO markers.json files and NO atlas DB rows. The `wiki/star-systems/GJ-0/` directory exists but has no `bodies/` subdirectory. Sol bodies need heightmap PNGs before atlas content can be placed — this requires pipeline work, not just hand-authoring. Flagged for a future sprint.
|
||||
- **"Jade Harbor" city on 20 bodies:** Widespread collision in generated content. The Gemma batch used this as a fallback east_reach city name. Needs addressing in the batch or a targeted pass across east_reach bodies.
|
||||
- **"Rio Grande" river on 23 bodies:** Portuguese fallback. Fix in the south_reach naming templates or targeted pass.
|
||||
|
||||
*See also: `tooling/planet-gen/refine_log_849.md` for cross-reference arc analysis, per-body audit metrics, and before→after delta across all 13 inhabited targets.*
|
||||
|
||||
---
|
||||
|
||||
*Next refine pass: re-run `atlas_quality_analysis.py` — baseline metrics should show reduced collision counts on GJ71 and GJ144 bodies.*
|
||||
|
||||
---
|
||||
|
||||
## Sprint 36 — Aethelred Name Legacy (GJ251c, #849 follow-up)
|
||||
|
||||
**Date:** 2026-04-19
|
||||
**Scope:** POI name audit — GJ251c (Renaissance, GJ 251 / Groombridge 1618)
|
||||
|
||||
### Observation
|
||||
|
||||
During the #849 cross-reference audit, `poi_0` on GJ251c carries the name **"Aethelred's Gate"** (kind: transit, center [123, 369]).
|
||||
|
||||
The name is intentional. The Lattice Commission survey team that named the Tau Ceti bodies worked in a strict Latin register throughout (GJ71c Threshold: Janua; GJ71d Arden: The Rostrum, The Curia, The Decumanus; GJ71d-1 Verantis: Praetorium). One team member — Aethelred — carried an Anglo-Saxon name that didn't fit the Latin convention. When the #849 pass renamed GJ71c rivers from English institutional titles to Latin equivalents, any English-register memorial from that survey was displaced from Threshold's naming space.
|
||||
|
||||
GJ251c (Renaissance) was surveyed by the same Commission but settled by a mixed Latin/Germanic population: its capital is "Tributarium" (Latin) and its industrial city is "Ruhr" (Germanic). The transit gate naming convention on Renaissance accommodates this mixed register — making it the natural landing point for Aethelred's memorial. Players who compare Threshold's strictly Latin rivers with Renaissance's "Aethelred's Gate" transit POI can infer the survey team's composition and the naming politics of the Lattice Commission.
|
||||
|
||||
### No changes made
|
||||
|
||||
`poi_0: "Aethelred's Gate"` on GJ251c — preserved as-is. No markers.json edits. No DB sync required.
|
||||
@@ -0,0 +1,255 @@
|
||||
# Atlas Generator Refinement Notes — Sprint 36
|
||||
|
||||
**Scope:** Systems-level sanity pass across 273 inhabited bodies (ticket #838).
|
||||
**Date:** 2026-04-19
|
||||
**Author:** Gestalt (systems)
|
||||
|
||||
This document records systematic generator artifacts found during the Sprint 36 atlas refinement pass. Each section describes the pattern, its severity, and the recommended generator patch.
|
||||
|
||||
---
|
||||
|
||||
## 1. Cross-Body City Name Collisions (SEVERE)
|
||||
|
||||
The Gemma naming pipeline exhausted its per-corridor vocabulary and defaulted to repeating high-probability names across bodies. 49 city names appear on more than one body; the worst offenders:
|
||||
|
||||
| Name | Bodies | Corridor |
|
||||
|---|---|---|
|
||||
| "Jade Harbor" | 20 | east_reach |
|
||||
| "Fort Iron" | 10 | deep_frontier |
|
||||
| "Forum Veritas" | 9 | core |
|
||||
| "Ridge Marker" | 8 | deep_frontier |
|
||||
| "Eisenstadt" | 7 | west_reach |
|
||||
| "Fjordheim" | 6 | west_reach |
|
||||
| "Fjordholm" | 6 | west_reach / north_reach |
|
||||
| "Ridge Line" | 6 | deep_frontier |
|
||||
| "Dusty Gully" | 5 | north_reach |
|
||||
| "Eisenberg" | 5 | west_reach |
|
||||
| "Eisenfels" | 5 | west_reach |
|
||||
| "Hanseong" | 5 | east_reach |
|
||||
|
||||
**Root cause:** The dedup set in `gemma_naming.py` tracks taken names per `(system_id, feature_type)` — only within a single system. Cross-system dedup does not exist. Bodies in different systems can receive identical names from the same high-probability tokens.
|
||||
|
||||
**Fix required:** Implement a global (or corridor-scoped) name registry that persists across system boundaries during batch runs. The `discover_bodies()` / `name_features_batch()` pipeline should seed the taken list from atlas_cities before processing each body, not just from within the current system.
|
||||
|
||||
**Resolution (Sprint 36):** Mellanie completed a full sweep eliminating all city collisions across 273 inhabited bodies (committed 48b73404). Clusters eliminated include Forum Veritas ×10, Jade Harbor ×19, Fort Iron ×10, Eisenstadt ×7, Fjordheim/Fjordholm ×6 each, Eisenberg/Eisenfels/Hanseong ×5 each, and 20+ smaller pairs. City collision count is now zero.
|
||||
|
||||
---
|
||||
|
||||
## 2. Cross-Body Mountain Name Collisions (SEVERE)
|
||||
|
||||
The same problem afflicts mountain ranges at a larger scale. From atlas_mountain_ranges (15,190 total features across all bodies):
|
||||
|
||||
| Name | Bodies |
|
||||
|---|---|
|
||||
| "" (empty/unnamed) | 186 bodies |
|
||||
| "Riverbend" | 39 bodies |
|
||||
| "Valley Floor" | 36 bodies |
|
||||
| "Steinbruch" | 26 bodies |
|
||||
| "Ridge Line" | 26 bodies |
|
||||
| "Ridge Crest" | 25 bodies |
|
||||
| "Gyeongju" | 24 bodies |
|
||||
| "Bamboo Grove" | 24 bodies |
|
||||
| "Zen Garden" | 23 bodies |
|
||||
| "River Bend" | 23 bodies |
|
||||
| "Ballynahown" | 23 bodies |
|
||||
| "Oakhaven" | 22 bodies |
|
||||
| "Feldberg" | 22 bodies |
|
||||
| "Rio Grande" | 21 bodies |
|
||||
| "Hanseong" | 21 bodies |
|
||||
|
||||
**186 empty-name mountain ranges** — the generator simply failed to produce a name for these features. They exist in the markers.json with `"name": ""`.
|
||||
|
||||
**Root cause:** Same as city collisions — no cross-system dedup. Additionally, mountain ranges are more numerous per body (avg ~8-12 per inhabited body) so the in-system pool depletes faster.
|
||||
|
||||
**Fix required:**
|
||||
1. Cross-system mountain name dedup (same approach as city fix above).
|
||||
2. Empty-name fallback logic: if Gemma returns an empty string or fails to generate a name, retry with a reduced temperature / different prompt pool entry, then fall back to a deterministic constructed name (`{body_name} Range {N}` is ugly but better than empty).
|
||||
|
||||
---
|
||||
|
||||
## 3. Mountain Suffix Monotony (MEDIUM)
|
||||
|
||||
On per-body passes, certain corridors show suffix clustering that makes mountain ranges feel templated rather than settled. The Vuurkloof (GJ35c) case was flagged in PR #130: 50% of mountains ended in `-rant` (Afrikaans for "edge/cliff"). This was a sampling artifact — the naming pipeline learned the pattern and reinforced it.
|
||||
|
||||
**Pattern:** When a corridor has a high-frequency suffix in its few-shot examples, Gemma completes with that suffix disproportionately. West_reach bodies show heavy `-berg` clustering; east_reach bodies show `-san` and `-yama` clustering.
|
||||
|
||||
**Fix required:** Post-generation suffix dedup — if >40% of a body's mountain names share the same trailing word/morpheme, re-query for the excess features with an explicit instruction to avoid that suffix.
|
||||
|
||||
---
|
||||
|
||||
## 4. Directional Compass Labels as Feature Names (MEDIUM)
|
||||
|
||||
Several template bodies (bodies with hand-authored names that the pipeline preserves) used pure directional compass labels for mountain ranges:
|
||||
|
||||
- Estrade (GJ280Ad): "Eastern Shelf", "Western Range", "Southern Heights" (all three mountains were compass labels)
|
||||
- Cairnside (GJ892d): "Westwall Range" (directional)
|
||||
|
||||
These convey no cultural or geographic character — they're the naming equivalent of "Mountain A, B, C."
|
||||
|
||||
**Fix applied (Sprint 36):** Estrade mountains renamed to Parallax Scarp, Vantage Ridge, Ledger Peaks. Cairnside "Westwall Range" renamed to Kappa Escarpment.
|
||||
|
||||
**Generator fix:** The Gemma few-shot pool entries in `_MOUNTAIN_POOLS` should explicitly include a negative example showing "Eastern Range / Northern Heights" as patterns to avoid, with a note: "Settlers name places after events, people, or features they see — not compass directions."
|
||||
|
||||
---
|
||||
|
||||
## 5. Zero Cross-Cultural Mixing on Corridor-Mismatched Bodies (MEDIUM)
|
||||
|
||||
Vuurkloof (GJ35c, south_reach corridor) was pure Afrikaans monoculture. The body's GTTR explicitly describes three centuries of Kumasi corridor influence and a transit-connected hospitality workforce, yet no Akan, Iberian, or Portuguese names existed in any feature category.
|
||||
|
||||
**Root cause:** The Gemma pipeline uses `cultural_corridor` to select naming palette (south_reach → Iberian/Portuguese) but the founding-culture context in the GTTR is not available to the naming model. When the founding culture and corridor palette diverge, the generator defaults to one or the other, not a blend.
|
||||
|
||||
**Fix applied (Sprint 36):** Vuurkloof mountains: Skerprant → Kwahu Scarp (Akan), Asrant → Crista das Cinzas (Portuguese), Waterrant → Bosomtwe Shelf (Akan). River: Rooistroom → Obotan (Akan). Ocean: Suidelike Poel → Lagoa do Sul (Portuguese).
|
||||
|
||||
**Generator fix:** The `gemma_naming.py` pipeline already reads `gttr_hook` per body. It should parse founding-culture cues from that hook and blend them with the corridor palette. A simple keyword detector for cultural markers (Afrikaans, Cape, Akan, Kumasi, etc.) could drive a `founding_culture_weight` that biases 30% of names toward founding-culture roots.
|
||||
|
||||
---
|
||||
|
||||
## 6. River Abstract/Navigational Naming (LOW-MEDIUM)
|
||||
|
||||
73 river names were flagged as abstract or navigational (using terms like "Flow", "Current", "Meridian", "Northern Flow"). Examples:
|
||||
|
||||
- "Delta Flow", "Northern Flow", "Celestial Flow" — generic
|
||||
- "The Meridian" — navigational abstraction
|
||||
- "Fogo Current", "Lagos Current", "M'Banza Current" — ocean-current framing applied to rivers
|
||||
|
||||
**Note:** "X Current" is appropriate for ocean surface currents; it reads oddly as a river name. Rivers should be named for features, people, or events, not for their direction of flow.
|
||||
|
||||
**Root cause:** The `_RIVER_POOLS` in `gemma_naming.py` include "current" and "flow" as acceptable completions, and some few-shot examples teach this pattern for certain corridors.
|
||||
|
||||
**Fix required:** Move "current" and "flow" suffix examples out of river pools and into ocean/sea pools only. Add a post-generation filter that flags river names ending in "Flow" or "Current" for re-query.
|
||||
|
||||
---
|
||||
|
||||
## 7. Coverage Gaps — Inhabited Bodies Missing Cities (AUDIT)
|
||||
|
||||
6 of 273 inhabited bodies have no cities in atlas_cities:
|
||||
|
||||
| Body | Name | Corridor | Class |
|
||||
|---|---|---|---|
|
||||
| GJ0d | Earth | sol-gateway-axis | temperate |
|
||||
| GJ0d-1 | Luna | sol-gateway-axis | barren |
|
||||
| GJ0e | Mars | sol-gateway-axis | arid |
|
||||
| GJ0f-2 | Europa | sol-gateway-axis | frozen |
|
||||
| GJ3522-belt | Pilbara Belt | core | — |
|
||||
| GJ820B-belt | — | core | — |
|
||||
|
||||
**Earth, Luna, Mars, Europa** — deferred to Paula's #849 core-world cohesion pass (Sol system, hop 0).
|
||||
|
||||
**Pilbara Belt, GJ820B-belt** — asteroid belts. These may not need traditional city placements. Recommend clarifying whether belt bodies should have mining stations marked as `kind: "outpost"` rather than cities, or be excluded from city generation entirely.
|
||||
|
||||
---
|
||||
|
||||
## 8. Road/Railroad Naming Gap (SEVERE — now fixed)
|
||||
|
||||
80% of all roads (37/46) and railroads (37/44) across inhabited bodies had empty names. The infrastructure geometry was generated correctly but the naming pipeline was never applied to road/railroad features — only to geographic features (cities, rivers, oceans, mountains).
|
||||
|
||||
**Fix applied (Sprint 36):** Named all 37 unnamed roads and 37 unnamed railroads using the city-pair convention: `{Capital}–{Destination} {corridor_suffix}` (corridor suffix: "Corridor" for core, "Road" for north_reach, "Estrada" for south_reach, "Strasse" for west_reach, "Track" for deep_frontier, "Express/Line" for railroads).
|
||||
|
||||
**Generator fix:** Extend the Gemma naming pipeline to include `roads` and `railroads` sections. Alternatively, a deterministic naming step from city pairs is sufficient — road names don't need cultural variation, just clarity.
|
||||
|
||||
---
|
||||
|
||||
## Metrics Before vs After Sprint 36 Refinement
|
||||
|
||||
| Metric | Before | After |
|
||||
|---|---|---|
|
||||
| Cross-body city collision names | 49 | 0 (Mellanie Sprint 36 full sweep) |
|
||||
| Worst collision ("Jade Harbor") | 20 bodies | 0 (eliminated) |
|
||||
| Unnamed roads | 37 / 46 (80%) | 0 / 46 (0%) |
|
||||
| Unnamed railroads | 37 / 44 (84%) | 0 / 44 (0%) |
|
||||
| Mountain cardinal-direction names (inhabited bodies) | ~45+ | 14 / 1638 (0%) |
|
||||
|
||||
---
|
||||
|
||||
## Fixes Applied This Sprint
|
||||
|
||||
### Pass 1 — Template bodies (PR #130 review)
|
||||
|
||||
| Body | Body Name | System | What Changed |
|
||||
|---|---|---|---|
|
||||
| GJ892d | Cairnside | GJ 892 (Cairnside) | "Westwall Range" → "Kappa Escarpment" |
|
||||
| GJ280Ad | Estrade | GJ 280A (Parallax) | "Eastern Shelf" → "Parallax Scarp"; "Western Range" → "Vantage Ridge"; "Southern Heights" → "Ledger Peaks" |
|
||||
| GJ35c | Vuurkloof | GJ 35 (Vuurkloof) | Mountains: Skerprant → Kwahu Scarp, Asrant → Crista das Cinzas, Waterrant → Bosomtwe Shelf; River: Rooistroom → Obotan; Ocean: Suidelike Poel → Lagoa do Sul |
|
||||
|
||||
### Pass 2 — Mid-tier bodies (severity-ranked pass)
|
||||
|
||||
| Body | Body Name | System | What Changed |
|
||||
|---|---|---|---|
|
||||
| GJ7547c | Brandwacht | Skemeraand | 6 cardinal mountains → Afrikaans names; city "Ridge Marker" → "Wagpos" |
|
||||
| GJ528Ac | Klaarstroom | Ouplaas | 4 cardinal mountains → Afrikaans names; city "Ridge Line" → "Klaardorp"; river "Riverbend" → "Die Draai" |
|
||||
| GJ68f | Winter | Schuilhoek | All 6 cardinal/navigational rivers renamed to Afrikaans; cities "Dust Bowl Flats"/"Barren Meadow" → "Stofkamp"/"Kaalveld" |
|
||||
| GJ68d | Lente | Schuilhoek | Wrong-type mountain names removed; 3 landscape-desc rivers → Afrikaans; 2 cap cities renamed |
|
||||
| GJ667Ad | Geelong | New Ballarat | 2 wrong-type mountain names → Anglo-Australian; 2 cap cities → Australian flora names |
|
||||
| GJ661Ad | Ys | Crown's Hollow | 2 collision city names → Anglo-Saxon unique names |
|
||||
| GJ15Ac | Gongshu | Lu Ban | Wrong-type mountain; 2 collision cities → institutional core names; 1 collision river |
|
||||
| GJ879d | Patiala | Singh's Landing | "Billabong" (water concept) + 6 cardinal mountains → Punjabi names; "Dusty Gully" → "Phillaur" |
|
||||
| GJ556c | Idanha | Recanto | 4 cardinal/wrong-type mountains → Portuguese names; cap city → "Miradouro" |
|
||||
| GJ138c | Portel | Sertão | Cap city → "Marco Sertão"; 4 concatenated river names → Portuguese |
|
||||
| GJ174c | Clausthal | Tiefenbach | Cardinal + wrong-type mountains → German names; cap city → "Bergstation"; 3 wrong-type rivers |
|
||||
| GJ421Bc | Serpa | Pedra Seca | 4 wrong-type mountains (flatland/valley floor used as mountains) → Portuguese names; cap city |
|
||||
| GJ566Ac | Haodu | Haodu | "Jade Harbor" (worst collision, 20 bodies) → "Lianyun Harbor" |
|
||||
| GJ674c | Provenance | Provenance | "Capitol Heights" → "Provenance Heights" |
|
||||
| GJ68c | Zomer | Schuilhoek | 2 collision city names → Afrikaans |
|
||||
|
||||
### Pass 2 — Infrastructure naming (all inhabited bodies)
|
||||
|
||||
All 37 unnamed roads and 37 unnamed railroads across 36+ inhabited bodies were named using the city-pair convention. Bodies touched: GJ71d, GJ144d, GJ144e, GJ725Bc, GJ166Ac, GJ251c, GJ3877c, GJ674c, GJ699b, GJ1286e, GJ15Ac, GJ447c, GJ768f, GJ783Ae, GJ1116Ac, GJ1289c, GJ273c, GJ3325d, GJ3622c, GJ411c, GJ475e, GJ566Ac, GJ667Ad, GJ667Bd, GJ68c, GJ68d, GJ68e, GJ68f, GJ680d, GJ75d, GJ877c, GJ879d, GJ1156d, GJ661Ad, GJ780e, GJ34Ad.
|
||||
|
||||
All bodies re-synced via `generate_atlas.py --body <id>` and verified in atlas_* tables.
|
||||
|
||||
---
|
||||
|
||||
## Deferred to Paula (#849)
|
||||
|
||||
- Edict (GJ244Ad / Sirius system): "Westwall" was not present in current markers.json or DB — either removed in a prior pass or the query data was stale. Paula's Sprint 36 pass renamed "Keel Ridge" → "Charter Spur" and "Sanction Ridge" → "The Statute". Edict mountains are clean. "Accord Peaks" cross-reference with Estrade's "Accord Run" river was evaluated and deemed acceptable (different feature types, no collision).
|
||||
- Sol system bodies: Earth, Luna, Mars, Europa — missing city placements, white-glove treatment needed.
|
||||
- Lendel (GJ380c / Groombridge system): check for any quality issues.
|
||||
|
||||
---
|
||||
|
||||
## 9. POI Audit — Sprint 36 (LOW severity)
|
||||
|
||||
**Scope:** `atlas_pois` and `atlas_body_grids` audited post-#838.
|
||||
|
||||
### atlas_body_grids
|
||||
Pure structural data (body_id, grid_w, grid_h, updated_at). No name column. **Clean — no action required.**
|
||||
|
||||
### atlas_pois
|
||||
287 total POIs across 267 inhabited bodies. Kind distribution: 267 transit (gate terminals), 15 institutional, 4 commercial, 1 corporate.
|
||||
|
||||
**Zero empty names.** All 267 transit POIs have names. Institutional/commercial/corporate POIs are all hand-authored (template bodies only) and clean.
|
||||
|
||||
**Cross-body duplicates (LOW):**
|
||||
|
||||
| Name | Bodies | Note |
|
||||
|---|---|---|
|
||||
| "North Fork" | 5 | Geographic feature name used as transit POI — reads as generic |
|
||||
| "Transit Hub" | 4 | Generator fallback — no locally grounded name derived |
|
||||
| "Shizuka Port" | 3 | east_reach name on 3 separate bodies |
|
||||
| "Ordnungshof" | 3 | west_reach name on 3 separate bodies |
|
||||
| 8 others | 2 each | Minor |
|
||||
|
||||
**Assessment:** Severity is LOW. Max collision depth is 5 bodies ("North Fork") vs. 20 for worst city collision. No empty names. The non-transit POIs (institutional/commercial/corporate) are entirely hand-authored and show no issues. Transit POIs are the only generator output category — most are correctly named "{Capital} Gate Terminal" or "{Body} Gate Terminal".
|
||||
|
||||
**No hand-fixes required this sprint.** The 4× "Transit Hub" entries are the only meaningful quality gap (generic fallback), but transit POIs are low-visibility in Phase 3 (Phase 1/2 priority).
|
||||
|
||||
**Generator fixes recommended (add to #853):**
|
||||
|
||||
7. **Transit POI deterministic naming** — derive gate terminal name from body's capital city: `{capital_name} Gate Terminal`. Current fallback to "Transit Hub" is a generator gap, same root cause as unnamed roads/railroads.
|
||||
8. **Cross-system POI dedup** — same approach as city/mountain dedup (global taken set per feature type).
|
||||
|
||||
---
|
||||
|
||||
## Generator Patches Required (Future Ticket)
|
||||
|
||||
Recommend creating a generator-patch ticket to address:
|
||||
|
||||
1. **Cross-system city name dedup** — seed taken list from global atlas_cities
|
||||
2. **Cross-system mountain name dedup** — same approach
|
||||
3. **Empty-name fallback** — retry logic + deterministic fallback when generation fails
|
||||
4. **Suffix monotony post-filter** — re-query if >40% same suffix per body
|
||||
5. **Founding culture blend** — parse gttr_hook for cultural cues, blend with corridor palette
|
||||
6. **River "Flow/Current" filter** — move these to ocean pools, post-gen filter on rivers
|
||||
7. **Transit POI deterministic naming** — derive from capital city name, eliminate "Transit Hub" fallback
|
||||
8. **Cross-system POI name dedup** — extend global dedup to atlas_pois
|
||||
9. **River/ocean cross-body name dedup (secondary/uninhabited bodies)** — Mellanie's Sprint 36 sweep confirmed river/ocean collisions remain on secondary and uninhabited bodies (Rio Grande ×23, Steinbruch ×19, others). Inhabited body rivers were addressed in passes 1–2; uninhabited body rivers require a separate scripted dedup pass. Same root cause as city/mountain: no global taken set in Gemma pipeline.
|
||||
Reference in New Issue
Block a user