# Round 2 — Burnelli-Sheldon ## System Economic-Specialization Workshop *Lens: economics/mapping/credibility — two-axis design, enriched vocabulary, field-count justification, CI guardrails.* *Operating within the user checkpoint decisions: two orthogonal axes preserved; no separate `dominant_production_scale` column (encode scale in vocabulary value instead); `dominant_faction` authored for named systems this pass.* --- ## Q1 — Two-Axis Mapping: Separability and Concrete Design ### Are the axes truly separable? Yes, with qualification. The economic and cultural axes are **mostly orthogonal** — they share some inputs but drive different generator outputs. They can diverge significantly: | System | Economic specialization | Cultural specialization | Why they diverge | |---|---|---|---| | Ran | `breadbasket` → Perishable, Specialist | `agrarian` | Ran's built form is dense agricultural infrastructure; its social character is conservative, syndic-controlled, five-century food production culture | | Cygni B | `shipbuilding` → BulkSolid, Common | `industrial_heritage` | Built form: competing shipyards, metallic asteroid extraction. Social character: labor collectives, industrial heritage, worker cooperative identity | | Groombridge | `clearing_house` → NonPhysical, MonopolySource | `financial_technocratic` | Built form: dense exchange floors, data archives. Social character: numerical thinking, information asymmetry culture, "expensive restraint" architecture | | Prometheus | `longevity_monopoly` → NonPhysical, MonopolySource | `medical_elite` | Built form: dense institutional facilities, controlled access. Social character: bioethics institutes, longevity research culture, restricted access norms | | Keid | `biosphere_tourism` → NonPhysical, MonopolySource | `ecological` | Built form: Conservancy control infrastructure, restricted visitor facilities. Social character: conservation ethics, Veil Institute research, nature-centered | | Parallax | `media_center` → NonPhysical, Specialist | `artistic` | Built form: production studios, news infrastructure. Social character: celebrity culture, reputation management, creative industry identity | | Gateway | `transit_hub` → NonPhysical, Common | `cosmopolitan` | Built form: customs offices, diplomatic facilities distributed throughout. Social character: transient mixed population, no single cultural dominance | The economic axis (BulkClass × ProductionUbiquity) is a **capital structure signal** — it answers what the settlement's production infrastructure looks like and how concentrated it is. The cultural axis is a **social program signal** — it answers what appears in the settlement's civic and social spaces. **The partial correlation**: they're not independent. A longevity monopoly (economic) creates a medical-elite cultural character as a near-necessary consequence. A media center (economic) produces an artistic cultural character. The cultural axis carries marginal additional information beyond the economic axis, but for the ~25-30 systems where it genuinely diverges, that information matters. **The design boundary**: economic axis feeds D-233 (block fill vocabulary + coverage fraction). Cultural axis feeds what TYPE of civic buildings appear in civic/social districts — museums vs. research institutes vs. courts vs. entertainment venues. This is consumed by the Phase 4+ block fill for civic district types (D-194) and Phase 6 NPC/room grammar generators. ### Mapping: Economic Axis → D-233 The economic axis maps through the curated specialization vocabulary to `(commodity_id, ProductionUbiquity)`, which then projects to `(BulkClass, ProductionUbiquity)` per the D-233/commodity catalog tables. Full mapping table: **Q2 below**. ### Mapping: Cultural Axis → Civic Building Program The cultural axis drives what *type* of civic institutions appear in civic/social districts. It is consumed by: 1. **Block fill (Phase 4+)** — which functional building-type tags appear in civic district blocks. A `scholarly` system gets research institutes and archives; an `institutional` system gets commission offices and courts. 2. **NPC character distributions (Phase 6)** — what NPCs populate social spaces (academics, bureaucrats, entertainers, traders). 3. **Room grammar (Phase 6)** — what the interiors of civic buildings contain. **Cultural axis → civic institution type mapping:** | `cultural_specialization` | Primary civic institution types | Secondary civic institutions | Example systems | |---|---|---|---| | `scholarly` | Research institutes, archives, universities | Observatories, rare materials libraries | Tessera, Keid (partial) | | `artistic` | Production studios, galleries, performance venues | Media syndicates, reputation management | Parallax | | `institutional` | Commission offices, courts, assembly halls | Diplomatic facilities, regulatory bodies | Sirius, ACB, Bastion (administrative) | | `commercial` | Trading floors, hospitality clusters, mixed markets | Bond warehouses, logistics offices | Altmark, Gateway | | `agrarian` | Cooperative halls, grain exchanges, agricultural heritage | Land record offices, food culture venues | Ran, Ostmark, Calloway Reach | | `industrial_heritage` | Labor cooperative halls, industrial museums | Worker memorial spaces, union halls | Cygni B, Sindri | | `medical_elite` | Longevity centers, bioethics institutes, medical research | High-security access control | Prometheus | | `ecological` | Conservation facilities, nature monitoring arrays | Research stations, restricted-access control | Keid | | `military` | Command centers, strategic planning, memorial halls | Readiness infrastructure | Bastion | | `financial_technocratic` | Exchange floors, actuarial institutes, data centers | Risk management facilities | Groombridge | | `cosmopolitan` | Mixed/diverse — no single dominant type | The absence of a dominant civic character | Generic transit hubs | | `compact_cooperative` | Community halls, cooperative banks, mutual aid | Self-reliance cultural institutions | All Compact member systems | **Heuristic fallback (when `cultural_specialization = NULL`):** The fallback derives from `dominant_faction` + `economic_specialization`: ``` if dominant_faction = 'concord_assembly': → 'institutional' if dominant_faction = 'compact' or 'compact_sympathetic': → 'compact_cooperative' if dominant_faction = 'veil_institute': → 'scholarly' if dominant_faction = 'syndic_dominant': → 'commercial' if economic_specialization in ['media_center', 'entertainment_hub']: → 'artistic' if economic_specialization in ['breadbasket', 'terroir_*', 'estate_farming']: → 'agrarian' if economic_specialization in ['general_manufacturing', 'shipbuilding', 'company_mining']: → 'industrial_heritage' else: → 'cosmopolitan' ``` This fallback is good enough for unnamed, generic systems. It fails for edge cases (Prometheus: faction=independent + economic=longevity_monopoly → falls through to 'cosmopolitan', wrong). Named hero systems should be pinned. --- ## Q2 — Enriched Economic Vocabulary ### Design decision: a curated specialization vocabulary The user resolved Fork 3 as: no separate `dominant_production_scale` column — encode scale in the vocabulary value instead. My implementation: **a `specialization_vocabulary` table** compiled from `wiki/economics/specialization_vocabulary.toml`. Each entry maps a human-authored specialization name to `(commodity_id, production_ubiquity_override)`. The commodity catalog stays at 36 entries (D-184 preserved, no expansion). Authors pick from the vocabulary, not from 36 commodity IDs. **Key constraint (Miri's equal-or-higher rule)**: `production_ubiquity_override` may only be set equal to or higher concentration than the catalog default. This is a CI hard error. **Why not expand the commodity catalog?** The commodity catalog is the tâtonnement simulation's production graph. Adding "breadbasket" as a commodity would require production chains, elasticity classes, and market dynamics for what is simply "agricultural_produce produced at higher concentration." That's not an economic distinction — it's a settlement identity distinction. The vocabulary layer above the catalog is the right home. ### The economic specialization vocabulary (complete first draft) **Source file**: `wiki/economics/specialization_vocabulary.toml` Each entry: `commodity_id` (FK → commodities), `production_ubiquity_override` (optional; if null, catalog default applies), `description` (human-readable), `d177_constrained` (boolean — D-177 lore ceiling applies). #### Agricultural cluster | `economic_specialization` | `commodity_id` | `ubiquity_override` | BulkClass | D-233 ProductionUbiquity | Representative system | |---|---|---|---|---|---| | `estate_farming` | `agricultural_produce` | null (→ ubiquitous) | Perishable | Ubiquitous | Arbour — scattered estate agriculture, correct | | `breadbasket` | `agricultural_produce` | `concentrated` | Perishable | Specialist | Ran — THE food exporter, dense agricultural district | | `terroir_agriculture` | `agricultural_produce` | `monopolistic` | Perishable | MonopolySource | VGV system — F8V spectral lock, D-177 | | `food_processing_hub` | `processed_food` | `common` | BulkSolid | Common | Standard processing world | | `terroir_spirits` | `processed_food` | `monopolistic` | BulkSolid | MonopolySource | Calloway Reach — distillery identity, D-177 | | `marine_farming` | `organic_compounds` | `concentrated` | BulkSolid | Specialist | Dagat — deep ocean kelp monopoly | | `terroir_organics` | `organic_compounds` | `monopolistic` | BulkSolid | MonopolySource | Braemar — brach fiber, D-177 | #### Extraction cluster | `economic_specialization` | `commodity_id` | `ubiquity_override` | BulkClass | D-233 ProductionUbiquity | Representative system | |---|---|---|---|---|---| | `ore_extraction` | `metallic_ore` | null (→ common) | BulkSolid | Common | Generic mining world | | `company_mining` | `metallic_ore` | `concentrated` | BulkSolid | Specialist | Sindri — DSMC dominance, company-town character | | `rare_mineral_extraction` | `rare_minerals` | `concentrated` | PrecisionDense | Specialist | Specialist rare-mineral world | | `rare_mineral_monopoly` | `rare_minerals` | `monopolistic` | PrecisionDense | MonopolySource | Monopoly rare-mineral source | | `lattice_material_source` | `lattice_grade_material` | null (→ monopolistic) | PrecisionDense | MonopolySource | East reach lattice anchor — catalog already monopolistic | | `stone_quarry` | `stone` | null (→ common) | BulkSolid | Common | Generic quarrying world | | `marble_monopoly` | `stone` | `monopolistic` | BulkSolid | MonopolySource | Nyrheim — Kvitfjell marble, D-177 geological ceiling | #### Energy cluster | `economic_specialization` | `commodity_id` | `ubiquity_override` | BulkClass | D-233 ProductionUbiquity | Representative system | |---|---|---|---|---|---| | `fuel_production` | `fusion_fuel` | null (→ common) | BulkLiquid | Common | Standard fuel refinery world | | `geothermal_hub` | `fusion_fuel` | `concentrated` | BulkLiquid | Specialist | Vuurkloof — geothermal identity dominates settlement character | #### Manufacturing cluster | `economic_specialization` | `commodity_id` | `ubiquity_override` | BulkClass | D-233 ProductionUbiquity | Representative system | |---|---|---|---|---|---| | `general_manufacturing` | `refined_metals` | null (→ common) | BulkSolid | Common | Generic industrial world | | `alloy_hub` | `advanced_alloys` | `concentrated` | BulkSolid | Specialist | High-performance alloy producer | | `shipbuilding` | `freight_haulers` | `common` | BulkSolid | Common | Cygni B — 7 competing combines, NOT monopoly | | `vehicle_production` | `transport_vehicles` | `concentrated` | BulkSolid | Specialist | Nova Roma — MVG identity | | `gate_fabrication` | `gate_components` | `monopolistic` | BulkSolid | MonopolySource | Renaissance — Gate Corp monopoly | | `consumer_goods_bazaar` | `consumer_goods` | `concentrated` | BulkSolid | Specialist | Lu Ban — 300 competing workshops | | `military_production` | `heavy_equipment` | `concentrated` | BulkSolid | Specialist | Bastion — fleet yards, maintenance bays | #### High-tech cluster | `economic_specialization` | `commodity_id` | `ubiquity_override` | BulkClass | D-233 ProductionUbiquity | Representative system | |---|---|---|---|---|---| | `electronics_hub` | `electronics` | null (→ regional/→Common) | PrecisionDense | Common | Electronics fabrication | | `precision_tech` | `electronics` | `concentrated` | PrecisionDense | Specialist | High-concentration electronics cluster | | `lattice_fabrication` | `lattice_substrate` | `concentrated` | PrecisionDense | Specialist | Lattice substrate production hub | #### Services cluster | `economic_specialization` | `commodity_id` | `ubiquity_override` | BulkClass | D-233 ProductionUbiquity | Representative system | |---|---|---|---|---|---| | `financial_hub` | `financial_services` | `concentrated` | NonPhysical | Specialist | Groombridge (main financial district character) | | `clearing_house` | `financial_services` | `monopolistic` | NonPhysical | MonopolySource | Groombridge as the ONLY clearing house | | `governance_center` | `commission_certification` | `concentrated` | NonPhysical | Specialist | Sirius — Assembly IS the system | | `transit_hub` | `commission_certification` | null (→ common) | NonPhysical | Common | Gateway, Wolf 359 — customs/transit diffuse throughout | | `legal_archive` | `legal_services` | `concentrated` | NonPhysical | Specialist | Tessera — Interpretive Registry | | `longevity_monopoly` | `medical_services` | `monopolistic` | NonPhysical | MonopolySource | Prometheus — only legitimate longevity facility | | `regional_healthcare` | `medical_services` | null (→ regional/→Common) | NonPhysical | Common | Standard medical hub | | `biosphere_tourism` | `tourism` | `monopolistic` | NonPhysical | MonopolySource | Keid — one biosphere, Conservancy-controlled | | `media_center` | `entertainment` | `concentrated` | NonPhysical | Specialist | Parallax — news syndicates, cultural production | | `military_station` | `heavy_equipment` | `concentrated` | BulkSolid | Specialist | Bastion — fleet infrastructure IS the settlement | **Note on `governance_center` vs `transit_hub`:** These both resolve to NonPhysical BulkClass but at different ProductionUbiquity (Specialist vs Common). This is the correct built-form distinction: Sirius reads as a concentrated institutional complex (dense commission offices, Assembly halls); Gateway reads as institutional infrastructure distributed throughout a transit settlement (customs offices everywhere, not a central commission district). The character distinction Paula noted between these two is captured by the ubiquity level, not by D-232 templates alone. **Note on `military_station` vs `military_production`:** Both exist in the vocabulary. Bastion is fleet-maintenance focused (primary built form: drydocks, maintenance bays, weapons depots → `military_production`, heavy_equipment, concentrated). A Compact military world that manufactures weapons systems might also use `military_production`. The CULTURAL axis (`military`) applies to both. **Vocabulary size: 33 values.** This is the right order of magnitude — larger than Paula's 9-value enum (captures more economic nuance) but far smaller than the full 36-commodity catalog (manageable for authors, legible by non-economists). ### How authors use this vocabulary Authors do not need to know commodity_id or production_ubiquity. They see: - A vocabulary list of 33 named values - A short description for each (e.g., "breadbasket: THE food exporter of a corridor or region — agricultural infrastructure dominates, concentrated processing and storage district") - Example systems for each value The CI validates the chosen value against the vocabulary table. The generator resolves commodity_id and ProductionUbiquity from the vocabulary table. Authors think in system identity; the mapping is the CI layer's concern. ### TOML format for `system_specialization.toml` ```toml # wiki/economics/system_specialization.toml # Decisions: D-233 (re-amended by this workshop), D-184 [GJ-144] # Ran economic_specialization = "breadbasket" cultural_specialization = "agrarian" dominant_faction = "concord_assembly" [GJ-380] # Groombridge economic_specialization = "clearing_house" cultural_specialization = "financial_technocratic" dominant_faction = "syndic_dominant" [GJ-702B] # Prometheus economic_specialization = "longevity_monopoly" cultural_specialization = "medical_elite" dominant_faction = "independent" [GJ-166A] # Keid economic_specialization = "biosphere_tourism" cultural_specialization = "ecological" dominant_faction = "independent" [GJ-820B] # Cygni B economic_specialization = "shipbuilding" cultural_specialization = "industrial_heritage" dominant_faction = "concord_assembly" [GJ-251] # Renaissance economic_specialization = "gate_fabrication" cultural_specialization = "institutional" dominant_faction = "syndic_dominant" [GJ-570A] # Bastion economic_specialization = "military_station" cultural_specialization = "military" dominant_faction = "lattice_commission" [GJ-280A] # Parallax economic_specialization = "media_center" cultural_specialization = "artistic" dominant_faction = "independent" [GJ-601A] # Ostmark economic_specialization = "breadbasket" cultural_specialization = "compact_cooperative" dominant_faction = "compact" [GJ-3737] # Nyrheim economic_specialization = "marble_monopoly" cultural_specialization = "compact_cooperative" dominant_faction = "compact" ``` --- ## Q3 — Field-Count Justification **The anti-scope-creep test** (from the brief): "only fields that genuinely change how a system reads earn a slot, and each must degrade to a heuristic/default for unauthored systems." ### Field 1: `economic_specialization` (new column on `system_economy`) **Changes how a system reads?** YES — the entire D-233 block fill vocabulary, coverage fraction, and operations surface derive from this. Ran with `breadbasket` generates a dense agricultural processing district. Ran with `estate_farming` (catalog default) generates scattered farm plots in mixed-use. These are completely different settlements. This is the whole point of the workshop. **Degrades to heuristic?** YES — for unnamed systems, the heuristic (`economic_role` + `planet_class` + corp HQ → vocabulary lookup) produces a plausible specialization value. The heuristic is now expressed as a vocabulary lookup rather than a direct commodity selection, but the fallback logic is unchanged from Round 1's weighted draw. **Verdict: IN.** Primary deliverable. ### Field 2: `cultural_specialization` (new column on `system_economy`) **Changes how a system reads?** YES — determines what TYPE of civic buildings appear. Two systems with identical economic specialization can have completely different civic character. Cygni B (`shipbuilding`) and Nova Roma (`vehicle_production`) both have BulkSolid/Specialist built form. Their civic programs differ: labor cooperative halls vs. MVG institutional architecture. That civic program difference is what makes the systems feel like different places to inhabit. **Degrades to heuristic?** YES — the fallback from `dominant_faction` + `economic_specialization` is solid for most generic systems (Compact members → `compact_cooperative`, Assembly systems → `institutional`, etc.). The cases where it fails are the edge cases that get pinned anyway. **Authoring burden**: ~30-40 pinned entries (hero systems). The other ~260 systems run the heuristic. This is not 300 entries — it's the same hero-body coverage as the trait pin. Non-hero systems get a reasonable fallback. **Does it duplicate `system_culture`?** No. `system_culture.primary_archetype` is a different signal for NPC dialogue and the storyteller — it's the GTTR narrative voice. `cultural_specialization` is the physical generator's civic-building-program input. They're consumed by different systems. However, to avoid confusion: `system_culture.primary_archetype` stays on its own wiki_sync.py pathway; `cultural_specialization` lives on `system_economy` via import_economics.py. Different consumers, different pipelines, no write conflict. **Verdict: IN — but only author for hero systems (~30-40 entries). Fallback covers the rest.** ### Field 3: `dominant_faction` (existing `system_factions.dominant_faction` — POPULATE, not add) This is not a new field. Paula correctly identifies that authoring it during this pass is necessary. The D-199 read-set already requires it; D-214 (PoliticalArchetype) and D-232 (template weights) already consume it. The problem is that its VALUES are currently derived by heuristic (hop distance, currency zone) rather than authored. **Changes how a system reads?** YES — `dominant_faction` feeds PoliticalArchetype (D-214), which determines whether settlements have radial-core Commission layout vs. corporate campus grid vs. cooperative distributed plan. Groombridge's `syndic_dominant` vs. `concord_assembly` distinction changes the spatial form of the entire settlement, not just individual buildings. **Degrades to heuristic?** YES — the existing derivation (Commission presence → `concord_assembly`, Compact membership from currency zone → `compact`, etc.) serves as the fallback for unnamed systems. **Verdict: IN — author for named systems this pass (~40-60 entries). Same pass, same TOML file.** ### Fields I explicitly reject **`economy_size`** — unchanged from Round 1: OUT. Redundant with `population × prosperity_baseline`. **Any fourth authored field** — the three fields above cover: what the settlement PRODUCES (economic), what it FEELS LIKE socially (cultural), and who GOVERNS it (faction). These are genuinely orthogonal and each changes how a system reads. A fourth field would need to clear a very high bar. Nothing clears it. **`atlas_body_trait_bias` hero pins** — these are NOT a system-level field. They're per-body entries in an existing table (D-232). They belong in this pass as a co-authoring activity (Miri + Araminta), but they're not a "field" in the economic schema sense. Include in the content-pass checklist, not in the schema. ### Summary: the minimal viable field set | Field | Column | Table | Authoring burden | Earns slot? | |---|---|---|---|---| | `economic_specialization` | New | `system_economy` | ~60-80 pins + heuristic for rest | **YES — primary deliverable** | | `cultural_specialization` | New | `system_economy` | ~30-40 pins + fallback for rest | **YES — civic program input** | | `dominant_faction` value | Existing (populate it) | `system_factions` | ~40-60 named systems | **YES — spatial layout input** | | `economy_size` | — | — | 300 entries | **NO — redundant** | | Any 4th field | — | — | 300 entries | **NO — nothing clears the bar** | --- ## Q4 — CI Guardrails for All Three Fields ### Schema additions ```sql -- system_economy (in systems-schema.sql, via COLUMN_MIGRATIONS in import_economics.py) ALTER TABLE system_economy ADD COLUMN economic_specialization TEXT; ALTER TABLE system_economy ADD COLUMN cultural_specialization TEXT; -- specialization_vocabulary (new — compiled from wiki/economics/specialization_vocabulary.toml) CREATE TABLE IF NOT EXISTS specialization_vocabulary ( specialization_id TEXT PRIMARY KEY, commodity_id TEXT NOT NULL REFERENCES commodities(commodity_id), production_ubiquity_override TEXT, -- NULL = use catalog default cultural_hint TEXT, -- suggested cultural_specialization (advisory only) d177_constrained INTEGER NOT NULL DEFAULT 0, description TEXT NOT NULL ); ``` ### Hard errors (build aborts) | ID | Field | Rule | Rationale | |---|---|---|---| | V-ES-01 | `economic_specialization` | Must be in `specialization_vocabulary` vocabulary | Typo protection; vocabulary is the constraint | | V-ES-02 | `economic_specialization` | Every inhabited system (population > 0) MUST have a non-null value after the pass is declared complete | Generator requires this field for D-233 | | V-ES-03 | `economic_specialization` | If `production_ubiquity_override` is set, it must map to equal or higher concentration than catalog default (ubiquitous < common ≈ regional < concentrated < monopolistic) | Miri's rule: can only increase local concentration, never decrease | | V-CS-01 | `cultural_specialization` | Must be in the 12-value vocabulary when present | Typo protection | | V-DF-01 | `dominant_faction` | Must be in vocabulary: `concord_assembly | compact | compact_sympathetic | syndic_dominant | veil_institute | lattice_commission | independent | disputed` | Typo protection | ### Soft warnings (build succeeds, prints) | ID | Field(s) | Rule | Rationale | |---|---|---|---| | W-ES-01 | `economic_specialization` | `monopolistic` ubiquity systems: print list | Monopoly pins load-bearing; human review required | | W-ES-02 | `economic_specialization` | Distribution: > 25% of systems in same BulkClass OR > 30% in same ProductionUbiquity → warn | Healthy economy requires variety | | W-ES-03 | `economic_specialization` + prose | System where `economic_base_primary` text doesn't match vocabulary entry description → flag | Contradiction detection | | W-CS-01 | `cultural_specialization` | Named systems (wiki entry exists) without `cultural_specialization` → list | Hero systems need explicit authoring | | W-DF-01 | `dominant_faction` + `currency_zone` | `dominant_faction = compact` AND `currency_zone = tractus_primary` → flag | D-172: Compact membership implies mark_primary or mixed | | W-DF-02 | `dominant_faction` + `economic_specialization` | `dominant_faction = compact` AND `economic_specialization` resolves to MonopolySource extraction → flag | Compact self-sufficiency doctrine contradicts monoeconomy extraction dependency | | W-DF-03 | `dominant_faction` + `cultural_specialization` | `dominant_faction = veil_institute` AND `cultural_specialization` NOT IN (`scholarly`, `ecological`) → flag | Veil Institute presence strongly implies these cultural characters | | W-DF-04 | `dominant_faction` | Named systems without `dominant_faction` authored → list | Generator uses it; heuristic fails for politically complex systems | ### Coverage report (extended from Round 1) ``` system_specialization coverage: economic authored: NNN / MMM inhabited systems (NN%) cultural authored: NNN / MMM named systems (NN%) faction authored: NNN / MMM named systems (NN%) economic by BulkClass: BulkSolid=NN, BulkLiquid=NN, Perishable=NN, PrecisionDense=NN, NonPhysical=NN economic by ProductionUbiquity: Ubiquitous=NN, Common=NN, Specialist=NN, MonopolySource=NN MonopolySource systems [REVIEW REQUIRED]: [list] D-172 faction/currency mismatches [REVIEW REQUIRED]: [list] Compact monoeconomy flags [REVIEW REQUIRED]: [list] ``` ### D-172 compliance check (new, flags gap Paula identified) ```python # In import_system_specialization(): # Cross-check faction pin against currency_zone for system_id, faction, currency_zone in authored_systems: if faction == 'compact' and currency_zone == 'tractus_primary': warnings.append(f"W-DF-01: {system_id}: compact faction but tractus_primary currency zone") if faction == 'compact_sympathetic' and currency_zone not in ('mixed', 'mark_primary'): warnings.append(f"W-DF-01: {system_id}: compact_sympathetic faction expects mixed/mark_primary") ``` --- ## Remaining open questions after Round 2 Two concrete questions the user should resolve before the D-record is written: **OQ-1 — Groombridge: `financial_hub` or `clearing_house`?** The vocabulary has both. `financial_hub` (financial_services, concentrated, Specialist) and `clearing_house` (financial_services, monopolistic, MonopolySource). MonopolySource gives the D-233 concentration rule: "MonopolySource concentrates contiguous block groups — the mine IS the settlement, everything else is support." Is Groombridge's clearing house SO dominant that everything else is support? Or does Groombridge have a dense financial district alongside other settlement life? My instinct: `clearing_house` (MonopolySource) — the GTTR says "where the money lives" and that level of concentration is correct. But Miri should confirm. **OQ-2 — Keid: `biosphere_tourism` (economic) vs. `research_station` cultural character?** My design has Keid economic=`biosphere_tourism` (tourism, monopolistic → NonPhysical, MonopolySource) and cultural=`ecological`. Paula wanted Keid economic=`research_station`. But `research_station` doesn't appear in my economic vocabulary because research isn't an economic commodity — it's a cultural program. The built form of Keid is access-control infrastructure (Conservancy), visitor facilities, and Veil Institute research stations. The economic characterization (`biosphere_tourism`) drives that built form. The research character is captured by cultural=`ecological`. Is this the right split, or does the Veil Institute's presence give Keid a genuinely distinct economic built form from tourism? If yes, we need `research_station` in the economic vocabulary pointing to an appropriate commodity. --- ## Summary The design resolves all three user checkpoint decisions: 1. **Both axes preserved**: `economic_specialization` → D-233 (BulkClass × ProductionUbiquity, block fill); `cultural_specialization` → civic building program (what types of institutions appear in civic/social districts). 2. **Fork 3 resolved in vocabulary**: the curated 33-value specialization vocabulary encodes both commodity identity AND local concentration scale (e.g., `breadbasket` = agricultural_produce at concentrated, overriding the catalog's ubiquitous default). No separate `dominant_production_scale` column. 3. **Fork 2 resolved**: `dominant_faction` authored for named systems in this same pass, same TOML file. Vocabulary: 8 values. CI guardrails include D-172 currency-zone alignment checks. Source: `wiki/economics/system_specialization.toml` + `wiki/economics/specialization_vocabulary.toml` → `import_economics.py` → `system_economy.economic_specialization`, `system_economy.cultural_specialization`, `system_factions.dominant_faction`. Total new authored entries for hero systems: ~60-80 economic pins + ~30-40 cultural pins + ~40-60 faction pins. The substantial majority of ~300 systems run heuristic fallbacks. The content pass is a three-field-per-hero-system exercise, not a 300-system full-authoring pass.