Files
settled-reach/docs/workshops/system-economic-specialization/workshop-outcomes.md
T
jpmschweitzerandClaude Opus 4.8 943f2e7749 docs(workshops): add decision_refs provenance frontmatter (pql migration phase 5)
Workshop -> decision provenance was prose-only. Adds a `decision_refs:` YAML
frontmatter list (the confirmed D-records each workshop-outcomes.md touches,
filtered against the governance decision set) to all 17 workshop outcomes; the two
that lacked frontmatter (commodity-catalog, system-economic-specialization) get a
minimal block. pql indexes the list and `SELECT fm.decision_refs` round-trips it, so
"which workshops touch D-NNN" is answerable via SELECT + filter or `pql search`.

decision_refs is a relevance signal (decisions a workshop discusses/produces), not a
strict authorship claim — historical bare refs aren't disambiguated. Generated wiki
read-only sections are left untouched.

Noted in pql-requirements #5: 1.6.2 has no working DSL operator for frontmatter
list-membership (`~`/`contains` error, `in` matches nothing), so membership queries
need a client-side filter for now.

Reproducible via tooling/pql-migrate/add_workshop_provenance.py (idempotent).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 13:06:33 +02:00

32 KiB
Raw Blame History

title, type, workshop, status, decision_refs
title type workshop status decision_refs
Workshop Outcomes: system-economic-specialization workshop system-economic-specialization archived
D-010
D-172
D-174
D-177
D-184
D-197
D-199
D-214
D-220
D-222
D-232
D-233
D-237
D-238

Workshop Outcomes — System Economic-Specialization

Workshop: system-economic-specialization | Date: 2026-05-31 Participants: Miri, Burnelli-Sheldon, Paula | Documenter: Qatux

Status: FILED — D-237 added to decisions/architecture.md (2026-05-31); D-233 re-amended. Human approved at final wrap-up checkpoint.


1. Summary: The Three-Field Authored Specialization Layer

Every inhabited named star system carries three authored fields sourced from a single TOML file. These fields are:

  • Static, t=0 — read at build time, never runtime state
  • Deterministic (D-010 compliant) — same source files + world_seed = same result every run
  • Authored lore wins — heuristic is fallback only for unnamed/unspecified systems
  • No PressureState, no tâtonnement, no save-state

The three fields

Field Column Table What it drives Default for unautored
economic_specialization New system_economy D-233: BulkClass × ProductionUbiquity → block fill, coverage, operations surface Seed-hashed weighted draw over vocabulary (deterministic-varied)
cultural_specialization New system_economy D-232: template pool selection (corridor or divergent-heritage override) Corridor assignment (D-232 existing algorithm)
dominant_faction Existing (populate) system_factions D-214 (PoliticalArchetype), D-232 (template weights), D-174 (shadow economy), D-172 (currency zone validation) Commission presence + currency zone derivation (existing)

Source and pipeline

wiki/economics/system_specialization.toml  ─┐
wiki/economics/specialization_vocabulary.toml  ─┤  import_economics.py  →  systems.db
                                              └─┘
  ↓
  system_economy.economic_specialization
  system_economy.cultural_specialization
  system_factions.dominant_faction         (UPSERT — column already exists)

TOML format (one stanza per system)

# wiki/economics/system_specialization.toml
# NULL = absent = heuristic fallback runs
# Decisions: D-[236] (this workshop)

[GJ-144]  # Ran
economic_specialization = "breadbasket"
cultural_specialization = "agrarian"
dominant_faction        = "concord_assembly"

[GJ-380]  # Groombridge
economic_specialization = "financial_hub"
cultural_specialization = "financial_technocratic"
dominant_faction        = "syndic_dominant"

Schema changes

-- In systems-schema.sql; via COLUMN_MIGRATIONS in import_economics.py (idempotent)
ALTER TABLE system_economy ADD COLUMN economic_specialization TEXT;
ALTER TABLE system_economy ADD COLUMN cultural_specialization TEXT;

-- New vocabulary reference table (compiled from 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
    bulk_class_projected        TEXT NOT NULL,  -- pre-computed BulkClass for D-233
    production_ubiquity_projected TEXT NOT NULL, -- pre-computed ProductionUbiquity for D-233
    description                 TEXT NOT NULL
);

2. Economic Specialization Vocabulary (27 values)

