Three-round design workshop (Miri, Burnelli-Sheldon, Paula; documented by Qatux, ticketed by SI) that produced D-237. Includes per-agent round outputs, round notes, the independent scout critique, and the final workshop-outcomes.md with the consolidated schema, 27-value economic vocabulary, cultural + faction vocabularies, deterministic-varied fallback spec, must-pin table, and CI guardrails. Clerk-Skip: workshop discussion docs, no D-record surface (D-237 filed separately) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
394 lines
30 KiB
Markdown
394 lines
30 KiB
Markdown
# 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.
|