The D-247 chirality/edibility register as authored data on every body, via the
stamped regen-db path (import_economics) — not a manual bake.
- systems-schema.sql + migration.py: nullable bodies.biosphere_class column.
- economy_import/bodies.py: populate_biosphere_class — reads the authored
environment.biosphere_class frontmatter override, else the D-247 two-gate default
(Gate 0 habitability from atmosphere/hydrosphere/inhabited; Gate 1 Compatible/Mirror
from economic_base_primary; neutral remainder -> stable ~50/50 split). Recomputes
every body each regen (frontmatter + default are its complete source).
- import_economics.py: wired as import step 17.
- frontmatter overrides for the bodies whose default deviates from canon:
Solandar=NativeMirror, GJ-524=NativeMirror (uninhabited-but-alive), Ha Long=
NativeCompatible (its transit economy hides its aquaculture identity). Linnaeus,
Arbour, Oshima, Freyburg, Puerto Ultimo, Edict all default correctly.
systems.db regenerated + stamped. All 9 canon exemplars verified; distribution is
111 Compatible : 108 Mirror among inhabited alive worlds (~50/50 target), Airless for
uninhabited bodies, TerraformedSterile for thin-atmosphere worlds.
Follow-up (rename completion): propagating Linnaeus to bodies.proper_name in the DB
(still "Cadwal" — proper_name is atlas-CLI-owned, and a wipe+reimport would drop
non-proposal columns like founding_age_years; needs a targeted approach).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Operationalize the D-247 native-biosphere premise in the wiki (workstreams 1-2).
Chirality continuity — additive clauses making each world's biosphere_class
legible without contradicting existing prose:
- GJ-524 (Mirror): the "no indigenous hazard" world has no indigenous *nutrition*
either — mirror-handed, inedible/inert; its promise is Earth-crop suitability.
- GJ-166A / Keid (Compatible): names the stakes the charter defends — Linnaeus's
biology is edible/cultivable/exploitable, which is *why* it is preserved.
- GJ-684A / Freyburg (Compatible): "robust but non-competitive" = compatible
chemistry, outcompeted by bred cultivars — not inert.
- GJ-124 / Hạ Long (Compatible): the two-generation "learn to farm" was learning
which native (chirality-compatible) organisms to harvest — a genuine alien crop.
- GJ-197 / Puerto Último (Compatible): native life is edible in its own right;
farming leaned on trusted introduced cultivars.
IP fix — the Keid conservancy world was named "Cadwal", Jack Vance's exact book
title (same narrative role). Renamed **Linnaeus** (the great classifier; pairs
with its neighbour Solander/Solandar). Capital stays "Vance" (the author tribute).
Renamed in the body frontmatter (+ biosphere_class: NativeCompatible), the
GJ-166A infobox, and the atlas proposal; D-247 clarified. The systems.db bake
(workstream 3) will propagate the DB + regenerate the infobox authoritatively.
Solandar and Oshima need no continuity edit (already canon-consistent).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- T-1070: scaffold_bodies.py heightmap link now conditional (bake criteria
per import_heightmaps.py); surgical removal of the dead image line from
all 2,131 body pages lacking the file (267 with the file keep theirs)
- T-1071: 26 real link breaks fixed (knowledge/→concepts/, pre-governance
decision anchors, 9 phantom catalog companions unlinked, cygni relink to
the corporation page, wrong design-doc path); wiki/index.md counts fixed
(301 systems) + Economics nav section; corporations/index.md regenerated
from frontmatter (all 155, tier1.toml grouping — corrects 4 misfiled
tier-1 corps); 25 orphaned station GTTRs linked from 11 system pages
(own ##-heading so atlas sync cannot absorb it); GOVERNANCE.md +
star-system template rewritten to the generated model (DB owns
structured fields, wiki owns prose); triangles/index.md added
- Sol markers conversion REVERTED before commit: atlas_viewer.gd:433 still
renders the legacy geometry schema, so conversion would drop Sol's Atlas
overlays — split to T-1073 (convert together with the client read path)
Broken relative links: 2,180 → 25 (all remaining are intentional
_templates/ placeholders).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The D-232 core hand-curated catalog (28 templates) the architecture-flavor
draw reads from, baked into trait_templates (#993):
- Cross-corridor pool (10): economic-function templates gated by BulkClass
(extraction/industrial/cold-chain/precision/information/civic) + universal
baselines + the foreign-import swerve. Guarantees the CI floor.
- Per-corridor baseline (8): each corridor's default cohesive look — core
cosmopolitan, north anglo-frontier, south lusophone, west germanic +
compact-cooperative, east dense-utilitarian, deep-frontier surname +
hardscrabble.
- Heritage sub-pools (10): deep-history callbacks tied to the D-237 heritage
taxonomy (scottish highland, west-african compound, iberian hacienda,
atlantic creole, nordic timber, central-european blok, east-asian temple,
vietnamese water village, afrikaans kraal, arab oasis).
Each template = holistic bundle: two-tier eligibility (hard gates
bulk_class/ubiquity/prosperity_bps + soft weight mods), zone_affinity over
the real DistrictType enum, allow/block tags from a shared ObjectTag
palette, and a D-235 visual_bundle with generic fallback parents. All
numerics integer basis-points (D-010).
Adds the D-232 CI guardrails to the baker (V-TT-01: >=5 templates eligible
per BulkClass; V-TT-02: no template >60% of pool weight) — both pass with
margin (23-24 eligible/class, 5% max share). Catalog can grow via the
bounded Gemma pass (#992); hero pins are #1017.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Review fixes for the #1016 cultural pass (Hoshe/Paula/Miri):
- Kruger 60 (GJ 860A) xhosa -> cosmopolitan (Miri): GTTR describes an
Afrikaner/Xhosa/Zulu founding "without mapping cleanly onto any of
them" — the textbook genuinely-fused case, which taxonomy rule 4
resolves to cosmopolitan rather than one of the three. Commented.
- Altmark (GJ 357) financial_technocratic -> cosmopolitan (Paula):
reverts to the original shipped value; the GTTR reads as commercial
non-alignment, not credential-based technocracy.
- Kampala Gate (GJ 667B) + Moyale (GJ 1292) keep swahili but add inline
comments documenting that these are East-African-INTERIOR founders
(Baganda; Kenyan/Ethiopian Borana-Oromo) for which the taxonomy has no
dedicated token — swahili is the nearest available, NULL would fall to
the wrong corridor default. Gap logged for a follow-up taxonomy value.
Mwangaza (693) swahili is literally correct (coastal) — untouched.
- heritage-taxonomy-draft.md: stale "(38)" subheadings -> "(47)" to match
the actual canonical count (Hoshe/Miri doc typo).
Retracted: Pedra Seca (GJ 421B) xhosa — reviewer thought it lacked
authored backing, but its gttr.md explicitly states "Afrikaans and Xhosa
heritage"; pin kept.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Completes the deferred cultural half of #1016 and migrates the heritage
vocabulary to the canonical 47-value taxonomy (D-237).
Migration (mechanical):
- _CULTURAL_HERITAGE replaced with the canonical 47-value set
(docs/.../heritage-taxonomy-draft.md). Renamed the 4 shipped hero
values to canonical: afrikaans_cape->afrikaans, french_provencal->
french, italian_northern->italian, norse_compact->nordic.
Content pass (authored from GTTR/name heritage triage, 6-sector fan-out):
- +139 new cultural_specialization pins and 1 change (Altmark
cosmopolitan->financial_technocratic), taking coverage 32 -> 171
across 54 distinct values. Each pin is grounded in an explicit GTTR
founding-community statement or system/feature name etymology, applied
only where founding heritage DIVERGES from the corridor baseline
(D-167/D-232); corridor-typical systems left NULL.
Distribution is now balanced and diverse — portuguese 15, german 12,
vietnamese 10, afrikaans 10 (no longer dominant post-#1019), then a long
tail filling the previously-missing slots (welsh, herero, czech, akan,
hungarian, konkan, afro_brazilian, cape_verdean, shona, arab/persian/
turkic, etc.).
Judgment calls (flagged for review):
- Kruger 60 + Pedra Seca -> xhosa (mixed SA founding; adds diversity).
Pedra Seca has a Portuguese name but Afrikaans/Xhosa GTTR founding —
name/heritage mismatch noted for a future content fix.
- Kampala Gate / Moyale / Mwangaza -> swahili as the nearest token for
East-African-interior heritage; taxonomy may want a dedicated value.
- Kept hero pins Kensho=scholarly, Keid=scholarly, Nyrheim=nordic.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
GJ 680 has aperture_count=2 / gate_connections=2, linking two distinct
systems (Athabasca GJ 1289 and Enugu GJ 75) — but the prose, inherited
verbatim from the original Carnarvon page, described "one gate in, one
gate out, both the same gate" and "one aperture connecting to Enugu and
Athabasca" (self-contradictory). Reword the gttr and index to two gates
while keeping the system's low-through-traffic spur character (the
spur_end topology label and "nobody routes through here" identity are
unchanged). Resolves the deferred PR #146 review finding.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Review fixes for the #1019 heritage rebalance:
- Marib's farm world Ghouta -> Ghawr (Miri): "Ghouta" carries strong
modern associations (2013 Damascus attack); Ghawr (the Jordan Rift
Valley, an irrigated lowland farming region) keeps the water-fed-
drylands sense without the resonance.
- Add dominant_faction = "independent" to GJ 914A / 508A / 1245B (Hoshe)
— all five rebalanced systems are self-governing independent
communities; uniform with siblings GJ 722 / 680 and clears V-FAC-01.
- catalog.md: fill GJ 914A -> Marib and GJ 722 -> Sığınak (Hoshe) — the
two anchor systems still showed em-dash placeholders.
- Marib gttr: name the second aperture neighbour Sığınak instead of the
bare "GJ 722" (Miri).
Pre-existing Golestan aperture/spur wording (reviewers split on whether
it is even wrong) is left for a separate content pass — not introduced
by this rename.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The corridor over-represented southern-African heritage (afrikaans on 15
systems; arab=2, persian/turkic=0) as an artifact of the earlier
name-balancing overcorrecting. Convert five genuinely-thin afrikaans
systems — whose distinctive threads are heritage-agnostic — into
Arab/Persian/Turkic founders so the cultural cascade is built on a
balanced set. Load-bearing mystery systems (Eerste Wacht / Helderoog /
Brandpunt etc.) are left untouched.
Droëland (GJ 914A) -> Marib (arab)
Stilwater (GJ 508A) -> Sawad (arab)
Koeberg (GJ 1245B) -> Akhgar (persian)
Skuilplek (GJ 722) -> Siginak (turkic)
Carnarvon (GJ 680) -> Golestan (persian; Mostert dynasty -> Farahani)
Result: afrikaans 15->10; arab 0->2, persian 0->2, turkic 0->1.
Full narrative retouch (not just names): gttr.md + index.md prose,
body/station proper_names, cultural_specialization, gttr_hook,
atlas_city_names, and the four brand-corps named after the converted
systems (corp IDs kept stable; only display names + products renamed).
Cross-references in neighbour systems, the catalog, the aggregate
drifter guides, and the atlas proposals are updated to match.
arab/persian/turkic added to _CULTURAL_HERITAGE so the values validate;
the full canonical 47-value migration remains #1016.
Also fixes a pre-existing canon bug: Sawad (GJ 508A) no longer claims
GJ 914A is "unsettled" — it is Marib, a three-century settlement.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The 6-sector content pass (core pilot + deep_frontier/north/east/south/west,
~260 systems read from both index.md and gttr.md) authored economic_
specialization + dominant_faction for the systems whose lore makes those
identities distinct. Conservative pin bar: corridor-typical systems left NULL
for the heuristic/derivation fallback.
Totals now: economic 170 (27 hero + 143), faction 76 (27 hero + 49),
cultural still 27 (DEFERRED — the culture pass needs a canonical heritage
vocabulary first; the agents surfaced ~30 real heritages from the names plus a
genuine Middle-East/Arabic gap, to be reconciled into one taxonomy before
writing cultural_specialization).
regen-db green, stamp fresh, all CI guardrails pass. Soft warnings are the
expected D-177 MonopolySource review list, the known Arbour estate/breadbasket
question, and sparse-corp_presence W-FAC-03 advisories — none blocking.
Notable pins: Haodu financial_hub/syndic_dominant, Matamba legal_archive,
Inhambane/Sonnwend/etc breadbasket, the terroir cluster, the west_reach
Compact zone, Aurelius governance_center/veil_institute. FLAGs left NULL
pending human calls (ISPI=veil_institute?, Gate-Corp-as-faction).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sol (system GJ 0) uses real Earth/Mars/Luna geography via the offline
sol_import.py and is permanently exempt from the procedural cascade. The
names-only strip had removed Sol's generated marker geometry; restore the
geometry-bearing markers.json for Earth (GJ0d), Luna (GJ0d-1), Mars (GJ0e)
and GJ0f-2 as preserved positional config. sol_import.py is left in place
for future scripted Sol integration; the source config in
tooling/planet-gen/sol_markers/ was never stripped.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Part 1 of #951. Per D-223, every markers.json is reduced to a flavored name pool —
names only, no positions/geometry. 2398 files; 25,264 names preserved across
rivers/mountains/oceans/cities/pois/roads/railroads. Positions now come from the
deterministic cascade (heightmap + drainage) and economic sim; names attach from the pool.
Expected fallout (next #951 steps): the tooling/planet-gen geometry pipeline and
import_economics read markers geometry, so regen-db breaks until the importer is
reworked for the names-only format. Sol markers (tooling/planet-gen/sol_markers/) not
yet handled. No push (batch until Phase 4 done).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Generated oort cloud and asteroid belt generic globe images via Gemini.
Background-masked with flood-fill (shadow-preserving). Donor fill script
copies matching globe.png from same planet_class+body_type pool with
per-body hash selection, no repeats within a system. 629 bodies filled,
3240/3240 now have globe.png.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Arbour Aggregates: body footer date updated to 2026-05-02
- Sede Chemical Works: added (SCW) abbreviation at first prose mention
Structural items (A-C: missing silence/political sections) deferred —
open Q-record on main challenges whether corp pages should have "What
They Don't Talk About" sections at all.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. Scapa Flow Industries: HQ moved from restricted military station to
Quaterna (civilian commercial platform). Overview expanded with
military/civilian context.
2. Threshold Fuel Syndicate: reconceived from "frontier east corridor
supplier" to Gateway's local fuel producer supplementing imports.
Removed frontier tag.
3. Arbour Aggregates: corridor labels fixed — "north"/"east" → "core zone"
to match GJ 338B's actual hop-3 loop_member position.
4. Rush Mining: named concrete sustaining mechanism (property tenure
uncertainty keeps combines away; first-mover holds by occupation).
5. Sede Chemical Works: expanded "ACB" to "ACB — Alpha Centauri B" on
first use.
6. Stale body footer dates updated on rush-mining and scapa-flow.
7. Bifrost Marmor: added missing Cross-References body section.
8. Rush Mining: added cross_ref to rare-vein-survey.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Resolved 8 conflicts in wiki/corporations/ between server #860 tag
updates and copy #861 three-layer authoring. Resolution: union of
server's commodity-tag additions + D-175 decision_refs, plus copy's
cross_refs populated entries.
- N1: wiki/factions/lattice-commission.md:144 — refresh footer
Updated: timestamp to 2026-04-22. Round-1 fix touched the
frontmatter but missed the footer block; both fields now agree.
- N2: wiki/factions/index.md — rewrite the Local Factions cross-ref
to describe the-ring.md as it actually is on the branch:
a canonical named faction (faction_type: criminal, status:
canonical) documenting an informal contraband network at
district scale, preserved as the one maintained worked example
for corridor authors. Previous prose mischaracterized the file
as an "archetype doc," which it is not.
lattice-commission.md has no direct link to the-ring.md, so no
change needed there — the only corridor-wide phrasing left is
"informal contraband networks" in the Faction Relationships
table, which is a generic structural observation about smuggling
as a Commission enforcement target, not a cross-ref to the-ring.md.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Blocking fixes (4):
- P1: wiki/factions/index.md — replace canonical "Local Factions /
The Ring" table row with a prose note, since the-ring.md was
rewritten in #865 as a generic informal-contraband-network
archetype rather than a named local faction.
- P2: wiki/factions/lattice-commission.md — replace The Ring
cross-refs (table row + Cross-References list) with generic
"informal contraband networks" framing; add D-193 cross-ref.
- P3: wiki/factions/lattice-commission.md — rewrite "Gameplay
Presence" section. Removed v0.1 smuggler/detective framing
(THE FRIEND detective path, Commission kiosk in logistics hub,
"detective's arrival" language) and replaced with corridor-
wide structural description: certification inspectors,
field investigators, compliance kiosks, audit cadence.
- P5: wiki/factions/lattice-commission.md — refresh `updated:`
timestamp to 2026-04-22.
Warnings (9):
- H1-H4: saigon-consulting, haesungdan-records, calluna-wellness,
leerfeld-records — expanded each above the ≥95-line DoD floor
with missing Political Relationships sections (mellanie3's
systematic section-skip, same pattern as the earlier cycle-2
pad pass) plus one extra cross-reference each.
- H5: 25 files in miri2's cycle-2 slice (alphabetical range
ondori-interactive → transit-library) used shorter "##
Relationships" header; renamed to "## Political Relationships"
to match the canonical section title from alcyone-tech.md.
- P4: lusaka-advisory — added documentary anchor to the concealed
fact. The cross-engagement reference ledger (internal partner-
only document maintained since 2052 restructuring) and the
2058 partner-retreat memo declining to present it in dispute
forums are the investigative surface. Addresses Paula's note
that the original concealed fact existed entirely in partners'
heads with no documentary trail.
Not fixed (documented as false positives — verified clean on
branch):
- M1: glossary.md line 19 NOT-list does not contain "Lattice
Commission" (Mellanie removed it in the D-193 commit;
reviewer likely reading a stale snapshot).
- M2-M5: Van Maanen / Station Sova references in
mastroianni-vehicle-group, ferreira-monteiro, gate-corporation,
stalownia-kowalski — all four files grep clean (#865 Bucket C
rewrote them).
- M8: wiki/star-systems/GJ-35/sova/transit/index.md was deleted
in commit 25eb8bd0 — file cannot be fixed.
Info-only comments (P6, P7, M6, M7) left as advisory notes
for future deepening passes.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sprint 36 PR #133 shipped 112 new corp wiki pages as ~24-line
frontmatter-only placeholders. This commit authors 105 of them to
the canonical three-layer narrative standard (≥95 lines each).
Three-layer content model per D-189:
1. Public identity — branding, market position, public face
2. Actual operation — supply chain, workforce reality, profit model,
political relationships, regulatory dependencies
3. One concealed fact — a single discoverable secret shaped like an
iceberg. Public commitment stays technically true; the compromise
lives in the deliberately-drafted clause, the accelerated refresh
cycle, the "behavioral pattern" that isn't a "guest record."
Every page:
- ≥95 lines (actual range 95-125)
- Overview, Origin, Operations, Political Relationships, concealed-
fact section, Gameplay Relevance, Cross-References
- Corridor/founding-system specificity — HQ culture informs voice
- "the Lattice Commission" (D-193) used throughout
- Cross-refs populated per D-189 brand layer architecture
Quality bar: wiki/corporations/alcyone-tech.md — authenticated
timing side-channel vulnerability, legal non-disclosure decision,
accelerated refresh cycle disguised as "performance enhancement."
Clean public promise; deliberately-kept secret; reachable by a
player who finds the internal report.
Authored across three cycles: cycle 1 validation (~20), cycle 2
main push (75 at 25 per author), cycle 3 cleanup (9). Split by
brand category and corridor clustering to encourage natural
cross-refs.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Spring-cleaning accumulated v0.1 vertical-slice residue across the
wiki. Scope per Jeroen's pre-decisions on 2026-04-21:
- Delete outright: wiki/star-systems/GJ-35/sova/ subtree (5 files +
2 dirs) — v0.1 Station Sova / Transit District content.
- Strip example blocks in authoring guides and _templates/ that
cited dropped v0.1 NPCs (Kael Davan, Sera Venn, Nils Davan, Devra,
Torek, Renn, Pell, Tav, Lera Sessik, Sabel). Replaced with short
"v0.1 examples removed — D-122" notes pointing authors to the
active NPC roster.
- Rewrite canonical-lore references file-by-file: faction pages,
technology pages, contraband pages, concepts pages, corp pages
that cited v0.1 names/places. Preserve institutional/structural
content, drop specific-name citations.
- Commission name drift: replace "Concord Commission" and "Assembly
Commission" with "the Lattice Commission" (D-193) throughout.
- Van Maanen's Star cultural references: the canonical in-game name
is Vuurkloof. "Van Maanen's Star" is retained only as an
astronomical designation (glossary + GJ-35 Calibration Note).
All cultural/system references converted to Vuurkloof across
culture-authoring-guide, cultural-generation-guide, founder-gates,
and star-system adjacent-system descriptions.
- Strip `v0.1` from faction/triangle frontmatter tags (8 files).
- wiki/triangles/hub-power.md and wiki/factions/the-ring.md:
rewritten using role-name exemplars (Ring Coordinator / Shift
Supervisor / THE FRIEND) instead of named v0.1 NPCs. Triangle
pattern preserved as a structural reference.
Also applies drive-by Commission drift fixes and minor cross-ref
updates to canonical corps (gate-corporation, mastroianni-vehicle-group,
stalownia-kowalski, prometheus-labs, ferreira-monteiro, vins-de-grand-vide,
and 13 others).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds and expands wiki/corporations/*.md entries so make economy-db
Phase 2 gate passes end-to-end without the 21 raw-commodity / system
coverage failures. Unblocks Phase 2 demand simulation.
Existing corporations (15): tag additions to baektu-mining-alliance,
bergkraft-antriebswerke, bifrost-marmor, gate-corporation,
hanyang-precision, jeju-lattice, nordmark-skog, norrland-woodcraft,
salud-alliance, shetland-wool, societe-chimique, stalownia-kowalski,
svanevann-waters, thrds, tongyeong-drive.
New corporations (6): arbour-aggregates, earth-standard-group,
rush-mining, scapa-flow-industries, sede-chemical-works,
threshold-fuel-syndicate.
systems.db regenerated — coverage validation now passes.
Cross-team scope note: wiki/ is copy-team territory per CLAUDE.md.
Writes here are accepted by lead for this sprint (maintenance sweep,
pragmatic fix); copy-team review follow-up filed as #884.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 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>
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>
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>
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>
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>
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>
The upstream terrain pipeline assigns sparse IDs (range_1, range_50,
range_29...) and the prune pass drops entries but keeps original IDs.
This leaves 2394 bodies with non-sequential IDs across mountain_ranges,
rivers, and oceans.
Renumbered all feature IDs to sequential {prefix}_0, {prefix}_1, ...
preserving sort order. 24021 IDs fixed across 2394 bodies. No name
or geometry data changed — only the id field.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Previous runs (both the GPU-contention kill and the anglophone-only
interrupt) left 19 hop 0-1 core bodies with stale generator output in
their markers.json files. Those bodies were being skipped via the
preserved path on relaunch, which meant the gttr-context fix
(commit a5fbce4c) would never touch them — exactly the set of
high-visibility systems that benefits most from per-system cohesion.
Reset to origin/main (clean null-name state) + re-prune to the 8/6
caps. Hand-authored templates (Edict, Estrade, Vuurkloof, Lendel,
Cairnside, Røros) explicitly excluded from the reset list and
verified intact (2-4 named cities each, untouched).
After this commit only the 6 hand-authored templates have
populated names in wiki/star-systems/. The entire rest of the reach
is clean and will be freshly named by the next gemma_naming.py run
with the full gttr + cosmopolitan + grounded few-shot + rotating
pool stack.
Bodies reset:
- Ran (GJ 144): all 9 bodies
- Sirius (GJ 244A): GJ244Ab, c, e-1, e-2 (not Ad, that's Edict)
- ACB (GJ 559B): GJ559Bb
- Tau Ceti (GJ 71): GJ71b, c, d, d-1, e
Two fixes from observing the first Gemma 2 batch run on Sirius:
1) Prune oversized feature counts. The upstream terrain pipeline emits
every distinct mountain cluster as a separate `mountain_range` and
every flowing path as a separate `river`. At the atlas generator's
512×256 grid this produced bodies with 40-80 named ranges and
10-15 rivers — noise, not information. A single planet with 48
ridges isn't richer, it's unparseable.
`tooling/planet-gen/prune_atlas_features.py` walks every
`markers.json` under `wiki/star-systems/`, ranks each feature type
by a size proxy, and keeps only the top N:
- mountain_ranges: sorted by `area_cells`, top 8 per body
- rivers: sorted by path length, top 6 per body
- oceans / cities / pois: untouched (already small, or
hand-authored by generate_atlas.py)
Sol (GJ-0) is hardcoded-excluded from pruning so the hand-authored
Earth / Mars / moon content stays untouched.
Each pruned body gets its atlas_* rows re-synced via
`sync_markers_to_db` so the DB mirror stays consistent. Bodies
whose wiki folder has no matching row in `bodies` (14 pre-existing
orphans like GJ1156h-1, GJ34Ah-2, …) are pruned in-file but skip
the DB sync to avoid FK violations on atlas_body_grids.
First run results:
bodies scanned: 2394
bodies pruned: 1513
mountain ranges dropped: 11640
rivers dropped: 1382
Safe to re-run — idempotent when a body is already within the caps.
2) Grounded cosmopolitan fallback palette. When Gemma's 3 retries
all fail (dedup, blocklist, stem-cap, placeholder), the code falls
to `_FALLBACK_STEMS[corridor]`. The old table had 10 stems per
corridor, all Latin-institutional (Meridian, Concord, Prefecture,
Cardinal, Lumen, Foro, Tabula, Vox, Axis, Senatus), which produced
the same-y `Axis Spine / Axis Ridge / Axis Heights / Axis Scarp`
clusters the user flagged on Sirius — exactly the old epic-Latin
register the few-shot pools were rewritten to avoid.
Fallbacks now draw from a 30-45 stem grounded cosmopolitan list
per corridor matching the few-shot pool intent:
- core: 45 stems (Ashfield, Bellview, Cedarbrook,
Fairmont, Ironwood, Kirkwood, Linden, Meridian,
Northfield, Riverside, Westbrook, …)
- north_reach: 40 stems (Ashford, Bellfield, Clifford, Drayton,
Elmhurst, Garner, Holmwood, Kelsworth, …)
- west_reach: 35 stems (Altdorf, Bergfjord, Eikhof, Hoogland,
Järvenpää, Kloosterdam, Nieuwpoort, Sørholm,
Svarteberg, Torsfell, Voorhout, Weserhof, Östby, …)
- east_reach: 35 stems (Aomori, Baektu, Chōshi, Fukagawa,
Hanyang, Izumi, Takamine, Yurigawa, …)
- south_reach: 36 stems (Alves, Brandão, Évora, Gomes, Ribeiro,
Serra, Várzea, Hlanganani, Kilimi, …)
- deep_frontier: 30 stems (Okafor, Stenner, Weller, Kellogg,
Stonebrook, Dustgate, Blackwater, …)
Per-feature suffix lists also expanded (e.g. river suffixes now
include Brook, Stream, Flow, Creek on top of the original Run /
Water / Beck / Rill / Course). Net effect: 300-450 unique fallback
combinations per (corridor, feature_type), up from 50, in the same
grounded register the few-shot pools teach.
Also preserves aliases `inner_corridor`, `inner_orbit`, and
`sol-gateway-axis` as legacy-compatible keys pointing at the
administrative-English palette.
Combined effect on the next run:
- ~45% fewer features to name (pruned 13k/52k)
- ~9× more fallback variety per corridor when fallback does trigger
- Same grounding overhaul from the previous commit, now reaching
into the safety-net path
Blocking PR #129 items 1, 2 (plus polish 16 and 17):
- D-191 §8 prose rewritten to match the code. The previous amendment said
positions were `{x, y}` objects against a "typically 1024 × 512" grid,
but the generator, the six hand-authored templates, and all 2394
procedural seed files ship `[row, col]` integer arrays against a
`{"w": 512, "h": 256}` grid. The decision doc is now aligned with
reality: positions are `[row, col]`, the storage grid is 512 × 256,
and the row-first ordering is called out explicitly so readers can
cross-reference NumPy/flood-fill/A*/cost-grid conventions.
- §8 now follows the D-094 amendment pattern. The superseded 2026-04-10
prose is preserved verbatim as "Original (superseded)" with a dated
Amendment block on top — future readers can see what changed and why
instead of silently losing the history.
- brands.toml header gains a short Phase 2 boundary note. The 4 anchor
brands come from D-189 §5; the additional ~23 brands from D-189 §11
are deliberately deferred to Phase 3 — Phase 2 only needs the demand-
node plumbing and V-B01..V-B06 validation exercised end-to-end.
- systems-schema.sql `bodies.terrain_reference` comment now pins the
repo-root-relative path convention (wiki/star-systems/<slug>/bodies/
<body_id>/heightmap.png) so the three downstream pipelines (populate,
atlas generator, client loader) share a documented contract instead
of drifting against an unwritten convention.
Implements the Phase 3 atlas content generator per D-191 §3, §8, and §9.
Pipeline per body (terrain-aware, deterministic per seed + body):
1. Simulate terrain via planet_simulation.simulate().
2. Analyse continents (flood-fill), habitability (temp/moisture/slope +
coastal bonus), river mouths, and a terrain A* cost grid.
3. Place cities sequentially — capital first (habitability + river-mouth
bias), then corridor growth via multi-source Dijkstra, quadrant-spread
penalty after 2 cities in a quadrant, port-on-new-continent bonus at
cities 3–4. ±25% noise for seed variation.
4. Generate roads and railroads as an MST over city positions, with
A* paths on the terrain cost grid (rail follows roads where possible).
5. Place a transit POI at the capital (15% chance to scatter to a
secondary city).
Output (canonical markers.json schema, pixel space per D-191 §8):
- cities: {id, name, kind, center:[r,c], population}
- roads: {id, name, kind, path:[[r,c],...]}
- railroads: {id, name, kind, path:[[r,c],...]}
- pois: {id, name, kind, center:[r,c]}
- existing rivers/oceans/mountain_ranges preserved untouched.
City names are left empty for gemma_naming.py (#833). Body population is
split across cities with geometric decay (capital ~50%, each subsequent
city half the previous). The 6 hand-authored bodies (Lendel, Edict,
Vuurkloof, Røros, Cairnside, Estrade) are detected by existing
`cities` and skipped for regeneration; their markers are still synced
to the DB index below.
Atlas index in systems.db (new):
- atlas_body_grids, atlas_cities, atlas_roads, atlas_railroads,
atlas_pois, atlas_rivers, atlas_oceans, atlas_mountain_ranges
- Scalar metadata mirror of every markers.json — the implant atlas app
and development queries can lookup cities/POIs/features without
scanning 267 JSON files. Polyline geometry stays in the markers.json
files next to the heightmaps (used by the renderer); the DB only
stores filterable scalar fields plus `point_count` as a length proxy.
- Schema lives in server/data/systems-schema.sql; generate_atlas.py
mirrors the CREATE TABLE IF NOT EXISTS block so it runs against any
DB state (matches the economy-db importer pattern).
- Populated and refreshed on every run. Each body's rows are deleted
and reinserted deterministically — no stale state.
Also fixes a pre-existing WIP bug in the quadrant-saturation penalty
loop (a stray outer `for r in range(GRID_H)` with unreachable breaks
meant only the NW quadrant was ever checked).
Runtime: 280s for all 267 inhabited bodies on a single core. 265 bodies
updated this run, 6 hand-authored bodies synced to DB without
regeneration.
Atlas index after run:
atlas_cities 329 (15 hand-authored + 314 awaiting #833)
atlas_roads 46
atlas_railroads 44
atlas_pois 287
atlas_rivers 2034
atlas_oceans 696
atlas_mountain_ranges 1953
atlas_body_grids 267
Adds the brand layer per D-189 §5:
- Schema: brand_products, brand_inputs, system_fiscal, corp_financial_state,
corp_lifecycle_events (+ 5 indexes).
- Importer: reads wiki/economics/corporations/brands.toml, populates the
new tables, validates V-B01–V-B05 structural rules, and derives
system_fiscal for inhabited systems.
- Data: 8 brand_products, 16 brand_inputs, 301 system_fiscal rows.
Brand products are demand nodes — they consume commodities; they are not
commodities themselves (D-185). Depends on copy PR #127 for the corp
records referenced by brands.toml.
Author Phase 3 atlas quality-bar templates for 4 core systems alongside
the pre-existing Lendel template. Names, cities, roads/rail, and POIs
hand-placed against each body's heightmap and tied to the system's
corridor naming tradition.
- GJ244Ad Edict (Sirius system, inner_corridor) — Assembly institutional
capital: Mandate 387M, Station Edict 13M, Founder's Range, Accord
Peaks, Founding Ocean, Edict Deep Line rail.
- GJ35c Vuurkloof (Van Maanen's Star, south_reach) — volcanic geothermal
settlement: Terras 290K, Kloofbas 50K, Groot Breuk, Ysterkop, Rantlyne
underground rail. Afrikaans geology naming per wiki canon.
- GJ66Bc Røros (Voss system, west_reach) — Compact mining world:
Storbjerg 3.2M, Hammervik 800K, Nordfjell, Rørosfjell, Storhav,
Glåmelva. Norwegian/Scandinavian heritage naming.
- GJ892d Cairnside (deep frontier, research domes) — Cairnside Primary
75M, Survey Post Kappa 5M, The Terraces, Baseline Lake, Baseline Rail.
Technical frontier naming pattern.
All files match the implemented Lendel markers.json format (grid + pixel
coordinates, raw population, gate terminal as named POI). D-191 section 8
describes the schema in abstract lat/lon terms; server team should align
generate_atlas.py and D-191 prose with the on-disk format before #832
and #833 consume these as few-shot examples.
These templates serve as the quality bar for generator tuning and as
few-shot examples for the Gemma 2 naming pipeline (#833).
Ticket: #837
Decisions: D-191 (Phase 3 atlas), D-036 (Sova/Vuurkloof canon), D-144
(Sirius/Concord seat)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
GJ 624 is Halvøy (aquaculture world), not Freiholt. Freiholt is GJ 453.
Fixed both cross-reference occurrences in compact-of-westphalia.md.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>