Each value maps to (commodity_id, production_ubiquity_override_or_null), which projects to (BulkClass, ProductionUbiquity) per D-233. Scale is encoded in the value — no separate scale column.

Equal-or-higher rule (Miri): production_ubiquity_override may only be equal or higher concentration than the commodity catalog's global production_ubiquity. CI hard error V-SES-03 enforces this.

Agricultural cluster (5 values)

economic_specialization commodity_id ubiquity_override BulkClass ProductionUbiquity Example system
estate_farming agricultural_produce null → Ubiquitous Perishable Ubiquitous Arbour — scattered amenity agriculture
breadbasket agricultural_produce concentrated Perishable Specialist Ran — dense agricultural processing district
terroir_agriculture agricultural_produce monopolistic Perishable MonopolySource VGV/Confluent — F8V spectral lock, D-177
terroir_spirits processed_food monopolistic BulkSolid MonopolySource Calloway Reach — distillery terroir, D-177
terroir_organics organic_compounds monopolistic BulkSolid MonopolySource Braemar (brach fiber), Dagat (kelp/Blue dye), D-177

Energy cluster (2 values)

economic_specialization commodity_id ubiquity_override BulkClass ProductionUbiquity Example system
fuel_production fusion_fuel null → Common BulkLiquid Common Generic fuel refinery world
geothermal_hub fusion_fuel concentrated BulkLiquid Specialist Vuurkloof — settlement built on thermal infrastructure

Extraction cluster (5 values)

economic_specialization commodity_id ubiquity_override BulkClass ProductionUbiquity Example system
ore_extraction metallic_ore null → Common BulkSolid Common Generic mining world
company_mining metallic_ore concentrated BulkSolid Specialist Sindri — DSMC company town
marble_monopoly stone monopolistic BulkSolid MonopolySource Nyrheim — Kvitfjell marble, D-177
rare_mineral_extraction rare_minerals null → Concentrated PrecisionDense Specialist Specialist rare-mineral world
lattice_material_source lattice_grade_material null → Monopolistic PrecisionDense MonopolySource East reach lattice anchor (catalog already monopolistic)

Manufacturing cluster (6 values)

economic_specialization commodity_id ubiquity_override BulkClass ProductionUbiquity Example system
general_industrial refined_metals null → Common BulkSolid Common Generic manufacturing world
shipbuilding freight_haulers common BulkSolid Common Cygni B — 7 competing combines, NOT MonopolySource
vehicle_production transport_vehicles concentrated BulkSolid Specialist Nova Roma — MVG identity
consumer_goods_bazaar consumer_goods concentrated BulkSolid Specialist Lu Ban — 300 competing workshops
gate_fabrication gate_components null → Monopolistic BulkSolid MonopolySource Renaissance — Gate Corp
military_industrial heavy_equipment concentrated BulkSolid Specialist Bastion — fleet yards, depots

Note: military_industrial merges military_production + military_station — same (BulkClass, ProductionUbiquity, cultural character).

High-tech cluster (2 values)

economic_specialization commodity_id ubiquity_override BulkClass ProductionUbiquity Example system
precision_tech electronics concentrated PrecisionDense Specialist Zenzele — hardening components, expertise-based
marine_farming organic_compounds concentrated BulkSolid Specialist Dagat (when not monopolistic) — absorbed into terroir_organics for confirmed D-177 cases

Services cluster (7 values)

economic_specialization commodity_id ubiquity_override BulkClass ProductionUbiquity Example system
financial_hub financial_services concentrated NonPhysical Specialist Groombridge — dense financial cluster + GSH landmark
governance_center commission_certification concentrated NonPhysical Specialist Sirius, ACB
transit_hub commission_certification null → Common NonPhysical Common Gateway, Wolf 359, Dài Lộ, Altmark
research_station commission_certification concentrated NonPhysical Specialist Keid — research access, Conservancy biosphere (Miri addition)
legal_archive legal_services concentrated NonPhysical Specialist Tessera — Assembly Interpretive Registry
media_center entertainment concentrated NonPhysical Specialist Parallax — news syndicates, cultural production
longevity_monopoly medical_services monopolistic NonPhysical MonopolySource Prometheus — only longevity facility in the Reach

Total: 27 values. Three edge-case values (rare_mineral_extraction, marine_farming, legal_archive) have no confirmed hero system anchor; retain for the content pass and retire after 300-system review if unused.


