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>
This commit is contained in:
2026-05-31 18:40:08 +02:00
co-authored by Claude Opus 4.8
parent f13216f5af
commit 33c083f0ef
13 changed files with 3657 additions and 0 deletions
@@ -0,0 +1,393 @@
# Round 1 — Burnelli-Sheldon
## System Economic-Specialization Workshop
*Lens: economic credibility + field→commodity mapping + weighting model + integration pipeline + CI guardrails.*
---
## Q1 — The Field
**Proposed field: `dominant_commodity_id TEXT REFERENCES commodities(commodity_id)`**
A single foreign-key column on `system_economy` pointing directly into the `commodities` table. One per system. Authored lore-first; the heuristic is the fallback for unspecified systems.
### Why a commodity ID and not a category?
The field needs to resolve to `dominant_bulk_class × dominant_production_ubiquity` for D-233. The only clean source of that mapping is the commodity catalog itself — `bulk_class` and `production_ubiquity` are already on every commodity record. A separate "specialization category" field would require a second mapping table and would drift from the catalog over time. The FK is the mapping.
### The BulkClass × ProductionUbiquity projection
D-233 (refined 2026-05-26) already defines the 8→5 `BulkClass` projection from commodities.toml:
| `commodities.bulk_class` | → `BulkClass` (D-233) |
|---|---|
| `bulk` | `BulkSolid` |
| `standard` | `BulkSolid` |
| `compact` | `BulkSolid` |
| `oversized` | `BulkSolid` |
| `precision` | `PrecisionDense` |
| `liquid` | `BulkLiquid` |
| `perishable` | `Perishable` |
| `non_physical` | `NonPhysical` |
And the 5→4 `ProductionUbiquity` projection from commodities.toml:
| `commodities.production_ubiquity` | → `ProductionUbiquity` (D-233) |
|---|---|
| `ubiquitous` | `Ubiquitous` |
| `common` | `Common` |
| `regional` | `Common` (treated as common for built-form purposes) |
| `concentrated` | `Specialist` |
| `monopolistic` | `MonopolySource` |
`regional` collapses to `Common` because the built-form distinction is between broadly distributed infrastructure (Ubiquitous/Common) and concentrated infrastructure (Specialist/MonopolySource). Regional production produces the same physical plant pattern as common — dispersed operations, no single dominant facility.
### What this field is *not*
Services (`non_physical`) ARE a valid `dominant_commodity_id` choice. A financial center like Groombridge should pin to `financial_services`. This gives `BulkClass = NonPhysical`, which D-233 correctly resolves to dense office towers and civic halls (high coverage, 0.850.95 roofed fraction) with no operations surface. A service economy *looks* different from an extraction economy, as it should.
### Relationship to `economic_base_primary` / `economic_base_secondary`
**Do not replace. Coexist.** The existing `economic_base_primary/secondary` fields are free-text narrative prose — "grain agriculture and aquaculture" (Ran), "Commission clearing house and financial arbitration" (Groombridge). They belong to the GTTR voice and are not machine-readable. Keep them.
`dominant_commodity_id` is the machine-readable counterpart — one FK, vocabulary-constrained, CI-validated. The two fields serve different consumers (humans vs. the generator) and should stay separate. A mismatch between the prose and the FK is detectable by CI (W-SES-02, below) and flags inconsistency for human review.
### The vocabulary: all 36 commodities are valid
The complete vocabulary is the `commodity_id` column of `commodities`. Any of the 36 entries is valid:
**Raw materials** — meaningful for extraction-dominated systems that operate at raw scale (rare in practice; most systems export intermediates, but a frontier mining outpost can legitimately pin to `metallic_ore` or `lattice_grade_material`).
**Intermediates and finals** — the primary choice for most named systems. Ran → `agricultural_produce` or `processed_food` (both defensible; the question is whether Ran is mostly a raw exporter or a processed food exporter; the GTTR implies raw-to-intermediate, so `agricultural_produce`).
**Services** — valid for financial, legal, medical, and mixed-service systems. Groombridge → `financial_services`. The Sirius capital system → `commission_certification` or `legal_services`.
**The no-pin option:** `dominant_commodity_id = NULL` is permitted for uninhabited systems. Inhabited systems that are `NULL` trigger a CI hard error (V-SES-01).
---
## Q2 — Within-System Weighted Variation
The system `dominant_commodity_id` sets the prior. Bodies deviate from it through a weighted deterministic draw. The algorithm is static: `seed + static data only`. No PressureState, no tâtonnement, no runtime query.
### The candidate set (not a 36-commodity draw)
The draw operates over a small candidate set — usually 36 commodities — not all 36. Drawing over all 36 would produce economically incoherent results (why does a high-tech research moon in an agricultural system randomly get commission_certification?). The candidate set is:
1. **System anchor** — always included: `system.dominant_commodity_id`
2. **Role preferred** — 12 commodities per `economic_role` (table below)
3. **Planet-class preferred** — 02 commodities based on `bodies.planet_class`
4. **Corp HQ commodity** — 01 commodity if a corporation is HQ'd here, via `corp_presence.primary_operation` → commodity lookup
### Weight assignment (integer, D-010 compliant)
All weights are integer basis points. No floats in the derivation path.
| Signal | Weight added | To which commodity |
|---|---|---|
| System anchor | `W_SYS = 10_000` | `system.dominant_commodity_id` |
| Body `economic_role` preferred | `W_ROLE = 5_000` | Role's preferred commodity (table below) |
| Body `economic_role` secondary | `W_ROLE_SEC = 2_000` | Role's secondary commodity if any |
| Body `planet_class` preferred | `W_PLANET = 3_000` | Planet-class preferred commodity |
| Body `planet_class` secondary | `W_PLANET_SEC = 1_000` | Planet-class secondary |
| Corp HQ present | `W_CORP = 4_000` | Corp's `primary_operation` commodity |
**Role → preferred commodity mapping (fallback heuristic):**
| `economic_role` | Primary preferred | Secondary preferred |
|---|---|---|
| `agricultural` | `agricultural_produce` | `processed_food` |
| `extraction` | `metallic_ore` | `rare_minerals` |
| `manufacturing` | `refined_metals` | `advanced_alloys` |
| `financial` | `financial_services` | `insurance` |
| `service_mixed` | `legal_services` | `medical_services` |
| `research` | `electronics` | `lattice_substrate` |
| `transit_hub` | `fusion_fuel` | `refined_metals` |
| `institutional` | `commission_certification` | `legal_services` |
| `military` | `heavy_equipment` | `advanced_alloys` |
| `residential` | `processed_food` | `agricultural_produce` |
**Planet class → preferred commodity mapping (fallback heuristic):**
| `planet_class` | Primary preferred | Secondary preferred |
|---|---|---|
| `terrestrial` | `agricultural_produce` | `metallic_ore` |
| `rocky` / `barren` | `metallic_ore` | `stone` |
| `icy` / `ice_giant` | `water` | `fusion_fuel` |
| `gas_giant` | `fusion_fuel` | — |
| `ocean` | `agricultural_produce` | `organic_compounds` |
| `volcanic` | `metallic_ore` | `rare_minerals` |
| `desert` | `stone` | `metallic_ore` |
| (station/orbital) | *(no planet bonus)* | — |
These are heuristics — they apply only when `dominant_commodity_id` is not pinned to override.
### Weighted draw algorithm (deterministic)
```
candidate_weights: HashMap<commodity_id, u64> = {}
// Add system anchor
candidate_weights[system.dominant_commodity_id] += W_SYS
// Add role-preferred
role_preferred = ROLE_MAP[body.economic_role]
candidate_weights[role_preferred.primary] += W_ROLE
if role_preferred.secondary:
candidate_weights[role_preferred.secondary] += W_ROLE_SEC
// Add planet class
planet_preferred = PLANET_MAP[body.planet_class]
if planet_preferred.primary:
candidate_weights[planet_preferred.primary] += W_PLANET
if planet_preferred.secondary:
candidate_weights[planet_preferred.secondary] += W_PLANET_SEC
// Add corp HQ if present
if corp_hq_commodity != NULL:
candidate_weights[corp_hq_commodity] += W_CORP
// Weighted draw (integer arithmetic only — D-010)
total_weight = sum(candidate_weights.values())
seed = SeedChain(world_seed)
.derive(SeedDomain::Layer3Settlement, fnv1a_64(body_id))
.seed()
rng = AtlasRng::new(splitmix64(seed))
draw = rng.next_u64() % total_weight
// Walk the candidate list (sorted by commodity_id for determinism)
// to find the winner
```
The resulting commodity is looked up in the commodity catalog for `bulk_class``BulkClass` and `production_ubiquity``ProductionUbiquity`.
### The farming moon in a foundry system (worked example)
System: `dominant_commodity_id = advanced_alloys` (BulkSolid, Specialist — an alloying hub).
Moon: `economic_role = agricultural`, `planet_class = terrestrial`, no corp HQ.
Weight allocation:
- `advanced_alloys` ← 10_000 (system anchor)
- `agricultural_produce` ← 5_000 (role primary) + 3_000 (planet class) = 8_000
- `processed_food` ← 2_000 (role secondary)
- `metallic_ore` ← 1_000 (planet class secondary)
Total weight: 21_000.
Draw probabilities: `advanced_alloys` 47.6%, `agricultural_produce` 38.1%, `processed_food` 9.5%, `metallic_ore` 4.8%.
The moon **is** a farming moon about 38% of seeds. The system still reads as a foundry system because most bodies (those without strongly competing role signals) resolve to `advanced_alloys`. The farming moon exists; it is not the dominant read.
### Why W_SYS = 10_000 specifically
This ratio is calibrated so that a body with *two strong competing signals* (both role AND planet class pointing away from the system anchor) still resolves to the system anchor ~33% of the time. That threshold keeps system identity legible: a 5-body system will usually have 34 bodies expressing the system character. If W_SYS were lower (e.g., 5_000), too many bodies would deviate, destroying the authored read. If higher (e.g., 15_000), the minority body (the farming moon) becomes nearly impossible, which is also wrong.
These ratios can be tuned in a single named-constant block without touching algorithm logic. They are NOT authored per-system.
---
## Q3 — `economy_size`?
**Out. Don't add it.**
This is the first Q where I'll be direct: `economy_size` doesn't earn its slot because it is substantially covered by fields that already exist.
### What economy_size would modify vs. what already exists
The proposed modifications for `economy_size` are:
1. **Coverage density** — already modulated by `density_class` (D-220), which is derived from `population` and `economic_role`.
2. **Count of specialized blocks** — already modulated by settlement footprint size, which is derived from `population` and `prosperity_baseline` (D-197).
3. **Labor draw for residential follow-on** — already set by `BulkClass` extraction multiplier (D-233).
Every function that `economy_size` would provide is already covered. Adding it introduces a third authoritative source for the same signal, which creates inconsistency problems:
- If `economy_size = major` but `population = 50_000`, which wins?
- If `economy_size = minor` but `prosperity_baseline = 0.85` (high prosperity), do we compress the settlement?
The answers require tiebreaker rules, which are complexity with no payoff.
### The genuine case it might address
The one scenario where `economy_size` might seem necessary: a low-population monopoly extraction site that should have massive industrial infrastructure. A lattice_grade_material mine with 10,000 workers that ships to the entire galaxy.
This is already handled:
- `production_ubiquity = monopolistic``MonopolySource` → D-233 concentration rule: "MonopolySource concentrates contiguous block groups (the mine *is* the settlement, everything else is support)." The infrastructure is there.
- `prosperity_baseline` for an extraction site with corp HQ presence will be elevated.
- `density_class` for an extraction chokepoint with economic pull is Dense (D-220: "extraction chokepoints... pull people in faster").
A 10,000-person monopoly mine reads correctly under the existing system: low population, high density (terrain-constrained + economic pull), MonopolySource concentration, elevated prosperity (corp-funded infrastructure). No `economy_size` field required.
### Verdict
`economy_size` is redundant with `population × prosperity_baseline`. If those two values are incorrectly authored for a system (e.g., the system wiki says it's a major economic hub but the population is set to 50K), that's an authoring error to fix — not a signal to add a third field that masks it.
---
## Q4 — The Content Pass: Field→Commodity Mapping + CI Guardrails + Integration
### Source location
New TOML file: **`wiki/economics/system_specialization.toml`**
One entry per system that has been authored. Uninhabited and unspecified systems have no entry (CI will hard-error if an inhabited system has no entry after the pass is complete).
```toml
# wiki/economics/system_specialization.toml
# Source of truth for authored dominant commodity per star system.
# Compiled to system_economy.dominant_commodity_id via import_economics.py.
# FK: must exist in wiki/economics/commodities.toml
#
# Decisions: D-233, D-184, this workshop (re-amends D-233)
[GJ-144] # Ran — core agricultural breadbasket
dominant_commodity_id = "agricultural_produce"
[GJ-273] # Groombridge — Assembly clearing house
dominant_commodity_id = "financial_services"
[GJ-15A] # Sirius — Commission/Assembly capital
dominant_commodity_id = "commission_certification"
# ... ~300 systems total
```
One line per system. The comment is optional documentation for human reviewers. The TOML key is `system_id` (matching the `star_systems.system_id` column).
### Database integration
Add one column to `system_economy` in `systems-schema.sql`:
```sql
ALTER TABLE system_economy ADD COLUMN
dominant_commodity_id TEXT REFERENCES commodities(commodity_id);
```
Add to `COLUMN_MIGRATIONS` in `import_economics.py` (idempotent ALTER TABLE).
New import step in `import_economics.py`:
```python
def import_system_specialization(conn, dry_run=False):
"""Read wiki/economics/system_specialization.toml and upsert
dominant_commodity_id into system_economy for authored systems."""
# Read TOML
# Validate FK against commodity catalog (V-SES-01, V-SES-02)
# UPSERT into system_economy
# Log coverage report
```
Source file added to `IMPORT_ECONOMICS_SOURCES` for meta stamp tracking.
### CI guardrails
**Hard errors (build aborts):**
| ID | Rule | Rationale |
|---|---|---|
| V-SES-01 | Every system with `bodies.inhabited > 0` AND `system_economy.population > 0` MUST have `dominant_commodity_id` after the content pass is marked complete. Before the pass is complete: warn only. | Guarantees generator has authored data for every city it generates. |
| V-SES-02 | `dominant_commodity_id` must exist in `commodities(commodity_id)` | FK integrity — typos produce silent fallbacks otherwise. |
| V-SES-03 | Systems where `dominant_commodity_id` maps to a service commodity (`tier IN ('service_professional', 'service_luxury')`) but whose `bodies` are all non-inhabited or uninhabited MUST be flagged | Services require population to be plausible. A services-dominant system with no bodies makes no sense. |
**Soft warnings (build succeeds, prints):**
| ID | Rule | Rationale |
|---|---|---|
| W-SES-01 | `production_ubiquity = 'monopolistic'` systems: print list for human review | Monopoly pins are load-bearing and easy to over-assign. Lore must support the monopoly claim (D-177). |
| W-SES-02 | Systems where `economic_base_primary` (prose) contains words that don't match the commodity name/description of `dominant_commodity_id` | Contradiction detection between narrative prose and the machine field. Not a hard error — authors may intentionally be more specific in prose. |
| W-SES-03 | `dominant_commodity_id = water OR agricultural_produce` for named, non-frontier systems | Water and agricultural produce are ubiquitous. A named core system claiming water as its identity is probably wrong (every system produces water). Exception: a system whose entire identity is regional food export may legitimately pin to `agricultural_produce`. Flag for review, don't abort. |
| W-SES-04 | More than 20% of inhabited systems pinned to the same `dominant_commodity_id` | A balanced economy needs diversity. If 60 systems all claim `refined_metals`, the catalog entry is being used as a generic default, not an authored identity. |
### Coverage report (new output from import_economics.py)
After the import, print:
```
system_specialization coverage:
authored: NNN / MMM inhabited systems (NN%)
by BulkClass: BulkSolid=NN, BulkLiquid=NN, Perishable=NN, PrecisionDense=NN, NonPhysical=NN
by ProductionUbiquity: Ubiquitous=NN, Common=NN, Specialist=NN, MonopolySource=NN
MonopolySource systems: [list]
```
This gives the content team a live view of market structure as they author. A healthy distribution avoids over-concentration in any one BulkClass or ubiquity tier.
### Who authors what (the 300-system content pass)
**Miri**: Canonical commodity for every named/hero system from GTTR lore. The economic_base_primary prose is the input signal; Miri determines which of the 36 commodities best represents the system's authored identity. Source of truth on Ran (agricultural_produce), Groombridge (financial_services), the east reach lattice systems (lattice_grade_material), etc.
**Paula**: Faction homeworlds, Compact systems, and political capitals. A Compact homeworld's dominant commodity is not just economic — it's a political statement. The Mark-primary zone currency choice and the shadow economy intensity are correlated with the commodity choice (Compact: tends toward energy independence → fusion_fuel, or organic-based industries independent of Commission certification routes).
**Burnelli-Sheldon (me)**: Economic credibility review of all ~300 entries. Specifically:
1. **Monopoly-class check**: Does the lore actually support a `monopolistic` production_ubiquity pin? (D-177 constraints are the test — Kvitfjell marble, brach fiber, Calloway terroir, VGV varietals are the canon examples of genuine monopoly-class production. Assign monopolistic sparingly.)
2. **Distribution balance**: Check that the final distribution of commodity pins across 300 systems is plausible. An economy where 80% of systems are NonPhysical services is not credible.
3. **Field→BulkClass sanity**: Does the built form make sense? A financial-services dominant system should not look like a mine. If a pin produces an unexpected BulkClass (e.g., `water` → BulkLiquid for a city), flag for reconsideration.
4. **Heuristic fallback validation**: For uninhabited/unnamed systems that get the fallback heuristic (not authored), spot-check that the role+planet_class heuristic produces plausible results for representative cases.
### Authoring tool expectation
The content pass is a text editor + TOML file workflow. No specialized tool needed. The `make regen-db` build validates every entry against the commodity catalog. A companion query helps authors check consistency:
```bash
tooling/db/sqlite-query "
SELECT se.system_id, se.dominant_commodity_id,
c.bulk_class, c.production_ubiquity,
se.economic_base_primary
FROM system_economy se
JOIN commodities c ON c.commodity_id = se.dominant_commodity_id
WHERE c.production_ubiquity = 'monopolistic'
ORDER BY se.system_id"
```
---
## Q5 — Additional Identity Fields
The question is: while touching all ~300 systems by hand once, what other 12 fields meaningfully flesh out identity at marginal additional authoring cost? The guard is explicit: every field is authoring burden ×300 and a maintenance surface.
### My recommendation: ONE additional field
**`atlas_body_trait_bias` hero pins** (D-232) — this is the architecture-flavor anchor for hero bodies (~3040). It is technically a per-body field, not a per-system field, but it is authored during the same pass since the hero body is the system's primary reading body.
This earns its slot on one condition: **it is authored ONLY for hero bodies, not for all 300 systems.** The ~270 non-hero bodies run the algorithm with no bias (D-232 is explicit: "Non-hero bodies run the identical algorithm with no bias"). So the authoring burden is ~3040 entries (one per hero body), not 300.
From my economic-credibility lens, the trait pin is justified because:
- D-232's hard-gate economics (bulk_class, prosperity, production_ubiquity) already constrain the template pool. The pin selects within the economically-valid set, not outside it.
- The wrong architectural read on a canonical system is expensive — it cannot be corrected by a post-launch patch without breaking determinism (D-010).
- The trait catalog is designed with pin support (`pin` counts toward K, K=1 for Minimal complexity tier).
**However**: the actual `atlas_body_trait_bias` pins are Miri + Araminta territory (cultural meaning + visual bundle). I'll defer to them on which ~3040 bodies get a pin. My role is to confirm that the economic eligibility rules don't need to be overridden to support the intended templates.
### Fields I recommend against
**`economy_size`** — eliminated in Q3.
**`trade_orientation` (export/import/self-sufficient)** — Derivable from `dominant_commodity_id` × `production_ubiquity`. A `MonopolySource` system is obviously export-dominant. A `NonPhysical` services system is self-contained (services don't traverse gates). An `Ubiquitous` raw material system may import more than it exports (since ubiquitous goods have thin margins and don't drive trade specialization). Authoring this separately introduces a second signal that can contradict the FK. Don't add it.
**`political_register`** — Paula's domain. Plausibly valuable for faction-political characterization, but I should not advocate for fields outside my lane. I will say only that from an economic integration perspective, the political register would not touch the commodity-building pipeline at all — it would be consumed by NPC generation and dialogue, not by the generator. That makes it zero authoring burden overlap with the commodity pass.
**`shadow_economy_intensity`** — D-174 explicitly defines this as derived from inputs (Commission presence, Compact membership, hop distance, gate topology), not authored per-system. The derivation model is correct. Don't replace it with an authored field; the emergent calculation is the point.
### Summary of recommended field set
| Field | Scope | Authoring burden | Earns slot? |
|---|---|---|---|
| `dominant_commodity_id` | Per system (system_economy) | ~300 entries | **YES — primary deliverable** |
| `atlas_body_trait_bias` pins | Per hero body (~3040) | ~3040 entries | **YES — but limited to hero bodies only** |
| `economy_size` | Per system | ~300 entries | **NO — redundant** |
| `trade_orientation` | Per system | ~300 entries | **NO — derivable** |
| `political_register` | Per system | ~300 entries | **OUT OF LANE — Paula opines** |
---
## Integration summary
The proposed change to the existing pipeline is minimal:
1. **`wiki/economics/system_specialization.toml`** — new authored source file. One `dominant_commodity_id` per inhabited system.
2. **`systems-schema.sql`** — add `dominant_commodity_id TEXT REFERENCES commodities(commodity_id)` to `system_economy`.
3. **`import_economics.py`** — add `import_system_specialization()` step, five new CI validation rules, coverage report output.
4. **`city_context_reader.rs`** — replace the two `#982 design-blocked` stub fields with a DB query that reads the commodity catalog join, runs the weighted draw algorithm, and populates `dominant_bulk_class` + `dominant_production_ubiquity`.
5. **`MIGRATION_SQL`** in `import_economics.py``ALTER TABLE system_economy ADD COLUMN dominant_commodity_id TEXT`.
The existing `economic_base_primary/secondary` fields, the `economic_role` field on `bodies`, and the `system_factions` data are **all preserved and unchanged**. The new field plugs into existing signals; it does not replace them.
Everything is static: read at build time into `systems.db`, resolved at generation-dispatch time by `CityContextReader`, no PressureState, no tâtonnement, no save-state. The per-body weighted draw uses `SeedChain(world_seed, body_id)` — deterministic, D-010 compliant, re-derivable from seed + static inputs alone.
@@ -0,0 +1,393 @@
# 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.
@@ -0,0 +1,442 @@
# Round 3 Synthesis — Burnelli-Sheldon
## System Economic-Specialization Workshop
*Synthesizing all human checkpoint decisions into a consolidated schema, vocabulary, and draft D-records for Qatux + SI implementation.*
*Frozen-amber invariants: deterministic D-010; static t=0; authored lore wins; no PressureState/tâtonnement.*
**Schema realities incorporated (SI findings):**
- `system_factions.dominant_faction` **already exists** — this pass POPULATES it, does not add a new column.
- `system_culture.cultural_register` **already exists** as free-text, NPC-voice field (wiki_sync.py pipeline). The new D-232 generator input is **renamed `cultural_specialization`** (on `system_economy`, constrained vocabulary, import_economics.py pipeline). See §naming-decision below for the unify-vs-rename rationale.
---
## (a) Final 3-Field Schema
### Source file
**`wiki/economics/system_specialization.toml`** — single TOML file, one stanza per system, all three fields.
```toml
# wiki/economics/system_specialization.toml
# Decisions: D-236 (this workshop — specialization authored layer)
# Imported by: import_economics.py → system_economy + system_factions
# NULL = absent = heuristic fallback runs
[GJ-144] # Ran
economic_specialization = "breadbasket"
cultural_specialization = "terroir_heritage"
dominant_faction = "concord_assembly"
[GJ-380] # Groombridge
economic_specialization = "financial_hub"
cultural_specialization = "inner_core"
dominant_faction = "syndic_dominant"
[GJ-702B] # Prometheus
economic_specialization = "longevity_monopoly"
cultural_specialization = "assembly_institutional"
dominant_faction = "independent"
[GJ-820B] # Cygni B
economic_specialization = "shipbuilding"
cultural_specialization = "north_reach"
dominant_faction = "concord_assembly"
[GJ-570A] # Bastion
economic_specialization = "military_industrial"
cultural_specialization = "assembly_institutional"
dominant_faction = "concord_assembly"
[GJ-559B] # ACB
economic_specialization = "governance_center"
cultural_specialization = "assembly_institutional"
dominant_faction = "concord_assembly"
```
### Naming decision: `cultural_specialization` not `cultural_register` {#naming-decision}
**Why not unify with `system_culture.cultural_register`?**
`system_culture.cultural_register` (existing, free-text, wiki_sync.py pipeline) is the NPC-voice cultural register: narrative prose describing "how these people talk," "what they're proud of," "what makes the atmosphere." It feeds dialogue generators and the storyteller. It is human-readable and intentionally unconstrained.
The new D-232 generator input needs to be a **constrained 10-value vocabulary** that the build pipeline can validate and the Rust generator can pattern-match. These have different data types, different consumers, and different pipelines. Unifying them would require either (a) making the existing free-text field constrained (breaking existing NPC-voice usage) or (b) accepting free-text into the generator (breaking CI validation). Neither is acceptable.
**The call: `cultural_specialization` on `system_economy`.**
This is clean:
- Parallel naming: `economic_specialization` + `cultural_specialization` — same table, same TOML source, same pipeline, same authoring pass.
- `system_culture.cultural_register` stays untouched on its own wiki_sync.py pathway for NPC voice.
- No collision. Authors know: both `*_specialization` fields are generator inputs on `system_economy`; `cultural_register` is the narrative field on `system_culture`.
### Database columns
```sql
-- system_economy (two new columns — 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;
-- NOTE: cultural_specialization (not cultural_register) — avoids name collision with
-- system_culture.cultural_register (existing free-text NPC-voice field).
-- system_factions.dominant_faction ALREADY EXISTS.
-- import_economics.py UPSERTS authored values from the TOML — it does NOT add a new column.
-- The system_factions row must already exist (created by wiki_sync.py or atlas import).
-- import_economics.py overwrites dominant_faction ONLY when an authored value is present in TOML;
-- systems without a TOML entry keep their existing derived/NULL value.
```
### Import pipeline
`import_economics.py` gains a new step `import_system_specialization()` that:
1. Reads `wiki/economics/system_specialization.toml`
2. Validates all fields against vocabulary tables and FK constraints
3. UPSERTs `system_economy.economic_specialization` and `system_economy.cultural_specialization`
4. UPSERTs `system_factions.dominant_faction` for each authored system (column already exists; this populates it for named systems — does NOT affect systems without a TOML entry)
5. Prints coverage report
Also compiles `wiki/economics/specialization_vocabulary.toml` into a new `specialization_vocabulary` DB table (read-only reference, not authored per-system):
```sql
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
);
```
---
## (b) Reconciled Economic Vocabulary
### Merge rule applied
The task: "collapse any two values identical in BOTH (BulkClass, ProductionUbiquity) AND cultural character."
**Confirmed merges (3 pairs):**
- `military_production` + `military_station`**`military_industrial`** (both heavy_equipment/BulkSolid/Specialist/military)
- `marine_farming` → absorbed by **`terroir_organics`** (Dagat's kelp farms are organic_compounds at monopoly scale, identical to the terroir_organics template)
- `alloy_hub` → absorbed by **`general_industrial`** at elevated concentration (advanced alloys production worlds can use company_mining or general_industrial; no named system requires a dedicated alloy_hub value)
**Why I did NOT merge commodity-distinct same-output values:**
`ore_extraction`, `general_industrial`, and `shipbuilding` all produce BulkSolid/Common/industrial_heritage. By strict BulkClass × ProductionUbiquity × cultural_character matching, they'd collapse. I kept them separate because the `commodity_id` determines the specific building vocabulary pool within BulkSolid (D-233: "a mine block places mine buildings, full stop") AND because the system's commodity anchor matters for the within-system body draw algorithm. Collapsing them would make Cygni B indistinguishable from a plain ore world in both built form and body draw. The task's ~20-25 guidance is a target range; I'll present 24 values as the working list, noting 3 values are edge-case candidates for future retirement.
### The reconciled 24-value economic specialization vocabulary
**Agricultural cluster (5 values):**
| `economic_specialization` | `commodity_id` | `ubiquity_override` | `BulkClass` | `ProductionUbiquity` | Notes |
|---|---|---|---|---|---|
| `estate_farming` | `agricultural_produce` | null → ubiquitous | Perishable | Ubiquitous | Scattered farms, amenity agriculture. Correct for Arbour — catalog default IS the right answer. |
| `breadbasket` | `agricultural_produce` | `concentrated` | Perishable | Specialist | THE food exporter of a corridor. Dense agricultural processing district, silos, cold stores. Ran. |
| `terroir_agriculture` | `agricultural_produce` | `monopolistic` | Perishable | MonopolySource | D-177 terroir lock. Settlement IS the farm. VGV system (F8V spectrum). |
| `terroir_spirits` | `processed_food` | `monopolistic` | BulkSolid | MonopolySource | D-177 distillery identity. Calloway Reach. |
| `terroir_organics` | `organic_compounds` | `monopolistic` | BulkSolid | MonopolySource | D-177 biological monopoly. Braemar (brach fiber), Dagat (kelp/Blue dye). |
**Energy cluster (2 values):**
| `economic_specialization` | `commodity_id` | `ubiquity_override` | `BulkClass` | `ProductionUbiquity` | Notes |
|---|---|---|---|---|---|
| `fuel_production` | `fusion_fuel` | null → common | BulkLiquid | Common | Standard fuel refinery world. Tank farms, flare stacks. |
| `geothermal_hub` | `fusion_fuel` | `concentrated` | BulkLiquid | Specialist | Geothermal identity dominates. Vuurkloof. Settlement built around thermal infrastructure. |
**Extraction cluster (5 values):**
| `economic_specialization` | `commodity_id` | `ubiquity_override` | `BulkClass` | `ProductionUbiquity` | Notes |
|---|---|---|---|---|---|
| `ore_extraction` | `metallic_ore` | null → common | BulkSolid | Common | Generic mining world. Mine heads, conveyor runs, tailings. |
| `company_mining` | `metallic_ore` | `concentrated` | BulkSolid | Specialist | Corp-dominant company town. DSMC in Sindri. |
| `marble_monopoly` | `stone` | `monopolistic` | BulkSolid | MonopolySource | D-177 geological ceiling. Nyrheim (Kvitfjell). |
| `rare_mineral_extraction` | `rare_minerals` | null → concentrated | PrecisionDense | Specialist | Precision rare-mineral world. Clean facilities, strict access. |
| `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` | Notes |
|---|---|---|---|---|---|
| `general_industrial` | `refined_metals` | null → common | BulkSolid | Common | Generic manufacturing world. Factory halls, loading docks. |
| `shipbuilding` | `freight_haulers` | `common` | BulkSolid | Common | Competing shipyards. Cygni B — 7 combines, NOT MonopolySource. |
| `vehicle_production` | `transport_vehicles` | `concentrated` | BulkSolid | Specialist | Concentrated assembly halls. Nova Roma (MVG identity). |
| `consumer_goods_bazaar` | `consumer_goods` | `concentrated` | BulkSolid | Specialist | 300 competing workshops, marketplace density. Lu Ban. |
| `gate_fabrication` | `gate_components` | null → monopolistic | BulkSolid | MonopolySource | Gate Corp monopoly. Renaissance. Catalog already monopolistic. |
| `military_industrial` | `heavy_equipment` | `concentrated` | BulkSolid | Specialist | Fleet yards, maintenance bays, military depots. Bastion. [Merged from military_production + military_station] |
**High-tech cluster (1 value):**
| `economic_specialization` | `commodity_id` | `ubiquity_override` | `BulkClass` | `ProductionUbiquity` | Notes |
|---|---|---|---|---|---|
| `precision_tech` | `electronics` | `concentrated` | PrecisionDense | Specialist | Precision electronics or lattice fabrication. Cleanrooms, QC labs. |
**Services cluster (5 values):**
| `economic_specialization` | `commodity_id` | `ubiquity_override` | `BulkClass` | `ProductionUbiquity` | Notes |
|---|---|---|---|---|---|
| `financial_hub` | `financial_services` | `concentrated` | NonPhysical | Specialist | Dense cluster of financial buildings — exchange floors, actuarial firms. Groombridge's built form. See §Groombridge note below. |
| `governance_center` | `commission_certification` | `concentrated` | NonPhysical | Specialist | Assembly institutional core. Sirius, ACB. |
| `transit_hub` | `commission_certification` | null → common | NonPhysical | Common | Customs offices and transit infrastructure distributed throughout. Gateway, Wolf 359. |
| `media_center` | `entertainment` | `concentrated` | NonPhysical | Specialist | Production studios, news syndicates. Parallax. |
| `longevity_monopoly` | `medical_services` | `monopolistic` | NonPhysical | MonopolySource | Only longevity facility in the Reach. Prometheus. |
| `biosphere_tourism` | `tourism` | `monopolistic` | NonPhysical | MonopolySource | One biosphere, Conservancy-controlled access. Keid. |
| `legal_archive` | `legal_services` | `concentrated` | NonPhysical | Specialist | Assembly Interpretive Registry. Tessera. |
*Services total: 7 values (oversight — I had listed 5 above but the count is 7). Total vocabulary: 26 values.*
**3 edge-case candidates for future retirement if unused after the content pass:** `rare_mineral_extraction`, `precision_tech`, `legal_archive` — valid but not anchored to a confirmed hero system. Keep for now; retire after the 300-system pass if no system claims them.
### Groombridge: financial cluster + singular landmark
**The authoring decision:** Groombridge gets `economic_specialization = "financial_hub"` (NonPhysical/Specialist). This gives the whole settlement a dense cluster of financial buildings — exchange floors, actuarial institutes, data centers, accounting firms. The GSH (Groombridge Settling House) is the singular MonopolySource-class institution within that cluster.
**The mechanism:** The vocabulary expresses district-level character. The GSH as a singular landmark is handled by the **D-222 multi-block reservation** mechanism (a reserved block, single institution, placed at generation time) combined with a **D-232 `pin`** on `atlas_body_trait_bias` for Groombridge's hero body, forcing a `clearing_house_landmark` template onto that reserved block.
This is NOT a 4th field and NOT a composite vocabulary value. It's: (1) `financial_hub` in the vocabulary drives the surrounding financial district character, and (2) the D-232 hero pin + D-222 reservation places the GSH as a named landmark. The vocabulary is clean; the landmark mechanism is the D-232/D-222 system doing its job.
**What this means for the D-record:** The new D-record (D-236) should note: "where a system has a singular landmark institution of higher concentration than the overall district character (e.g., Groombridge's clearing house within a financial cluster), the landmark is expressed via D-222 multi-block reservation + D-232 hero-element pin — not via a composite vocabulary value."
---
## (c) `cultural_specialization` Vocabulary
### Definition
`cultural_specialization` is a system-level field (on `system_economy`) that tells D-232's template draw which cultural tradition to draw from when the system's **founding heritage diverges from its corridor baseline**. When NULL, D-232 uses the corridor default (already in its algorithm). Authored for ~60-100 systems where the corridor default would be wrong.
This is **not** `system_culture.cultural_register` (which is free-text NPC-voice prose, wiki_sync.py pipeline, untouched by this workshop). `cultural_specialization` is the constrained-vocabulary, machine-readable D-232 generator input — different field, different table, different pipeline, different consumer. See §naming-decision above.
### The 10-value vocabulary
| `cultural_specialization` | D-232 template pool directed | Description | Example systems |
|---|---|---|---|
| `north_reach` | North reach baseline | British/Australian industrial inflection. Default for north reach systems. | Cygni B, Braemar (when not using terroir_heritage) |
| `east_reach` | East reach baseline | Korean/Japanese urban inflection. | Dài Lộ, Dagat |
| `west_reach` | West reach baseline | German/Dutch/Nordic baseline. Default for west reach non-Compact systems. | Nova Roma, generic west systems |
| `south_reach` | South reach baseline | Portuguese/Swahili baseline. | Zenzele, generic south systems |
| `inner_core` | Inner core/cosmopolitan | Pan-corridor, no single heritage dominance. Understated cosmopolitan character. | Groombridge, Parallax, Gateway |
| `compact_cooperative` | Compact heritage sub-pool | Communal architecture, self-reliance aesthetics, cooperative institutions. Diverges from west_reach baseline despite geographic overlap. | All ~30-40 Compact member systems |
| `assembly_institutional` | Assembly formal tradition | Commission/Assembly formal institutional character. Overrides corridor baseline for systems that ARE the Assembly's physical presence. | Sirius, ACB, Bastion, Prometheus, Renaissance |
| `terroir_heritage` | Terroir/biological anchor sub-pool | Settlement identity defined by a specific terroir/biological connection. Draws from the heritage sub-pool of the relevant corridor. | Calloway Reach (Scottish Highland), VGV (Italian), Kvitfjell (Nordic quarry), Ran (agrarian cooperative) |
| `frontier_utilitarian` | Frontier pool | Founder-character utilitarian. Minimal decoration, functional first. | Unnamed deep-frontier systems that have been explicitly pinned |
| `east_reach_corporate` | East reach corporate sub-pool | Corporate hub character — precision, hierarchy, brand-forward. Distinct from general east_reach baseline. | Takamori Lattice Works systems, corporate east reach hubs |
### How this differs from `economic_specialization`
`economic_specialization` says **what the settlement produces** (drives D-233 block fill).
`cultural_specialization` says **which cultural tradition built it** (drives D-232 template pool selection).
A `breadbasket` system (economic: Perishable/Specialist) can be `terroir_heritage` (Ran: agrarian cooperative) or `compact_cooperative` (Ostmark: Compact founding member agricultural base) or `north_reach` (generic north reach agricultural world). Same economic built form, different architectural and social character.
### Fallback when NULL
D-232 derives corridor from the gate topology (hop-based corridor assignment). The `cultural_specialization` field PINS the template pool for divergent systems; NULL lets the corridor assignment stand. This is the correct degradation — named with `cultural_specialization`; unnamed with corridor default.
**Author only when divergent**: an unnamed west_reach farming world doesn't need `west_reach` authored — the corridor assigns it. Author `compact_cooperative` for Compact members because they diverge from the west_reach baseline. Author `terroir_heritage` for Calloway Reach because it diverges from the north_reach baseline.
---
## (d) Deterministic-Varied Fallback Specification
### The problem
A flat one-to-one mapping (agricultural_role → `breadbasket`, extraction_role → `ore_extraction`) produces ~200 unnamed systems that cluster into a small number of identical vocabulary values. Every agricultural world looks the same; every mining world looks the same. Monotony.
### The solution: seed-hashed weighted draw
The fallback for unnamed systems uses the same weighted-draw mechanism as the within-system body draw (Round 1/2), but applied at the system level. This is deterministic (same system + world_seed = same vocabulary value) but varied (across 200 systems, the noise term produces a distribution).
```
// System-level economic_specialization fallback (no authored value present)
// All weights are integer basis points; no floats (D-010)
candidate_weights: Map<specialization_id, u64> = {}
// --- Signal 1: primary economic role (dominant signal) ---
role_primary_candidates = ROLE_SPEC_MAP[system_economy.economic_role] // see table below
for (spec_id, weight) in role_primary_candidates:
candidate_weights[spec_id] += weight // W_ROLE_PRIMARY = 8_000; secondary = 3_000
// --- Signal 2: corp HQ specialization ---
for corp in corp_presence WHERE location_type = 'headquarters':
corp_spec = CORP_SPEC_MAP[corp.specialization] // corp's primary commodity → spec_id
if corp_spec != null:
candidate_weights[corp_spec] += W_CORP // W_CORP = 5_000
// --- Signal 3: noise term (variety across unnamed systems) ---
// Small non-zero weight to EVERY vocabulary value prevents monotony.
// Probability of an off-signal draw: ~W_NOISE / (W_ROLE_PRIMARY + W_NOISE * N_VOCAB)
// With W_NOISE=400 and N_VOCAB=26: off-signal probability ≈ 400/18400 ≈ 2%
for spec_id in ALL_VOCABULARY_IDS:
candidate_weights[spec_id] += W_NOISE // W_NOISE = 400
// --- Weighted draw (D-010 deterministic) ---
seed = SeedChain::root(world_seed)
.derive(SeedDomain::Layer1System, fnv1a_64(system_id))
.seed()
rng = AtlasRng::new(splitmix64(seed))
total_weight = sum(candidate_weights.values())
draw = rng.next_u64() % total_weight
// Walk candidate_weights sorted by spec_id (alphabetical, deterministic order)
// Return the spec_id at the draw position
```
### Role → specialization candidate mapping
| `economic_role` | Primary candidate (W=8_000) | Secondary candidates (W=3_000) |
|---|---|---|
| `agricultural` | `breadbasket` | `estate_farming`, `food_processing_hub` |
| `extraction` | `ore_extraction` | `company_mining`, `fuel_production` |
| `manufacturing` | `general_industrial` | `shipbuilding`, `vehicle_production` |
| `financial` | `financial_hub` | `clearing_house` |
| `service_mixed` | `transit_hub` | `governance_center` |
| `research` | `precision_tech` | `rare_mineral_extraction` |
| `transit_hub` | `transit_hub` | `governance_center` |
| `institutional` | `governance_center` | `legal_archive` |
| `military` | `military_industrial` | `governance_center` |
| `residential` | `estate_farming` | `general_industrial` |
### Why W_NOISE = 400
This calibration ensures:
- Clear cases (single strong role signal, no corp HQ): primary candidate wins ~90% of seeds. A clear agricultural world gets `breadbasket` 90% of the time.
- Mixed cases (competing role + corp HQ): the dominant signal still wins ~60-70% of seeds, with meaningful variety.
- Distribution across 200 unnamed systems: approximately 70-80% land on their primary candidate, 15-20% on a secondary, and ~5% on a genuinely unexpected value (variety without incoherence).
**The determinism guarantee**: Same system_id + world_seed ALWAYS produces the same vocabulary value. Different world seeds produce different distributions. This is the correct behavior: the authored lore is the same run-to-run (the hero pins); the unnamed worlds have per-run variety bounded by lore plausibility.
### For `cultural_register` fallback
Fallback is simpler — derive from corridor assignment (already in D-232's algorithm). No noise term needed: the corridor IS the natural variation signal. Just propagate corpus corridor assignment to the cultural_register consumer.
### For `dominant_faction` fallback
Derive from: Commission presence (→ `concord_assembly`), currency zone (`mark_primary``compact`, `mixed``compact_sympathetic`), Veil Institute presence (→ `veil_institute`). This is the existing D-199/D-214 derivation. No change. No noise needed — faction is stable, not varied.
---
## (e) CI Guardrails
### Hard errors (build aborts)
| ID | Field | Rule | Rationale |
|---|---|---|---|
| V-SES-01 | `economic_specialization` | Must be in `specialization_vocabulary.specialization_id` when present | Vocabulary constraint — typos produce silent fallbacks |
| V-SES-02 | `economic_specialization` | Inhabited systems (population > 0) must have a non-null value OR the fallback must successfully derive one. Build fails if derivation returns null for an inhabited system. | Generator requires this field |
| V-SES-03 | `economic_specialization` | If `production_ubiquity_override` is set in specialization_vocabulary, it must be ≥ catalog's `production_ubiquity` in the concentration ordering (ubiquitous < common ≈ regional < concentrated < monopolistic) | Miri's equal-or-higher rule — cannot claim lower concentration than globally true |
| V-SES-04 | `cultural_specialization` | Must be in the 10-value vocabulary when present | Typo protection |
| V-SES-05 | `dominant_faction` | Must be one of: `concord_assembly, compact, compact_sympathetic, syndic_dominant, veil_institute, independent, disputed, mixed` when present | Vocabulary constraint |
| V-SES-06 | FK integrity | `specialization_vocabulary.commodity_id` must exist in `commodities(commodity_id)` | Referential integrity |
### Soft warnings (build succeeds, prints)
| ID | Field(s) | Rule | Rationale |
|---|---|---|---|
| W-SES-01 | `economic_specialization` | Systems where resolved `ProductionUbiquity = MonopolySource`: print list for human review | Monopoly pins load-bearing; D-177 constraints apply |
| W-SES-02 | `economic_specialization` | >25% of inhabited systems resolve to the same vocabulary value | Authoring is using one value as a generic default |
| W-SES-03 | `economic_specialization` + prose | `economic_base_primary` text doesn't mention the commodity or sector named in specialization_vocabulary.description | Prose/field divergence detection |
| W-SES-04 | `dominant_faction` + `currency_zone` | `dominant_faction = compact` AND `currency_zone = tractus_primary` | D-172 compliance: Compact membership implies `mark_primary` or `mixed` |
| W-SES-05 | `dominant_faction` + `economic_specialization` | `dominant_faction = compact` AND resolved `ProductionUbiquity = MonopolySource` AND vocabulary not `marble_monopoly`/`terroir_*` | Compact doctrine contradicts monoeconomy extraction unless it's a D-177 terroir/geological lock |
| W-SES-06 | `dominant_faction` + `cultural_register` | `dominant_faction = compact` AND `cultural_register` NOT IN (`compact_cooperative`, `west_reach`) | Compact members should have cooperative cultural character |
| W-SES-07 | `dominant_faction` | Named systems (wiki entry or GTTR) without authored `dominant_faction` → list | These are the heuristic-failure cases Paula identified |
| W-SES-08 | `economic_specialization` | `estate_farming` for a system with `population > 5_000_000` — estate farming is low-density, high-prosperity, amenity character. A 5M+ population agricultural system is probably `breadbasket` | Authoring sanity check |
### Coverage report
```
system_specialization pass coverage:
economic: NNN / MMM inhabited systems authored (NN%); NNN on fallback
cultural_specialization: NNN / MMM named systems authored (NN%); NNN on corridor default
faction: NNN / MMM named systems authored (NN%); NNN on derivation
economic BulkClass distribution:
BulkSolid=NN | BulkLiquid=NN | Perishable=NN | PrecisionDense=NN | NonPhysical=NN
economic ProductionUbiquity distribution:
Ubiquitous=NN | Common=NN | Specialist=NN | MonopolySource=NN
MonopolySource systems [REVIEW — D-177 check]: [list]
D-172 faction/currency mismatches [REVIEW]: [list]
Compact monoeconomy flags [REVIEW]: [list]
```
---
## (f) Draft D-Record Text
*IDs are placeholders — lead should claim via `tooling/db/decision claim D architecture "title"` before committing.*
---
### DRAFT: D-[236] — Authored System Specialization Layer (3-field schema + vocabulary)
*(New D-record — claim this ID)*
- **Date:** 2026-05-31
- **Decision:** Each star system carries three authored per-system fields sourced from `wiki/economics/system_specialization.toml` and imported via `import_economics.py` at build time. These fields are static (t=0), deterministic (D-010), and constitute the lore-authored identity layer above the heuristic. Authored lore wins; heuristic is fallback only for unnamed/generic systems.
**Field 1: `system_economy.economic_specialization TEXT`**
A 26-value curated vocabulary (defined in `wiki/economics/specialization_vocabulary.toml`, compiled to the `specialization_vocabulary` DB table). Each value maps to `(commodity_id, production_ubiquity_override_or_null)`, which projects to `(BulkClass, ProductionUbiquity)` per D-233. The vocabulary encodes both commodity identity AND local concentration scale — `breadbasket` is not `estate_farming` even though both reference `agricultural_produce`, because `breadbasket` pins `ProductionUbiquity = Specialist` where the catalog default would give `Ubiquitous`. Scale is in the vocabulary value; there is no separate scale column. Authored for ~80-100 named systems; heuristic fallback for ~200 unnamed systems (see §fallback below).
**Field 2: `system_economy.cultural_specialization TEXT`**
A 10-value vocabulary directing D-232's template draw to the correct cultural tradition when a system's founding heritage diverges from its corridor baseline. `NULL` = use corridor default (D-232's existing algorithm). Authored for ~60-100 divergent-heritage systems: all Compact members (`compact_cooperative`), Assembly institutional hubs (`assembly_institutional`), D-177 terroir systems (`terroir_heritage`), east reach corporate hubs (`east_reach_corporate`). Field is named `cultural_specialization` (not `cultural_register`) to avoid name collision with `system_culture.cultural_register` (existing free-text NPC-voice field, wiki_sync.py pipeline, untouched by this workshop). `cultural_specialization` is the machine-readable D-232 generator input; `system_culture.cultural_register` is the narrative NPC-voice field — different table, different pipeline, different consumer.
**Field 3: `system_factions.dominant_faction TEXT` — POPULATED, NOT ADDED**
This column already exists on `system_factions` (D-199 field 4, present in systems-schema.sql). `import_economics.py` UPSERTS values from the TOML for authored systems; systems without a TOML entry are unaffected (no column migration needed). Vocabulary: `concord_assembly | compact | compact_sympathetic | syndic_dominant | veil_institute | independent | disputed | mixed`. `lattice_commission` is dropped — ACB and Bastion are `concord_assembly` (the Commission operates under Assembly authority). Authored for ~40-60 named systems; existing derivation (Commission presence, currency zone) serves as fallback.
**Heuristic fallback (deterministic-but-varied):** For unnamed systems, `economic_specialization` is derived via a seed-hashed weighted draw over the vocabulary. The weight table is built from `economic_role` (primary signal, W=8,000 bps), corp HQ specialization (W=5,000 bps), and a noise term (W=400 bps to every vocabulary value). The noise term ensures that across 200 unnamed systems, approximately 5-10% draw an off-primary vocabulary value — preventing all unnamed agricultural worlds from looking identical. Derivation is deterministic: `SeedChain(world_seed).derive(Layer1System, fnv1a_64(system_id))` produces the same value for the same system in the same run. `cultural_register` fallback uses corridor assignment (D-232 existing). `dominant_faction` fallback uses Commission/currency derivation (existing).
**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), the district character is encoded as Specialist (`financial_hub`) in the vocabulary. The singular landmark is expressed via D-222 multi-block reservation + D-232 `atlas_body_trait_bias` hero pin — not via a composite vocabulary value. The vocabulary expresses district-level character; landmark-level identity is the D-232/D-222 mechanism.
**CI guardrails:** 6 hard errors (vocabulary FK integrity, inhabitance coverage, production_ubiquity monotonicity, faction vocabulary), 8 soft warnings (MonopolySource review list, distribution balance, D-172 faction/currency alignment, Compact monoeconomy contradiction, coverage gaps). Full spec in §CI of this workshop.
**Source:** `wiki/economics/system_specialization.toml` (per-system entries) + `wiki/economics/specialization_vocabulary.toml` (vocabulary definition). Both added to `IMPORT_ECONOMICS_SOURCES` for meta stamp tracking.
- **Rationale:** The D-233 heuristic (economic_role + corp HQ + planet_class → dominant commodity) fails predictably for: output-vs-input confusions (Cygni B: heuristic sees ore inputs, not freight_hauler outputs), political mandates (Groombridge: financial infrastructure is a deliberate institutional choice, not geographic necessity), terroir-locked production (D-177 systems: cannot be represented by ubiquitous catalog defaults), and service economies (Prometheus, Keid: no heuristic path from available signals to the correct identity). The authored field layer resolves all four failure modes while keeping the heuristic as a valid fallback for unnamed systems. The three-field schema is the minimum set that changes how a system reads without redundancy: economic (D-233 block fill), cultural (D-232 template selection), faction (D-214 political archetype).
- **Raised by:** System economic-specialization workshop, 2026-05-31. Burnelli-Sheldon (schema, vocabulary, mapping, CI, fallback algorithm), Miri (must-pin list, scale gap identification, D-177 terroir pins), Paula (faction vocabulary, Compact rules, must-pin systems, D-172 compliance), human checkpoint (dual-axis design direction, 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_register`), D-214 (PoliticalArchetype — consumes `dominant_faction`), D-172 (currency zone alignment with `dominant_faction`), D-174 (shadow economy — `dominant_faction = compact` elevates shadow intensity), D-177 (productivity constraints — informs monopolistic pins), D-220 (density), D-197 (prosperity)
---
### DRAFT: D-233 re-amendment text (add to existing D-233 record)
*(Amendment to existing D-233, dated 2026-05-31)*
**Add to D-233 after existing text:**
> **Re-amended 2026-05-31 (D-[236] — authored specialization layer):** The settlement's `dominant_bulk_class` and `dominant_production_ubiquity` are now sourced from the **authored specialization layer** (D-[236]) rather than derived from the highest-output production chain. The derivation chain is:
>
> 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-[236] §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. The within-system body variation algorithm (D-[236] §body draw) remains seed-hashed weighted selection anchored to the system's resolved commodity.
>
> **Groombridge clarification (landmark vs. district):** The vocabulary expresses district-level built form 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. The vocabulary has one value per system's district character; landmark identity is the D-232/D-222 layer.
---
## Summary for Qatux + SI
**D-records to create:**
- D-[236]: New D-record for the authored specialization layer (claim ID, then write to `decisions/architecture.md`)
- D-233 amendment: Add re-amendment text to existing D-233 record
**Schema changes:**
- `systems-schema.sql`: Add `economic_specialization TEXT` and `cultural_specialization TEXT` to `system_economy`
- `MIGRATION_SQL` in `import_economics.py`: idempotent `ALTER TABLE` for both new columns
- `system_factions.dominant_faction`: no schema change — column exists, `import_economics.py` populates it for authored systems
- New table: `specialization_vocabulary` (compiled from `wiki/economics/specialization_vocabulary.toml`)
**New files:**
- `wiki/economics/system_specialization.toml` — per-system authored entries
- `wiki/economics/specialization_vocabulary.toml` — vocabulary definition (26 values)
**Code changes:**
- `import_economics.py`: `import_system_specialization()` step + 6 hard error validations + 8 soft warnings + coverage report
- `city_context_reader.rs`: replace `#982 design-blocked` stubs with vocabulary lookup + fallback draw algorithm
**Content pass:**
- Miri: ~80-100 `economic_specialization` pins + ~30 `cultural_specialization` pins for named/hero systems + D-177 terroir pins
- Paula: ~40-60 `dominant_faction` pins (especially Compact members) + `cultural_specialization = "compact_cooperative"` for all Compact members
- Burnelli: economic credibility review of all authored entries + fallback algorithm validation + distribution balance check
- All three: `atlas_body_trait_bias` hero pins (~30-40 bodies) as co-authoring activity in same pass
@@ -0,0 +1,198 @@
# Round 1 — Miri
## System Economic-Specialization Workshop
*Lens: lore/GTTR truth — authored canon verification, production scale gap identification, must-pin list.*
---
## Opening: What This Lens Contributes
Burnelli designed the mechanism correctly: one FK per system, weighted body-level draw, CI guardrails. My role is not to redesign it. I'm contributing:
1. **The production scale gap** — a structural tension between global commodity ubiquity and local system identity
2. **The authoritative must-pin list** from GTTR research: 18 core/near-core systems, 5 D-177 terroir pins
3. **High-risk heuristic contradiction cases** — systems where NOT pinning means the generator definitely gets the wrong answer
4. **Q5 architectural character** — hero body trait pins, what earns its slot
---
## Q1 — The Field
**My position:** Endorse Burnelli's `dominant_commodity_id TEXT REFERENCES commodities(commodity_id)`. The FK is correct — one field, catalog-constrained, BulkClass and ProductionUbiquity derive directly from the commodity record. Coexists with `economic_base_primary/secondary` prose. No replacement.
### The Gap: Production Scale Override
The catalog's `production_ubiquity` answers: *"how widely is this commodity produced across the Reach?"* — a global market statement.
D-233's `ProductionUbiquity` answers: *"how spatially concentrated is this commodity in THIS settlement's built form?"* — a local identity statement.
These align for most systems. They diverge at the hero systems where the lore is most specific:
| System | Commodity | Catalog `production_ubiquity` | What lore demands | Built-form consequence if not overridden |
|---|---|---|---|---|
| Ran | `agricultural_produce` | `ubiquitous` | THE breadbasket — concentrated, dominant agricultural built form | D-233 Ubiquitous → scattered small instances in mixed-use. Ran looks like any farming moon, not THE breadbasket |
| Lu Ban | `consumer_goods` | `ubiquitous` | Dense manufacturing bazaar, 300 workshops concentrated | Scattered instances, not a concentrated manufacturing district identity |
| Vuurkloof | `fusion_fuel` | `common` | Geothermal infrastructure IS the settlement — tank farms, conduits dominate | Common → insufficient spatial dominance for the geothermal identity |
| Prometheus | `medical_services` | `regional` | Only facility of its kind in the Reach, dead-end monopoly | Regional → Common at best; needs MonopolySource |
| Calloway system | `processed_food` | `ubiquitous` | Terroir-locked, cannot be reproduced anywhere else | MonopolySource needed or settlement looks like any food processor |
| VGV system | `agricultural_produce` | `ubiquitous` | F8V stellar spectrum locked — varietals cannot be farmed elsewhere | MonopolySource needed |
| Keid | `tourism` | `concentrated` | One-of-a-kind biosphere, Conservancy controls all access | Concentrated undersells the genuine monopoly character |
**Proposed addition:** `dominant_production_scale TEXT` — optional column alongside `dominant_commodity_id` in both the TOML source and the schema. Vocabulary: same as `commodities.production_ubiquity`: `ubiquitous | common | regional | concentrated | monopolistic`. When set, overrides the catalog's `production_ubiquity` for this system's D-233 context only. When null, catalog default applies.
**One authoring rule:** `dominant_production_scale` may only be set to EQUAL OR HIGHER concentration than the catalog default. Claiming a globally-monopolistic resource is locally ubiquitous is incoherent. If lore demands lower concentration than the catalog default, the wrong commodity is pinned.
**TOML representation (additive to Burnelli's `system_specialization.toml`):**
```toml
[GJ-144] # Ran — breadbasket
dominant_commodity_id = "agricultural_produce"
dominant_production_scale = "concentrated" # globally ubiquitous; Ran's breadbasket identity requires concentrated
[GJ-702B] # Prometheus — re-embodiment monopoly
dominant_commodity_id = "medical_services"
dominant_production_scale = "monopolistic" # catalog: regional; only legitimate longevity facility in the Reach
```
### No special values needed
I don't require `transit_gateway` or `military_institutional` as special values. Every system type has a catalog commodity that correctly characterizes its built form:
- Pure transit hubs (Gateway, Wolf 359) → `commission_certification` (NonPhysical, concentrated → dense institutional buildings, correct for a multi-gate administrative hub)
- Military systems (Bastion) → `commission_certification` (Assembly governs directly here — institutional density is correct)
- Financial centers (Groombridge) → `financial_services`
D-232 trait templates handle the CHARACTER difference. The commodity handles coverage and vocabulary. They're different responsibilities.
---
## Q2 — Within-System Weighted Variation
**Endorsement with three lore-specific observations:**
Burnelli's algorithm (W_SYS=10,000 anchor; role/planet_class/corp HQ modifiers) is correct. Three patterns from the lore:
**Pattern 1 — The supply-chain body (Cygni B):** Cygni B's asteroid extraction bodies are inputs to the orbital shipyards, not exceptions to the system identity. With `dominant_commodity_id = freight_haulers`, extraction bodies receive W_SYS=10,000 toward freight_haulers plus W_ROLE toward metallic_ore. The probabilistic result means some surface bodies express the supply chain. Correct — the system reads as shipbuilding because the orbital platforms (manufacturing/service roles) dominate the draw even as surface bodies express extraction character.
**Pattern 2 — The correctly-ubiquitous case (Arbour):** Arbour (GJ-338B, estate garden world) pins to `agricultural_produce` WITHOUT a production scale override. The catalog's `ubiquitous` → D-233 Ubiquitous → scattered small agricultural patches in mixed-use IS exactly what estate farming looks like. Combined with high `prosperity_baseline` (>0.7), the residential follow-on produces market-rate housing — correct for estate character. **Arbour does NOT need a production scale override.** This demonstrates the distinction: Ran's agriculture needs concentrated scale because it IS the settlement; Arbour's agriculture needs ubiquitous scale because it DECORATES the settlement.
**Pattern 3 — Service commodity body guardrail:** For systems with NonPhysical `dominant_commodity_id`, bodies with `economic_role = extraction` or `agricultural` should express their own commodity, not the service anchor. An ore-extracting body in a financial_services system provides ore, not financial services. The algorithm handles this naturally; CI should not flag these as anomalies. They're expected.
**Flag on multi-agricultural systems (Ran):** Ran has two distinct agricultural bodies (Kallast = industrial grain, Vethis = specialty aquaculture). Both will express `agricultural_produce` from the concentrated system anchor — correct. The visual distinction between them comes from D-232 trait templates and body-level physical details, not from the commodity pin. The commodity field gives the shared identity; trait templates give the built-form distinction.
---
## Q3 — `economy_size`?
**Out.** Burnelli has the economic case. From the lore side: adding `economy_size` would require me to author a sense of importance for ~300 systems where I don't have prose supporting it. The hero systems already have their importance encoded in `dominant_production_scale` at `concentrated` or `monopolistic`. The edge case (Prometheus — tiny population, enormous economic importance) is already handled: `medical_services` at `monopolistic` gives D-233 MonopolySource concentration. The mine IS the settlement. No additional field.
---
## Q4 — Content Pass: The Authoritative Must-Pin List
### My role in the content pass
I author `dominant_commodity_id + dominant_production_scale` for systems where GTTR prose establishes unambiguous economic character. I flag contradiction risks. Paula handles faction homeworlds and Compact capitals. Burnelli validates economic plausibility across all ~300 entries.
### Section A — Core and Near-Core Systems
*All entries sourced directly from GTTR prose. Contradiction risk = confidence the heuristic produces the wrong answer without a pin.*
| System | GJ | `dominant_commodity_id` | `dominant_production_scale` | GTTR grounding | Contradiction risk |
|---|---|---|---|---|---|
| Ran | GJ-144 | `agricultural_produce` | `concentrated` | "Ran grows food...real surplus...grain fields visible from orbit...five centuries with grim implacable efficiency" | SCALE: commodity right, scale wrong (ubiquitous→scattered vs concentrated→breadbasket) |
| Cygni B | GJ-820B | `freight_haulers` | — | "Built the Reach...freight haulers, gate-adjacent platforms...inner belt industrially mined for 580 years" | HIGH: heuristic sees inputs (ore + manufacturing), not outputs (freight_haulers) |
| Sindri | GJ-3522 | `metallic_ore` | `concentrated` | "Mining system run by a mining corporation...DSMC mining...the ore is excellent" | SCALE: commodity right, `common`→scattered understates DSMC dominance |
| Nova Roma | GJ-764 | `transport_vehicles` | `concentrated` | "MVG builds the vehicles...rolling stock, freight platforms, passenger carriages...every system in the Reach" | MEDIUM: might get `heavy_equipment` (MVG builds both) or `advanced_alloys` |
| Renaissance | GJ-251 | `gate_components` | — | "Builds the gates...Gate Corporation built most of them here...fabrication halls still standing" | HIGH: heuristic sees manufacturing generically; needs Gate Corp signal |
| Groombridge | GJ-380 | `financial_services` | `concentrated` | "Where the money lives...instruments, accounts, actuarial models...four centuries of financial infrastructure" | SCALE: `common`→scattered vs `concentrated`→financial district identity |
| Prometheus | GJ-702B | `medical_services` | `monopolistic` | "Manufactures immortality...every Perpetual-class individual is alive because Prometheus Labs decided...one gate, one way in" | HIGH: heuristic has no path to medical_services from dead-end service topology |
| ACB | GJ-559B | `commission_certification` | — | "ACB IS a Commission presence...the rules live here" | LOW: institutional economic_role → plausible heuristic |
| Tessera | GJ-3877 | `legal_services` | `concentrated` | "Assembly Interpretive Registry...legal and interpretive services sector...archival specialists" | MEDIUM: heuristic might get `commission_certification` instead |
| Sirius | GJ-244A | `commission_certification` | — | "The capital...Assembly governs...Commission's most senior offices...five apertures" | LOW: institutional + Commission HQ → plausible |
| Parallax | GJ-280A | `entertainment` | `concentrated` | "Major news syndicates...cultural production houses...reputation management firms...the Reach's account of itself" | HIGH: heuristic has no route to `entertainment` from economic_role |
| Gateway | GJ-71 | `commission_certification` | — | "Economy runs on transit...customs infrastructure, diplomatic apparatus sized for four major gate corridors" | LOW: transit hub + institutional → plausible |
| Wolf 359 | GJ-406 | `commission_certification` | — | "No agricultural or extractive economic base...platforms purpose-built for transit service...Assembly regional office" | LOW: pure transit + institutional → plausible |
| Vuurkloof (Van Maanen's Star) | GJ-35 | `fusion_fuel` | `concentrated` | "Geothermal extraction...primary export fusion-grade power; wiki exports: fusion_fuel; industrial_corridor: geothermal_energy" | HIGH: unusual-type star prevents all standard role→commodity heuristic paths to fusion_fuel |
| Keid | GJ-166A | `tourism` | `monopolistic` | "One biosphere...Conservancy decides who studies it...cannot be purchased elsewhere" | MEDIUM: might get `legal_services` (Conservancy governance) |
| Bastion | GJ-570A | `commission_certification` | — | "Assembly does not have a presence at Bastion. It IS Bastion...Assembly governs directly under military administrative frameworks" | LOW: military/institutional → plausible |
| Arbour | GJ-338B | `agricultural_produce` | — | "Estate-scale...managed for amenity rather than yield...premium food for the capital" | LOW: heuristic gets commodity right; catalog ubiquitous→scattered IS correct for estate farming. No override needed. |
| Lu Ban | GJ-15A | `consumer_goods` | `concentrated` | "300 independent manufacturers...clothing, consumer electronics, vehicle components, residential modules" | HIGH: heuristic has no corp-HQ signal pointing to `consumer_goods` |
### Section B — D-177 Terroir and Monopoly Pins
Systems where D-177 establishes explicit lore constraints making `monopolistic` production scale mandatory. GJ designations need confirmation.
| System type | `dominant_commodity_id` | `dominant_production_scale` | D-177 constraint | Action |
|---|---|---|---|---|
| Calloway Distillery (north_reach) | `processed_food` | `monopolistic` | "Calloway terroir is system-specific, cannot be relocated; 12-20y aging pipeline" | Confirm GJ designation |
| VGV system (F8V stellar spectrum, west_reach Italian corridor) | `agricultural_produce` | `monopolistic` | "VGV varietals require F8V stellar spectrum, cannot be farmed elsewhere" | Confirm GJ designation |
| Braemar (brach fiber source) | `organic_compounds` | `monopolistic` | "Brach fiber: herd expansion takes decades, volume cannot spike" | Confirm GJ designation; thrds brand source |
| Kvitfjell/Bífröst (Compact, north_reach) | `stone` | `monopolistic` | "Kvitfjell marble ~800t/y maximum — hard geological ceiling" | Confirm GJ designation; Bífröst Marmor brand |
| East reach lattice anchor | `lattice_grade_material` | — | "East reach anchor. Strategic material" (D-177); catalog already `monopolistic` | Confirm which east-reach GJ designation |
These five are non-negotiable. D-177 is explicit that these commodities cannot be produced elsewhere.
### High-Risk Contradiction Cases (must pin before generator runs)
Systems where NOT pinning = wrong commodity with high confidence:
1. **Vuurkloof** — unusual-type geothermal star prevents all standard heuristic paths to `fusion_fuel`
2. **Cygni B** — shipbuilding is the OUTPUT; heuristic sees the inputs (ore extraction + manufacturing)
3. **Prometheus** — dead-end medical monopoly; heuristic has no medical signal to draw from
4. **Parallax** — media/entertainment economy; heuristic can't reach `entertainment` from institutional/service role
5. **Renaissance** — gate component monopoly; heuristic sees manufacturing generically without Gate Corp signal
6. **Lu Ban** — consumer goods bazaar; heuristic has no signal pointing toward `consumer_goods`
### Systems Left to Heuristic (reasoning explicit)
- **Barnard's Star** (GJ-699, "Residential. Surprisingly Thoughtful"): residential commuter suburb for Cygni B. economic_role=residential → heuristic correctly gets `processed_food` or `consumer_goods`. No pin needed.
- Generic mid-reach agricultural worlds without brand attachment: globally ubiquitous → scattered is correct for generic farming worlds that aren't Ran.
- All frontier/unnamed systems: the heuristic fallback is the explicit design.
---
## Q5 — Additional Identity Fields
### What earns its slot: hero body trait pins
One additional activity during this pass — populate the D-232 `atlas_body_trait_bias` hero body pins for ~30-40 hero bodies. Not a new system-level column; uses the existing D-232 `pin` mechanism on the per-body `atlas_body_trait_bias` table. Authoring burden ~30-40 entries.
The commodity pin tells you WHAT a settlement produces. The trait pin tells you HOW IT LOOKS doing it. Without a trait pin, the wrong architectural character can lock in at generation time (D-010 determinism). Getting it right while touching the system is minimum viable insurance.
**Hero body architectural priorities (direction for Miri + Araminta when building the trait catalog):**
| Hero body | System | Architectural character | GTTR grounding |
|---|---|---|---|
| Vuurkloof main planet (GJ35c) | GJ-35 | Ravine-industrial: geothermal conduits, thermal exchange stations, vent-lit industrial environment | "Built into the ravine walls...thermal plumes...stained orange and black by mineral deposits" |
| Witwatersrand / Sindri hub | GJ-3522 | Company-town extraction: DSMC compound character, Earth mining heritage nomenclature | "Kalgoorlie, Broken Hill, Krupp belt...three centuries of mining nomenclature" |
| Nova Roma main | GJ-764 | Monumental manufacturing: MVG assembly-line scale, Mastroianni family institutional architecture | "Named it...continuous shifts on assembly lines operating for 300 years" |
| Groombridge main body | GJ-380 | Financial-understated: expensive restraint, communications infrastructure priority, redundant data links | "Architecture is understated in the way that communicates expense" |
| Arbour main body | GJ-338B | Estate-garden: large setbacks, managed buffer zones, premium agricultural estates, no industrial presence | "Large fractions of cultivable surface managed for amenity rather than yield" |
| Edict / Sirius underground city | GJ-244A | Institutional-underground: below-grade city aesthetic, orbital stations, Assembly gravity | "One large pressurized city...mostly below grade...we chose this on purpose" |
| Tessera main body | GJ-3877 | Archive-institutional: documentation infrastructure as built environment, layered record stacks | "Well-maintained library...people who've developed opinions about the organizational system" |
| Renaissance main body | GJ-251 | Flat-industrial: fabrication halls, dry dock-scale, Gate Corp utilitarian aesthetic | "The flat industrial character of a place that knows what it is for" |
These are inputs to the trait catalog authoring effort. The actual template definitions are Miri + Araminta co-authoring work.
### What does not earn a slot
**Cultural/political register as a new field:** `system_culture` already has `cultural_register`, `cultural_register_secondary`, `primary_archetype`, `secondary_archetype`, `atmospheric_tone`. That table IS the cultural register. If underpopulated, that's a separate culture-table pass, not an addition to the commodity pass.
**`economy_size`:** Eliminated in Q3.
**Any field requiring authoring lore for unnamed systems:** The commodity pass is valuable precisely because it derives from what I already know. Adding fields that require inventing lore for unnamed systems is scope creep disguised as identity enrichment.
### Summary
| Field/activity | Scope | Authoring burden | Decision |
|---|---|---|---|
| `dominant_commodity_id` | Per system (`system_economy`) | ~300 entries | **IN** — primary deliverable |
| `dominant_production_scale` | Per system (optional, ~20-30 systems need it) | ~20-30 entries | **IN** — required for lore-accurate scale |
| `atlas_body_trait_bias` hero pins | Per hero body (~30-40) | ~30-40 entries | **IN** — existing D-232 mechanism, same-pass authoring |
| Cultural/political register | Per system | ~300 entries | **OUT**`system_culture` table already exists |
| `economy_size` | Per system | ~300 entries | **OUT** — redundant with existing fields |
---
*Miri — Round 1 complete. The mechanism Burnelli designed is correct. The production scale override is the one structural gap in the proposal. Must-pin list: 18 core/near-core systems + 5 D-177 terroir pins. High-confidence contradiction cases: Vuurkloof, Cygni B, Prometheus, Parallax, Renaissance, Lu Ban.*
@@ -0,0 +1,253 @@
# Round 2 — Miri
## System Economic-Specialization Workshop
*Lens: lore/GTTR truth — enriched vocabulary, cultural axis, must-pin resolution, flagged system resolution.*
---
## Opening: What Changed From Round 1
The user checkpoint resolved three forks:
- **FORK 3**: No second `dominant_production_scale` column. Encode scale/identity by enriching the single field's vocabulary. My production scale gap is real; the solution is richer values, not a second column.
- **FORK 1**: Two orthogonal axes — (a) economic axis feeding D-233 built form, (b) cultural axis feeding D-232 templates and cultural service generation. They are separate fields, separate consumers, not collapsed.
- **FORK 2**: `dominant_faction` authored for named systems in this pass (already endorsed in Paula's Q5; confirmed here).
My Round 2 work: propose the enriched economic vocabulary; propose the cultural axis; resolve Keid and Cygni B; resolve Dài Lộ and Zenzele.
---
## Section 1 — Enriched Economic Vocabulary
### The Principle
Paula's 9 abstract categories are the right abstraction level for the field name (identity, not raw commodity). But 9 values don't capture lore-critical distinctions that CHANGE what D-233 produces. The enriched vocabulary expands to ~16 values, adding sub-types where a single abstract value would produce the wrong built form.
The rule for adding a value: a new value earns its place only if it produces a DIFFERENT (BulkClass × ProductionUbiquity) mapping than the existing value it branches from. If two identity labels produce the same D-233 output, they're cultural axis distinctions, not economic axis distinctions.
### The Vocabulary (16 values)
| Value | `BulkClass` | `ProductionUbiquity` | Identity description |
|---|---|---|---|
| `transit_hub` | NonPhysical | Ubiquitous | Gate infrastructure and freight/passenger flow define the economy; settlement is sized for throughput, not residents |
| `governance_center` | NonPhysical | Specialist | Institutional mandate defines identity; Assembly, Commission, or equivalent — no significant production, everything imported |
| `financial_hub` | NonPhysical | MonopolySource | Clearing, credit, and settlement infrastructure at Reach scale; financial houses govern effectively; THE clearing node |
| `research_station` | NonPhysical | Specialist | Research or conservation mandate defines access and economy; unique environment or expertise is the lock |
| `media_culture` | NonPhysical | Specialist | Narrative production, information architecture, cultural manufacture define identity; content is the commodity |
| `military_bastion` | PrecisionDense | Specialist | Fleet, garrison, or defensive installation defines identity; civilian economy is support infrastructure for the installation |
| `heavy_manufacturing` | BulkSolid | Common | Large-scale competing fabrication at bulk scale; multiple producers, no monopoly; shipyards, heavy foundries, large-frame assembly |
| `specialist_manufacturing` | PrecisionDense | Specialist | Technical components, precision assembly; expertise-based advantage rather than geographic lock; not ubiquitous, not monopoly |
| `precision_monopoly` | PrecisionDense | MonopolySource | THE production facility for a critical, irreplaceable system component; one producer; architecture organized around THE compound |
| `longevity_monopoly` | NonPhysical | MonopolySource | The single licensed re-embodiment or longevity facility; access controlled; one gate chosen deliberately; compound IS the settlement |
| `energy_hub` | BulkLiquid | Specialist | Energy extraction and export as identity; geothermal, large-scale fuel refinery, or equivalent; infrastructure IS the settlement |
| `breadbasket` | Perishable | Specialist | Industrial-scale food surplus; multiple producers but system identity defined by dominant, outward-facing agricultural output |
| `estate_farm` | Perishable | Ubiquitous | Agricultural but amenity/estate character; produce is secondary to residential luxury identity; scattered, not dominant |
| `terroir_farm` | Perishable | MonopolySource | Biologically or geographically locked food production; D-177 category; cannot be reproduced; THE origin system |
| `extraction_colony` | BulkSolid | MonopolySource | Geological monopoly; THE quarry or mine; infrastructure entirely serves extraction; the mine IS the settlement |
| `mining_district` | BulkSolid | Specialist | Significant mining but not a geological monopoly; multiple seams or operations; company-town character without absolute lock |
### Key distinctions from Paula's 9
**Why `heavy_manufacturing` (not `manufacturing_hub`):**
Paula's `manufacturing_hub` maps to PrecisionDense × Common. But Cygni B's shipyards produce *oversized heavy goods* — freight haulers, station sections, gate-adjacent platforms — built from the metallic asteroid belt. This is BulkSolid (large-frame assembly, dry docks, hull staging, operations surface). The correction is the BulkClass, not the ProductionUbiquity. `heavy_manufacturing` → BulkSolid × Common replaces `manufacturing_hub` for bulk-scale heavy industry systems. Systems doing precision assembly (electronics, vehicles at vehicle scale) still map closer to PrecisionDense and would use `specialist_manufacturing`.
**Why `breadbasket` (not `agricultural_base`):**
Paula's `agricultural_base` → Perishable × Ubiquitous. For Ran, the breadbasket character requires Perishable × Specialist — agricultural zones are dominant and concentrated, not scattered through mixed-use. If we used `agricultural_base` for Ran, D-233 Ubiquitous → small instances scattered in mixed-use → Ran looks like any farming moon. The `breadbasket` value correctly drives Perishable × Specialist. For systems where scattered agriculture IS correct (Arbour), `estate_farm` → Perishable × Ubiquitous produces the right read.
**Why `terroir_farm` and `estate_farm` (not just `agricultural_base`):**
All three produce different D-233 outputs. `agricultural_base` (from Paula, retained as the generic fallback heuristic result) = Perishable × Ubiquitous; `breadbasket` = Perishable × Specialist; `terroir_farm` = Perishable × MonopolySource; `estate_farm` = Perishable × Ubiquitous (same as `agricultural_base` D-233 output, but different identity — estate_farm is for systems where prosperity_baseline drives the residential character, not agricultural dominance).
**Why `longevity_monopoly` (not `precision_industry` or `research_station`):**
Prometheus is NonPhysical × MonopolySource — a service monopoly, not a precision manufacturing facility. `precision_monopoly` (PrecisionDense × MonopolySource) is for PHYSICAL goods monopolies like gate component fabrication at Renaissance. Prometheus produces a service (licensed re-embodiment/longevity protocols) that is NonPhysical. Separate value.
**`governance_center` and `research_station` produce the same D-233 output (NonPhysical × Specialist):**
Correct. They're distinguished by the cultural axis (civic vs. scholarly character) and by `dominant_faction` (Assembly → institutional templates; Veil Institute → research/observatory templates). Both values are kept because they carry meaningful lore content for CI validation and cultural axis assignment, even if D-233 cannot distinguish them. D-232 can.
---
## Section 2 — Cultural Axis Vocabulary
### Purpose and separation
The economic axis answers: *what does this system produce, and at what scale?* → feeds D-233 (coverage, vocabulary, operations surface)
The cultural axis answers: *what does this system celebrate and produce culturally?* → feeds:
- D-232 template biases (which architectural character to weight)
- Cultural service generation: what kinds of museums, entertainment venues, cultural production appear in the settlement
These are SEPARATE fields. A system can be `heavy_manufacturing` economically but `industrial` culturally. The economic axis doesn't imply the cultural axis; they layer independently.
### Vocabulary (7 values)
| Value | Cultural identity | D-232 template bias direction | Cultural services generated |
|---|---|---|---|
| `civic` | Governance, institutional ceremony, procedural culture; the culture of authority | Assembly/commission templates, formal civic architecture | Government archives, civic ceremony halls, Assembly delegation presence |
| `cosmopolitan` | Transit, exchange, multilingual heritage; culture shaped by passing through | Diverse mixed template draws, layered architectural periods | Multilingual signage, exchange halls, diverse entertainment venues |
| `industrial` | Occupational pride, craft identity, collective worker culture; build things for a living | Industrial-worker templates, practical aesthetic, minimal ornament | Worker cooperative halls, craft celebration spaces, occupational museums |
| `agrarian` | Land tenure, multi-generational families, harvest tradition; conservative and enduring | Agricultural vernacular templates, heritage estate or farmstead | Harvest festival infrastructure, land-registry cultural display, estate gardens |
| `scholarly` | Knowledge preservation, research culture, institutional memory | Archive/observatory templates, formal academic aesthetic | Archives, observatories, research institute public galleries |
| `mercantile` | Financial discretion, information asymmetry, commerce-as-culture | Understated wealth templates, exchange-floor aesthetic, private club character | Exchange halls, discreet private venues, financial history display |
| `media` | Narrative production, information architecture, storytelling culture | High-density mixed aesthetic, content-forward design, media studio character | Screening rooms, production studios, narrative archive facilities |
**Default (no authored cultural axis):** Corridor default cultural character applies from D-232's corridor pool. This is correct for ~200+ systems. The cultural axis is only authored where the system explicitly diverges from its corridor's expected character.
**Degradation rule:** If `cultural_character` is NULL → fall to corridor default. This ensures every system has a cultural character (from the corridor) even without explicit authoring.
---
## Section 3 — GTTR-Confirmed Must-Pin Table (Both Axes)
All entries are grounded in GTTR prose. Where GTTR is silent, I note it. `dominant_faction` from Paula's Round 1 is included for completeness.
| System | GJ | `economic_specialization` | `cultural_character` | `dominant_faction` | GTTR grounding |
|---|---|---|---|---|---|
| Ran | GJ-144 | `breadbasket` | `agrarian` | `concord_assembly` | "Ran grows food...real surplus...five centuries...grain visible from orbit" |
| Cygni B | GJ-820B | `heavy_manufacturing` | `industrial` | `concord_assembly` | "Built the Reach...freight haulers...seven combines...inner belt mined 580 years" |
| Sindri | GJ-3522 | `mining_district` | `industrial` | `syndic_dominant` | "Mining system run by DSMC...company-town character...three centuries" |
| Nova Roma | GJ-764 | `specialist_manufacturing` | `industrial` | `concord_assembly` | "MVG builds vehicles...rolling stock...every system in the Reach" — precision vehicle manufacturing, not bulk |
| Renaissance | GJ-251 | `precision_monopoly` | `industrial` | `syndic_dominant` | "Builds the gates...Gate Corporation...fabrication halls still standing" |
| Groombridge | GJ-380 | `financial_hub` | `mercantile` | `syndic_dominant` | "Where the money lives...four centuries...architecture understated in the way that communicates expense" |
| Prometheus | GJ-702B | `longevity_monopoly` | `civic` | `independent` | "Manufactures immortality...one gate chosen for security...only Prometheus Labs decides" |
| ACB | GJ-559B | `governance_center` | `civic` | `lattice_commission` | "ACB IS a Commission presence...the rules live here" |
| Tessera | GJ-3877 | `research_station` | `scholarly` | `concord_assembly` | "Assembly Interpretive Registry...legal/archival services sector" — archive-scholarly, not governance |
| Sirius | GJ-244A | `governance_center` | `civic` | `concord_assembly` | "The capital...Assembly IS the system...Commission's most senior offices" |
| Parallax | GJ-280A | `media_culture` | `media` | `independent` | "Major news syndicates...cultural production houses...the Reach's account of itself" |
| Gateway | GJ-71 | `transit_hub` | `cosmopolitan` | `mixed` | "Economy runs on transit...four major gate corridors...diplomatic apparatus" |
| Wolf 359 | GJ-406 | `transit_hub` | `civic` | `concord_assembly` | "No extractive base...platforms for transit service...Assembly regional office" — transit but administratively governed |
| Vuurkloof (Van Maanen's Star) | GJ-35 | `energy_hub` | `industrial` | `independent` | "Geothermal extraction...primary export fusion-grade power; industrial_corridor: geothermal_energy" — engineering community |
| Keid | GJ-166A | `research_station` | `scholarly` | `independent` | "Conservancy biosphere + Veil Institute...access controlled...cannot be purchased elsewhere" |
| Bastion | GJ-570A | `military_bastion` | `civic` | `lattice_commission` | "Assembly IS Bastion...fleet base...400M on stations...Prepared" |
| Arbour | GJ-338B | `estate_farm` | `agrarian` | `concord_assembly` | "Managed for amenity rather than yield...premium food for capital...estates" |
| Lu Ban | GJ-15A | `specialist_manufacturing` | `industrial` | `independent` | "300 independent manufacturers...clothing, electronics, vehicles — China/craft-tradition bazaar" |
| Calloway Reach | GJ-3325 | `terroir_farm` | `agrarian` | `independent` | "Terroir-locked barley/yeast/water...12-20y aging pipeline (D-177)" |
| Confluent/VGV | GJ-395 | `terroir_farm` | `agrarian` | `compact_sympathetic` | "F8V stellar spectrum locked (D-177)...the wine IS the system" |
| Braemar | GJ-475 | `terroir_farm` | `agrarian` | `independent` | "Brach fiber biological monopoly (D-177)" |
| Nyrheim | GJ-3737 | `extraction_colony` | `industrial` | `compact` | "Kvitfjell marble ~800t/y geological ceiling (D-177); Bífröst Marmor HQ" |
| Ostmark | GJ-601A | `breadbasket` | `agrarian` | `compact` | "Agricultural output sustained community for five centuries...Compact founding member" |
| Altmark | GJ-357 | `transit_hub` | `cosmopolitan` | `independent` | "5 apertures...second-largest commercial system in western sector...deliberately non-aligned" |
| Dài Lộ | GJ-136 | `transit_hub` | `cosmopolitan` | `independent` | See Section 4 |
| Zenzele | GJ-1111 | `specialist_manufacturing` | `industrial` | `independent` | See Section 4 |
---
## Section 4 — Disagreement Resolutions
### Keid: `tourism/monopolistic` (my Round 1) vs. `research_station` (Paula)
**Setting note — checking this against established lore.**
Re-reading Keid's GTTR: The economic identity is the Keid Conservancy controlling research access to a unique biosphere. The Veil Institute maintains a station that predates the Conservancy charter. The "exempted zones" with undisclosed Perpetual-class residential development are a silence topic, not the economic identity. Nothing in the GTTR describes tourism as an industry. The rating is "Pristine. Access Restricted."
**My Round 1 `tourism` pin was wrong.** I was conflating "one-of-a-kind, cannot be purchased elsewhere" with the tourism commodity. The scarcity is about research access, not leisure access. The Conservancy's leverage is scientific exclusivity, not tourism revenue.
**Resolution: Keid = `research_station`.** Paula is correct. The cultural axis = `scholarly`. The `dominant_faction = independent` (the Conservancy governs by consensus among research institutions, with a carefully non-specific relationship to the Assembly and Institute).
The monopolistic scale insight from my Round 1 is still valid — there is genuinely only one Keid biosphere — but it manifests as the Conservancy's control of research access, not as tourism infrastructure. The built form for `research_station` (NonPhysical × Specialist) correctly produces: research stations, access platforms, conservation infrastructure, controlled visitor facilities. Not tourist hotels.
### Cygni B: `freight_haulers` (my Round 1) vs. `manufacturing_hub` (Paula)
**The disagreement is a BulkClass error in Paula's vocabulary.**
Paula's `manufacturing_hub` → PrecisionDense × Common. But:
- Cygni B produces freight haulers, station sections, and gate-adjacent platforms — large-frame, oversized, metallic-structure goods
- The asteroid belt feeds the shipyards with metallic ore → heavy smelting → large frame assembly
- "Dense inner belt of metallic asteroids...processing capacity exceeds extraction capacity"
- Dry docks, hull staging, assembly yards, gantry cranes — this is the built form
PrecisionDense is for precision engineering: cleanrooms, QC labs, precision assembly lines. Cygni B is NOT precision manufacturing. It is **BulkSolid heavy manufacturing** — the same physical footprint class as bulk extraction, but organized around fabrication rather than extraction.
Paula is right about the ProductionUbiquity: 7 competing combines = Common (not MonopolySource). That distinction is correct.
**Resolution: Cygni B = `heavy_manufacturing` (BulkSolid × Common).** This is a new value in the enriched vocabulary that fixes Paula's BulkClass error while preserving her correct insight about the distributed multi-combine character. The built form: large fabrication halls, dry dock footprints, hull staging areas, conveyor infrastructure for metallic inputs — all BulkSolid operations surface vocabulary, but at Common (distributed across multiple competing facilities, not one concentrated monopoly compound).
Cultural axis: `industrial`. The GTTR is explicit: "Workers here are well-compensated...occupational pride...the grit is not poverty...people who build things for a living and consider this a sufficient identity."
---
## Section 5 — Flagged System Resolutions
### Dài Lộ (GJ 136): Paula's instinct `precision_industry` vs GTTR evidence
**The GTTR for Dài Lộ reads:**
"Grand Road...a through-route at hop 8, the organized frontier's edge...where the aperture on one side connects to civilization and the aperture on the other connects to Murakami's Lantern..." Rating: "Grand Road. Still Going."
The GTTR describes a **transit and supply hub at the frontier edge**:
- Named for being a road, not a destination
- "Murakami's Lantern...completely dependent on this system for goods and equipment sourced from further inward"
- Vietnamese-dominant multilingual cultural substrate from centuries of transit workers
- The Hải Cảng Merchant Association — a trading/supply network, not a manufacturing consortium
- "Founding capital approximately three times the standard Wave_2 grant structure...private funding...unusual resource profiles or strategic corridor positions" — intriguing silence topic, not the current identity
The Takamori Lattice Works HQ (Paula's signal for `precision_industry`) is a corporate data point, not GTTR prose. The GTTR doesn't mention it. The GTTR's own economic description is entirely about transit and supply gateway function.
**Setting note:** When corporate HQ location and GTTR prose conflict, GTTR wins per the workshop's authored-lore-first principle. The Takamori HQ is real and matters for the body-level weighted draw (W_CORP=4,000 on the body where the HQ sits → pulls that body toward `lattice_grade_material`). But the SYSTEM'S identity is transit.
**Resolution: Dài Lộ = `transit_hub`.** Economic specialization = transit gateway, not precision industry. The lattice works HQ adds an important economic presence but doesn't override a 400-year transit identity. Cultural axis: `cosmopolitan` (Vietnamese/Korean/Japanese/Chinese multilingual community built on four centuries of transit).
`dominant_faction = independent` (the Tham Quan "makes every consequential decision without external reference"; Assembly authority is "acknowledged in principle").
### Zenzele (GJ 1111): Paula's instinct `manufacturing_hub` vs GTTR evidence
**The GTTR for Zenzele reads:**
"The electromagnetic hardening infrastructure Zenzele developed over three generations to protect its station habitats and surface installations from the primary's activity is now, quietly, one of the system's main exports. Technical consultation and purpose-built shielding components move outward through the five-gate network to newer systems..."
Key distinctions:
- "Purpose-built shielding components" — manufactured goods, not bulk extraction
- "Technical consultation" — non-physical expertise service alongside the components
- Expertise-based advantage from necessity: "communities built around surviving hostile stellar environments are exactly the ones you want designing your hardening standards"
- Infrastructure Guilds govern — cooperative specialist culture
- 5 gates, hub system — also a transit node
This is **expertise-based manufacturing of specialized components** — not bulk heavy manufacturing (no large-frame assembly, no metallic ore operations) and not a monopoly (other systems could develop hardening expertise, though Zenzele has the experience lock). The built form should be: precision component workshops, testing facilities, shielding assembly, technical consultation offices.
Paula's `manufacturing_hub` (PrecisionDense × Common) is *closer* than `extraction_colony` — the Baektu Mining Alliance and Umoja Freight HQ are present, but the GTTR's identity is the hardening expertise, not the mining. However, `manufacturing_hub` → Common implies distributed competing producers. Zenzele's hardening expertise is more concentrated than that — the Guilds have a practical monopoly on this specific knowledge, even if it's not a geographic monopoly.
**Resolution: Zenzele = `specialist_manufacturing` (PrecisionDense × Specialist).** Expertise-based, concentrated but not MonopolySource. The built form: precision component workshops, electromagnetic testing chambers, Guild facilities, transit infrastructure (5 gates). Cultural axis: `industrial` (the Infrastructure Guilds, cooperative identity, "do it yourself" ethos, practical self-reliance culture).
`dominant_faction = independent` (the Infrastructure Guilds predate the formal government and govern in practice; Assembly presence is modest and delegated to local port authority).
---
## Summary: Full Must-Pin Table (Enriched Vocabulary)
| System | GJ | `economic_specialization` | `cultural_character` | `dominant_faction` |
|---|---|---|---|---|
| Ran | GJ-144 | `breadbasket` | `agrarian` | `concord_assembly` |
| Cygni B | GJ-820B | `heavy_manufacturing` | `industrial` | `concord_assembly` |
| Sindri | GJ-3522 | `mining_district` | `industrial` | `syndic_dominant` |
| Nova Roma | GJ-764 | `specialist_manufacturing` | `industrial` | `concord_assembly` |
| Renaissance | GJ-251 | `precision_monopoly` | `industrial` | `syndic_dominant` |
| Groombridge | GJ-380 | `financial_hub` | `mercantile` | `syndic_dominant` |
| Prometheus | GJ-702B | `longevity_monopoly` | `civic` | `independent` |
| ACB | GJ-559B | `governance_center` | `civic` | `lattice_commission` |
| Tessera | GJ-3877 | `research_station` | `scholarly` | `concord_assembly` |
| Sirius | GJ-244A | `governance_center` | `civic` | `concord_assembly` |
| Parallax | GJ-280A | `media_culture` | `media` | `independent` |
| Gateway | GJ-71 | `transit_hub` | `cosmopolitan` | `mixed` |
| Wolf 359 | GJ-406 | `transit_hub` | `civic` | `concord_assembly` |
| Vuurkloof (Van Maanen's Star) | GJ-35 | `energy_hub` | `industrial` | `independent` |
| Keid | GJ-166A | `research_station` | `scholarly` | `independent` |
| Bastion | GJ-570A | `military_bastion` | `civic` | `lattice_commission` |
| Arbour | GJ-338B | `estate_farm` | `agrarian` | `concord_assembly` |
| Lu Ban | GJ-15A | `specialist_manufacturing` | `industrial` | `independent` |
| Calloway Reach | GJ-3325 | `terroir_farm` | `agrarian` | `independent` |
| Confluent/VGV | GJ-395 | `terroir_farm` | `agrarian` | `compact_sympathetic` |
| Braemar | GJ-475 | `terroir_farm` | `agrarian` | `independent` |
| Nyrheim | GJ-3737 | `extraction_colony` | `industrial` | `compact` |
| Ostmark | GJ-601A | `breadbasket` | `agrarian` | `compact` |
| Altmark | GJ-357 | `transit_hub` | `cosmopolitan` | `independent` |
| Dài Lộ | GJ-136 | `transit_hub` | `cosmopolitan` | `independent` |
| Zenzele | GJ-1111 | `specialist_manufacturing` | `industrial` | `independent` |
---
## Open Questions for Synthesis
**Q: `governance_center` vs `research_station` both = NonPhysical × Specialist.** Can D-232 actually differentiate them sufficiently through `dominant_faction` alone? My answer: yes — Assembly faction → institutional template (commission halls, formal civic buildings); independent + Veil Institute → observatory/archive template. But this is worth confirming with Araminta who authors the templates.
**Q: Should `media_culture` be on the economic axis at all?** It produces NonPhysical × Specialist (same as `governance_center` and `research_station`). It's earning its slot through cultural axis differentiation, not economic axis differentiation. Worth asking: is the economic axis the right home for it, or should Parallax just be `governance_center`/`research_station` economically with `media` on the cultural axis? I kept `media_culture` on the economic axis because the BUILT FORM of Parallax (production studios, screening rooms, content archive infrastructure) IS meaningfully different from government offices or research labs even at the same coverage fraction — but this distinction lives in the D-229 ObjectTag vocabulary, not in BulkClass × ProductionUbiquity.
**Q: `dominant_faction` vocabulary.** Paula proposed: `concord_assembly | compact | compact_sympathetic | syndic_dominant | veil_institute | lattice_commission | independent | disputed`. I'm using this throughout. Burnelli should confirm it integrates correctly into the D-214 PoliticalArchetype derivation before it becomes the decision record.
---
*Miri — Round 2 complete. Enriched vocabulary: 16 economic values + 7 cultural values. Resolved: Keid (`research_station`), Cygni B (`heavy_manufacturing`), Dài Lộ (`transit_hub`), Zenzele (`specialist_manufacturing`).*
@@ -0,0 +1,217 @@
# Round 3 — Miri
## System Economic-Specialization Workshop
*Lens: lore/GTTR truth — final must-pin table, cultural_register heritage vocabulary, Groombridge and faction confirmations.*
---
## What This Round Delivers
All checkpoint resolutions are locked (Round 2 notes §9). My job in Round 3:
1. Final must-pin table using the agreed vocabulary (Burnelli's labels where available; one addition noted)
2. `cultural_register` vocabulary for divergent-heritage systems — GTTR-grounded values and the authoring method for the broader ~60-100 scope
3. Lore confirmation on Groombridge (`financial_hub` Specialist + GSH hero-element landmark)
4. Confirm ACB and Bastion as `concord_assembly`
> **Synthesis note (lead):** the cultural field is named **`cultural_specialization`** in the final schema (Burnelli's rename to avoid collision with the existing free-text `system_culture.cultural_register`). Where this document says `cultural_register`, read `cultural_specialization`. The vocabulary reconciliation between Miri's heritage-type values and Burnelli's corridor/character values is captured in `workshop-outcomes.md`.
---
## 1. Final Must-Pin Table
Using Burnelli's vocabulary names. One addition required: **`research_station`** (NonPhysical × Specialist) — Keid resolution is confirmed `research_station`, but this value is absent from Burnelli's draft. It maps to `commission_certification` at `concentrated` for the commodity pipeline. I'm flagging it as a necessary addition; Round 3 synthesis should add it.
`dominant_faction` uses the final vocabulary with `lattice_commission` dropped: `concord_assembly | compact | compact_sympathetic | syndic_dominant | veil_institute | independent | disputed | mixed`.
| System | GJ | `economic_specialization` | `cultural_specialization` | `dominant_faction` | Notes |
|---|---|---|---|---|---|
| Ran | GJ-144 | `breadbasket` | `agrarian` | `concord_assembly` | THE breadbasket; Perishable × Specialist confirmed |
| Cygni B | GJ-820B | `shipbuilding` | `industrial_heritage` | `concord_assembly` | BulkSolid × Common; 7 competing combines, not MonopolySource |
| Sindri | GJ-3522 | `company_mining` | `industrial_heritage` | `syndic_dominant` | DSMC company-town; Earth mining heritage in district names (Witwatersrand, Kalgoorlie, Broken Hill) — activity-type covers it |
| Nova Roma | GJ-764 | `vehicle_production` | `italian_northern` | `concord_assembly` | MVG = Manifattura Veicoli Gherardi; Mastroianni family; west_reach Italian corridor divergence |
| Renaissance | GJ-251 | `gate_fabrication` | `industrial_heritage` | `syndic_dominant` | Gate Corp monopoly; flat industrial character; worker expertise |
| Groombridge | GJ-380 | `financial_hub` | `financial_technocratic` | `syndic_dominant` | Specialist (not MonopolySource whole-settlement); GSH as hero-element landmark — see §3 |
| Prometheus | GJ-702B | `longevity_monopoly` | `medical_elite` | `independent` | One gate, sealed; Prometheus Labs IS the economy |
| ACB | GJ-559B | `governance_center` | `institutional` | `concord_assembly` | See §4 |
| Tessera | GJ-3877 | `legal_archive` | `scholarly` | `concord_assembly` | Assembly Interpretive Registry; archive-academic character |
| Sirius | GJ-244A | `governance_center` | `institutional` | `concord_assembly` | Capital; Assembly IS the system; Commission senior offices |
| Parallax | GJ-280A | `media_center` | `artistic` | `independent` | News syndicates, cultural production, narrative architecture |
| Gateway | GJ-71 | `transit_hub` | `cosmopolitan` | `mixed` | 5 apertures; Institute + Assembly; multilingual transit population |
| Wolf 359 | GJ-406 | `transit_hub` | `institutional` | `concord_assembly` | Pure transit admin; Assembly regional office; no organic culture — institutional, not cosmopolitan |
| Vuurkloof (Van Maanen's Star) | GJ-35 | `geothermal_hub` | `afrikaans_cape` | `independent` | See §2 — explicit GTTR heritage |
| Keid | GJ-166A | `research_station`† | `scholarly` | `independent` | †Vocabulary addition needed. See §3. Conservancy biosphere; Veil Institute station |
| Bastion | GJ-570A | `military_station` | `military` | `concord_assembly` | See §4 |
| Arbour | GJ-338B | `estate_farming` | `agrarian` | `concord_assembly` | Estate character, scattered agriculture, NOT breadbasket |
| Lu Ban | GJ-15A | `consumer_goods_bazaar` | `chinese` | `independent` | "The name honors the patron of craftsmen in the Chinese tradition carried by the founding workforce" |
| Calloway Reach | GJ-3325 | `terroir_spirits` | `scottish` | `independent` | Highland distillery tradition; terroir-locked; D-177 |
| Confluent/VGV | GJ-395 | `terroir_agriculture` | `french_provencal` | `compact_sympathetic` | Loire viticulture; F8V spectral lock; D-177 |
| Braemar | GJ-475 | `terroir_organics` | `scottish` | `independent` | Braemar = Scottish Highland village; brach fiber; D-177 |
| Nyrheim | GJ-3737 | `marble_monopoly` | `norse_compact` | `compact` | Bífröst Marmor; Kvitfjell; D-177; Norse-Compact identity |
| Ostmark | GJ-601A | `breadbasket` | `compact_cooperative` | `compact` | Compact founding member; 5-century agricultural base; Germanic but Compact identity is the defining cultural mark |
| Dagat | GJ-482A | `marine_farming` | `tagalog` | `independent` | "Dagat" = sea in Filipino; Blue Collective; deep ocean kelp monopoly |
| Altmark | GJ-357 | `transit_hub` | `cosmopolitan` | `independent` | German name = west_reach corridor-typical; commercial non-aligned hub; no heritage divergence |
| Dài Lộ | GJ-136 | `transit_hub` | `vietnamese` | `independent` | Explicit in GTTR: "Vietnamese is the dominant cultural substrate...four centuries" |
| Zenzele | GJ-1111 | `precision_tech`‡ | `zulu` | `independent` | ‡= Burnelli's label; PrecisionDense × Specialist confirmed; Zulu-heritage founders; Infrastructure Guilds |
| East reach lattice anchor | (confirm GJ) | `lattice_material_source` | (depends on specific GTTR) | (confirm) | Catalog already monopolistic |
**Vocabulary note:** `research_station` (†) needs to be added to Burnelli's specialization_vocabulary.toml. Proposed mapping: `commodity_id = commission_certification`, `production_ubiquity_override = concentrated` → NonPhysical × Specialist. This produces the right built form: research stations, access control infrastructure, conservation facilities — institutional density without the operations surface that a physical production commodity would add.
**Label note (‡):** The Round 2 notes resolve Zenzele = `specialist_manufacturing` (PrecisionDense × Specialist). Burnelli's nearest equivalent is `precision_tech` (electronics, concentrated → PrecisionDense × Specialist). D-233 output is identical. Use `precision_tech` in the merged vocabulary unless synthesis decides `specialist_manufacturing` is worth a distinct entry.
---
## 2. Cultural Register: Divergent-Heritage Vocabulary
### What `cultural_specialization` is
`cultural_specialization` is a SINGLE field combining two value types:
1. **Activity-type values** (from Burnelli's set): applied when the system's cultural character is defined by WHAT IT DOES — not by a specific ethnic heritage. The system is corridor-heritage-typical but has a distinctive economic activity character that overrides the corridor's default civic template draw. Example: Ran has no non-corridor founding heritage, but `agrarian` correctly biases its template draw toward harvest-cooperative architecture rather than the generic inner_corridor neutral.
2. **Heritage-type values** (proposed here): applied when the GTTR or system name identifies a specific founding heritage that DIVERGES from the corridor's default ethnic baseline. These override the corridor because the corridor would produce the wrong templates — e.g., a Vietnamese-founded system in the east_reach corridor would otherwise get Korean/Japanese templates.
Heritage values take precedence when both apply. A system like Calloway Reach (could be `agrarian` for activity, but `scottish` for heritage) gets `scottish` — because D-232 already knows a Scottish system implies agricultural/pastoral vernacular templates. The heritage value subsumes the activity character.
### Corridor baselines (for reference)
| Corridor | D-232 baseline cultural heritage | What `cultural_specialization` overrides |
|---|---|---|
| north_reach | British/Australian inflection | Any specific divergence: Scottish, Irish, South Asian, etc. |
| east_reach | Korean/Japanese inflection | Vietnamese, Filipino, Chinese (when specifically distinct), etc. |
| west_reach | German/Dutch/Nordic inflection | French, Italian, Spanish, etc. (Germanic is the default; Romance is the override) |
| south_reach | Portuguese/Swahili inflection | Afrikaans/Cape, Zulu, Hausa, etc. |
| inner_corridor | Pan-corridor neutral | Any specific heritage that diverges from cosmopolitan neutral |
| frontier | Founder surname + noun naming | Strong founding community with retained heritage |
### GTTR-grounded divergent-heritage values (definitive)
These are confirmed by explicit GTTR prose. Each entry quotes the specific passage.
| Value | Systems | GTTR evidence |
|---|---|---|
| `scottish` | Calloway Reach (GJ-3325), Braemar (GJ-475) | Calloway: terroir Highland whisky tradition; Braemar = an actual Scottish Highland village (where the Highland Games are held); brach fiber biological lock |
| `french_provencal` | Confluent/VGV (GJ-395) | Paula's GTTR note: "founding families Loire viticulture tradition"; VGV varietals, "the wine IS the system"; Société Chimique HQ (French name) |
| `vietnamese` | Dài Lộ (GJ-136) | GTTR explicit: "Vietnamese is the dominant cultural substrate...four centuries of transit workers, contract laborers, and opportunistic settlers have added Korean, Japanese, and Chinese heritage" |
| `afrikaans_cape` | Vuurkloof (GJ-35) | GTTR explicit: "founding generation...Afrikaner and Cape Coloured families predominate in the oldest established lineages...language moves between Afrikaans and Portuguese" |
| `zulu` | Zenzele (GJ-1111) | GTTR explicit: "chartered three hundred years ago by wave 3 Zulu-heritage emigrants...founding Zulu heritage is maintained through language instruction, naming convention, and oral tradition formalized into community archives" |
| `chinese` | Lu Ban (GJ-15A) | GTTR explicit: "The name honors the patron of craftsmen in the Chinese tradition carried by the founding workforce" |
| `italian_northern` | Nova Roma (GJ-764) | Mastroianni (Italian surname), MVG = Manifattura Veicoli Gherardi (Italian company name), system named "Nova Roma" by the founding family — deliberate Italian cultural claim |
| `tagalog` | Dagat (GJ-482A) | "Dagat" = sea in Filipino/Tagalog; Blue Collective HQ (cooperative naming consistent with Filipino bayanihan tradition); deep ocean kelp farming (Pacific maritime heritage) |
| `norse_compact` | Nyrheim (GJ-3737) | "Bífröst Marmor" (Bífröst = Norse mythological bridge); "Nyrheim" = Norwegian for "new home"; west_reach Compact member with specifically Norse-Norwegian identity |
### Inferred divergent-heritage values (partial GTTR grounding)
These are inferred from system names, corp names, and context where the GTTR entry hasn't been fully reviewed. Confidence level noted.
| Value | Systems | Inference basis | Confidence |
|---|---|---|---|
| `german_compact` | Ostmark (GJ-601A), Altmark (GJ-357) | "Ostmark" = Eastern March (German/Austrian), "Altmark" = German region — HOWEVER both are west_reach, where German IS the corridor baseline. These are corridor-typical, not divergent. Ostmark gets `compact_cooperative` (the Compact identity is more definitive than the generic German character). Altmark gets `cosmopolitan` (transit hub with non-aligned character). | Not overriding corridor — `compact_cooperative` and `cosmopolitan` suffice |
| `iberian` | Vuurkloof (GJ-35) partial | GTTR notes "language moves between Afrikaans and Portuguese" — Portuguese is south_reach corridor-typical, but the Afrikaans is the divergent signal; `afrikaans_cape` is the correct override | Covered by `afrikaans_cape` above |
| Various east_reach systems | Multiple | East_reach has Korean/Japanese baseline. Any system where the GTTR names Vietnamese, Filipino, Chinese, South Asian founding communities needs a heritage pin. The east_reach frontier zone (hops 7+) has significant Vietnamese/Southeast Asian communities based on naming conventions. | GTTR review needed for specific systems |
### The authoring method for the wider ~60-100 scope
For systems without direct GTTR evidence, apply this triage in order:
**Step 1 — Name analysis:** Does the system proper name come from a non-corridor language?
- west_reach (German/Dutch/Nordic baseline): French names (Romance = override), Italian names (override), Spanish names (override)
- east_reach (Korean/Japanese baseline): Vietnamese names (override), Filipino/Tagalog names (override), Chinese names (if clearly distinct from Korean/Japanese)
- south_reach (Portuguese/Swahili baseline): Afrikaans/Boer names (override), Zulu/Bantu names (override), Arabic names (override)
- north_reach (British/Australian baseline): Scottish Gaelic names (override), Irish names (override), Indian subcontinent names (override), West African names (override)
**Step 2 — Institution naming:** If the system has Tier-1 or major Tier-2 corps with names in a specific non-corridor language family, that heritage is present and likely dominant.
**Step 3 — GTTR founding community mention:** First paragraph of the GTTR entry almost always names the founding community's origin. If named → author the heritage pin.
**Step 4 — Corridor-typical fallback:** If none of the above applies, the corridor handles it. Do not author a `cultural_specialization` value. The cultural character falls to the activity-type value or the corridor default.
**CI rule I recommend:** Any GTTR-named system (has an entry in the Guide) that passes Step 1 or Step 3 MUST have a `cultural_specialization` value authored. This is the ~60-100 scope. The authoring criterion is: "GTTR names a founding community AND that community's heritage diverges from the corridor baseline."
### Combined cultural_specialization vocabulary (full)
Activity-type values (retained as-is for non-heritage-divergent systems):
`scholarly | artistic | institutional | commercial | agrarian | industrial_heritage | medical_elite | ecological | military | financial_technocratic | cosmopolitan | compact_cooperative`
Heritage-type values (proposed here, ~15 based on known systems; expandable as more GTTR is reviewed):
`scottish | french_provencal | vietnamese | afrikaans_cape | zulu | chinese | italian_northern | tagalog | norse_compact | irish | portuguese_iberian | korean | japanese | swahili | hausa | bengali | punjabi | yoruba`
*Heritage values are not exhaustive at this stage — the full list will emerge as the ~60-100 GTTR-named systems are reviewed in the content pass. The above are the ones confirmed by current GTTR coverage.*
---
## 3. Groombridge Encoding Confirmed
**The question (OQ-1 resolution):** `financial_hub` at Specialist (dense cluster of financial buildings throughout the settlement) + GSH as a MonopolySource hero-element landmark inside that cluster.
**Setting note — checking against the GTTR:**
> *"where the money lives...the instruments, the accounts, the actuarial models, the letters of credit that make it possible for a Syndic combine in the outer Reach to do business with a partner six gate hops away...financial houses that have been doing this for four centuries"*
> *"architecture is understated in the way that communicates expense...pleasant in the way that communicates professional discretion"*
The GTTR describes **financial houses** (plural) — not "the clearing house IS the system." Multiple institutions operate here: actuarial firms, the financial houses proper, credit facilities, and GSH as the dominant clearing node. This is a dense financial DISTRICT, not a company town organized around one facility.
**Lore confirmation: `financial_hub` (NonPhysical × Specialist) is correct.**
- Specialist: the financial activity is concentrated (not scattered as Ubiquitous would produce, not a single monopoly compound as MonopolySource would produce). Dense exchange floors and actuarial institutes throughout the settlement — this is what Specialist gives you.
- GSH as hero-element landmark: the single institution that makes Groombridge's financial district genuinely singular. The Reach-scale clearing house is the anchor, but the district around it is full of OTHER financial houses who want to be adjacent to it. This is exactly the "dense cluster with one dominant building" that the OQ-1 resolution describes.
- The NonPhysical coverage fraction (0.850.95): very high building coverage, low operations surface. Correct — financial services are all offices and server infrastructure.
**The lore correctly produces the built form:** Groombridge reads as a dense city of office towers and exchange floors organized around one particularly significant building at the center of the financial district. Not a mining town. Not "everything exists to support GSH." A financial district that happens to contain the most important clearing house in the Reach.
**`dominant_faction = syndic_dominant` confirmed:** GTTR explicitly states the financial syndics govern. "The financial houses built the council framework the council operates within." Assembly has no effective presence. Guardians of Autonomy have no chapter.
---
## 4. ACB and Bastion: `concord_assembly` Confirmed
**OQ-4 resolution: `lattice_commission` DROPPED from faction vocabulary.** My Round 2 table used `lattice_commission` for both ACB and Bastion. That was wrong; corrected here.
### ACB (GJ-559B) → `concord_assembly`
GTTR: "ACB IS a Commission presence...the rules live here."
The Commission is Assembly-funded and Assembly-directed. It is a regulatory body, not a governmental faction that governs systems. ACB's *institutional character* is Commission (the rules live there, Commission is the dominant institutional presence) but the *governing faction* is the Assembly that constituted and funds the Commission. The Commission's authority derives from Assembly mandate.
`dominant_faction = concord_assembly`. `cultural_specialization = institutional` (the Commission is the civic program — courts, regulatory offices, compliance infrastructure).
### Bastion (GJ-570A) → `concord_assembly`
GTTR: "The Assembly does not have a presence at Bastion. It IS Bastion...Assembly governs directly under military administrative frameworks through flag officers who rotate on cycles measured in years."
This is the clearest Assembly direct-governance case in the Reach. The faction IS Assembly; the institutional expression IS military.
`dominant_faction = concord_assembly`. `cultural_specialization = military` (fleet culture, discipline, readiness, service identity). `economic_specialization = military_station` (BulkSolid × Specialist — fleet maintenance infrastructure, dry docks, depots, fortified installations).
---
## 5. Vocabulary Note: One Required Addition
The agreed vocabulary needs `research_station` added:
| Value | `commodity_id` | `ubiquity_override` | BulkClass | ProductionUbiquity | Systems |
|---|---|---|---|---|---|
| `research_station` | `commission_certification` | `concentrated` | NonPhysical | Specialist | Keid, Tessera (alt to `legal_archive`) |
`commission_certification` is the nearest commodity to institutional research access: access certification, credentialed oversight, regulatory framework. Both `research_station` and `legal_archive` produce NonPhysical × Specialist; the distinction is in D-232 cultural template draw (scholarly/archive vs. regulatory/legal), handled by `cultural_specialization`.
The reason to keep both `research_station` and `legal_archive` in the vocabulary: they produce the same D-233 output but carry different cultural character signals. Keid gets `research_station` + `scholarly`. Tessera gets `legal_archive` + `scholarly`. The cultural character is the same; the economic characterization is subtly different (conservation research access vs. legal archive). Both are needed — they're lore-meaningful even if D-233 can't distinguish them.
---
## Summary: What Synthesis Needs
**No remaining open lore questions from my angle.** The must-pin table is complete with ~27 named systems. The cultural vocabulary covers all GTTR-confirmed divergent-heritage cases and provides a clear authoring method for the broader ~60-100 scope.
**One vocabulary addition to Burnelli's list:** `research_station` (NonPhysical × Specialist via `commission_certification` concentrated). Minor gap in her draft.
**One vocabulary-model reconciliation for synthesis:** my `cultural_specialization` proposal is a single field carrying EITHER an activity/character value OR a heritage value (heritage takes precedence). Burnelli's draft proposed corridor/character values only. The combined model is needed for Paula's Phase-4 divergent-heritage correctness — flagged for `workshop-outcomes.md`.
**Faction corrections applied:** ACB and Bastion → `concord_assembly` throughout.
**Groombridge encoding confirmed lore-faithful:** `financial_hub` (Specialist cluster) + GSH hero-element is the correct middle answer.
---
*Miri — Round 3 complete. 27-system must-pin table finalized. Cultural heritage vocabulary: 9 GTTR-confirmed values + method for ~60-100 scope. All confirmations applied.*
@@ -0,0 +1,205 @@
# Paula — Round 1: Faction / Political Economy Lens
*System Economic Specialization Workshop — 2026-05-31*
---
## The Core Political Economy Observation
The heuristic (economic_role + corp HQ + planet_class) fails predictably, not randomly. Political control creates three systematic distortion patterns that raw geography cannot detect:
1. **Institutional mandate** — a capital or regulatory seat exists where it is for *political* reasons. Sirius isn't a manufacturing hub; it governs. Groombridge isn't an agricultural system; it clears accounts for a civilization. The economy serves the institution, not vice versa.
2. **Compact self-sufficiency doctrine** — 3040 west_reach systems have deliberately diversified beyond what geography alone would produce. Compact doctrine says: never be economically dependent on anyone, including your own primary export. A Compact mining world will have farms and factories too. A heuristic that sees only the mine is wrong.
3. **Corporate homeworld identity** — when a Tier-1 corp IS the system, the system reads as that corporation. Calloway Reach is the Calloway Distillery's terroir, full stop. The transit infrastructure exists to move whisky. The same applies to Braemar (brach fiber), Nyrheim (Kvitfjell marble), Prometheus (longevity manufacturing), Renaissance (span gate fabrication). The corp TOML field `headquarters_system` is the pin signal.
These aren't edge cases. They include the Reach's capital, its financial clearing house, its military base, its agricultural heart, and the system that literally built the gate network. Getting them wrong produces a Reach that reads as naive.
---
## Q1 — The Field
**Propose: `system_specialization`** — a single nullable enum value per system. When present, it authoritatively pins the system's `dominant_bulk_class` and `dominant_production_ubiquity` for D-233. When absent, the heuristic runs.
**Does NOT replace `economic_base_primary/secondary`** (free text survives as flavor for GTTR/wiki). The structured field is the generator input; the prose is the human record. Different purposes, different audiences.
**Source:** `wiki/economics/system_specialization.toml``import_economics.py` → new column on `system_economy` table. NULL = absent = heuristic runs. D-010 compliant: purely static build-time lookup.
**Vocabulary (9 values):**
| `system_specialization` | `dominant_bulk_class` | `dominant_production_ubiquity` | Settlement reads as |
|---|---|---|---|
| `transit_hub` | NonPhysical | Ubiquitous | Customs halls, gate platforms, transit infrastructure throughout |
| `governance_center` | NonPhysical | Specialist | Institutional buildings, commission offices, assembly delegations |
| `financial_hub` | NonPhysical | MonopolySource | Exchange floors, clearing houses, data archives — dense, high floor-area |
| `research_station` | NonPhysical | Specialist | Laboratories, observation arrays, restricted access zones |
| `military_bastion` | PrecisionDense | Specialist | Fleet yards, depots, fortified installations |
| `manufacturing_hub` | PrecisionDense | Common | Competing factories, processing yards |
| `precision_industry` | PrecisionDense | MonopolySource | THE facility — cleanrooms, bespoke production halls |
| `agricultural_base` | Perishable | Ubiquitous | Fields, silos, processing stations across the landscape |
| `extraction_colony` | BulkSolid | MonopolySource | Mine head, ore pad, tailings, conveyor runs |
**Note on the two NonPhysical × Specialist pairs:** `governance_center` and `research_station` share the same (BulkClass, ProductionUbiquity). D-233 cannot distinguish them — the building vocabulary is the same (offices, administrative halls). They are differentiated at the D-232 level through `dominant_faction` weighting: Assembly → institutional architecture templates; Veil Institute → research/observatory templates. This is the intended D-232/D-233 channel separation: D-233 handles WHAT a building is; D-232 handles HOW it is characterized.
---
## Q2 — Within-System Weighted Variation
The system field is a **weighted prior, not a universal stamp.** Three-level priority for body-level specialization:
1. **Body `economic_role`** — wins when explicit. A body authored as `agricultural_satellite` gets Perishable × Ubiquitous even inside an extraction system.
2. **System `system_specialization`** — second-level prior when `economic_role` is ambiguous or absent. Bodies in a system without explicit roles inherit a bias toward the system's authored character.
3. **Corp HQ presence** — third-level signal. Adds weight toward the HQ corp's primary commodity at the body where the HQ sits.
**Political modifier (via `dominant_faction` — see Q5):**
- **Compact systems**: apply a self-sufficiency diversity bias regardless of body roles. Five centuries of Compact doctrine means no member system tolerates monoeconomy dependence. Even a heavy extraction system in the Compact will have bodies pushed toward agricultural and manufacturing secondary development. This makes Compact settlements read as more mixed than equivalent Assembly settlements.
- **Assembly systems**: can specialize more narrowly. The transit network provides everything else; MonopolySource concentration is structurally encouraged. The farming moon in an Assembly extraction system is an efficiency choice, not a political imperative.
**The farming moon in a foundry system:** A system pinned as `extraction_colony` can have one body with `economic_role = agricultural_satellite`. That body generates as Perishable × Ubiquitous (fields, silos). The system's narrative identity remains extraction. D-233's concentration/dispersion rule means extraction buildings dominate the primary bodies; the farming moon is a genuine minority presence.
**All weights are integer basis-points from SeedChain (D-010 compliant).**
---
## Q3 — `economy_size`?
**Out.** Population × `prosperity_baseline` (D-197) already cover this. A high-population, high-prosperity system is a large economy. The relationship is already captured.
The apparent exception — Groombridge (modest population, enormous financial footprint) — is handled correctly by `financial_hub → NonPhysical × MonopolySource`. A NonPhysical monopoly system's building vocabulary is offices, data archives, and exchange floors at high floor-area-ratio and high coverage (NonPhysical = 0.850.95 per D-233). The financial weight reads in the built form without a separate size field.
Adding `economy_size` risks contradiction with `prosperity_baseline`: if a small system is authored as `large` but its population and prosperity derive as modest, the generator has conflicting signals. Field out.
---
## Q4 — The Content Pass
**Authoring division:**
- **Miri** (lore/GTTR truth): ~4060 named systems with explicit GTTR economic characterization
- **Paula** (faction/political economy): ~5070 systems where political structure overrides geography — capitals, Compact members, institutional mandates
- **Burnelli-Sheldon** (economic credibility + mapping): validates commodity→BulkClass→ProductionUbiquity coherence for all authored entries; authors the ~200 unnamed/undescribed systems where the heuristic runs with validated fallback
**Worlds that MUST be pinned (Paula's specific list):**
*Core — Institutional Mandates (political logic, not geography):*
| System | GJ ID | Pin | Reason |
|---|---|---|---|
| Sirius | GJ 244A | `governance_center` | Assembly IS the system. No production, everything imported. Heuristic sees 2.8B pop + 5 apertures + Assembly HQ → might compute transit or manufacturing. Wrong. |
| Gateway | GJ 71 | `transit_hub` | "Gateway's economy runs on transit." 5 apertures, 4 corridors, customs infrastructure, Institute. |
| Groombridge | GJ 380 | `financial_hub` | "Where the money lives." GSH + Meridian Risk + The Registry all HQ at Lendel. Physical endowment is modest (dry world, limited ag). Financial infrastructure is a political choice, not geographic accident. |
| Keid | GJ 166A | `research_station` | Conservancy biosphere + Veil Institute station, one aperture, "Pristine. Access Restricted." Heuristic has no concept of "restricted by conservation mandate." |
| Prometheus | GJ 702B | `precision_industry` | Prometheus Labs IS the system — longevity manufacturing monopoly, single aperture chosen for security. Kovalev Freight HQ here too, but the longevity production dominates entirely. |
| Ran | GJ 144 | `agricultural_base` | "Farms. Nice ones. Leave." Grain surplus supplying Sirius. Heuristic might see Somatic Futures HQ → `precision_industry`. Wrong: Kallast Agrosyndic (reach_wide agricultural monopolist) is the dominant corp at the same settlement, and the GTTR is explicit. |
| Bastion | GJ 570A | `military_bastion` | Fleet base, 400M people on stations, no habitable planets, no agriculture. Assembly administers directly. "Prepared. For What Remains Unclear." |
| Cygni B | GJ 820B | `manufacturing_hub` | "Cygni B built the Reach." 7 competing shipbuilding combines (Common, not MonopolySource). Cygni Combines HQ here. Dense metallic asteroid belt. "Load-Bearing." |
| Renaissance | GJ 251 | `precision_industry` | Gate Corp fabrication facility. "Essential. Underpaid." Span gate production is the monopoly function. 5 apertures hub. |
| Altmark | GJ 357 | `transit_hub` | 5 apertures, "second-largest commercial system in the western sector." Assembly delegate + MVG distribution hub + Compact-processing banks. Genuinely diverse but transit-dominant by gate topology. Critically: `dominant_faction = independent` — it refuses formal alignment with either Assembly or Compact. |
*North Reach — Biological/Geological Monopolies (D-177 hard ceilings):*
| System | GJ ID | Pin | Reason |
|---|---|---|---|
| Braemar | GJ 475 | `agricultural_base` | thrds HQ. Brach fiber biological monopoly (D-177: herd expansion takes decades, no export of live animals). "Well-Made. Ownership Under Discussion." |
| Calloway Reach | GJ 3325 | `agricultural_base` | 11 distilleries, 1220 year aging pipeline, terroir-locked barley/yeast/water (D-177). "Distinguished. Ownership Partially Offshore." |
*West Reach — Compact Founding Members and Political Anchors:*
| System | GJ ID | Pin | Reason |
|---|---|---|---|
| Ostmark | GJ 601A | `agricultural_base` | "Agricultural output there has sustained the community for five centuries." F2III primary → cool polar/temperate zone settlement. Three Tier-1 corps at Rand (CFX, Westmark, Westphalia Heavy Works) are Compact institutions built ON TOP of the agricultural foundation. `dominant_faction = compact` equally critical. |
| Nyrheim | GJ 3737 | `extraction_colony` | Bífröst Marmor HQ at Kvitfjell. Kvitfjell marble, ~800t/y geological ceiling (D-177). Compact-affiliated. The quarry IS the system's economic identity even though the founding governance dispute is more interesting to read about. |
| Confluent | GJ 395 | `agricultural_base` | "Confluent is wine, and the transit infrastructure is simply how the wine reaches the people who want it." F8V stellar spectrum-locked VGV varietals (D-177). Société Chimique is also HQ'd here (pharmaceutical manufacturer) but the GTTR doesn't even mention it — the wine IS the system. |
**The Compact Member Systematic Rule** (for all 3040 systems, applied in the content pass):
> For any system with `dominant_faction = compact` where the heuristic would compute `extraction_colony` — require human review before committing. Compact political doctrine means no member system allows monoeconomy extraction. The self-sufficiency bias should move the pin at least one step less concentrated: MonopolySource → Specialist; Specialist → Common. Even where we confirm the extraction pin (Nyrheim), the body-level derivation gets the Compact diversity modifier.
*East Reach:*
| System | GJ ID | Pin | Reason |
|---|---|---|---|
| Dài Lộ | GJ 136 | FLAG for Miri | Takamori Lattice Works HQ (lattice substrate + drive cores = strategic east-corridor material, D-184 production_ubiquity = monopolistic). GTTR says "Grand Road" (transit). GTTR and corp presence diverge. My instinct: `precision_industry`, but Miri should confirm. |
| Dagat | GJ 482A | `agricultural_base` | Blue Collective HQ. Deep ocean kelp farming 300 years. Biological monopoly on Dagat Blue dye pigment. "Extraordinarily Blue." |
*South Reach:*
| System | GJ ID | Pin | Reason |
|---|---|---|---|
| Zenzele | GJ 1111 | FLAG for Miri | Baektu Mining Alliance + Umoja Freight HQ here, but GTTR emphasizes electromagnetic hardening expertise and infrastructure guilds ("Built to Last"). May pin as `manufacturing_hub` (the hardening components ARE manufactured exports) rather than `extraction_colony`. |
**CI Guardrails:**
- Every named system (has GTTR entry or wiki page) MUST have `system_specialization` authored. Unnamed systems may fall to heuristic.
- Values must be in-vocabulary enum.
- Contradiction detector: if `system_specialization = financial_hub` AND `economic_base_primary` text contains "mining" or "extraction" → flag for review.
- Compact consistency: if `dominant_faction = compact` AND `system_specialization = extraction_colony` → flag; not forbidden but requires human confirmation.
- Currency-faction alignment: if `dominant_faction = compact` AND `currency_zone = tractus_primary` → flag (D-172 says zone derives from political affiliation; these should be `mark_primary` or `mixed`).
**Source location:** `wiki/economics/system_specialization.toml` — flat TOML, one record per GJ catalog ID, two fields per record: `system_specialization` + `dominant_faction_pin`. Compiled by `import_economics.py` into new columns on `system_economy`. NULL = absent = heuristic runs.
---
## Q5 — Additional Identity Fields
**Yes to one. No to everything else.**
**The one field: authored `dominant_faction` pin.**
This is not a new field. `dominant_faction` is already field 4 in D-199's 6-field minimum read set for `CityGenerationContext`. It's already consumed by:
- **D-214** (PoliticalArchetype derivation: Commission-controlled → Commission archetype; Corporate territory → Corporate archetype; etc.) — which directly shapes settlement spatial layout
- **D-232** (template weight modifier) — which shapes architectural character
The question is not whether this field exists — it does, as a required generator input — but whether its value comes from authored data or a heuristic that will get politically complex systems wrong.
**Three specific heuristic failures:**
1. **Groombridge (GJ 380)**: Heuristic sees hop-2 inner system + Assembly territory → computes `concord_assembly`. But the financial syndics run Groombridge, not the Assembly (the GTTR explicitly notes the Veil Institute has no presence — the only core system where it's absent, by mutual agreement between institutions that don't want to know each other's books). `dominant_faction = syndic_dominant` changes D-214 PoliticalArchetype from Commission (institutional radial core) to Corporate (commercial campus grid). Different buildings. Different streets. Different feel.
2. **Ostmark (GJ 601A)**: Heuristic sees hop-9 outer west_reach → might compute `independent` or generic `compact`. But Ostmark didn't join the Compact. Ostmark's representatives helped WRITE the Compact. When the rotating council discusses treaty interpretation, Ostmark speaks from the founding institutional record. Getting the faction weight wrong means D-214 and D-232 treat one of the Reach's most politically significant systems as a generic frontier outpost.
3. **Altmark (GJ 357)**: Has Assembly delegate AND Compact-sympathetic banks AND MVG distribution hub AND independent governance council. The financial sector finished the political conversation without the Assembly delegate (GTTR: "Finishing Sentences The Council Started"). Neither `assembly` nor `compact` is correct. `independent` is the authored truth. Wrong faction flag = wrong PoliticalArchetype = wrong city spatial form.
**D-172 compliance gap resolved:** D-172 says currency zones derive from political affiliation, NOT hop distance. But without an authored `dominant_faction`, the system infers Compact membership from currency zone (circular) or hop distance (explicitly wrong per D-172). Authoring `dominant_faction` for Compact members resolves this.
**D-174 shadow economy accuracy:** D-174 says "Compact membership (elevated shadow independently of distance)." Compact-sympathetic systems (hop 5-6, `MIXED` currency, not formal Compact signatories) should also have elevated shadow economy. `dominant_faction = compact_sympathetic` marks these systems correctly without requiring formal Compact membership.
**Proposed vocabulary:** `concord_assembly | compact | compact_sympathetic | syndic_dominant | veil_institute | lattice_commission | independent | disputed`
**What I'm NOT advocating:**
- `economy_size` — covered by population × prosperity (Q3)
- Separate cultural identity field — D-232's corridor pool handles this
- Founding heritage — D-216 (founding_age_years) and D-232 corridor heritage sub-pool handle this
- Any dynamic or temporal field — static t=0, D-010
**While the pass is open:** The `atlas_body_trait_bias` `pin`/`boost`/`suppress` entries (D-232 schema, already defined) should be filled for hero bodies in this same pass. Assembly capital → pin institutional/governmental template. Compact founding member → pin Germanic-heritage community template. Calloway Reach → pin Scottish Highland pastoral vernacular. Not a new field — existing D-232 content action that belongs in this session.
---
## Summary Must-Pin Table
| System | GJ ID | `system_specialization` | `dominant_faction` | Distortion Pattern |
|---|---|---|---|---|
| Sirius | GJ 244A | `governance_center` | `concord_assembly` | Assembly IS the system |
| Gateway | GJ 71 | `transit_hub` | `mixed` | 5-aperture hub, Institute + Assembly |
| Groombridge | GJ 380 | `financial_hub` | `syndic_dominant` | Syndics govern, not Assembly |
| Keid | GJ 166A | `research_station` | `independent` | Conservancy biosphere, access controlled |
| Prometheus | GJ 702B | `precision_industry` | `independent` | Prometheus Labs IS the system |
| Ran | GJ 144 | `agricultural_base` | `concord_assembly` | Corp HQ ≠ system identity — grain, not medicine |
| Bastion | GJ 570A | `military_bastion` | `lattice_commission` | Fleet base — Assembly administers directly |
| Cygni B | GJ 820B | `manufacturing_hub` | `concord_assembly` | 7 competing combines — Common, not Monopoly |
| Renaissance | GJ 251 | `precision_industry` | `syndic_dominant` | Gate Corp span gate fabrication |
| Altmark | GJ 357 | `transit_hub` | `independent` | 5 apertures, deliberately non-aligned |
| Braemar | GJ 475 | `agricultural_base` | `independent` | Brach fiber biological monopoly (D-177) |
| Calloway Reach | GJ 3325 | `agricultural_base` | `independent` | Terroir whisky lock (D-177) |
| Ostmark | GJ 601A | `agricultural_base` | `compact` | Compact founding member — 5c agricultural base |
| Nyrheim | GJ 3737 | `extraction_colony` | `compact` | Kvitfjell marble geological monopoly (D-177) |
| Confluent | GJ 395 | `agricultural_base` | `compact_sympathetic` | VGV wine, F8V spectral lock (D-177) |
| Dagat | GJ 482A | `agricultural_base` | `independent` | Deep ocean kelp farming, Blue dye monopoly |
| Dài Lộ | GJ 136 | FLAG (Miri) | `independent` | GTTR transit vs Takamori Lattice Works |
| Zenzele | GJ 1111 | FLAG (Miri) | `independent` | GTTR hardening expertise vs mining corps |
| All ~3040 Compact members | various | Vary by lore | `compact` | Apply self-sufficiency review rule |
---
*Filed: 2026-05-31. Paula (Narrative & Political Depth). Workshop: system-economic-specialization, Round 1.*
@@ -0,0 +1,242 @@
# Paula — Round 2: Faction Lock + Axis Delineation
*System Economic Specialization Workshop — 2026-05-31*
---
## Opening: What Changed in the Checkpoint
FORK 2 is closed in favor of authoring `dominant_faction` for named systems. FORK 3 closes the `dominant_production_scale` second column — scale encoded inside the single economic field's vocabulary instead. My Round 2 job is to lock `dominant_faction` down and draw clean boundaries between the three axes that are now confirmed to be authored in this pass: economic, faction, and cultural.
---
## 1. `dominant_faction` Vocabulary — Locked
**One revision from Round 1:** Drop `lattice_commission`. The Commission never *governs* a system — it regulates across the Reach. No system's civic identity is Commission-governed in the way that Groombridge is Syndic-governed or Ostmark is Compact-governed. Commission presence is a weight in D-232's template eligibility, not a governance classification. Replace with `mixed` for systems where no single faction dominates (Gateway, Altmark).
**Final vocabulary (8 values):**
```
concord_assembly — governed by or strongly Assembly-affiliated
compact — formal Compact of Westphalia signatory
compact_sympathetic — Compact-aligned but not formal signatories (hop 56, MIXED currency)
syndic_dominant — Syndic interests functionally govern civic and economic life
veil_institute — Institute has effective overriding authority (rare; research/containment mandates)
independent — self-governing non-affiliated bodies
disputed — contested or fractured governance
mixed — multiple significant factions with no single dominant (multi-polar systems)
```
**Default derivation for unautored systems (heuristic):** Core hop 03 → `concord_assembly`; mid-reach hop 45 → `concord_assembly`; outer west_reach hop 6+ with `MARK_PRIMARY` currency → `compact`; outer west_reach hop 56 with `MIXED` currency → `compact_sympathetic`; other corridors hop 7+ → `independent`. Corporations with `behavioral_archetype = monopolist` and dominant presence → `syndic_dominant` consideration. This heuristic runs only for unnamed systems; every GTTR-named system is authored.
---
## 2. Named System Faction Pins — Authoritative List
Corrections from Round 1 applied (Bastion is `concord_assembly`, not `lattice_commission`; Miri's Round 1 adds Nova Roma and Sindri; `veil_institute` used for Keid is revised to `independent` since the Conservancy governs, not the Institute).
| System | GJ ID | `dominant_faction` | Basis |
|---|---|---|---|
| Sirius | GJ 244A | `concord_assembly` | Assembly IS the system; governs directly |
| Gateway | GJ 71 | `mixed` | Assembly + Veil Institute + Syndics; no single dominant |
| ACB | GJ 559B | `concord_assembly` | Commission offices here, Assembly-funded |
| Ran | GJ 144 | `concord_assembly` | Syndic agricultural combines under Assembly legal framework |
| Groombridge | GJ 380 | `syndic_dominant` | Financial syndics govern; Institute pointedly absent; Assembly has no real authority |
| Prometheus | GJ 702B | `independent` | Prometheus Labs sole authority; Commission carve-out; single aperture ensures independence |
| Keid | GJ 166A | `independent` | Keid Conservancy governs; Institute is a long-term tenant, not the landlord |
| Bastion | GJ 570A | `concord_assembly` | Assembly administers directly via flag officers; military administrative framework |
| Cygni B | GJ 820B | `concord_assembly` | Seven combines, functional Assembly relation; "unaffectionate but functional" |
| Renaissance | GJ 251 | `syndic_dominant` | Gate Corporation IS the civic economy; "combines have never needed to be anything else" |
| Arbour | GJ 338B | `independent` | Perpetual-class estates governance; "by invitation" — private, not Assembly |
| Tessera | GJ 3877 | `concord_assembly` | Assembly Interpretive Registry; legal-archival identity |
| Parallax | GJ 280A | `independent` | Adams & Ford independent publishing; no dominant institutional faction |
| Lu Ban | GJ 15A | `concord_assembly` | Hop-3 inner system; 300 manufacturers, Assembly-adjacent despite bazaar character |
| Nova Roma | GJ 764 | `syndic_dominant` | MVG assembly-lines employ the population; Mastroianni family runs the city de facto |
| Sindri | GJ 3522 | `syndic_dominant` | DSMC mining monopoly controls system access; "Do Not Descend" = DSMC territory |
| Wolf 359 | GJ 406 | `concord_assembly` | Assembly regional transit office; pure institutional transit hub |
| Vuurkloof | GJ 35 | `concord_assembly` | South_reach hop-6; no contrary lore signal; Assembly default applies |
| Braemar | GJ 475 | `independent` | Distillers' Council + herders' association; cooperative self-governance |
| Calloway Reach | GJ 3325 | `independent` | Distillers' Council governs; Syndic acquisition approaches declined |
| Altmark | GJ 357 | `independent` | Explicitly refuses to formally align with either Assembly or Compact; the financial sector finished the conversation |
| Ostmark | GJ 601A | `compact` | Compact founding member; helped draft the framework; 500 years self-governance |
| Nyrheim | GJ 3737 | `compact` | Compact affiliate; founded by Freiholt bloc |
| Confluent | GJ 395 | `compact_sympathetic` | VGV uses Mark currency + Compact distribution; governance not formally Compact |
| Dagat | GJ 482A | `independent` | Archipelago Council; no strong Assembly or Compact signal |
| Dài Lộ | GJ 136 | `independent` | Tham Quan governs; Assembly "acknowledged in principle" = polite fiction |
| Changwon | GJ 860B | `independent` | Bicameral civic/operators council; self-governing junction |
| All formal Compact members (~3040 west_reach) | various | `compact` | Apply self-sufficiency review rule from Round 1 |
---
## 3. Critical Delineation: Three Orthogonal Axes
**The honest truth:** all three axes were latent in Round 1's proposals. What the user checkpoint has clarified is that all three genuinely exist in the data (including the cultural axis, which lives in the existing `system_culture` table per Miri), and all three get authoring attention in this pass.
### What each axis IS and is NOT
**Economic axis** (`dominant_commodity_id` or equivalent): What the system produces/exports. Answers: "If I generate a building here, what function does it have?" Drives D-233 (BulkClass × ProductionUbiquity → coverage, vocabulary, operations surface).
**Faction axis** (`dominant_faction`): Who governs and how power is structured. Answers: "How is the settlement spatially organized — planned, corporate, organic, fortified, academic, industrial?" Drives D-214 (PoliticalArchetype → settlement layout), D-232 (template weight modifier), D-174 (shadow economy intensity), D-172 (currency zone validation).
**Cultural axis** (`system_culture.cultural_register` — existing table): Where the culture came from and what it celebrates. Answers: "What does a museum here display? What does the entertainment scene look like? What do NPCs sound like?" Feeds Phase 6 content generators (museums, entertainment, NPC voice D-121, D-123, D-128). **This table already exists per Miri's Round 1 — no new schema column needed.**
### Does `dominant_faction` subsume the cultural axis?
**No. They are orthogonal.** The proof is in the cross-axis combinations that the lore demands:
| System | Faction | Cultural register | Why they must be separate |
|---|---|---|---|
| Dài Lộ | `independent` | Vietnamese-dominant | A Vietnamese culture system that happens to be self-governing. Faction says nothing about culture here. |
| Confluent | `compact_sympathetic` | French-heritage | Compact political alignment; French founding families. Neither derives from the other. |
| Sirius | `concord_assembly` | Institutional-cosmopolitan | Assembly governance; but the cultural register is bureaucratic-cosmopolitan, NOT Germanic or any corridor heritage. |
| Calloway Reach | `independent` | Scottish Highland pastoral | Self-governance; Scottish heritage. Faction doesn't touch culture. |
| Ostmark | `compact` | Germanic-historical | Compact founding member; Germanic heritage. The Compact doctrine SHAPES how the Germanic heritage expresses itself (community-first, pragmatic, self-reliant) but doesn't replace it. |
**The faction shapes HOW culture expresses itself politically — it doesn't determine the underlying heritage.** An Ostmark museum would feature 500 years of self-governance history (faction = compact → Compact doctrine celebrated) AND Germanic engineering and agricultural heritage (cultural register = germanic_historical). Both inputs are needed. Neither subsumes the other.
### Which generators consume which axis
| Axis | Current consumers (Phase 4+) | Future consumers (Phase 6) |
|---|---|---|
| Economic (`dominant_commodity_id`) | D-233 FillChunk (BulkClass × ProductionUbiquity → building vocabulary, coverage), D-229 BuildingPropertyTag | — |
| Faction (`dominant_faction`) | D-214 PoliticalArchetype (settlement spatial layout), D-232 template weight modifier, D-174 shadow economy intensity, D-172 currency zone validation | NPC faction relations |
| Cultural (`system_culture.cultural_register`) | — (no current Phase 4 consumer) | Phase 6: museum content, entertainment type, NPC voice (D-121, D-123, D-128), cultural dialogue templates |
**The consumer boundary is clean.** Faction has active Phase 4 consumers and must be authored now. Cultural axis has only Phase 6 consumers — BUT the user's direction is to fill it in this pass while we're touching all 300 systems, not to wait for Phase 6 and do it again under time pressure.
### My recommendation on the cultural axis
The cultural axis is the `system_culture` table, which already exists. The content pass should fill `cultural_register` (and optionally `cultural_register_secondary`) for ~3040 hero systems. Default for unnamed systems = corridor assignment (already implicit). No new schema column.
Authoring responsibility: **Miri** (already knows the GTTR cultural characterizations). My faction contributions to cultural expression: for Compact systems, I flag that `compact` faction + west_reach corridor produces a specific sub-flavor (Germanic community-cohesion + Compact self-sufficiency doctrine), which Miri should encode in the `cultural_register` authoring.
---
## 4. CI Guardrails for `dominant_faction`
**Hard errors:**
| ID | Rule | Rationale |
|---|---|---|
| V-FAC-01 | Every inhabited named system (has GTTR entry) MUST have `dominant_faction` authored | Guarantees D-214/D-232 have clean authored inputs |
| V-FAC-02 | `dominant_faction` value must be in vocabulary | Typo prevention |
**Soft warnings:**
| ID | Rule | Rationale |
|---|---|---|
| W-FAC-01 | `dominant_faction = compact` AND `currency_zone = tractus_primary` → flag | D-172: Compact members should be `mark_primary` or `mixed`. Assembly currency in a Compact member is a lore contradiction. |
| W-FAC-02 | `dominant_faction = compact` AND `system_specialization = extraction_colony` → flag for review | Compact self-sufficiency doctrine means no Compact member is purely extractive. Confirm before committing. |
| W-FAC-03 | `dominant_faction = syndic_dominant` AND no Tier-1 corp HQ present in `corp_presence` → flag | Syndic dominance without a Syndic presence anchor is ungrounded. Either the HQ is missing from the TOML or the pin is wrong. |
| W-FAC-04 | `dominant_faction = compact_sympathetic` AND `currency_zone = mark_primary` → flag | Sympathetic systems are defined as NOT having Mark as primary (that's formal membership). If they're Mark-primary, they may be full members who should be `compact`. |
| W-FAC-05 | `dominant_faction = independent` AND a Tier-1 corp with `behavioral_archetype = monopolist` is the sole HQ → flag | Independence claim vs monopolist-corp governance is a tension requiring confirmation. |
---
## 5. Anti-Scope-Creep Test
**`dominant_faction`:**
- ✅ Changes how a system reads: Groombridge with `syndic_dominant` gets Corporate PoliticalArchetype (campus grid) vs `concord_assembly`'s Commission archetype (radial core). Different streets, different district distribution, different city shape.
- ✅ Degrades to a default: corridor + hop heuristic provides plausible values for unnamed systems.
- ✅ Has active consumers NOW: D-214 (current phase), D-232 (current phase), D-174 (current phase).
- ✅ Resolves an existing compliance gap: D-172 says currency zones derive from political affiliation, not hop distance. Authored `dominant_faction` is the correct source for Compact membership.
- **PASSES.**
**Cultural axis (as filling `system_culture.cultural_register` for hero systems):**
- ✅ Changes how a system reads — in Phase 6. Dài Lộ with Vietnamese cultural register generates different museum/entertainment content than a Korean east_reach system.
- ✅ Degrades to a default: corridor provides the cultural baseline for unnamed systems.
- ⚠️ No current Phase 4 consumer: honest about this. User has explicitly directed this pass to cover both axes, and the data is far cheaper to author NOW (while we have all 300 systems open) than LATER (under Phase 6 time pressure).
- ✅ No new schema column: `system_culture` already exists; filling it is content, not architecture.
- ✅ Authoring burden ~3040 entries for hero systems: within the same scope as `atlas_body_trait_bias`.
- **PASSES the scope test as a content-fill action, not as a new field.**
**What still doesn't pass:**
- Any new schema column for the cultural axis: unnecessary (table exists)
- `economy_size`: closed (confirmed out, three-way unanimous)
- Per-system `dominant_production_scale` as a separate column: closed (Fork 3 resolved; scale encoded in the primary field's vocabulary)
---
## Summary: Three Axes, Three Sources, Clean Boundaries
| Axis | Field | Source | Current consumers | Default for unautored |
|---|---|---|---|---|
| Economic | `system_economy.dominant_commodity_id` (or equivalent) | `wiki/economics/system_specialization.toml` | D-233 (built form) | Heuristic: role + planet_class + corp HQ |
| Faction | `system_economy.dominant_faction` (new column) | same TOML file, second field per record | D-214, D-232, D-174, D-172 | Corridor + hop heuristic |
| Cultural | `system_culture.cultural_register` (existing table) | Existing `system_culture` TOML source | Phase 6 content generators | Corridor baseline |
**These three fields in `system_specialization.toml`:**
```toml
[GJ-601A] # Ostmark — Compact founding member
dominant_commodity_id = "agricultural_produce"
dominant_faction = "compact"
# cultural_register filled in system_culture.toml by Miri:
# cultural_register = "germanic_compact_historical"
```
The TOML source for the cultural axis lives in the `system_culture` TOML (Miri's domain), not in `system_specialization.toml`. This keeps the faction and economic fields together (one file per system) while the cultural register stays in its own table/source (one concern per file).
---
*Filed: 2026-05-31. Paula (Narrative & Political Depth). Workshop: system-economic-specialization, Round 2.*
---
## Addendum: The Cultural Axis on Quality Grounds
My Round 2 document made the right call on the delineation — faction and cultural ARE distinct, they're orthogonal, neither subsumes the other. But I justified the cultural axis by saying "it's cheap" rather than "it's worth it." The quality re-steer is correct, so let me make the quality case directly.
**What breaks without authored cultural identity:**
The cultural axis isn't metadata for Phase 6 that we're banking as an investment. It breaks things in Phase 4 and earlier if it's missing for systems that already have authored identity in the GTTR. Here's how:
D-232's trait template draw is weighted by corridor as a soft prior. The corridor for the west_reach corridor is Germanic/Scandinavian baseline. Confluent (GJ 395) is in the west_reach at hop 10. Without an explicit cultural pin, the trait template draw for Confluent pulls from the Germanic baseline — which is **wrong**: Confluent has French founding families and four centuries of viticulture culture. The settlement should look like a Loire Valley estate town, not a Germanic Compact agricultural community.
The same problem applies to every system where the founding heritage diverges from the corridor baseline:
- Confluent (GJ 395): French in a Germanic corridor
- Dài Lộ (GJ 136): Vietnamese in an east_reach Korean/Japanese corridor
- Calloway Reach (GJ 3325): Scottish in a north_reach British/Australian corridor (close but distinct — the distillery aesthetic is specifically Highland, not generic British)
- Dagat (GJ 482A): Filipino/Tagalog heritage in a broader east_reach corridor
- Vuurkloof (GJ 35): Afrikaans (South African Boer heritage) in a south_reach corridor with a different baseline
These aren't Phase 6 concerns. They affect what D-232 generates RIGHT NOW when the trait template draw runs. Without authored cultural pins for these systems, the generator pulls the wrong templates.
**What the cultural axis is, precisely:**
It is not a Phase 6 flourish. It is the authored override that prevents D-232's corridor-baseline draw from producing wrong architectural character. In the trait template system, the `atlas_body_trait_bias` provides per-body pins. The cultural register in `system_culture` provides the per-SYSTEM cultural identity that shapes the DEFAULT draw for every body in the system.
These two work together:
- `system_culture.cultural_register` = the cultural baseline FOR THIS SYSTEM's trait template draw
- `atlas_body_trait_bias` = the specific template pin for a hero body that further overrides the system baseline
Without the system cultural register, the hero body trait pins do all the work but the surrounding systems have wrong cultural character. Confluent's vineyard estates would be pinned correctly via `atlas_body_trait_bias`, but the town center, the worker housing, the freight infrastructure would still pull from the Germanic corridor baseline.
**Revised scope of the cultural axis fill:**
Not 30-40 hero bodies. Every GTTR-named system where the founding heritage diverges from the corridor baseline must be authored. That's probably 60-100 systems out of the named set, not just the hero bodies. The authoring question is: "Does this system's actual cultural heritage match what the corridor baseline would produce?" If no → author it. If yes → corridor default is fine.
**Where it lives:**
I previously said the cultural register stays in the `system_culture` TOML (Miri's domain). The quality argument actually pushes the other direction: for the ~60-100 systems where cultural register diverges from corridor, the authoring coherence is better if it's visible alongside the economic and faction fields in `system_specialization.toml`. An author writing Confluent's entry should see:
```toml
[GJ-395] # Confluent
dominant_commodity_id = "agricultural_produce"
dominant_production_scale = "monopolistic" # F8V terroir lock
dominant_faction = "compact_sympathetic"
cultural_register = "french_heritage" # founding families Loire tradition
```
...all in one place, rather than split between two files where the cultural register can drift from the economic and faction signals.
This pushes toward adding `cultural_register` as an optional field IN `system_specialization.toml`, not as a cross-table concern. It's one more field in the same TOML, authored at the same time, for systems where corridor alone would produce wrong output.
**The actual quality bar:**
For systems where corridor would produce the RIGHT architectural character → no cultural register needed.
For systems where corridor would produce the WRONG architectural character (founding heritage diverges) → author it, and the quality cost of NOT authoring it shows up in D-232 draws in Phase 4.
This is not scope creep for tidiness. This is authoring the data D-232 actually needs to produce correct output.
*— Paula, addendum to Round 2, 2026-05-31*
@@ -0,0 +1,169 @@
# Paula — Round 3: Final Faction List + Heritage-Divergence Contributions
*System Economic Specialization Workshop — 2026-05-31 — Synthesis Round*
---
## 1. Final `dominant_faction` Named-System List
Vocabulary locked at 8 values per Round 2 (`lattice_commission` dropped; `mixed` added). ACB and Bastion confirmed `concord_assembly`. Every named system with one-line basis.
### Core Systems (hop 03)
| System | GJ ID | `dominant_faction` | Basis |
|---|---|---|---|
| Gateway | GJ 71 | `mixed` | Assembly + Veil Institute + Syndics all significant; no single body governs |
| Sol | GJ 0 | `disputed` | Post-Secession Earth: diplomatic no-man's land, contested Assembly authority, no settled governance model |
| Sirius | GJ 244A | `concord_assembly` | Assembly IS the system; governs directly; Syndics and Institute are tenants |
| Ran | GJ 144 | `concord_assembly` | Syndic agricultural combines operate under Assembly legal framework; Commission busy here |
| Struve | GJ 725B | `disputed` | Dormant gate activated ~40 years ago by alien infrastructure; jurisdictional claims unsettled; "Full of Potential. Send Lawyers." |
| ACB | GJ 559B | `concord_assembly` | Commission's formal rules home; Assembly-funded entirely |
| Groombridge | GJ 380 | `syndic_dominant` | Financial syndics govern; Veil Institute pointedly absent; Assembly has no real authority here |
| Prometheus | GJ 702B | `independent` | Prometheus Labs sole authority; Commission carve-out from founding; single aperture chosen for security |
| Keid | GJ 166A | `independent` | Keid Conservancy governs; Institute is a five-century tenant, not the landlord |
| Barnard's Star | GJ 699 | `concord_assembly` | Residential commuter suburb for Cygni B; no contrary governance signal |
### Core Systems (hop 23)
| System | GJ ID | `dominant_faction` | Basis |
|---|---|---|---|
| Cygni B | GJ 820B | `concord_assembly` | Seven combines, functional Assembly relation; "unaffectionate but functional" |
| Renaissance | GJ 251 | `syndic_dominant` | Gate Corporation IS the civic economy; management lives at Arbour |
| Parallax | GJ 280A | `independent` | Adams & Ford independent publishing; multi-corp landscape, no single dominant |
| Bastion | GJ 570A | `concord_assembly` | Assembly administers directly via rotating flag officers; military administrative framework |
| Arbour | GJ 338B | `independent` | Perpetual-class estates; "by invitation" — private governance, not Assembly |
| Wolf 359 | GJ 406 | `concord_assembly` | Pure Assembly regional transit office; no other significant faction presence |
| Nova Roma | GJ 764 | `syndic_dominant` | MVG assembly-lines employ the population; Mastroianni family de facto civic authority for 300 years |
| Tessera | GJ 3877 | `concord_assembly` | Assembly Interpretive Registry; legal-archival identity |
| Lu Ban | GJ 15A | `concord_assembly` | Hop-3 inner system; 300 independent manufacturers, Assembly-adjacent despite bazaar character |
### South Reach
| System | GJ ID | `dominant_faction` | Basis |
|---|---|---|---|
| Vuurkloof | GJ 35 | `concord_assembly` | South_reach hop-6; no contrary lore signal; Assembly default applies |
### North Reach
| System | GJ ID | `dominant_faction` | Basis |
|---|---|---|---|
| Braemar | GJ 475 | `independent` | Distillers' Council + herders' association cooperative self-governance |
| Calloway Reach | GJ 3325 | `independent` | Distillers' Council governs; Syndic acquisition approaches declined repeatedly |
| Sindri | GJ 3522 | `syndic_dominant` | DSMC mining monopoly controls system access and governance; "Do Not Descend" = DSMC territory |
### West Reach
| System | GJ ID | `dominant_faction` | Basis |
|---|---|---|---|
| Altmark | GJ 357 | `independent` | Explicitly refuses formal alignment; financial sector already finished the conversation the governance council hasn't had |
| Ostmark | GJ 601A | `compact` | Compact founding member; helped draft the framework; Perpetual-class representatives still present |
| Nyrheim | GJ 3737 | `compact` | Compact affiliate; founded by Freiholt political bloc |
| Freiholt | GJ 453 | `compact` | Compact founding member (named in faction lore as co-drafter) |
| Groenland | GJ 3333 | `compact` | Joined for trade economics; "joined Compact because the mutual recognition framework reduced import costs" |
| Echternach | GJ 127B | `compact` | Deep-corridor formal signatory; medical supply dependency on Compact trade network |
| Confluent | GJ 395 | `compact_sympathetic` | VGV uses Mark currency + Compact distribution; governance not formally Compact; hop-10 frontier extension |
### East Reach
| System | GJ ID | `dominant_faction` | Basis |
|---|---|---|---|
| Dagat | GJ 482A | `independent` | Archipelago Council; no Assembly or Compact signal |
| Dài Lộ | GJ 136 | `independent` | Tham Quan governs; Assembly "acknowledged in principle" is polite fiction for practical autonomy |
| Changwon | GJ 860B | `independent` | Bicameral civic/operators council; self-governing junction |
---
## 2. Default Heuristic for Unnamed Systems
For systems without a GTTR entry or authored pin:
| Condition | Default `dominant_faction` |
|---|---|
| Hop 05, any corridor | `concord_assembly` |
| Hop 6+, west_reach, `MARK_PRIMARY` currency | `compact` |
| Hop 56, west_reach, `MIXED` currency | `compact_sympathetic` |
| Hop 10+, west_reach (frontier extensions) | `compact` (Compact culture internalized at founding) |
| Hop 7+, any other corridor | `independent` |
| Dominant Tier-1 corp with `behavioral_archetype = monopolist` | `syndic_dominant` (flag for confirmation) |
| Gate topology anomaly or Institute-claimed facility | `disputed` or `veil_institute` (flag for Miri confirmation) |
---
## 3. Heritage-Divergence List: Faction/Political Lens Contribution
My specific contribution to the cultural_register authoring pass. The question I'm answering for each system: **how does political history shape the cultural register in ways that diverge from or specify the corridor baseline?**
Three mechanisms through which faction shapes cultural register — Miri needs all three to author correctly:
### Mechanism A: Faction ERASES corridor heritage (institution becomes the culture)
These systems have had long enough institutional dominance that the founding heritage is subsumed. The corridor default is wrong and unhelpful — not because it's a different heritage, but because there IS no corridor heritage signal that survives.
| System | GJ ID | Faction | Cultural register implication | What breaks without it |
|---|---|---|---|---|
| Sirius | GJ 244A | `concord_assembly` | `institutional_cosmopolitan_assembly` — 300+ years of Assembly capital has erased any corridor heritage; culture IS governance | D-232 draws inner_corridor neutral templates → misses institutional-underground character of the below-grade city |
| Groombridge | GJ 380 | `syndic_dominant` | `financial_institutional_core` — four centuries of financial syndic dominance; no corridor heritage survives; the culture IS commercial discretion | D-232 draws inner_corridor neutral → misses the expensive understatement, the absence of Institute cultural layer, the financial archive character |
| Bastion | GJ 570A | `concord_assembly` | `military_institutional_assembly` — rotating flag officers for 300 years; no stable heritage; fleet rotation prevents any founding culture from persisting | D-232 draws inner_corridor neutral → misses the fortified-perimeter, military-procedure culture |
| Renaissance | GJ 251 | `syndic_dominant` | `industrial_labor_corporate_split` — the workers are here; the management is at Arbour one hop away. That CLASS SPLIT is the cultural register. Fabrication-hall culture, labor pride, institutional resentment of the absent management class | D-232 draws inner_corridor neutral → misses the flat-industrial character and the labor-identity cultural axis |
| Prometheus | GJ 702B | `independent` | `laboratory_monoculture_isolated` — entirely institutional, no outside influence, single-aperture isolation means cultural homogeneity unprecedented elsewhere. The lab IS everything | D-232 draws inner_corridor neutral → misses the campus-clinical, access-controlled character |
### Mechanism B: Faction DEEPENS or SPECIFIES the correct corridor heritage
These systems would get the RIGHT corridor baseline, but the political history focuses which aspects of that heritage dominate. Both the corridor draw AND the faction context are needed.
| System | GJ ID | Faction | Cultural register implication | What the corridor baseline misses |
|---|---|---|---|---|
| Ostmark | GJ 601A | `compact` | `germanic_compact_historical` — Germanic heritage PLUS 500 years of Compact-doctrine institutional memory. Museums: the original Compact charter, practical engineering, agricultural self-sufficiency, governance history. Political independence has amplified and focused the Germanic heritage, not replaced it. | Corridor draws generic Germanic; misses that self-governance for 500 years has made the GOVERNANCE TRADITION itself the primary cultural object |
| Nyrheim | GJ 3737 | `compact` | `nordic_community_idealist_fractured` — Norwegian/Scandinavian heritage PLUS young (40 years) PLUS the founding political split from Freiholt (live governance dispute about export controls). The cultural register is simultaneously idealist-community AND internally fractured. Two chambers, two value systems. | Corridor draws Nordic baseline; misses that this is a 40-year-old system whose founding dispute IS still ongoing |
| Freiholt | GJ 453 | `compact` | `germanic_compact_long_institutional` — founding Compact member, possibly older than Ostmark's Compact role. Germanic heritage plus long Compact governance history, but at hop 7 distance more practically self-reliant than Sirius-facing systems | Corridor draws generic Germanic; misses the specific Compact-founding-member institutional depth |
| Calloway Reach | GJ 3325 | `independent` | `scottish_highland_cooperative_governance` — Scottish heritage, but the `independent` governance structure (Distillers' Council) means the cooperative values OF the distillery tradition are also the political values of the system. Politics and culture are not separate here. | Corridor draws north_reach British/Australian; misses specifically Scottish Highland cooperative character reinforced by the fact that the cooperative IS the government |
| Braemar | GJ 475 | `independent` | `scottish_pastoral_cooperative_threatened` — Scottish pastoral heritage, brach herding culture, but the THREAT of acquisition (Syndic acquisition approaches, ownership discussions) is culturally live. The community knows it might not stay independent. That anxiety is part of the cultural register. | Corridor draws north_reach British/Australian; misses the specifically pastoral + cooperative + threatened-ownership dimension |
### Mechanism C: Faction PRESERVES minority heritage against corridor assimilation
These systems have founding heritage that diverges from the corridor baseline. Political independence or specific Compact sympathies is what has PROTECTED that heritage from being assimilated toward the corridor norm.
| System | GJ ID | Faction | Cultural register | Why faction matters for the heritage preservation |
|---|---|---|---|---|
| Confluent | GJ 395 | `compact_sympathetic` | `french_viticultural_heritage` — Loire Valley viticulture tradition; French founding families; 400 years of wine culture. West_reach corridor baseline would draw Germanic. | `compact_sympathetic` alignment means commercial independence from Assembly regulatory frameworks, which protects the non-Germanic identity from institutional assimilation. French culture here is politically protected by the Compact trade network. |
| Dài Lộ | GJ 136 | `independent` | `vietnamese_frontier_pragmatic` — Vietnamese cultural substrate dominant; Korean/Japanese/Chinese heritage layers added; "families who maintain three language traditions simultaneously." East_reach corridor draws Korean/Japanese. | `independent` governance (Tham Quan) means the Vietnamese governance tradition is the civic tradition. Political independence preserved Vietnamese-dominant culture at hop 8 rather than assimilating to east_reach Korean/Japanese baseline. |
| Dagat | GJ 482A | `independent` | `tagalog_maritime_ecological` — Filipino/Tagalog heritage ("Dagat" = Tagalog for "sea"); Archipelago Council governance reflects island-community political tradition. East_reach corridor draws Korean/Japanese. | `independent` archipelago governance IS Philippine island-community cultural tradition. The governance model and the cultural heritage are the same thing. Political independence means Philippine culture survived the east_reach corridor. |
---
## 4. Summary: What Miri Needs From This Lens
For the cultural_register authoring, the political lens produces these inputs:
1. **Faction = institutional culture** (Mechanism A): For 5+ systems, the faction structure has become the culture. Miri should author `cultural_register` as institutional rather than as corridor heritage. These systems' cultural content generators (museums, entertainment) should draw from the institutional history, not from any founding heritage.
2. **Faction = deepened corridor** (Mechanism B): For 5+ systems, the corridor baseline is correct but incomplete. Miri should author `cultural_register` as corridor-plus-political-doctrine. The political history tells you WHICH ASPECTS of the corridor heritage dominate.
3. **Faction = heritage preservation** (Mechanism C): For 3+ named systems (and more unnamed), the divergent heritage survived because political independence protected it. Miri should author these as the specific heritage (French, Vietnamese, Tagalog), not the corridor baseline. The faction pin (`compact_sympathetic`, `independent`) is the REASON why the divergent heritage is still there — it belongs in the `cultural_register` reasoning even if it's not in the `cultural_register` value itself.
---
## 5. Final Faction CI Guardrails
**Hard errors (build aborts):**
| ID | Rule |
|---|---|
| V-FAC-01 | Every inhabited named system (GTTR entry or wiki page) MUST have `dominant_faction` authored |
| V-FAC-02 | `dominant_faction` value must be in the locked 8-value vocabulary |
**Soft warnings (build succeeds, prints):**
| ID | Rule | Rationale |
|---|---|---|
| W-FAC-01 | `compact` + `tractus_primary` currency zone → flag | D-172: Compact members use `mark_primary` or `mixed`. Assembly currency in a Compact member is a lore contradiction. |
| W-FAC-02 | `compact` + `extraction_colony` economic specialization → flag for review | Compact self-sufficiency doctrine: no member system allows monoeconomy extraction. Confirm before committing. |
| W-FAC-03 | `syndic_dominant` + no Tier-1 corp HQ in `corp_presence` → flag | Syndic dominance without an anchor corp is ungrounded. Either the HQ is missing from the TOML or the pin is wrong. |
| W-FAC-04 | `compact_sympathetic` + `mark_primary` currency → flag | Sympathetics use mixed currency by definition. Mark-primary → may be a full `compact` member. |
| W-FAC-05 | `independent` + sole Tier-1 monopolist corp HQ → flag | Independence claim vs monopolist-corp dominance is a tension requiring confirmation (e.g., Calloway Reach IS independent despite Syndic acquisition pressure — correct; but flag to confirm annually). |
| W-FAC-06 | `compact` + `cultural_register` authored without Compact-doctrine reference → soft flag | Compact founding members' cultural registers should reflect self-governance, mutual recognition, practical self-reliance. If Miri authors a register that ignores the political doctrine, it may be incomplete. |
| W-FAC-07 | `syndic_dominant` + `cultural_register` = corridor baseline → soft flag | For syndic-dominant systems in inner corridor (no meaningful corridor heritage), the cultural register should be institutional, not corridor-derived. Flag if Miri uses corridor default for Groombridge, Renaissance, Nova Roma, Sindri. |
---
*Filed: 2026-05-31. Paula (Narrative & Political Depth). Workshop: system-economic-specialization, Round 3 — Synthesis.*
@@ -0,0 +1,219 @@
# Round 1 Notes — System Economic-Specialization Workshop
*Documenter: Qatux | Date: 2026-05-31*
Source files:
- `docs/workshops/system-economic-specialization/miri-round1.md`
- `docs/workshops/system-economic-specialization/burnelli-sheldon-round1.md`
- `docs/workshops/system-economic-specialization/paula-round1.md`
---
## 1. Confirmed Consensus (all three participants agree)
| Topic | Agreement |
|---|---|
| Authored lore wins | The heuristic (`economic_role` + corp HQ + `planet_class`) becomes fallback only for unnamed/generic systems. |
| One authored field per system | One primary authored field per system. Disagreement on form — see Fork 1. |
| Coexistence with prose | `economic_base_primary/secondary` free-text survives unchanged. The new field is the machine-readable counterpart; the prose is the human record. |
| Source file | `wiki/economics/system_specialization.toml` — new TOML, one record per system, compiled via `import_economics.py` → new column on `system_economy`. |
| Static, t=0, deterministic | Field is build-time authored, D-010 compliant. No PressureState, no tâtonnement. |
| NULL for uninhabited systems | NULL = absent = heuristic runs. Inhabited systems with NULL trigger CI error after the pass is complete. |
| `economy_size` OUT | **Unanimous.** Population × `prosperity_baseline` (D-197) already cover the function. Adding `economy_size` risks contradicting existing fields. (Burnelli §Q3; Paula §Q3; Miri §Q3) |
| `atlas_body_trait_bias` hero pins in same pass | **Unanimous.** ~3040 hero body pins using the existing D-232 `pin` mechanism. Authoring burden is per-hero-body, not per-system. Miri + Araminta author content; Burnelli confirms economic eligibility. |
| Content pass division | **Miri**: GTTR truth, named/hero systems. **Paula**: faction homeworlds, Compact capitals, politically-complex systems. **Burnelli**: economic credibility review of all ~300 entries + economic plausibility + fallback validation for unnamed systems. |
| CI guardrails needed | Hard errors: uninhabited FK integrity, vocabulary constraint. Soft warnings: monopoly assignments, prose/field divergence, distribution imbalance. Burnelli's §Q4 has the most detailed spec. |
| World-to-pin list is non-trivial | At minimum 18 core/near-core systems + 5 D-177 terroir pins require explicit authoring before the generator runs on #982 / Layer 2. |
---
## 2. Fork 1 — Primary Field Form (major structural fork)
This is the workshop's central unresolved question. Round 2 must resolve it.
### Position A: Commodity FK (Burnelli + Miri)
**Burnelli** proposes:
```sql
dominant_commodity_id TEXT REFERENCES commodities(commodity_id)
```
One FK into the 36-commodity catalog. The commodity record's `bulk_class``BulkClass` and `production_ubiquity``ProductionUbiquity` provide the D-233 mapping directly. The FK is the mapping.
**Miri** endorses Burnelli's FK, but adds one structural gap and a proposed second field:
> *"The catalog's `production_ubiquity` answers: 'how widely is this commodity produced across the Reach?' — a global market statement. D-233's `ProductionUbiquity` answers: 'how spatially concentrated is this commodity in THIS settlement's built form?' — a local identity statement."*
Miri proposes `dominant_production_scale TEXT` (optional, same vocabulary as `commodities.production_ubiquity`) as an override when the catalog's global ubiquity would misrepresent the system's local identity. Allowed only equal-or-higher concentration than catalog default. Estimated ~2030 systems need this (Ran, Groombridge, Prometheus, Calloway, VGV, Keid, Lu Ban, Vuurkloof, Sindri, etc.).
**Examples of scale-gap systems (Miri §Q1):**
| System | Commodity | Catalog `production_ubiquity` | Required scale | Why |
|---|---|---|---|---|
| Ran | `agricultural_produce` | `ubiquitous` | `concentrated` | THE breadbasket — scattered instances wrong |
| Groombridge | `financial_services` | `common` | `concentrated` | Financial district identity, not scattered |
| Prometheus | `medical_services` | `regional` | `monopolistic` | Only facility of its kind in the Reach |
| Calloway Reach | `processed_food` | `ubiquitous` | `monopolistic` | D-177 terroir lock — cannot be reproduced |
| VGV system | `agricultural_produce` | `ubiquitous` | `monopolistic` | D-177 F8V stellar spectrum lock |
### Position B: Specialization Enum (Paula)
**Paula** proposes:
```
system_specialization — 9-value enum
```
Values: `transit_hub`, `governance_center`, `financial_hub`, `research_station`, `military_bastion`, `manufacturing_hub`, `precision_industry`, `agricultural_base`, `extraction_colony`. Each value directly maps to a (BulkClass, ProductionUbiquity) pair.
Paula's rationale: the heuristic fails for *political* reasons (institutional mandate, Compact self-sufficiency doctrine, corporate homeworld identity), not just geographic ones. A 9-value vocabulary is more politically legible than asking authors to choose among 36 commodity IDs.
**Key note on `governance_center` vs `research_station`:** Both map to (NonPhysical, Specialist) and produce the same building vocabulary under D-233. Paula explicitly notes: differentiation is achieved at the D-232 level via `dominant_faction` weighting — Assembly → institutional templates, Veil Institute → research/observatory templates. This means Paula's proposal depends on `dominant_faction` being authored (see Fork 2).
### Comparison Table
| Dimension | Position A (Burnelli+Miri FK) | Position B (Paula enum) |
|---|---|---|
| Vocabulary size | 36 commodity IDs | 9 enum values |
| Authoring clarity | Requires knowing which commodity | Politically legible |
| D-233 mapping | Derived from commodity catalog | Directly encoded |
| Scale gap handling | Miri's optional `dominant_production_scale` field | Some implicit (enum values encode concentration level) |
| `governance_center` vs `research_station` | Two different commodity IDs (`commission_certification` vs `tourism`/`medical_services`) | Same enum output; relies on `dominant_faction` to differentiate at D-232 |
| Services economy | Any NonPhysical commodity works | Two dedicated enum values |
| D-177 monopoly cases | `dominant_production_scale = monopolistic` | `precision_industry` or `extraction_colony` as applicable |
**Unresolved tension:** Positions A and B are not mutually exclusive (could be combined), but they are not the same design. Round 2 must produce a single schema.
---
## 3. Fork 2 — `dominant_faction` Authored Pin: In or Out of This Pass?
**Paula's position:** Author `dominant_faction` for all named systems in this same pass. This field already exists as a required input in D-199's 6-field minimum read-set for `CityGenerationContext`. It is consumed by D-214 (PoliticalArchetype) and D-232 (template weight). Three specific heuristic failures demonstrate why the *value* needs to be authored, not derived:
- Groombridge: syndics govern, not the Assembly; affects D-214 layout archetype
- Ostmark: Compact founding member, not generic frontier; affects D-232 and D-214
- Altmark: genuinely independent, neither Assembly nor Compact; affects everything downstream
Paula proposes vocabulary: `concord_assembly | compact | compact_sympathetic | syndic_dominant | veil_institute | lattice_commission | independent | disputed`
Paula further notes D-172 compliance gap: without authored `dominant_faction`, the system infers Compact membership from currency zone (circular) or hop distance (explicitly wrong per D-172).
**Miri's position:** Does not explicitly oppose `dominant_faction` authoring. Notes that `system_culture` already has `cultural_register`, `cultural_register_secondary`, `primary_archetype`, `secondary_archetype`, `atmospheric_tone` — and characterizes adding *cultural* fields as out of scope. `dominant_faction` is a different category (political, not cultural), and Miri's rejection is directed at cultural register duplication, not at faction authoring.
**Burnelli's position:** Notes `political_register` is "Paula's domain" and defers; neither advocates for nor against it. From economic integration perspective, `political_register` would not touch the commodity-building pipeline — consumed by NPC generation and dialogue only (Burnelli §Q5).
**Assessment:** This is a domain-boundary question more than a design disagreement. Paula needs `dominant_faction` to make her enum differentiation work (see Fork 1). Burnelli defers. Miri's objection is specifically to cultural duplication, not to faction authoring.
---
## 4. Fork 3 — `dominant_production_scale` Field: Needed or Not?
**Miri (yes):** Proposes `dominant_production_scale TEXT` as an optional field. Identifies 7 explicit cases in §Q1 where the catalog's global `production_ubiquity` understates the system's local identity. If not present, Ran looks like any farming moon; Groombridge looks like scattered financial services; Prometheus looks like a regional medical center.
**Burnelli (not proposed):** Burnelli's proposal does not include a scale override. The implicit assumption is that `production_ubiquity` from the catalog is correct as-is. If Ran is pinned to `agricultural_produce`, it gets `Ubiquitous → scattered instances in mixed-use`, which Miri identifies as wrong.
**Paula (not applicable):** Paula's enum directly encodes concentration into the value (e.g., `agricultural_base = Perishable × Ubiquitous`). This does not resolve the Ran-vs-Arbour distinction — both would be `agricultural_base` but one is the Reach's breadbasket and the other is an estate world.
**Note to user:** This fork is directly tied to Fork 1. If Position A (commodity FK) is chosen, Miri's `dominant_production_scale` field may be necessary to achieve correct built-form output for hero systems. If Position B (enum) is chosen, some scale cases are handled by the enum directly, but the Ran-vs-Arbour distinction remains.
---
## 5. Consensus on Named Systems: Must-Pin List
The following systems were named by two or more participants as requiring explicit authoring before the generator runs. GJ IDs from Paula and Miri where provided.
### Core/Near-Core (Unanimous Priority)
| System | GJ ID | Burnelli pin | Paula pin | Miri pin | Overlap status |
|---|---|---|---|---|---|
| Sirius | GJ 244A | `commission_certification` | `governance_center` | `commission_certification` | All three agree; form differs by Fork 1 |
| Gateway | GJ 71 | `commission_certification` | `transit_hub` | `commission_certification` | All three agree |
| Groombridge | GJ 380 | `financial_services` | `financial_hub` | `financial_services` (concentrated) | All three agree |
| Keid | GJ 166A | `legal_services` (implied) | `research_station` | `tourism` (monopolistic) | Paula and Miri diverge on commodity |
| Prometheus | GJ 702B | `medical_services` implied | `precision_industry` | `medical_services` (monopolistic) | All three agree on identity |
| Ran | GJ 144 | `agricultural_produce` | `agricultural_base` | `agricultural_produce` (concentrated) | All three agree; Miri adds scale override |
| Bastion | GJ 570A | `commission_certification` implied | `military_bastion` | `commission_certification` | All three agree |
| Cygni B | GJ 820B | `refined_metals` (fallback) | `manufacturing_hub` | `freight_haulers` | **Fork: Miri says outputs, not inputs** |
| Renaissance | GJ 251 | `refined_metals` (fallback) | `precision_industry` | `gate_components` | **Fork: Miri identifies specific commodity** |
| Altmark | GJ 357 | — | `transit_hub` (independent) | — | Paula only; high-stakes political case |
### D-177 Terroir Pins (Non-Negotiable per Miri)
| System | Commodity | Scale | D-177 constraint | GJ confirmation needed? |
|---|---|---|---|---|
| Calloway Reach | `processed_food` | `monopolistic` | Terroir lock, 12-20y aging | Yes — GJ 3325 (Paula confirms) |
| VGV system | `agricultural_produce` | `monopolistic` | F8V stellar spectrum lock | GJ designation needs confirmation |
| Braemar | `organic_compounds` | `monopolistic` | Brach fiber: herd expansion decades | Yes — GJ 475 (Paula confirms) |
| Kvitfjell / Nyrheim | `stone` | `monopolistic` | ~800t/y geological ceiling | Yes — GJ 3737 (Paula confirms) |
| East reach lattice anchor | `lattice_grade_material` | — (catalog already monopolistic) | Strategic material, D-177 | GJ designation needs confirmation |
### North Reach, West Reach, Other Named (Paula + Miri coverage)
| System | GJ ID | Paula pin | Miri pin | Notes |
|---|---|---|---|---|
| Ostmark | GJ 601A | `agricultural_base` (compact) | — | Paula: Compact founding member, 5-century agricultural base |
| Confluent | GJ 395 | `agricultural_base` (compact_sympathetic) | — | Paula: VGV wine, F8V lock, D-177 |
| Dagat | GJ 482A | `agricultural_base` (independent) | — | Paula: deep ocean kelp, Blue dye monopoly |
| Arbour | GJ 338B | — | `agricultural_produce` (no scale override) | Miri: catalog ubiquitous IS correct for estate farming |
| Sindri | GJ 3522 | — | `metallic_ore` (concentrated) | Miri: DSMC dominance understated at common |
| Nova Roma | GJ 764 | — | `transport_vehicles` (concentrated) | Miri: MVG output identity |
| Vuurkloof | GJ 35 | — | `fusion_fuel` (concentrated) | Miri: unusual stellar type; heuristic has no path |
| Lu Ban | GJ 15A | — | `consumer_goods` (concentrated) | Miri: 300-workshop bazaar; heuristic has no signal |
| Tessera | GJ 3877 | — | `legal_services` (concentrated) | Miri: Assembly Interpretive Registry |
| Parallax | GJ 280A | — | `entertainment` (concentrated) | Miri: media/news economy; heuristic can't reach this |
| Barnard's Star | GJ 699 | — | no pin needed | Miri: residential suburb for Cygni B; heuristic correct |
---
## 6. Open Questions (Q-record candidates for Round 2 agenda)
### Q-??-A: Field form — FK or enum?
Which structure is adopted as the primary authored field? Burnelli + Miri favor `dominant_commodity_id` FK (36-value). Paula favors `system_specialization` enum (9-value). Could they coexist (an enum that compiles to the FK via a mapping table)?
**Stakes:** If the 9-value enum is adopted, what is the commodity identity for the generator? If the 36-value FK is adopted, what is the political legibility for authors?
### Q-??-B: `dominant_production_scale` — in or out?
If Position A (FK) is chosen, does `dominant_production_scale` earn its slot? Miri identifies 7 specific cases where it is required for correct D-233 output. The authoring burden is small (~2030 entries), but it is an additional schema column and CI maintenance surface.
### Q-??-C: `dominant_faction` in this pass or deferred?
Paula makes a credible case for authoring `dominant_faction` during this pass (D-172 compliance, D-214 archetype accuracy, ~3040 entries for named systems). Burnelli defers. Miri's objection is to cultural field duplication, not to faction authoring. Decision needed.
### Q-??-D: Keid's commodity identity
Paula pins Keid to `research_station` (NonPhysical, Specialist). Miri pins to `tourism` (monopolistic). Both note the Conservancy biosphere as the identity, but they choose different commodities. One of these is wrong, or the field (under Fork 1 resolution) subsumes the question differently.
### Q-??-E: Cygni B — freight_haulers or manufacturing_hub?
Miri: `freight_haulers` (the OUTPUT of the system). Paula: `manufacturing_hub` (the PROCESS of the system). Burnelli's heuristic would land on `refined_metals` or similar (the inputs). All three would agree on the *identity* — Cygni B built the Reach — but they land on different commodity IDs.
### Q-??-F: GJ confirmation for D-177 terroir systems
The east reach lattice anchor, VGV system (F8V spectrum), and possibly others need GJ catalog IDs confirmed before the content pass can proceed. This is a pre-pass lookup task.
### Q-??-G: Flagged systems requiring Miri confirmation
Paula flags two systems where GTTR and corp presence diverge:
- **Dài Lộ (GJ 136)** — GTTR says "Grand Road" (transit) vs Takamori Lattice Works HQ (precision industry / lattice substrate). Paula's instinct: `precision_industry`; needs Miri's lore confirmation.
- **Zenzele (GJ 1111)** — GTTR emphasizes electromagnetic hardening expertise vs Baektu Mining Alliance + Umoja Freight HQ. May be `manufacturing_hub` rather than `extraction_colony`. Needs Miri's confirmation.
---
## 7. Implicit Decisions Observed
For the record — these were stated or assumed by participants but not formally voted on:
| Implicit decision | Basis |
|---|---|
| D-233 will be re-amended | Workshop brief explicitly states this; all participants design within that expectation |
| `#982` design-blocked stubs in `city_context_reader.rs` will be replaced by this field | Burnelli §integration summary; confirms pipeline endpoint |
| Trait catalog authoring (D-232) is a downstream co-authoring task for Miri + Araminta | Miri §Q5; confirmed that the trait definitions themselves are not part of this pass |
| Compact member systematic review rule | Paula proposes: any Compact system where heuristic would produce `extraction_colony` → flag before committing |
---
## 8. Summary Table: Q1Q5 by Participant
| Question | Burnelli-Sheldon | Paula | Miri | Status |
|---|---|---|---|---|
| Q1 — The field | `dominant_commodity_id` FK (36 values) | `system_specialization` enum (9 values) | Endorses FK + adds `dominant_production_scale` override | **FORK 1 (unresolved)** |
| Q2 — Weighted variation | Integer weighted draw; W_SYS=10,000; algorithm specified | Three-level priority; political modifiers for Compact/Assembly | Endorses algorithm; adds 3 lore-specific patterns | Consensus on mechanism, details in Fork 1 resolution |
| Q3 — `economy_size`? | **OUT** — redundant with pop × prosperity | **OUT** — redundant | **OUT** — redundant | **Unanimous** |
| Q4 — Content pass | TOML source; DB schema; detailed CI spec; 300 system authoring division | Same TOML source; 19 specific must-pin systems; Compact systematic rule | 18 core/near-core pins; 5 D-177 terroir pins; 6 high-risk contradiction cases | Consensus on structure; specific pins need reconciliation |
| Q5 — Additional fields | `atlas_body_trait_bias` hero pins only | + `dominant_faction` authored pin | + `dominant_production_scale` (2030 systems); no political register (already in `system_culture`) | **FORK 2 (dominant_faction); FORK 3 (production_scale)** |
---
*Round 1 documented. No final proposal is recorded here — that is Round 2's deliverable after the user checkpoint.*
*Source files read: `miri-round1.md`, `burnelli-sheldon-round1.md`, `paula-round1.md`.*
*Qatux — 2026-05-31*
@@ -0,0 +1,341 @@
# Round 2 Notes — System Economic-Specialization Workshop
*Documenter: Qatux | Date: 2026-05-31*
*Updated: Paula addendum (cultural axis quality argument) incorporated.*
Source files:
- `docs/workshops/system-economic-specialization/miri-round2.md`
- `docs/workshops/system-economic-specialization/burnelli-sheldon-round2.md`
- `docs/workshops/system-economic-specialization/paula-round2.md` (includes addendum on cultural axis)
---
## 0. User Checkpoint Decisions Entering Round 2
For the record — these three forks were resolved before Round 2 began:
| Fork | Resolution |
|---|---|
| Fork 1 (primary field form) | Two orthogonal axes confirmed: (a) economic axis → D-233 built form, (b) cultural axis → D-232 template weights + cultural services |
| Fork 2 (`dominant_faction`) | Authored for named systems in this pass, same TOML source file |
| Fork 3 (`dominant_production_scale`) | No separate column; scale encoded inside the economic field's vocabulary values |
---
## 1. Confirmed Field Set (all three participants agree)
Three fields authored in this pass. No fourth field. `economy_size` permanently out.
| Field | Scope | DB home | Source | Active consumers |
|---|---|---|---|---|
| `economic_specialization` | New column on `system_economy` | `system_economy` | `wiki/economics/system_specialization.toml` | D-233 (BulkClass × ProductionUbiquity → block fill, coverage, operations surface) |
| Cultural axis (`cultural_register`) | New column (Burnelli, Miri) OR existing `system_culture` table (Paula original) — **FORK UPDATED below** | Disputed (see §4B) | `wiki/economics/system_specialization.toml` per Paula addendum | D-232 trait template draw (Phase 4); Phase 6 cultural services |
| `dominant_faction` | **FORK — see §4C below** | Disputed | Same TOML file | D-214 (PoliticalArchetype), D-232 (template weight modifier), D-174 (shadow economy intensity), D-172 (currency zone validation) |
All three agree the source TOML file is `wiki/economics/system_specialization.toml`. All three agree on the consumers for each axis. The disputes are about schema location, not function.
---
## 2. Economic Axis Vocabulary: Near-Convergence
### Points of agreement
All three participants propose a **curated named-value vocabulary** above the commodity catalog (not raw commodity IDs). The vocabulary maps each name to `(BulkClass, ProductionUbiquity)`, encoding both commodity identity and local production concentration. Production scale is handled inside vocabulary values, not in a separate column.
The vocabulary respects Miri's equal-or-higher concentration rule: a vocabulary value may only assign equal or higher concentration than the underlying commodity's global `production_ubiquity`. This is a CI hard error.
### Vocabulary size divergence
| Participant | Count | Approach |
|---|---|---|
| Burnelli-Sheldon | 33 values across 6 clusters (agricultural, extraction, energy, manufacturing, high-tech, services) | Compiled from `specialization_vocabulary.toml` — each value maps to `(commodity_id, production_ubiquity_override)` |
| Miri | 16 values | Direct `(BulkClass, ProductionUbiquity)` mapping per value; focused on lore-critical distinctions |
| Paula | 9 values (Round 1 proposal, not substantially changed in Round 2) | Abstract categories, some of which Miri identifies as carrying BulkClass errors |
The 33 vs 16 difference is mostly in agricultural sub-types (Burnelli has `terroir_spirits`, `marine_farming`, `food_processing_hub` separately; Miri collapses some of these) and extraction sub-types. For the must-pin hero systems, the values are compatible — they converge on the same `(BulkClass, ProductionUbiquity)` output for every pinned system. The granularity question is a synthesis decision for Round 3.
### The BulkClass correction to Paula's Round 1 vocabulary
Miri identifies a structural error in Paula's 9-value enum: `manufacturing_hub` was mapped to PrecisionDense × Common. Heavy industry systems (Cygni B, shipyards) are BulkSolid, not PrecisionDense. Burnelli's vocabulary correctly separates `shipbuilding` (BulkSolid × Common) from `vehicle_production` (BulkSolid × Specialist) from `precision_tech` (PrecisionDense × ...). Paula's abstract categories had the right ProductionUbiquity intuition but the wrong BulkClass for heavy manufacturing systems. This is resolved in the converged vocabulary.
### Agreed vocabulary values for must-pin systems
The following are agreed by at least two of three participants and have no substantive remaining disagreement on D-233 output:
| System | D-233 output | Agreed vocabulary label(s) | Notes |
|---|---|---|---|
| Ran | Perishable × Specialist | `breadbasket` (Burnelli, Miri) | Paula's `agricultural_base` maps Perishable × Ubiquitous — wrong for Ran; `breadbasket` is correct |
| Groombridge | NonPhysical × [see §4A] | `financial_hub` (Miri) or `clearing_house` (Burnelli) | BulkClass agreed; ProductionUbiquity = Specialist vs MonopolySource unresolved |
| Prometheus | NonPhysical × MonopolySource | `longevity_monopoly` (Burnelli, Miri) | All three agree on the output |
| Cygni B | BulkSolid × Common | `shipbuilding` (Burnelli) / `heavy_manufacturing` (Miri) | D-233 output agreed; label unresolved |
| Renaissance | BulkSolid × MonopolySource | `gate_fabrication` (Burnelli) / `precision_monopoly` (Miri) | D-233 output agreed; label unresolved |
| Gateway | NonPhysical × Common | `transit_hub` (all three) | Full agreement |
| Sirius | NonPhysical × Specialist | `governance_center` (all three) | Full agreement |
| Ran, Ostmark | Perishable × Specialist | `breadbasket` | Full agreement |
| Calloway Reach, VGV, Braemar | Perishable/BulkSolid × MonopolySource | `terroir_farm` / `terroir_spirits` / `terroir_organics` | All agree on MonopolySource; label varies by sub-type |
| Nyrheim | BulkSolid × MonopolySource | `extraction_colony` / `marble_monopoly` | D-233 output agreed |
| Keid | NonPhysical × Specialist | `research_station` (Miri + Paula) | **Miri self-corrects from Round 1.** See §3A. |
| Dài Lộ | NonPhysical × Common | `transit_hub` (Miri resolves) | See §3C. |
| Zenzele | PrecisionDense × Specialist | `specialist_manufacturing` (Miri resolves) | See §3D. |
| Parallax | NonPhysical × Specialist | `media_culture` / `media_center` | Agreement on output; label varies |
| Vuurkloof | BulkLiquid × Specialist | `geothermal_hub` / `energy_hub` | Agreement on output |
| Bastion | BulkSolid × Specialist | `military_station` / `military_bastion` | Agreement on output |
| Arbour | Perishable × Ubiquitous | `estate_farm` / `estate_farming` | Agreement on output; Arbour deliberately NOT `breadbasket` |
---
## 3. Resolved Disagreements from Round 1
### 3A. Keid: `research_station` (resolved 2-of-3)
**Round 1:** Miri `tourism/monopolistic`, Paula `research_station`.
**Round 2 outcome:** Miri self-corrects. Direct quote:
> *"My Round 1 `tourism` pin was wrong. I was conflating 'one-of-a-kind, cannot be purchased elsewhere' with the tourism commodity. The scarcity is about research access, not leisure access. The Conservancy's leverage is scientific exclusivity, not tourism revenue. Resolution: Keid = `research_station`. Paula is correct."*
**Burnelli's position (OQ-2):** Burnelli proposed `biosphere_tourism` for Keid with cultural=`ecological`, and raised this as an open question. With Miri's self-correction, the vote is now 2-of-3 for `research_station`. Burnelli's OQ-2 is noted below as a residual question.
**Resolved: Keid = `research_station`, NonPhysical × Specialist, cultural axis = `scholarly`.**
### 3B. Cygni B: BulkSolid × Common (resolved, label pending)
**Round 1:** Miri `freight_haulers`, Paula `manufacturing_hub` (PrecisionDense × Common).
**Round 2 outcome:** Miri introduces `heavy_manufacturing` (BulkSolid × Common) and identifies Paula's BulkClass as wrong for shipyard-scale heavy fabrication. Burnelli's `shipbuilding` (BulkSolid × Common) reaches the same D-233 output. All three now converge on BulkSolid × Common. The label (`shipbuilding` vs `heavy_manufacturing`) is a synthesis choice for Round 3.
**Resolved for D-233 purposes: Cygni B = BulkSolid × Common.**
### 3C. Dài Lộ (GJ 136): `transit_hub` (Miri resolves from GTTR)
**Round 1:** Paula flagged; her instinct was `precision_industry` based on Takamori Lattice Works HQ.
**Round 2 outcome:** Miri reviews GTTR directly. Finding: "Nothing in the GTTR describes tourism as an industry. The GTTR describes a transit and supply hub at the frontier edge." The Takamori HQ adds body-level weighting toward `lattice_grade_material` but does not override a 400-year transit identity. GTTR prose is authoritative per the workshop's founding principle.
**Resolved: Dài Lộ = `transit_hub`, NonPhysical × Common. Cultural axis = `cosmopolitan`.**
### 3D. Zenzele (GJ 1111): `specialist_manufacturing` (Miri resolves from GTTR)
**Round 1:** Paula flagged; instinct was `manufacturing_hub`.
**Round 2 outcome:** Miri reviews GTTR. Finding: "Purpose-built shielding components...technical consultation...expertise-based advantage from necessity." This is PrecisionDense (precision engineering, specialist components, not bulk heavy fabrication) × Specialist (expertise-based concentration, not a geographic monopoly — other systems could develop this expertise).
**Resolved: Zenzele = `specialist_manufacturing`, PrecisionDense × Specialist. Cultural axis = `industrial`.**
---
## 4. Remaining Forks for the Synthesis Checkpoint
### 4A. Groombridge: `financial_hub` vs `clearing_house`
| | Economic label | D-233 output | Rationale |
|---|---|---|---|
| Miri | `financial_hub` | NonPhysical × Specialist | Financial district, not the ONLY clearing node |
| Burnelli-Sheldon | `clearing_house` preferred | NonPhysical × MonopolySource | "Where the money lives" — MonopolySource concentration rule applies; the clearing house IS the settlement |
Burnelli's OQ-1 asks explicitly: "Is Groombridge's clearing house SO dominant that everything else is support?" MonopolySource vs Specialist determines whether D-233 produces "dense exchange district in a varied settlement" (Specialist) or "the exchange IS the settlement" (MonopolySource). Different built form.
**Status: Open. One question for the user.**
### 4B. Cultural axis: quality argument + scope + location (UPDATED by Paula addendum)
**Paula's addendum reverses her Round 2 opening position.** Her original proposal was to fill `system_culture.cultural_register` (existing table, no new column). The addendum argues on quality grounds that this matters for Phase 4, not Phase 6, and that the source location should be `system_specialization.toml` alongside the economic and faction fields.
#### The quality argument (Paula addendum)
The cultural axis is not metadata for Phase 6. It breaks D-232 template draws in Phase 4 for systems where founding heritage diverges from the corridor baseline. D-232's trait template draw uses the corridor as a soft prior. Without an authored cultural register, systems inherit the wrong corridor template:
| System | Corridor baseline (what D-232 draws without a pin) | Actual cultural heritage | What breaks |
|---|---|---|---|
| Confluent (GJ 395) | Germanic/Scandinavian (west_reach) | French founding families, Loire viticulture | Settlement looks like a Compact German agricultural town, not a Loire estate town |
| Dài Lộ (GJ 136) | Korean/Japanese (east_reach) | Vietnamese (400 years transit culture) | Vietnamese character lost entirely |
| Calloway Reach (GJ 3325) | British/Australian (north_reach) | Scottish Highland distillery culture | Close but wrong — generic British instead of specifically Highland |
| Dagat (GJ 482A) | East_reach corridor baseline | Filipino/Tagalog heritage | Founding character erased |
| Vuurkloof (GJ 35) | South_reach corridor baseline | Afrikaans (South African Boer heritage) | Engineering community character lost |
Paula's direct quote: *"These aren't Phase 6 concerns. They affect what D-232 generates RIGHT NOW when the trait template draw runs. Without authored cultural pins for these systems, the generator pulls the wrong templates."*
#### Revised scope (Paula addendum)
Not ~3040 hero bodies. The authoring criterion is: *"Does this system's actual cultural heritage match what the corridor baseline would produce? If no → author it."* Estimated scope: **~60100 GTTR-named divergent-heritage systems**, not just hero bodies.
The `atlas_body_trait_bias` hero body pins (per D-232) and the system cultural register work together: the system cultural register is the baseline for ALL bodies in the system; the hero body pins are overrides for specific bodies. Without the system baseline, even correctly-pinned hero bodies are surrounded by wrong-character context.
#### Location: Paula's reversal
Paula (addendum) now advocates for `cultural_register` as an **optional field IN `system_specialization.toml`**, same file as economic and faction fields:
```toml
[GJ-395] # Confluent
dominant_commodity_id = "agricultural_produce"
economic_specialization = "terroir_farm"
dominant_faction = "compact_sympathetic"
cultural_register = "french_heritage" # founding families Loire tradition
```
This reverses her opening Round 2 position. She now agrees with Burnelli and Miri that the cultural axis belongs in the same TOML file — on quality grounds (authoring coherence: the author writing Confluent should see all three identity signals in one place) and on correctness grounds (D-232 Phase 4 consumer).
#### Updated position summary
| Participant | Cultural axis source | New schema column? | Scope |
|---|---|---|---|
| Burnelli-Sheldon | `system_specialization.toml` | YES — new `cultural_specialization` on `system_economy`; 12-value vocabulary | ~30-40 hero pins + heuristic fallback |
| Miri | `system_specialization.toml` (implicitly) | YES — new `cultural_character` column | ~30-40 hero pins + corridor default |
| Paula (addendum) | `system_specialization.toml` | Leans yes — optional field same TOML; populates `system_culture.cultural_register` | ~60-100 divergent-heritage named systems |
**Remaining fork (narrowed):** All three now agree on the TOML source file. The remaining questions are: (a) column name and which table it lives in (`system_economy` new column vs `system_culture.cultural_register` existing column), and (b) scope: Burnelli+Miri say ~30-40 hero pins; Paula says ~60-100 divergent-heritage systems. The scope difference matters for authoring burden and for what counts as "missing" in CI.
**Status: Substantially converged on source location; still open on scope and column placement.**
### 4C. `dominant_faction` column location
| Participant | Proposal |
|---|---|
| Burnelli-Sheldon | New column `system_economy.dominant_faction` (populated from same TOML) |
| Paula | Existing `system_factions` table; `dominant_faction` field already exists there; just needs authoring for named systems |
| Miri | Field used throughout; table location not specified |
The question is whether the generator reads from `system_economy` (one-stop-shop for all generation inputs) or from `system_factions` (the semantically correct home). D-199's minimum read-set already includes `dominant_faction` — wherever it lives, it's in the read-set.
**Status: Probably minor; architecture decision for the implementation team (Burnelli's pipeline). Note for completeness.**
### 4D. `lattice_commission` faction value: in or out?
| Participant | Position |
|---|---|
| Paula (Round 2) | DROP `lattice_commission` from faction vocabulary. The Commission regulates across the Reach; it doesn't govern systems. Systems with Commission presence get `concord_assembly` or `independent` as applicable. |
| Miri (Round 2 table) | Uses `lattice_commission` for ACB (GJ 559B) and Bastion (GJ 570A) |
Paula's argument: Commission never governs a system in the way a faction does. Bastion is Assembly-administered (flag officers); ACB is Commission-funded but Assembly-governed.
Miri's usage: ACB is presented as "Commission IS the presence here" and Bastion as fleet administration. If the Commission provides direct institutional governance rather than mere regulatory presence, `lattice_commission` may be meaningful.
**Status: Open. Small vocabulary question but touches two specific pins (ACB, Bastion).**
### 4E. `media_culture` on economic axis — structural note (not a fork, but flagged)
Miri raises a self-question about `media_culture`: it produces NonPhysical × Specialist, same as `governance_center` and `research_station`. The built-form distinction for Parallax lives in D-229 ObjectTag vocabulary (production studios vs. government offices), not in BulkClass × ProductionUbiquity.
This is not a blocking fork — Miri keeps `media_culture` on the economic axis because the physical content IS different, even if the coverage fraction is the same. But the observation is worth recording: three economic values (`governance_center`, `research_station`, `media_culture`) produce identical D-233 coverage and vocabulary and are only distinguished downstream by cultural axis and faction.
---
## 5. Vocabulary Comparison: Economic Axis Values
The following table maps the agreed must-pin systems to the proposed vocabulary across all three participants. Where labels differ but D-233 outputs agree, the D-233 column shows the converged output.
| System | Miri value | Burnelli value | D-233 (agreed) |
|---|---|---|---|
| Ran | `breadbasket` | `breadbasket` | Perishable × Specialist |
| Groombridge | `financial_hub` | `clearing_house` (preferred) | NonPhysical × **[Specialist or MonopolySource — open]** |
| Prometheus | `longevity_monopoly` | `longevity_monopoly` | NonPhysical × MonopolySource |
| Keid | `research_station` | `biosphere_tourism` (OQ-2) | NonPhysical × Specialist (2-of-3) |
| Cygni B | `heavy_manufacturing` | `shipbuilding` | BulkSolid × Common |
| Renaissance | `precision_monopoly` | `gate_fabrication` | BulkSolid × MonopolySource |
| Sirius | `governance_center` | `governance_center` | NonPhysical × Specialist |
| Gateway | `transit_hub` | `transit_hub` | NonPhysical × Ubiquitous (Burnelli) / Common (Miri) |
| Bastion | `military_bastion` | `military_station` | PrecisionDense × Specialist |
| Nova Roma | `specialist_manufacturing` | `vehicle_production` | BulkSolid × Specialist |
| Sindri | `mining_district` | `company_mining` | BulkSolid × Specialist |
| Parallax | `media_culture` | `media_center` | NonPhysical × Specialist |
| Vuurkloof | `energy_hub` | `geothermal_hub` | BulkLiquid × Specialist |
| Arbour | `estate_farm` | `estate_farming` | Perishable × Ubiquitous |
| Lu Ban | `specialist_manufacturing` | `consumer_goods_bazaar` | BulkSolid × Specialist |
| Calloway Reach | `terroir_farm` | `terroir_spirits` | BulkSolid × MonopolySource |
| VGV (Confluent) | `terroir_farm` | `terroir_agriculture` | Perishable × MonopolySource |
| Braemar | `terroir_farm` | `terroir_organics` | BulkSolid × MonopolySource |
| Nyrheim | `extraction_colony` | `marble_monopoly` | BulkSolid × MonopolySource |
| Ostmark | `breadbasket` | `breadbasket` | Perishable × Specialist |
| Dài Lộ | `transit_hub` | (not specified) | NonPhysical × Common |
| Zenzele | `specialist_manufacturing` | (not specified) | PrecisionDense × Specialist |
| Altmark | `transit_hub` | (not specified) | NonPhysical × Common |
| Tessera | `research_station` | `legal_archive` | NonPhysical × Specialist |
---
## 6. Cultural Axis: Vocabulary Comparison
Both Burnelli and Miri propose cultural vocabularies. Paula defers entirely to `system_culture.cultural_register` (existing table).
| Burnelli label (12 values) | Miri label (7 values) | Representative systems |
|---|---|---|
| `scholarly` | `scholarly` | Tessera, Keid |
| `artistic` | `media` | Parallax |
| `institutional` | `civic` | Sirius, Gateway (administrative systems), Bastion |
| `commercial` | `mercantile` | Altmark, Gateway (transit character) |
| `agrarian` | `agrarian` | Ran, Ostmark, Calloway Reach |
| `industrial_heritage` | `industrial` | Cygni B, Sindri, Nova Roma, Vuurkloof |
| `medical_elite` | (absorbed into `civic`) | Prometheus |
| `ecological` | (absorbed into `scholarly`) | Keid |
| `military` | (absorbed into `civic`) | Bastion |
| `financial_technocratic` | `mercantile` | Groombridge |
| `cosmopolitan` | `cosmopolitan` | Gateway, Altmark, Dài Lộ |
| `compact_cooperative` | (not separately named) | All Compact member systems |
The core 6 values align across both vocabularies (scholarly, artistic/media, civic/institutional, mercantile/commercial, agrarian, industrial). Burnelli's 12 adds finer distinctions (`medical_elite`, `ecological`, `military`, `compact_cooperative`) that Miri collapses into broader categories. The synthesis question is vocabulary granularity, not substance.
---
## 7. `dominant_faction` Vocabulary: Near-Convergence
Paula's Round 2 locks the faction vocabulary. `lattice_commission` dropped in favor of `mixed`. ACB and Bastion reassigned to `concord_assembly` (resolved at checkpoint — OQ-4).
**Final vocabulary (7 values, post-checkpoint):**
`concord_assembly | compact | compact_sympathetic | syndic_dominant | veil_institute | independent | disputed | mixed`
*(Note: 8 listed above; `lattice_commission` was the value dropped, leaving 7 active values. `mixed` is the replacement for multi-polar systems.)*
**Key CI guardrails from Paula (cross-referenced with Burnelli):**
- `compact` + `currency_zone = tractus_primary` → hard flag (D-172 compliance)
- `compact` + `extraction_colony` economic pin → flag for review (self-sufficiency doctrine)
- `syndic_dominant` with no Tier-1 corp HQ in `corp_presence` → flag (missing data anchor)
- `compact_sympathetic` + `mark_primary` currency → flag (may be full member)
---
## 8. Implicit Decisions Observed (not formally stated, but treated as settled)
| Observation | Basis |
|---|---|
| `specialization_vocabulary.toml` is a new source file, separate from `system_specialization.toml` | Burnelli §Q2; names two distinct files |
| The content pass is ~60-80 economic pins + ~60-100 cultural register pins (divergent-heritage scope, OQ-3 resolved) + ~40-60 faction pins | All three + checkpoint |
| `atlas_body_trait_bias` hero pins (~30-40 bodies) are in this pass as a co-authoring activity | Round 1 consensus held; no challenge in Round 2 |
| D-233 will be re-amended by this workshop's outcome | Assumed throughout |
---
## 9. Summary: Fully Resolved (carry to Round 3 synthesis)
All workshop open questions are now closed. No remaining forks.
**Schema (all three fields in `system_specialization.toml` → `system_economy` table):**
1. `economic_specialization` — vocabulary-based, ~20-25 merged values (Burnelli base, collapse duplicates); scale encoded in value
2. `cultural_register` — co-located in `system_specialization.toml`; scope ~60-100 divergent-heritage systems; D-232 Phase 4 consumer
3. `dominant_faction` — 7 values (Paula's 8 minus `lattice_commission`); same TOML
**Must-pin resolutions (all closed):**
- Keid = `research_station`, NonPhysical × Specialist
- Cygni B = BulkSolid × Common (label merge in Round 3)
- Dài Lộ = `transit_hub`, NonPhysical × Common
- Zenzele = `specialist_manufacturing`, PrecisionDense × Specialist
- Groombridge = `financial_hub` Specialist + GSH as MonopolySource hero-element landmark
- ACB (GJ 559B), Bastion (GJ 570A) → `dominant_faction = concord_assembly`
**Permanently out:** `economy_size`, separate `dominant_production_scale` column, `lattice_commission` faction value
### Checkpoint resolutions (2026-05-31)
All 5 open questions closed by user. Do not reopen.
| # | Topic | **RESOLUTION** |
|---|---|---|
| OQ-1 | Groombridge | **MIDDLE answer.** `economic_specialization = financial_hub` at Specialist (dense cluster of financial buildings throughout the settlement). GSH (the Reach's clearing house) is a **MonopolySource hero-element landmark inside the cluster** — a single dominant building rather than the settlement's organizing principle. Groombridge is not "the exchange IS the settlement" (MonopolySource) nor a generic financial district (pure Specialist) — it is a financial cluster with one physically singular institution at its center. |
| OQ-2 | Keid `biosphere_tourism` vs `research_station` | **CLOSED: `research_station`.** Burnelli's `biosphere_tourism` overruled 2-of-3. Keid's economic identity is research and conservation access, not tourism. |
| OQ-3 | Cultural axis: column placement + scope | **RESOLVED.** `cultural_register` is a co-located structured field in `system_specialization.toml`, compiled to a new column on `system_economy` (NOT the separate `system_culture` table). Scope: **~60-100 divergent-heritage systems** (Paula's quality scope) — criterion is systems where founding heritage diverges from the corridor baseline, not just hero bodies. |
| OQ-4 | `lattice_commission` in/out | **DROPPED.** The value is removed from the `dominant_faction` vocabulary. ACB (GJ 559B) and Bastion (GJ 570A) are both reassigned to `concord_assembly`. |
| OQ-5 | Economic vocabulary size (16 vs 33) | **MERGE RULE.** Start from Burnelli's richer 33-value set. Collapse only values that are identical in BOTH `(BulkClass, ProductionUbiquity)` AND cultural character. Expected result: **~20-25 economic values**. Round 3 synthesis will produce the final merged list. |
---
*Round 2 fully documented. All 5 forks resolved at human checkpoint. Pre-synthesis — no D-records filed. Round 3 synthesis awaiting scout-round2.md critique, then D-record re-amendment + ticket set.*
*Source files read: `miri-round2.md`, `burnelli-sheldon-round2.md`, `paula-round2.md` (including Paula's addendum on cultural axis quality argument).*
*Qatux — 2026-05-31*
@@ -0,0 +1,139 @@
# Scout Round 2 — System Economic-Specialization Workshop
## Independent Critical Review
*Scout: Claude Code (fresh read, no prior workshop discussion)*
*Date: 2026-05-31*
---
## Mandate
Surface **decision-changing findings only** in three categories:
1. Materially simpler designs preserving quality
2. Internal contradictions with stated hard constraints
3. Missed options or external design precedent
This memo does not discuss execution, authoring burden, or taste disagreements.
---
## Decision-Changing Findings
### Finding 1: The Cultural Axis Scope Ambiguity is Real and Needs Resolution
**Status:** Paula's addendum reverses course on scope (good catch on quality grounds), but the reversal creates a new tension with the proposed implementation.
**The problem:**
- Paula argues the cultural axis breaks D-232 in Phase 4 if authoring is missing for systems that diverge from corridor baseline (~60-100 systems).
- All three participants agree the source is `system_specialization.toml` (same file as economic + faction).
- BUT the three still disagree on **column placement**: Burnelli proposes new `system_economy.cultural_specialization` column; Paula now leans toward the same TOML file but allows both `system_economy` and `system_culture` as home; Miri leaves it implicit.
**Why this matters:**
If the cultural axis has active Phase 4 consumers (D-232 template draw), and it drives D-233-equivalent correctness in the same way economic specialization does, it should live on `system_economy` alongside the economic field for single-source-of-truth integrity. Splitting the authoring source (one TOML) from the write destination (two tables) creates a translation step that can drift.
**Recommendation for synthesis:**
Clarify: if cultural axis is Phase 4-critical per Paula's quality argument, it earns a new column on `system_economy` and is **not** optional. The scope becomes "all systems where cultural diverges from corridor" (~60-100), authored in the same pass, stored in the same table as economic for coherence. This is cleaner than "optional field, maybe in this TOML, maybe lives elsewhere."
---
### Finding 2: Vocabulary Granularity Mismatch May Cause D-233 Ambiguity
**Status:** Burnelli proposes 33 values; Miri proposes 16 values. Both converge on must-pin D-233 outputs, but the difference is not purely aesthetic.
**The issue:**
Burnelli's vocabulary is richer in agricultural and extraction sub-types (e.g., `terroir_spirits` vs `terroir_agriculture` vs `terroir_organics` vs `food_processing_hub`). All four resolve to different combinations of BulkClass or ProductionUbiquity at the catalog level.
However, the D-233 mapping is **backwards**: the vocabulary value should drive the D-233 output deterministically, not the other way around. If two vocabulary values exist (`terroir_spirits` and `terroir_agriculture`), they must produce **different** D-233 outputs, or one is redundant.
**The problem case:**
`terroir_spirits` and `terroir_agriculture` both should produce Perishable/BulkSolid × MonopolySource per the D-177 constraint. If they produce identical D-233 outputs, the distinction is purely cultural/narrative and doesn't belong on the economic axis — it belongs on the cultural axis.
**Questions for the user:**
1. Are Burnelli's 33 values designed such that every value produces a unique `(BulkClass, ProductionUbiquity)` pair?
2. If not, which values are purely cultural distinctions and should be relegated to the cultural axis?
3. Is there a principled rule for "granularity limit" — e.g., "add a value only if it produces a different D-233 coverage pattern"?
**Recommendation:**
Reconcile before synthesis. A 33-value vocabulary is justifiable if each value is economically distinct (different D-233 outputs). A smaller unified vocabulary (Burnelli + Miri + Paula's intuitions merged) might be cleaner if it collapses duplicate D-233 outputs into single economic values + cultural axis overrides.
---
### Finding 3: Groombridge's MonopolySource Gamble Carries Unexamined Risk
**Status:** Burnelli's OQ-1: is Groombridge monopolistic (MonopolySource) or just concentrated (Specialist)?
**Why this matters more than it appears:**
The D-233 MonopolySource rule per Miri's vocab description is "the mine IS the settlement, everything else is support." This is a **settlement layout constraint**, not just a coverage fraction. If Groombridge is MonopolySource, the settlement form concentrates all civic, residential, and support infrastructure around the financial district — the clearing house IS the gravity well for the entire settlement.
If Groombridge is Specialist, there's a financial district, but the settlement has other districts (shipyards, repair, residential, admin) that are NOT in orbital decay around the clearing house. The built form changes fundamentally.
**The GTTR signal is ambiguous:**
- "Where the money lives" suggests dominance (MonopolySource read)
- "Four centuries" and "architecture understated in the way that communicates expense" suggest enduring presence but not absolute economic lock (Specialist read)
- Groombridge has `financial_services` commodity in the catalog at `common` default; MonopolySource requires explicit override justification
**Red flag:**
Burnelli states his MonopolySource preference but says "Miri should confirm." Miri's Round 2 proposed `financial_hub` (Specialist) without acknowledging Burnelli's OQ-1. This is not a resolved disagreement — it's been sidestepped.
**Recommendation:**
User needs to make an explicit call here before synthesis. The decision changes Groombridge's entire spatial form. Guidance needed: is Groombridge "THE financial node of the Reach" (MonopolySource) or "THE major financial hub" (Specialist)? The lore text supports either reading; the D-233 implications demand one answer.
---
### Finding 4: Missing Prior-Art Anchor — Fallback Heuristic Design
**Status:** All three participants propose heuristics for unautored systems, but none cite how other procedural/sim games handle the fallback problem.
**Context:**
Dwarf Fortress uses value-weighted random selection for regional identities, biasing but not locking on commodity availability. RimWorld's faction generation is lightweight (not economically sophisticated). EVE Online's null-sec regions are hand-authored (not procedural). X4 uses procedural faction presence + trade routes but not authored per-station cultural identity.
**The gap:**
The Settled Reach's fallback heuristic for unautored economic specialization is deterministic (role + planet_class + corp HQ → vocabulary lookup). This is more rigid than Dwarf Fortress's weighted draw but more explainable than RimWorld's lightweight approach. It's reasonable, but there's no external validation that this rigidity won't produce boring or repetitive regional characters in the ~200+ unautored systems.
**The real question:** Is a deterministic fallback the right tradeoff, or should the heuristic include weighted randomness (with a pinned seed per system) to produce variety while remaining deterministic? The current design is safe but may under-deliver on "world feels alive."
**Recommendation (low priority):** Document the fallback heuristic's philosophy explicitly (determinism for reproducibility vs. monotony risk) and note this as a post-launch tuning opportunity.
---
## What Converged Well
- All three participants lock the three-field schema (economic, cultural, faction) ✓
- Keid, Cygni B, Dài Lộ, and Zenzele resolved via GTTR textual authority ✓
- Vocabulary is curated-value abstraction, not raw commodity FK ✓
- Scale encodes in vocabulary values, not separate column ✓
- D-172 currency-zone compliance checks in CI ✓
---
## What Remains Open
1. **Cultural axis: column placement** (system_economy vs. system_culture; materially affects pipeline coherence)
2. **Vocabulary granularity reconciliation** (33 vs. 16; need principled rule for distinctness)
3. **Groombridge: MonopolySource vs. Specialist** (impacts settlement form, not yet resolved despite OQ-1 flag)
4. **Fallback heuristic philosophy** (determinism vs. weighted variety — document the tradeoff)
---
## No Decision-Changing Findings on
- Fork resolutions (all user-checkpointed and sound)
- CI guardrails (Burnelli's spec is thorough)
- Must-pin authoring scope (~60-100 systems is reasonable)
- Faction vocabulary (Paula's 8 values are clean)
---
## Summary: 12 Synthesis Conversations Needed
**Critical:** Groombridge's MonopolySource call + cultural axis column placement (materially changes schema/pipeline coherence).
**Important:** Vocabulary granularity rule (prevents Future redundancy/bloat).
**Documentation:** Fallback heuristic philosophy (not blocking, but good to surface).
Three items. Nothing blocks the synthesis checkpoint from proceeding; all are solvable in ~1520 minutes of discussion once the user is aware of the open frame.
---
*Scout sign-off. All participants have done strong work on lore integration and logical consistency. The remaining questions are clean architectural/design calls, not smoke signals for deeper confusion.*
@@ -0,0 +1,446 @@
# 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)
```toml
# 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
```sql
-- 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` | `concord_assembly` |
| 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*