Files
settled-reach/docs/workshops/system-economic-specialization/burnelli-sheldon-round2.md
T
jpmschweitzerandClaude Opus 4.8 33c083f0ef docs(workshops): system-economic-specialization rounds + outcomes
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>
2026-05-31 18:40:08 +02:00

394 lines
30 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.