fix(content): PR #133 review — 9 remaining items resolved

Closes 9 of 10 review items (blocker 1 handled in add2507e + d78d3b59):

- decisions/economics.md: reformat D-189 §5 amendment to standard
  Amendment (YYYY-MM-DD) block pattern (review #4)
- tooling/planet-gen/sol_name_fixes.py: dedup guard + argparse
  --dry-run (reviews #5, #10a)
- tooling/planet-gen/sol_markers/earth_features.json: trim to 11
  cities with selection rationale (review #6A); user-approved
  rebalance Sydney → Lagos and London → Brussels (review #6B)
- wiki/star-systems/GJ-380/bodies/GJ380c/markers.json: 2 secondary
  features renamed to Akan/Asante register — Kesset → Nkwanta Beck,
  Holt Spur → Bosomtwe Spur (review #7)
- docs/atlas/hand-refine-log.md: Aethelred lore-migration
  documentation + see-also cross-link to refine_log_849.md
  (reviews #8, #13)
- tooling/planet-gen/refine_log_849.md: rebalance addendum
- wiki/star-systems/GJ-0/bodies/GJ0d/markers.json, server/data/
  systems.db: re-synced after rebalance

Stub depth (review blocker #2) handled via split — tracked as
follow-up ticket #861 (three-layer narrative authoring).

Final Earth cities (11): Beijing, Brussels, Cairo, Delhi, Istanbul,
Lagos, Moscow, New York, São Paulo, Singapore, Tokyo.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-19 15:51:17 +02:00
co-authored by Claude Opus 4.7
parent d78d3b599c
commit 2c3e3ff5eb
8 changed files with 109 additions and 75 deletions
+2 -1
View File
@@ -337,7 +337,8 @@ This domain covers: currency system, commodity taxonomy, shadow economy, corpora
**5. DB Schema**
- `brand_products`: `brand_product_id`, `corp_id`, `product_name`, `brand_category` (8 values), `value_trajectory`, `scarcity_class` (`capped` / `constrained` / `scalable` / `unlimited`), `product_subcategory`, `base_premium_multiplier`, `premium_floor`, `origin_system`, `terroir_locked`, `currency_denomination`, `shadow_viable`, `brand_tier` (`halo` / `volume`), `halo_brand_id` (for volume tiers), `price_tier` (enum — see below)
- `price_tier` enum (5 values — amended Sprint 36 per team decision; closed enum locked on sprint-36/copy branch): `mass` (widely accessible, lowest price point; commodity_branded volume tiers) / `premium` (above-average quality signal; most volume tiers across categories) / `luxury` (aspirational, restricted availability; terroir and design_heritage halos) / `flagship` (pinnacle output, ultra-scarce; Veblen curve inflection; max 1 per brand, lore-grounded scarcity ceiling required) / `institutional` (B2B contract pricing, not market price; service_premium and platform_catalogue)
- `price_tier` enum (5 values): `mass` (widely accessible, lowest price point; commodity_branded volume tiers) / `premium` (above-average quality signal; most volume tiers across categories) / `luxury` (aspirational, restricted availability; terroir and design_heritage halos) / `flagship` (pinnacle output, ultra-scarce; Veblen curve inflection; max 1 per brand, lore-grounded scarcity ceiling required) / `institutional` (B2B contract pricing, not market price; service_premium and platform_catalogue)
- **Amendment (2026-04-19):** `price_tier` valid values were not defined in the original decision. Locked to the five values above per team decision, Sprint 36.
- `brand_inputs`: `brand_product_id`, `commodity_id`, `quantity`
- `system_fiscal`: `system_id`, `corp_tax_rate`, `collection_efficiency` (derived from `shadow_economy_intensity`)
- `corp_financial_state` + `corp_lifecycle_events` tables for acquisition/startup lifecycle
+21
View File
@@ -148,6 +148,27 @@ River and ocean collisions (Rio Grande ×23 rivers, Steinbruch ×19 rivers, Ridg
- **"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.
Binary file not shown.
+19
View File
@@ -174,6 +174,19 @@ suffixes incompatible with the British-Isles naming style.
**DB sync:** `generate_atlas.py --body GJ380c`
**Addendum (PR #133 review):** Initial pass left GJ380c 100% Anglo-British register with zero
cross-corridor influence from the Kumasi/south_reach trade lanes. Added two secondary features
in Akan/Asante register, keeping primary features (Aldren capital, Durneth Range, Rethain Sea)
in their established Anglo register:
| Feature type | Old name | New name | Reason |
|---|---|---|---|
| river | The Kesset | Nkwanta Beck | Nkwanta = Akan "junction/crossroads" — trade-route name; Beck suffix localizes it |
| mountain | Holt Spur | Bosomtwe Spur | Bosomtwe = sacred Asante lake in Ghana; Spur suffix preserved from Groombridge convention |
**Corridors are tendencies, not borders** — capital and primary geography stay Anglo-British;
peripheral features reflect Kumasi trade influence. DB re-synced.
---
### GJ 699 — Barnard's Star system
@@ -261,6 +274,12 @@ Ankara, Karachi, Shanghai, Mumbai, Jakarta, Dhaka, Manila, Bangkok, Seoul, Osaka
Kolkata, Lahore, Shenzhen, Bangalore, Ho Chi Minh City, Luanda, Addis Ababa, Santiago, Taipei,
Hong Kong, Casablanca.
**PR #133 review rebalance (user-approved Option 1 + London swap):**
- `Sydney → Lagos` — improves African representation (Cairo + Lagos = 2 African cities; Sydney was the weakest cultural-touchstone anchor).
- `London → Brussels` — Brussels chosen for future-strong-EU-capital setting fit over London's legacy cultural weight.
**Final 11:** Beijing, Brussels, Cairo, Delhi, Istanbul, Lagos, Moscow, New York, São Paulo, Singapore, Tokyo.
**Generator note:** sol_import.py has no `--top-n` city filter — it uses the full earth_features.json
list. If Sol is regenerated, earth_features.json should be trimmed to the 11 kept cities, or a
filter added in sol_import.py. Filed as finding in #853.
@@ -1,5 +1,6 @@
{
"GJ0d": {
"_city_selection_note": "11 cultural touchstones, one per major historical/cultural cluster. Criterion: would a player setting a bookmark to 'Earth' recognize this city? Full 46-city reference list is in git history (trimmed Sprint 36 #849). PR #133 review rebalance: Sydney → Lagos (African representation); London → Brussels (future EU capital fit). To adjust: edit this array and re-run sol_import.py, then generate_atlas.py --body GJ0d.",
"oceans": [
{"name": "Pacific Ocean", "center": [128, 440]},
{"name": "Atlantic Ocean", "center": [128, 170]},
@@ -33,62 +34,22 @@
{"name": "Murray", "mouth": [170, 417]}
],
"cities": [
{"name": "London", "center": [79, 260], "population": 9000000, "region": "europe"},
{"name": "Istanbul", "center": [83, 279], "population": 15000000, "region": "europe"},
{"name": "Moscow", "center": [72, 294], "population": 12700000, "region": "europe"},
{"name": "Paris", "center": [80, 261], "population": 11000000, "region": "europe"},
{"name": "Berlin", "center": [77, 269], "population": 3700000, "region": "europe"},
{"name": "Brussels", "center": [80, 266], "population": 2100000, "region": "europe"},
{"name": "Istanbul", "center": [83, 279], "population": 15000000, "region": "europe"},
{"name": "Moscow", "center": [72, 294], "population": 12700000, "region": "europe"},
{"name": "Mexico City", "center": [107, 101], "population": 21800000, "region": "north_america"},
{"name": "New York", "center": [87, 130], "population": 20100000, "region": "north_america"},
{"name": "Los Angeles", "center": [93, 95], "population": 13200000, "region": "north_america"},
{"name": "Toronto", "center": [84, 123], "population": 6200000, "region": "north_america"},
{"name": "Chicago", "center": [85, 115], "population": 9500000, "region": "north_america"},
{"name": "New York", "center": [87, 130], "population": 20100000, "region": "north_america"},
{"name": "São Paulo", "center": [143, 164], "population": 22400000, "region": "south_america"},
{"name": "Lima", "center": [133, 131], "population": 10700000, "region": "south_america"},
{"name": "Bogotá", "center": [121, 135], "population": 11300000, "region": "south_america"},
{"name": "Rio de Janeiro", "center": [142, 168], "population": 13500000, "region": "south_america"},
{"name": "Buenos Aires", "center": [151, 153], "population": 15200000, "region": "south_america"},
{"name": "São Paulo", "center": [143, 164], "population": 22400000, "region": "south_america"},
{"name": "Lagos", "center": [120, 262], "population": 15400000, "region": "africa"},
{"name": "Kinshasa", "center": [124, 270], "population": 15600000, "region": "africa"},
{"name": "Cairo", "center": [97, 286], "population": 21300000, "region": "africa"},
{"name": "Johannesburg", "center": [156, 279], "population": 6000000, "region": "africa"},
{"name": "Nairobi", "center": [128, 293], "population": 5100000, "region": "africa"},
{"name": "Cairo", "center": [97, 286], "population": 21300000, "region": "africa"},
{"name": "Tehran", "center": [92, 308], "population": 9000000, "region": "west_asia"},
{"name": "Baghdad", "center": [94, 303], "population": 8100000, "region": "west_asia"},
{"name": "Riyadh", "center": [103, 304], "population": 7700000, "region": "west_asia"},
{"name": "Ankara", "center": [87, 284], "population": 5700000, "region": "west_asia"},
{"name": "Karachi", "center": [103, 327], "population": 16500000, "region": "west_asia"},
{"name": "Tokyo", "center": [92, 400], "population": 37400000, "region": "east_asia"},
{"name": "Delhi", "center": [99, 339], "population": 32900000, "region": "east_asia"},
{"name": "Beijing", "center": [87, 383], "population": 21500000, "region": "east_asia"},
{"name": "Tokyo", "center": [92, 400], "population": 37400000, "region": "east_asia"},
{"name": "Delhi", "center": [99, 339], "population": 32900000, "region": "east_asia"},
{"name": "Shanghai", "center": [97, 387], "population": 28500000, "region": "east_asia"},
{"name": "Beijing", "center": [87, 383], "population": 21500000, "region": "east_asia"},
{"name": "Mumbai", "center": [107, 333], "population": 21700000, "region": "east_asia"},
{"name": "Jakarta", "center": [120, 374], "population": 34500000, "region": "fill"},
{"name": "Dhaka", "center": [103, 351], "population": 23000000, "region": "fill"},
{"name": "Manila", "center": [109, 388], "population": 14400000, "region": "fill"},
{"name": "Bangkok", "center": [109, 370], "population": 11000000, "region": "fill"},
{"name": "Seoul", "center": [90, 393], "population": 9800000, "region": "fill"},
{"name": "Osaka", "center": [93, 398], "population": 19300000, "region": "fill"},
{"name": "Chongqing", "center": [97, 375], "population": 17000000, "region": "fill"},
{"name": "Kolkata", "center": [103, 349], "population": 15100000, "region": "fill"},
{"name": "Lahore", "center": [97, 336], "population": 14000000, "region": "fill"},
{"name": "Shenzhen", "center": [104, 382], "population": 13400000, "region": "fill"},
{"name": "Bangalore", "center": [111, 339], "population": 13200000, "region": "fill"},
{"name": "Ho Chi Minh City", "center": [113, 374], "population": 9300000, "region": "fill"},
{"name": "Luanda", "center": [132, 268], "population": 9000000, "region": "fill"},
{"name": "Addis Ababa", "center": [119, 292], "population": 5500000, "region": "fill"},
{"name": "Santiago", "center": [147, 137], "population": 7000000, "region": "fill"},
{"name": "Taipei", "center": [103, 388], "population": 7000000, "region": "fill"},
{"name": "Hong Kong", "center": [104, 382], "population": 7500000, "region": "fill"},
{"name": "Singapore", "center": [119, 372], "population": 5900000, "region": "fill"},
{"name": "Sydney", "center": [161, 421], "population": 5300000, "region": "fill"},
{"name": "Casablanca", "center": [93, 249], "population": 3800000, "region": "fill"}
{"name": "Singapore", "center": [119, 372], "population": 5900000, "region": "southeast_asia"},
{"name": "Lagos", "center": [119, 263], "population": 15000000, "region": "africa"}
]
}
}
+39 -7
View File
@@ -4,7 +4,12 @@ sol_name_fixes.py — Name previously-unnamed Sol body auto-detected features.
Targets features with null names: Earth oceans/rivers, Luna/Mars/Europa mountain ranges.
All names are real-world geographic names for Sol bodies.
Usage:
python3 sol_name_fixes.py # apply all fixes
python3 sol_name_fixes.py --dry-run # print planned changes without writing
"""
import argparse
import json
from pathlib import Path
@@ -44,7 +49,6 @@ FIXES = {
"range_579": "Haemus Montes", # 33 cells — south of Mare Serenitatis
"range_231": "Gruithuisen Domes", # 25 cells — volcanic domes
"range_580": "Mons La Hire", # 25 cells — volcanic dome, Mare Imbrium
"range_606": "Montes Riphaeus", # fallback ID
"range_570": "Montes Riphaeus", # 24 cells — Oceanus Procellarum ridge
"range_596": "Montes Secchi", # 24 cells — east of Mare Fecunditatis
"range_604": "Montes Spitzbergen", # 24 cells — isolated massif
@@ -79,7 +83,22 @@ SECTION_MAP = {
}
def apply_sol_fixes():
def _check_dedup(fixes: dict) -> None:
"""Raise if any name is assigned to more than one feature ID within a body."""
for body_id, sections in fixes.items():
for section, id_map in sections.items():
seen: dict[str, str] = {}
for fid, name in id_map.items():
if name in seen:
raise ValueError(
f"Duplicate name {name!r} in {body_id}/{section}: "
f"{seen[name]} and {fid} both assigned"
)
seen[name] = fid
def apply_sol_fixes(dry_run: bool = False) -> None:
_check_dedup(FIXES)
for body_id, body_fixes in FIXES.items():
path = WIKI / body_id / "markers.json"
if not path.exists():
@@ -99,17 +118,30 @@ def apply_sol_fixes():
new = id_map[fid]
if old != new:
print(f" [{body_id}/{section}] {fid}: {old!r}{new!r}")
feature["name"] = new
if not dry_run:
feature["name"] = new
changed = True
if changed:
with open(path, "w") as f:
json.dump(markers, f, indent=2)
print(f" Written: {path}")
if dry_run:
print(f" (dry-run) Would write: {path}")
else:
with open(path, "w") as f:
json.dump(markers, f, indent=2)
print(f" Written: {path}")
else:
print(f" No changes for {body_id}")
print()
if __name__ == "__main__":
apply_sol_fixes()
parser = argparse.ArgumentParser(
description="Name previously-unnamed Sol body auto-detected features."
)
parser.add_argument(
"--dry-run",
action="store_true",
help="print planned changes without writing any files",
)
args = parser.parse_args()
apply_sol_fixes(dry_run=args.dry_run)
+14 -14
View File
@@ -48,7 +48,7 @@
},
{
"id": "river_1",
"name": "Dnieper",
"name": null,
"path": [
[
59,
@@ -266,7 +266,7 @@
},
{
"id": "river_4",
"name": "Tone River",
"name": null,
"path": [
[
87,
@@ -742,7 +742,7 @@
},
{
"id": "river_10",
"name": "Cagayan",
"name": null,
"path": [
[
102,
@@ -810,7 +810,7 @@
"oceans": [
{
"id": "water_1",
"name": "The World Ocean",
"name": null,
"kind": "ocean",
"center": [
125,
@@ -837,13 +837,13 @@
"roads": [],
"cities": [
{
"id": "city_london",
"name": "London",
"id": "city_brussels",
"name": "Brussels",
"center": [
79,
260
80,
266
],
"population": 9000000
"population": 2100000
},
{
"id": "city_istanbul",
@@ -927,13 +927,13 @@
"population": 5900000
},
{
"id": "city_sydney",
"name": "Sydney",
"id": "city_lagos",
"name": "Lagos",
"center": [
161,
421
119,
263
],
"population": 5300000
"population": 15000000
}
],
"railroads": [],
@@ -52,7 +52,7 @@
},
{
"id": "river_1",
"name": "The Kesset",
"name": "Nkwanta Beck",
"path": [
[
250,
@@ -253,7 +253,7 @@
},
{
"id": "range_5",
"name": "Holt Spur",
"name": "Bosomtwe Spur",
"center": [
33,
396