feat(db): corp-HQ placement boundary re-tune — Standalone only for industrial-complex HQs (T-1076 item 0, D-242)

95->11 Standalone / 60->144 CityTenant per Jeroen's boundary ruling: only extraction/mining/quarrying, heavy vehicle+shipyard, heavy energy, gate infrastructure keep their own settlements; craft/consumer manufacturing, agriculture offices, high-tech fabs flip to CityTenant. Cygni pin moved to Metropolis (its HQ settlement vanishes under the flip). Regen systems.db: 340 city rows, 129 tenant links, fixpoint stable.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-16 16:22:22 +02:00
co-authored by Claude Fable 5
parent f5bb71736b
commit a0ebdbe6b8
3 changed files with 89 additions and 79 deletions
Binary file not shown.
+73 -66
View File
@@ -15,74 +15,75 @@
# sits alone). Standalone stanzas carry a second field,
# standalone_economic_role, so the emitted atlas_city_names
# row has a real economic_role (the existing 10-value
# D-195/D-197 vocabulary — manufacturing | financial |
# agricultural | extraction | service_mixed | institutional |
# transit_hub | research | military | residential) instead
# of a generic fallback. CityTenant stanzas do not carry this
# field — no settlement is emitted for them, so it would be
# dead data.
# D-195/D-197 vocabulary). CityTenant stanzas do not carry
# this field — no settlement is emitted for them.
#
# THE BOUNDARY (Jeroen's ruling, T-1076 item 0 — supersedes the earlier
# bulk_class-derived default, which over-generalized: it mapped every
# physical-goods value Standalone and produced a winery and a leatherworks
# as standalone asteroid-belt settlements). Standalone applies ONLY where
# the HQ is ITSELF an industrial complex / company town:
#
# - extraction / mining / quarrying (the deposit IS the site)
# - heavy vehicle + shipyard manufacturing (the yard IS the site)
# - heavy energy: refinery / extraction complexes (the plant IS the site)
# - gate / orbital infrastructure fabrication (the works IS the site)
#
# EVERYTHING else is CityTenant — explicitly including craft/consumer
# manufacturing (distilleries, breweries, wineries, ceramics, textiles,
# furniture), agriculture of every scale (the estate/agribusiness OFFICE
# sits in a market town; the fields are not the HQ), and high-tech fabs.
# Jeroen's rendering note (recorded in D-242): CityTenant HQs often sit on
# a settlement's EDGE or in industrial clusters — that is rendering /
# district-placement color for later phases, NOT a third placement class.
#
# This file has exactly one stanza per corp_specialization value — the
# REUSED D-237 specialization_vocabulary id-space (see
# wiki/economics/specialization_vocabulary.toml): the original 27
# system-authored values plus 4 corp-only Services-extension values added
# alongside this file (trade_distribution, hospitality_hub,
# professional_services, licensed_clinical_services — real gaps the T-1074
# corp categorization pass found: ~10% of corps do logistics/hospitality/
# consulting/licensed-clinical work no original value covered; the fourth
# landed via PR #177 M1). D-242 asked for an authored "specialization -> HQ-placement
# map"; this vocabulary already exists and already carries the signal that
# decides placement (bulk_class_projected: NonPhysical vs everything else),
# so rather than invent a second, parallel corp-only taxonomy, the map below
# is this vocabulary keyed onto the two-value placement enum (D-242
# amendment, recorded 2026-07-16 alongside T-1074).
# system-authored values plus 4 corp-only Services-extension values
# (trade_distribution, hospitality_hub, professional_services,
# licensed_clinical_services). Flipped stanzas below carry a one-line
# justification against the boundary.
#
# The default follows bulk_class_projected exactly:
# NonPhysical (financial/institutional/media/legal/research services)
# -> CityTenant — an office; no physical plant needed.
# Everything else (BulkSolid/BulkLiquid/PrecisionDense/Perishable —
# farms, mines, refineries, shipyards, factories)
# -> Standalone — needs land/plant of its own.
#
# hq_placement is authored EXPLICITLY per value (not computed from
# bulk_class_projected at import time) so a future ticket can flip one
# value without touching import code — three values in the Services group
# (governance_center, transit_hub, research_station) are individually
# lore-ambiguous (a "transit hub" corp could plausibly BE its own
# spaceport-town, e.g. Gateway/Wolf 359 read as whole transit-identity
# systems in the vocabulary's own descriptions) but are pinned to the
# bulk_class_projected default here for consistency; revisit case-by-case
# if a specific corp's placement reads wrong once bodies are walkable.
#
# Decisions: D-242 (this map), D-237 (the reused vocabulary + the
# bulk_class_projected signal this defaults from). Ticket: T-1074.
# Decisions: D-242 (this map + the boundary), D-237 (the reused
# vocabulary). Tickets: T-1074 (map created), T-1076 item 0 (boundary
# correction). PR #177 review created the 4th extension value (M1).
# ==========================================================================
# -------------------------------------------------------------------------
# Agricultural — Standalone (farms/estates need land)
# Agricultural — ALL CityTenant (T-1076 item 0). The land/terroir is the
# production site, but the HQ is the estate/agribusiness office, and offices
# sit in market towns. (Previously Standalone via the bulk_class shortcut.)
# -------------------------------------------------------------------------
[estate_farming]
hq_placement = "Standalone"
standalone_economic_role = "agricultural"
hq_placement = "CityTenant"
# FLIPPED: estate agriculture — Jeroen's explicit example; the estate office
# sits in a market town, the manor grounds are not a corporate settlement.
[breadbasket]
hq_placement = "Standalone"
standalone_economic_role = "agricultural"
hq_placement = "CityTenant"
# FLIPPED: industrial-scale agribusiness is still agriculture — the grain
# combine's HQ is an office in the region's market hub, not a company town
# on the fields.
[terroir_agriculture]
hq_placement = "Standalone"
standalone_economic_role = "agricultural"
hq_placement = "CityTenant"
# FLIPPED: agriculture; the terroir lock is about the LAND, not the HQ.
[terroir_spirits]
hq_placement = "Standalone"
standalone_economic_role = "agricultural"
hq_placement = "CityTenant"
# FLIPPED: distilleries are craft manufacturing — Jeroen's explicit example
# (Groot Karoo Cellars as a standalone belt settlement was the named
# failure mode this correction eliminates).
[terroir_organics]
hq_placement = "Standalone"
standalone_economic_role = "agricultural"
hq_placement = "CityTenant"
# FLIPPED: herd/ecosystem-origin organics are agriculture; the fiber/dye
# house's HQ is a town office.
# -------------------------------------------------------------------------
# Energy — Standalone (extraction/refinery infrastructure)
# Energy — Standalone (heavy energy: the refinery/extraction complex IS the
# corporate site — explicitly inside Jeroen's boundary).
# -------------------------------------------------------------------------
[fuel_production]
hq_placement = "Standalone"
@@ -93,7 +94,8 @@ hq_placement = "Standalone"
standalone_economic_role = "extraction"
# -------------------------------------------------------------------------
# Extraction — Standalone (mine/quarry sits on the deposit)
# Extraction — Standalone (mining/quarrying: the deposit IS the site; the
# company town is the archetype of the whole Standalone class).
# -------------------------------------------------------------------------
[ore_extraction]
hq_placement = "Standalone"
@@ -116,11 +118,17 @@ hq_placement = "Standalone"
standalone_economic_role = "extraction"
# -------------------------------------------------------------------------
# Manufacturing — Standalone (factory/yard footprint)
# Manufacturing — SPLIT by the boundary: heavy vehicle/shipyard/gate works
# stay Standalone; craft/consumer fabrication flips to CityTenant.
# -------------------------------------------------------------------------
[general_industrial]
hq_placement = "Standalone"
standalone_economic_role = "manufacturing"
hq_placement = "CityTenant"
# FLIPPED: this value is carried overwhelmingly by craft/consumer
# fabricators (leatherworks, furniture, ceramics, glassworks, apparel —
# Kalahari Leatherworks as a standalone belt settlement was a named failure
# mode). Not heavy vehicle/shipyard work. A future true steel-complex
# identity would need its own vocabulary value rather than re-coarsening
# this one.
[shipbuilding]
hq_placement = "Standalone"
@@ -131,8 +139,9 @@ hq_placement = "Standalone"
standalone_economic_role = "manufacturing"
[consumer_goods_bazaar]
hq_placement = "Standalone"
standalone_economic_role = "manufacturing"
hq_placement = "CityTenant"
# FLIPPED: consumer manufacturing, and literally an urban bazaar of small
# workshops (Lu Ban) — the epitome of in-city production.
[gate_fabrication]
hq_placement = "Standalone"
@@ -143,19 +152,21 @@ hq_placement = "Standalone"
standalone_economic_role = "military"
# -------------------------------------------------------------------------
# High-tech — Standalone (fabrication/aquaculture plant)
# High-tech — CityTenant (T-1076 item 0: "high-tech fabs" are explicitly
# on Jeroen's CityTenant side of the boundary).
# -------------------------------------------------------------------------
[precision_tech]
hq_placement = "Standalone"
standalone_economic_role = "manufacturing"
hq_placement = "CityTenant"
# FLIPPED: high-tech fabs — Jeroen's explicit example; a cleanroom campus
# is an urban-edge tenant, not a company town.
[marine_farming]
hq_placement = "Standalone"
standalone_economic_role = "agricultural"
hq_placement = "CityTenant"
# FLIPPED: aquaculture is agriculture's marine twin — the operator's HQ
# sits in the harbor town, the kelp beds are not a settlement.
# -------------------------------------------------------------------------
# Services (all NonPhysical) — CityTenant (an office, no plant); no
# standalone_economic_role — no settlement is ever emitted for these.
# Services (all NonPhysical) — CityTenant (unchanged; an office, no plant).
# -------------------------------------------------------------------------
[financial_hub]
hq_placement = "CityTenant"
@@ -179,11 +190,7 @@ hq_placement = "CityTenant"
hq_placement = "CityTenant"
# -------------------------------------------------------------------------
# Services extension (4, all NonPhysical) — added alongside the vocabulary
# extension in specialization_vocabulary.toml (D-242/T-1074; the fourth via
# PR #177 M1). Same rule as the rest of Services: NonPhysical -> CityTenant
# (an office/depot/clinic, not a factory — this is exactly what made these
# corps hard to place in the original 27).
# Services extension (4, all NonPhysical) — CityTenant (unchanged).
# -------------------------------------------------------------------------
[trade_distribution]
hq_placement = "CityTenant"
+16 -13
View File
@@ -31,17 +31,20 @@
# markers.json pool. Every entry below is verified against real, repeated
# `make regen-db` runs — see the note on each stanza for its actual source
# row. Note (PR #177 H1/H3): corporations.headquarters_body is RECOMPUTED
# from source on every run now, so the three corp-named Standalone-HQ pins
# below (Cygni Combines, The Gate Corporation, Mastroianni Vehicle Group)
# hold because their HQ bodies carry real authored population — the
# population-first tiebreak re-derives the same body every run (verified:
# two consecutive regens, all 8 pins applied, zero placement drift) — not
# because a stale first-run value is being kept. Prometheus (GJ 702B) is
# DROPPED from this list — verified live: every one of its 12 bodies has
# zero authored markers.json city names AND zero population, so there is
# no settlement to pin at all (a genuine wiki content gap: the Reach's
# longevity-monopoly hero system has no named city anywhere — T-1115
# authors the missing names; the bake cannot invent a name to pin).
# from source on every run now, so the two corp-named Standalone-HQ pins
# below (The Gate Corporation, Mastroianni Vehicle Group) hold because
# their HQ bodies carry real authored population — the population-first
# tiebreak re-derives the same body every run — not because a stale
# first-run value is being kept. (T-1076 item 0: the former third
# corp-named pin, "Cygni Combines", was retired when Jeroen's placement
# boundary flipped general_industrial to CityTenant — that corp no longer
# emits a settlement; Cygni B's pin moved to its pure-pool city
# 'Metropolis'.) Prometheus (GJ 702B) is DROPPED from this list —
# verified live: every one of its 12 bodies has zero authored markers.json
# city names AND zero population, so there is no settlement to pin at all
# (a genuine wiki content gap: the Reach's longevity-monopoly hero system
# has no named city anywhere — T-1115 authors the missing names; the bake
# cannot invent a name to pin).
#
# Match key: (body_id, name) against atlas_city_names — NOT the numeric
# atlas_city_names.id, which is regen-volatile (AUTOINCREMENT, no
@@ -60,8 +63,8 @@ note = "Kallast / GJ 144 (Ran) — THE breadbasket; lore-anchored plains body (D
[[hero]]
body_id = "GJ820Bc"
name = "Cygni Combines"
note = "Cygni B / GJ 820B — shipbuilding cluster, 7 competing combines (D-237). D-242 Standalone-HQ settlement (general_industrial corp_specialization) — the corp's own settlement IS the hero identity here; the pure pool has only 'Metropolis' (generic)."
name = "Metropolis"
note = "Cygni B / GJ 820B — shipbuilding cluster, 7 competing combines (D-237). Pure-pool city. (T-1076 item 0: previously pinned the 'Cygni Combines' Standalone-HQ settlement, retired when general_industrial flipped CityTenant under Jeroen's placement boundary.)"
[[hero]]
body_id = "GJ251c"