3. Groombridge: Cluster + Singular Landmark Encoding

Economic specialization: financial_hub (NonPhysical × Specialist)

This produces a dense cluster of financial buildings throughout the settlement: exchange floors, actuarial institutes, data centers, credit facilities. GTTR confirmation: "financial houses...for four centuries...architecture understated in the way that communicates expense." Multiple institutions, not a single monopoly compound. Specialist is correct.

The GSH landmark: The Groombridge Settling House is a MonopolySource-class institution (the Reach's primary clearing house) but exists WITHIN the Specialist financial cluster — not as the organizing principle of the entire settlement. It is expressed via:

  1. D-222 multi-block reservation — reserved block at generation time for a singular named institution
  2. D-232 atlas_body_trait_bias hero pin — forces a clearing_house_landmark template onto the reserved block

This is NOT a fourth field and NOT a composite vocabulary value. The vocabulary expresses district-level built form; landmark-level identity is the D-232/D-222 mechanism.


4. Cultural Specialization Vocabulary

cultural_specialization carries two value types in a single field. Heritage-type values take precedence when both activity and heritage apply.

Activity/character values (12 — from Burnelli-Sheldon)

These apply when the system's cultural character is defined by what it DOES, not by a divergent founding heritage.

Value D-232 template direction Example systems
scholarly Research institutes, archives Tessera, Keid
artistic Studios, galleries, media infrastructure Parallax
institutional Commission offices, courts, assembly halls Sirius, ACB, Wolf 359, Prometheus, Renaissance
financial_technocratic Exchange floors, data centers, private character Groombridge
commercial Trading floors, mixed markets, hospitality Altmark, Gateway
agrarian Cooperative halls, grain exchanges, harvest infrastructure Ran, Arbour, Ostmark
industrial_heritage Labor cooperative halls, fabrication museums, occupational pride Cygni B, Sindri, Renaissance, Bastion (adj.)
medical_elite Longevity centers, bioethics institutes Prometheus
ecological Conservation infrastructure, nature monitoring Keid
military Command centers, strategic infrastructure, memorial halls Bastion
cosmopolitan Mixed/diverse; no single dominant civic type Gateway, Altmark, Dài Lộ
compact_cooperative Community halls, cooperative banks, self-reliance institutions All Compact member systems

Heritage-type values (GTTR-confirmed at time of workshop — expandable in content pass)

These apply when a system's founding heritage diverges from its corridor baseline. The corridor would produce wrong D-232 templates without the pin.

Value Corridor it overrides GTTR-confirmed systems GTTR evidence
scottish north_reach (British/Australian) Calloway Reach (GJ-3325), Braemar (GJ-475) Braemar = Scottish Highland village; Calloway terroir Highland whisky tradition
french_provencal west_reach (German/Dutch/Nordic) Confluent/VGV (GJ-395) "founding families Loire viticulture tradition"; Société Chimique (French)
vietnamese east_reach (Korean/Japanese) Dài Lộ (GJ-136) GTTR explicit: "Vietnamese is the dominant cultural substrate...four centuries"
afrikaans_cape south_reach (Portuguese/Swahili) Vuurkloof (GJ-35) GTTR explicit: "Afrikaner and Cape Coloured families predominate in the oldest established lineages"
zulu south_reach (Portuguese/Swahili) Zenzele (GJ-1111) GTTR explicit: "chartered...by wave 3 Zulu-heritage emigrants...maintained through language instruction, naming convention"
chinese east_reach (Korean/Japanese) Lu Ban (GJ-15A) GTTR explicit: "name honors the patron of craftsmen in the Chinese tradition carried by the founding workforce"
italian_northern west_reach (German/Dutch/Nordic) Nova Roma (GJ-764) Mastroianni family, MVG = Manifattura Veicoli Gherardi; "Nova Roma" as deliberate Italian cultural claim
tagalog east_reach (Korean/Japanese) Dagat (GJ-482A) "Dagat" = sea in Filipino/Tagalog; Blue Collective; Pacific maritime heritage
norse_compact west_reach (German/Dutch/Nordic) Nyrheim (GJ-3737) Bífröst Marmor (Norse mythological bridge); "Nyrheim" = Norwegian for "new home"

Content pass scope: ~60-100 GTTR-named systems. Authoring criterion: "GTTR entry names a founding community whose heritage diverges from the corridor baseline." Triage method: (1) system name language, (2) corp/institution name language, (3) GTTR founding community mention, (4) corridor default if none. See Miri's Round 3 §2 for full triage protocol.


5. dominant_faction Vocabulary (8 values, final)

lattice_commission dropped. mixed replaces it for multi-polar systems.

concord_assembly     — governed by or strongly Assembly-affiliated
compact              — formal Compact of Westphalia signatory
compact_sympathetic  — Compact-aligned but not formal signatories
syndic_dominant      — Syndic interests functionally govern
veil_institute       — Institute has effective overriding authority
independent          — self-governing non-affiliated
disputed             — contested or fractured governance
mixed                — multiple significant factions, no single dominant

Heuristic fallback for unnamed systems:

  • Hop 05, any corridor → concord_assembly
  • Hop 6+, west_reach, MARK_PRIMARY currency → compact
  • Hop 56, west_reach, MIXED currency → compact_sympathetic
  • Hop 7+, any other corridor → independent
  • Tier-1 monopolist corp sole HQ → syndic_dominant (flag for confirmation)
  • Institute-claimed facility → veil_institute (flag for confirmation)

6. Deterministic-Varied Fallback (Economic Axis)

For unnamed systems, economic_specialization is derived via a seed-hashed weighted draw. NOT a flat one-to-one mapping — the noise term prevents all unnamed agricultural worlds from being identical.

Algorithm (all weights integer basis-points, D-010 compliant):

// Weights
W_ROLE_PRIMARY = 8_000   // dominant signal from system_economy.economic_role
W_ROLE_SECONDARY = 3_000 // secondary role signals
W_CORP = 5_000           // corp HQ primary operation
W_NOISE = 400            // small weight to EVERY vocabulary value (variety term)

// Seed derivation
seed = SeedChain::root(world_seed)
    .derive(SeedDomain::Layer1System, fnv1a_64(system_id))
    .seed()
rng = AtlasRng::new(splitmix64(seed))

Role → candidate mapping:

economic_role Primary (W=8,000) Secondary (W=3,000)
agricultural breadbasket estate_farming, terroir_agriculture
extraction ore_extraction company_mining, fuel_production
manufacturing general_industrial shipbuilding, vehicle_production
financial financial_hub governance_center
service_mixed transit_hub governance_center
research research_station precision_tech
transit_hub transit_hub governance_center
institutional governance_center legal_archive
military military_industrial governance_center
residential estate_farming general_industrial

Distribution outcome: Primary candidate wins ~90% for clear cases, ~60-70% for mixed signals. ~5-10% draw off-primary values. D-233 output varies across 200 unnamed systems instead of clustering identically.

Cultural and faction fallback: Corridor assignment (D-232 existing) for cultural_specialization; Commission/currency derivation for dominant_faction. No noise term — these are stable, not varied.


7. Full Must-Pin Table

All confirmed by lore/GTTR verification from Miri (economic + cultural) and Paula (faction). 27 named systems.

System GJ ID economic_specialization cultural_specialization dominant_faction
Ran GJ-144 breadbasket agrarian concord_assembly
Cygni B GJ-820B shipbuilding industrial_heritage concord_assembly
Sindri GJ-3522 company_mining industrial_heritage syndic_dominant
Nova Roma GJ-764 vehicle_production italian_northern concord_assembly
Renaissance GJ-251 gate_fabrication industrial_heritage syndic_dominant
Groombridge GJ-380 financial_hub financial_technocratic syndic_dominant
Prometheus GJ-702B longevity_monopoly medical_elite independent
ACB GJ-559B governance_center institutional concord_assembly
Tessera GJ-3877 legal_archive scholarly concord_assembly
Sirius GJ-244A governance_center institutional concord_assembly
Parallax GJ-280A media_center artistic independent
Gateway GJ-71 transit_hub cosmopolitan mixed
Wolf 359 GJ-406 transit_hub institutional concord_assembly
Vuurkloof GJ-35 geothermal_hub afrikaans_cape independent

| Keid | GJ-166A | research_station | scholarly | independent | | Bastion | GJ-570A | military_industrial | military | concord_assembly | | Arbour | GJ-338B | estate_farming | agrarian | concord_assembly | | Lu Ban | GJ-15A | consumer_goods_bazaar | chinese | independent | | Calloway Reach | GJ-3325 | terroir_spirits | scottish | independent | | Confluent/VGV | GJ-395 | terroir_agriculture | french_provencal | compact_sympathetic | | Braemar | GJ-475 | terroir_organics | scottish | independent | | Nyrheim | GJ-3737 | marble_monopoly | norse_compact | compact | | Ostmark | GJ-601A | breadbasket | compact_cooperative | compact | | Dagat | GJ-482A | terroir_organics | tagalog | independent | | Altmark | GJ-357 | transit_hub | cosmopolitan | independent | | Dài Lộ | GJ-136 | transit_hub | vietnamese | independent | | Zenzele | GJ-1111 | precision_tech | zulu | independent |

Additional Paula faction pins (not in Miri's table but needed):

System GJ ID dominant_faction Notes
Sol GJ 0 disputed Post-Secession; no settled governance
Struve GJ 725B disputed Dormant gate; jurisdictional unsettled
Barnard's Star GJ 699 concord_assembly Cygni B commuter suburb
Freiholt GJ 453 compact Compact co-drafter
Groenland GJ 3333 compact Trade economics motivated
Echternach GJ 127B compact Medical supply dependency
Changwon GJ 860B independent Bicameral self-governing junction
All ~30-40 formal Compact west_reach members various compact Apply self-sufficiency review rule

8. CI Guardrails

Hard errors (build aborts)

ID Field Rule
V-SES-01 economic_specialization Must be in specialization_vocabulary when present
V-SES-02 economic_specialization Inhabited systems (population > 0): must have non-null authored value OR fallback must successfully derive one
V-SES-03 economic_specialization production_ubiquity_override must be ≥ catalog default concentration (cannot claim lower concentration than globally true)
V-SES-04 cultural_specialization Must be in the combined activity+heritage vocabulary when present
V-SES-05 dominant_faction Must be in the 8-value vocabulary when present
V-SES-06 FK specialization_vocabulary.commodity_id must exist in commodities(commodity_id)

Soft warnings (build succeeds, prints)

ID Field(s) Rule
W-SES-01 economic_specialization Resolved MonopolySource systems: print list for human review (D-177 check)
W-SES-02 economic_specialization >25% of inhabited systems resolve to same vocabulary value
W-SES-03 economic_specialization + prose economic_base_primary text doesn't mention commodity/sector from vocabulary
W-SES-04 dominant_faction + currency_zone compact + tractus_primary currency → D-172 violation
W-SES-05 dominant_faction + economic_specialization compact + MonopolySource resolved (except D-177 terroir/geological values)
W-SES-06 dominant_faction + cultural_specialization compact + cultural_specialization authored without Compact-doctrine reference
W-SES-07 dominant_faction Named systems (GTTR entry) without authored dominant_faction → list
W-SES-08 economic_specialization estate_farming + population > 5_000_000 → likely should be breadbasket

Coverage report output

system_specialization pass coverage:
  economic: NNN / MMM inhabited systems authored (NN%); NNN on fallback
  cultural: NNN / MMM named systems authored (NN%); NNN on corridor default
  faction:  NNN / MMM named systems authored (NN%); NNN on derivation

  economic BulkClass: BulkSolid=NN | BulkLiquid=NN | Perishable=NN | PrecisionDense=NN | NonPhysical=NN
  economic ProductionUbiquity: Ubiquitous=NN | Common=NN | Specialist=NN | MonopolySource=NN
  MonopolySource systems [D-177 REVIEW]: [list]
  D-172 faction/currency mismatches [REVIEW]: [list]
  Compact monoeconomy flags [REVIEW]: [list]

9. Content Pass Summary

Author Scope Count estimate
Miri economic_specialization + cultural_specialization for named/hero systems + all D-177 terroir pins ~80-100 economic; ~60-100 cultural (divergent-heritage scope)
Paula dominant_faction for all Compact members + political capitals + contested systems ~40-60 faction pins
Burnelli-Sheldon Economic credibility review of all ~300 entries; fallback algorithm validation; distribution balance Review only (no new authoring)
All three atlas_body_trait_bias hero pins (~30-40 bodies) as co-authoring — separate from this pass ~30-40 D-232 entries

10. Draft D-Records

D-237 filed to decisions/architecture.md 2026-05-31. D-233 re-amended same date. D-238 (stray duplicate) deleted from DB.


D-237: Authored System Specialization Layer

(Filed to decisions/architecture.md 2026-05-31 — see that file for the canonical record.)

  • Date: 2026-05-31

  • Decision: Each inhabited star system carries three authored per-system identity fields, statically compiled from wiki/economics/system_specialization.toml at build time via import_economics.py. These fields constitute the lore-authored identity layer above the heuristic and are the primary source for D-233/D-232/D-214 generator inputs for named systems.

    Three fields:

    (1) system_economy.economic_specialization TEXT (new column) A 27-value curated vocabulary compiled from wiki/economics/specialization_vocabulary.toml into the specialization_vocabulary DB table. Each value maps to (commodity_id, production_ubiquity_override_or_null)(BulkClass, ProductionUbiquity) for D-233. Scale is encoded in the vocabulary value — no separate scale column. The vocabulary respects the equal-or-higher concentration rule: an override may only assign equal or higher concentration than the commodity's global production_ubiquity. Authored for ~80-100 named systems; heuristic fallback for ~200 unnamed (deterministic-varied weighted draw — see below).

    (2) system_economy.cultural_specialization TEXT (new column) A combined vocabulary directing D-232's template pool when a system's cultural character diverges from corridor baseline. Two value subtypes co-exist in one field: activity/character values (what the system does culturally — agrarian, industrial_heritage, institutional, etc.) and heritage-type values (founding ethnic heritage that overrides corridor defaults — scottish, vietnamese, tagalog, zulu, afrikaans_cape, chinese, italian_northern, french_provencal, norse_compact, etc.). Heritage values take precedence when both apply. NULL = use corridor default (D-232's existing algorithm). Authored for ~60-100 systems where corridor default would produce wrong architectural templates for Phase 4 correctness, not merely Phase 6 enrichment. Does NOT replace system_culture.cultural_register (prose/NPC/narrative voice consumed by dialogue generators); this field is consumed by the physical generator (D-232) only.

    (3) system_factions.dominant_faction TEXT — populated, not added Column already exists (D-199 field 4); VALUES for named systems are authored in this pass. 8-value vocabulary: concord_assembly | compact | compact_sympathetic | syndic_dominant | veil_institute | independent | disputed | mixed. lattice_commission is dropped — Commission is a regulatory body, not a governing faction; ACB and Bastion are concord_assembly. Authored for ~40-60 named systems; existing derivation (Commission presence + currency zone) serves as fallback.

    Heuristic fallback (economic axis, deterministic-varied): For unnamed systems, economic_specialization is derived via a seed-hashed weighted draw over the vocabulary. Weight table: economic_role primary signal (W=8,000 bps), corp HQ specialization (W=5,000 bps), noise term W=400 to every vocabulary value. The noise term ensures ~5-10% of unnamed systems draw an off-primary value — preventing all unnamed agricultural worlds from being identical. Deterministic: SeedChain(world_seed).derive(Layer1System, fnv1a_64(system_id)) produces the same value run-to-run.

    Groombridge landmark mechanism: Where a system's authored identity includes a singular MonopolySource-class institution within a Specialist-scale district (Groombridge: financial_hub/Specialist + GSH clearing house as landmark), the district character is encoded as Specialist in the vocabulary. The singular landmark is expressed via D-222 multi-block reservation + D-232 atlas_body_trait_bias hero pin. The vocabulary expresses district-level character; landmark-level identity is the D-232/D-222 mechanism.

    CI: 6 hard errors (vocabulary FK integrity, inhabitance coverage, production_ubiquity monotonicity, vocabulary constraint for all three fields), 8 soft warnings (MonopolySource review, distribution balance, prose/field divergence, D-172 faction/currency alignment, Compact monoeconomy flag, authoring gap lists). Full spec in CI guardrails section of this workshop document.

  • Rationale: The pre-existing D-233 heuristic (economic_role + corp HQ + planet_class → dominant commodity) fails predictably for: (1) output-vs-input confusions (Cygni B: heuristic sees ore inputs, not freight_hauler outputs); (2) political mandates (Groombridge: financial infrastructure is an institutional choice, not geographic necessity); (3) terroir-locked production (D-177 systems: catalog defaults are globally-ubiquitous, not locally-monopolistic); (4) service economies (Prometheus, Keid: no heuristic path from available signals). The three-field authored layer resolves all four failure modes. The three-field minimum is justified: economic (D-233 block fill), cultural (D-232 template selection), faction (D-214 political archetype). No field is redundant; each changes how a system reads in Phase 4. The cultural_specialization field was argued on quality grounds (Paula addendum): without it, systems with founding heritage diverging from corridor baseline produce wrong D-232 architectural draws in Phase 4 — not a thin Phase 6 concern.

  • Raised by: System economic-specialization workshop, 2026-05-31. Burnelli-Sheldon (schema, vocabulary, mapping, CI, fallback algorithm), Miri (must-pin list, scale gap, D-177 terroir pins, cultural heritage vocabulary), Paula (faction vocabulary, Compact rules, heritage-divergence cultural scope, D-172 compliance), human checkpoint (dual-axis design, no separate scale column, faction authored, quality-first field count, deterministic-varied fallback, Groombridge landmark mechanism).

  • Dissent: None.

  • Cross-reference: D-233 (re-amended — see below), D-184 (commodity catalog), D-199 (CityGenerationContext read-set, extended), D-232 (template draw — consumes cultural_specialization), D-214 (PoliticalArchetype — consumes dominant_faction), D-172 (currency zone alignment), D-174 (shadow economy intensity), D-177 (productivity constraints — informs monopolistic pins), D-220 (density), D-197 (prosperity)


D-233 RE-AMENDMENT

(Filed to existing D-233 record in decisions/architecture.md 2026-05-31 — see that file for the canonical record.)

Re-amended 2026-05-31 (D-237 — authored specialization layer): The settlement's dominant_bulk_class and dominant_production_ubiquity are now sourced from the authored specialization layer (D-237) rather than derived directly from the highest-output production chain. Derivation chain:

  1. If system_economy.economic_specialization is authored → resolve via specialization_vocabulary(economic_specialization)(commodity_id, production_ubiquity_override)(BulkClass, ProductionUbiquity). Use the vocabulary-specified ProductionUbiquity (which may override the catalog default per the equal-or-higher rule).

  2. If economic_specialization is NULL → run the deterministic-varied heuristic (D-237 §fallback: seed-hashed weighted draw over the vocabulary using economic_role + corp HQ signals + noise term) → same projection.

In both cases, the resolved (BulkClass, ProductionUbiquity) populates CityGenerationContext.dominant_bulk_class and CityGenerationContext.dominant_production_ubiquity. The frozen-amber constraint is unchanged: fill_chunk(ctx, seed) holds no PressureState reference. Within-system body variation (weighted draw over body-level candidates anchored to system commodity) remains seed-hashed.

Groombridge clarification (landmark vs. district): The vocabulary expresses district-level character. Singular MonopolySource-class landmarks within a Specialist district are expressed via D-222 multi-block reservation + D-232 hero-element pin, not via composite vocabulary values.


11. Implementation Notes (for the lead + SI)

New source files:

  • wiki/economics/system_specialization.toml — per-system authored entries (~300 stanzas for the full pass)
  • wiki/economics/specialization_vocabulary.toml — vocabulary definition (27 values)

Both added to IMPORT_ECONOMICS_SOURCES in tooling/check-systems-db-stamp for meta stamp tracking.

DB schema changes:

  • server/data/systems-schema.sql: add economic_specialization TEXT and cultural_specialization TEXT to system_economy; add specialization_vocabulary table DDL
  • MIGRATION_SQL in import_economics.py: idempotent ALTER TABLE system_economy ADD COLUMN for both

Code changes:

  • import_economics.py: new import_system_specialization() step; compile specialization_vocabulary; 6 hard-error validations; 8 soft warnings; coverage report
  • server/src/bridge/city_context_reader.rs: replace #982 design-blocked stubs with vocabulary lookup + fallback draw algorithm

system_factions.dominant_faction is an existing column; import_economics.py UPSERTs values from the TOML. System_factions rows must already exist (created by wiki_sync.py or atlas import). Does NOT add a new column.


Workshop outcomes document complete. Pre-filing — D-records require ID assignment (tooling/db/decision claim) and human approval before writing to decisions/architecture.md. Source files: miri-round3.md, burnelli-sheldon-round3.md, paula-round3.md (all rounds read). Qatux — 2026-05-31