The flag is a susceptibility marker, not an absolute state — Commission certification only applies when trading in TRACTUS_PRIMARY zones. Compact-internal trade ignores it entirely. Renamed across all TOML source files, schema docs, workshop outputs, and D-184. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
24 KiB
Gestalt — #801 Commodity Catalog Validation Report
Files validated:
docs/workshops/commodity-catalog/commodities-final.toml(38 commodities)docs/workshops/commodity-catalog/production-chains-final.toml(21 chains)docs/workshops/commodity-catalog/schema-final.md(schema + validation rules)
Date: 2026-04-05
1. Chain Graph Completeness
1a. All chain inputs reference valid commodity IDs
Cross-checked every inputs[].commodity value against the commodity list:
| Input referenced | Exists in catalog? |
|---|---|
| metallic_ore | ✓ |
| rare_minerals | ✓ |
| lattice_grade_material | ✓ |
| water | ✓ |
| agricultural_produce | ✓ |
| organic_compounds | ✓ |
| stone | ✓ |
| chemical_feedstock | ✓ |
| timber | ✓ |
| refined_metals | ✓ |
| advanced_alloys | ✓ |
| electronics | ✓ |
| chemicals | ✓ |
| processed_food | ✓ |
| textiles | ✓ |
| structural_panels | ✓ |
| drive_cores | ✓ |
| lattice_substrate | ✓ |
Result: PASS — no dangling references.
1b. Every non-service commodity appears as chain input or output
Raws (9) — checked as chain inputs:
| Commodity | Appears in chain inputs? |
|---|---|
| metallic_ore | ✓ (smelt_ore, alloy_fabrication) |
| rare_minerals | ✓ (alloy_fabrication, electronics_fabrication, drive_core_assembly) |
| lattice_grade_material | ✓ (lattice_processing) |
| timber | ✓ (panel_from_timber) |
| agricultural_produce | ✓ (food_processing) |
| water | ✓ (fuel_refining, food_processing, chemical_processing, chemical_from_organics) |
| organic_compounds | ✓ (chemical_from_organics, textile_production) |
| stone | ✓ (panel_from_stone) |
| chemical_feedstock | ✓ (chemical_processing) |
Result: PASS — all raws consumed in chains.
Intermediates (10) — checked as chain outputs AND inputs:
| Commodity | As chain output | As chain input |
|---|---|---|
| refined_metals | ✓ (smelt_ore) | ✓ (electronics_fabrication, panel_from_timber, panel_from_stone, heavy_equipment_assembly, freight_hauler_construction, rail_construction) |
| advanced_alloys | ✓ (alloy_fabrication) | ✓ (drive_core_assembly, vehicle_manufacturing, medical_goods_production, gate_component_assembly) |
| fusion_fuel | ✓ (fuel_refining) | ⚠ NOT FOUND AS CHAIN INPUT |
| processed_food | ✓ (food_processing) | ✓ (consumer_goods_assembly) |
| electronics | ✓ (electronics_fabrication) | ✓ (8 of 9 finals + lattice_processing uses chemicals which uses feedstock) |
| chemicals | ✓ (chemical_processing, chemical_from_organics) | ✓ (textile_production, lattice_processing, implant_fabrication, medical_goods_production, habitat_module_assembly) |
| textiles | ✓ (textile_production) | ✓ (consumer_goods_assembly) |
| structural_panels | ✓ (panel_from_timber, panel_from_stone) | ✓ (habitat_module_assembly, rail_construction) |
| drive_cores | ✓ (drive_core_assembly) | ✓ (heavy_equipment_assembly, vehicle_manufacturing, freight_hauler_construction, gate_component_assembly) |
| lattice_substrate | ✓ (lattice_processing) | ✓ (implant_fabrication, gate_component_assembly) |
Result: PASS with one design-decision flag on fusion_fuel (see §1c below).
Finals (9) — checked as chain outputs only (must not appear as inputs):
All 9 finals (heavy_equipment, transport_vehicles, freight_haulers, consumer_goods, implant_hardware, medical_goods, gate_components, habitat_modules, rail_infrastructure) appear as chain outputs and do NOT appear as any chain input.
Result: PASS — finals are correctly end-of-chain.
1c. ⚠ Fusion Fuel — Design Decision Flag
fusion_fuel is produced by fuel_refining but does not appear as an input in any production chain. Its consumption is handled entirely by demand_model = utility (exogenous population/station consumption) and panic_threshold_weeks = 2.
This is not a bug — it is an intentional architectural decision. Fusion fuel is not a manufacturing input; it is consumed as operational overhead by every active node. The Leontief matrix has zero entries for fusion_fuel as a chain input; demand comes from the utility model.
The sim must handle this explicitly: without a utility demand injection mechanism, fusion_fuel's price will collapse to equilibrium-at-zero-demand (no buyers in the Leontief matrix). The demand_model = utility field is the signal to the sim that these commodities require a separate exogenous demand floor calculation.
Recommend documenting this in the server team's simulation implementation notes: utility commodities (water, fusion_fuel, agricultural_produce, processed_food) have demand floors generated outside the Leontief matrix, driven by node population × per-capita consumption rate.
Water also has this property, but water at least appears in 4 chain inputs — so it has BOTH Leontief chain demand AND utility demand. Fusion_fuel has ONLY utility demand.
1d. No Circular Dependencies
The chain graph is a strict DAG: Raw → Intermediate → Final. No intermediate produces a raw; no final feeds back to an intermediate. The only multi-level intermediate dependency is:
metallic_ore + rare_minerals → advanced_alloys → drive_cores
rare_minerals ──────────────────────────────↗
rare_minerals feeds advanced_alloys which feeds drive_cores which feeds advanced_alloys — WAIT. Does drive_core_assembly use advanced_alloys as input? Let me verify:
[drive_core_assembly]
inputs = [
{ commodity = "rare_minerals", quantity = 0.4 },
{ commodity = "advanced_alloys", quantity = 0.8 },
]
And alloy_fabrication uses metallic_ore + rare_minerals — not drive_cores. So the chain is:
- metallic_ore + rare_minerals → advanced_alloys
- rare_minerals + advanced_alloys → drive_cores
No cycle: advanced_alloys does NOT depend on drive_cores. ✓
Result: PASS — the chain graph is a valid DAG with no circular dependencies.
2. Cascade Analysis
The Three Chokepoints
Chokepoint 1: lattice_grade_material → lattice_substrate → implant_hardware + gate_components
Status: INTACT AND STRENGTHENED.
New addition versus Round 2: lattice_processing now takes chemicals (0.3) as a second input alongside lattice_grade_material (1.0). This means the lattice chain now has a second upstream dependency — a chemicals disruption also cascades to lattice_substrate.
Cascade path:
lattice_grade_material (monopolistic, cert required, shadow viable)
↓ lattice_processing (also needs chemicals)
lattice_substrate (concentrated, cert required, shadow viable)
↓ implant_fabrication ↓ gate_component_assembly
implant_hardware gate_components
(cert+contested+shadow) (cert+contested+shadow, monopolistic)
Both terminals are commission_certifiable + compact_contested + shadow_viable. A lattice_grade_material shortage disrupts both at once. The chemicals dependency adds a second, less geographic chokepoint.
Politically, this means: the Compact's shadow market for implant_hardware is structurally linked to the lattice_grade_material supply chain, which is east-reach anchored. Disrupting east-reach exports affects the formal market everywhere and the shadow market in the Compact zone.
Chokepoint 2: rare_minerals → electronics + advanced_alloys + drive_cores → nearly all finals
Status: INTACT.
Rare_minerals feeds 3 intermediates directly:
- → electronics (via electronics_fabrication)
- → advanced_alloys (via alloy_fabrication, with metallic_ore)
- → drive_cores (via drive_core_assembly, with advanced_alloys — DOUBLE rare_minerals dependency)
Downstream impact:
- electronics → 8 of 9 finals (all except gate_components)
- advanced_alloys → transport_vehicles, medical_goods, gate_components
- drive_cores → heavy_equipment, transport_vehicles, freight_haulers, gate_components
gate_components is the only final without direct electronics dependency, but has TRIPLE rare_minerals exposure (direct via drive_cores, via advanced_alloys, via drive_cores-through-advanced_alloys).
A rare_minerals shortage cascades to the ENTIRE manufacturing sector. This is correctly the dominant structural chokepoint.
Chokepoint 3: water → fusion_fuel (8:1) + processed_food + chemicals
Status: INTACT, BROADER THAN NOTED IN schema-final.md.
Water feeds 4 chains:
- fuel_refining (8.0 water → 1.0 fuel) — 8:1 ratio means water disruption = 8x amplified fuel shortage
- food_processing (0.2 water) — utility demand, inelastic
- chemical_processing (0.5 water) — primary chemicals route
- chemical_from_organics (0.3 water) — secondary chemicals route
schema-final.md lists only the water→fuel cascade. The chemicals cascade through water is equally important: chemicals feeds textile_production, lattice_processing, implant_fabrication, medical_goods_production, habitat_module_assembly. A severe water shortage disrupts BOTH food AND fuel AND the chemicals supply chain.
Water is the most widely consumed raw in the chain graph — 4 chain inputs. Combined with panic_threshold_weeks = 1 (the shortest threshold, life-or-death hoarding), water disruption is the single most catastrophic event possible in the simulation.
rail_infrastructure Analysis
rail_construction inputs: structural_panels (1.5), electronics (0.3), refined_metals (1.0)
Sensible inputs: ✓
- structural_panels → track foundations, station structures, tunnels
- electronics → signaling, control systems, communications
- refined_metals → rail, brackets, structural fittings
Interesting supply chain dependencies created:
-
rail competes with habitat_modules for structural_panels. Both finals depend heavily on structural_panels:
- habitat_modules: 1.2 structural_panels
- rail_infrastructure: 1.5 structural_panels A timber shortage (D-177: 40-60y recovery) forces a choice: build homes or build transit. This is a genuine resource allocation tension without any scripting.
-
rail touches the electronics bottleneck. A rare_minerals shortage cascades to rail signaling systems, not just ships and implants. Every major planetary transit project competes with shipbuilding and implant manufacturing for rare_minerals.
-
rail is non-Commission-certified and non-compact_contested. Unlike vehicles and freight_haulers, rail_infrastructure has no political friction. It's a neutral good — both Assembly and Compact systems build rail. This creates an interesting gap: a Compact world can build its own transit infrastructure without Assembly approval, reducing its dependency on certified vehicles.
One note: rail_infrastructure is unit_elastic and oversized. The oversized bulk class (2.0x multiplier, 16%/hop) means that once rails are manufactured, shipping them between systems is extremely expensive. This correctly implies that rail is built near source materials — planetary transit is a local-production affair.
Verdict: rail_infrastructure is a clean addition. It creates genuine panel competition with habitat_modules, touches the electronics chokepoint, and has a meaningful political identity (neutral, non-certified, accessible to both blocs).
3. D-175 Archetype Coverage
28 Lore-Taxonomy Archetypes
Extraction (5):
| Archetype | Commodity slot |
|---|---|
| Ore mining | metallic_ore ✓ |
| Gas extraction | chemical_feedstock ✓ |
| Quarrying | stone ✓, lattice_grade_material ✓ |
| Deep ocean fishery | organic_compounds ✓ (marine biological feedstock) |
| Maritime salvage | metallic_ore ✓ (salvaged metals) |
Agriculture (6):
| Archetype | Commodity slot |
|---|---|
| Grain | agricultural_produce ✓ |
| Livestock | agricultural_produce ✓ |
| Viticulture | agricultural_produce ✓ (grapes are agricultural produce; brand layer handles VGV) |
| Whisky distilling | agricultural_produce ✓ (grain), timber ✓ (cooperage wood) |
| Biomass farming | organic_compounds ✓ |
| Fermentation cooperative | agricultural_produce ✓ (fermentation inputs) |
Manufacturing (6):
| Archetype | Commodity slot |
|---|---|
| Heavy industry | heavy_equipment ✓ |
| Shipbuilding | transport_vehicles ✓, freight_haulers ✓ |
| Precision instruments | electronics ✓, drive_cores ✓, lattice_substrate ✓ |
| Textile/craft guild | textiles ✓ |
| Implant manufacturing | implant_hardware ✓ |
| Pharmaceuticals | medical_goods ✓, chemicals ✓ |
Trade/logistics (4):
| Archetype | Commodity slot |
|---|---|
| Freight | freight_haulers ✓ |
| Gate operations | gate_components ✓ |
| Distribution | transport_vehicles ✓, consumer_goods ✓ |
| Broker | commercial_intelligence ✓, financial_services ✓ |
Services (6):
| Archetype | Commodity slot |
|---|---|
| Legal | legal_services ✓ |
| Banking | financial_services ✓ |
| Insurance | insurance ✓ |
| Logistics management | ⚠ commercial_intelligence ✓ (partial fit; no dedicated service) |
| Information brokerage | commercial_intelligence ✓ |
| Cultural experience | tourism ✓, entertainment ✓, hospitality ✓ |
Intelligence (1):
| Archetype | Commodity slot |
|---|---|
| Commercial intelligence | commercial_intelligence ✓ |
5 East-reach archetypes: All 5 (maritime salvage, precision instruments, fermentation cooperative, maritime fishery, textile/craft guild) have commodity slots — covered under Extraction and Manufacturing above.
⚠ Logistics Management — Minor Gap
The "logistics management" archetype has no dedicated service commodity. Per the team's decision, logistics management was removed as redundant with the transport cost model. Logistics corporations (Sova and equivalents) can operate on commercial_intelligence (route optimization, buffer stock management) and transport_vehicles/freight_haulers (fleet operations). This is an acceptable fit — the archetype can operate, just without a dedicated commodity slot.
This is a design choice, not an error. Worth documenting for the corporation data authoring phase.
6 Behavioral Archetypes
| Archetype | Commodity mapping |
|---|---|
| Monopolist | Gate Corp → gate_components; Bifröst Marmor → stone; lattice producers → lattice_grade_material |
| Distributor | Sova → freight_haulers + commercial_intelligence |
| Producer | Stalownia → heavy_equipment; generic manufacturers |
| Specialist | Brand layer corporations buying raws (Calloway → agricultural_produce + timber) |
| Cooperative | East reach → organic_compounds / agricultural_produce; brach fiber → organic_compounds |
| Intermediary | Mercado → commercial_intelligence; Groombridge clearing house → financial_services |
Result: PASS — all 28 lore-taxonomy archetypes and all 6 behavioral archetypes have commodity slots.
4. D-131 Verb Coverage
| Verb | Backing commodity or service | Status |
|---|---|---|
| buy | All 19 physical commodities | ✓ |
| sell | All 19 physical commodities | ✓ |
| hire | legal_services, commercial_intelligence, medical_services | ✓ |
| rent | habitation_berths (explicitly designed for this verb) | ✓ |
| contract | insurance, commission_certification, legal_services | ✓ |
| inspect | Signal vocabulary D-181: price_current, price_trend, trade_flow_volume, corporate_presence, stockpile_weeks, production_vs_baseline, official_coverage_ratio | ✓ — inspect is backed by the signal system, not a single commodity |
| negotiate | Any transaction; cross-zone currency friction creates negotiation space | ✓ |
| invest | financial_services; heavy_equipment, gate_components, rail_infrastructure as capital goods | ✓ (thin for Phase 2; Phase 3+ will need capital allocation mechanics) |
Result: PASS — all D-131 verbs have backing.
Note on invest: The verb is covered but the mechanics are thin until the player layer (Phase 3+). For Phase 2, invest is implicitly modeled through corporate agent behavior (corporations expand production chains when returns justify it). No player verb needed for Phase 2 simulation.
5. Service Demand Multipliers
Services don't participate in production chains but create demand-side pressure on physical commodities. Each service should have a clear goods-demand effect:
| Service | Physical goods consumed | Mechanism | Strength |
|---|---|---|---|
legal_services |
electronics (office equipment), fusion_fuel (power) | Indirect; pulls from node-level general consumption | Weak |
financial_services |
None direct | Tractus velocity; reduces cross-zone trade friction → increases overall trade volume | Indirect |
medical_services |
chemicals (direct), electronics (direct), medical_goods (direct consumption) | Hospitals consume medical_goods, chemicals for pharmaceuticals, electronics for diagnostic equipment | Strong |
insurance |
None direct | Risk pricing affects which trade routes are used; boosts trade volume on insured routes | Indirect |
commercial_intelligence |
None direct | Improves official_coverage_ratio signal; better market visibility → more efficient commodity allocation |
Signal effect |
commission_certification |
None direct | Tractus sink; certification costs pull Tractus from cross-zone commerce → increases formal goods demand relative to shadow goods | Financial effect |
habitation_berths |
consumer_goods (residents' daily needs), processed_food (food service), water (life support), fusion_fuel (power) | Population occupying berths generates continuous commodity demand at node level | Strong |
tourism |
consumer_goods (visitors' spending), hospitality chain inputs (agricultural_produce, processed_food) | Pulls consumer_goods demand; indirectly pulls agricultural_produce via hospitality | Strong (indirect) |
entertainment |
electronics (production hardware for content creation), fusion_fuel (power) | Content production infrastructure pulls electronics demand | Moderate |
hospitality |
agricultural_produce (kitchen inputs, direct), processed_food (direct), chemicals (cleaning, preservation) | Direct physical commodity consumption at the service node | Strong |
Summary:
- Strongest goods-demand services: habitation_berths, medical_services, hospitality
- Moderate: tourism (indirect via hospitality), entertainment (electronics pull)
- Signal/financial effects only: financial_services, insurance, commercial_intelligence, commission_certification, legal_services
Design note: The three services with no direct physical goods demand (financial_services, insurance, commercial_intelligence) affect the simulation through price signal quality and trade volume, not commodity consumption. This is mechanically correct — these are information/financial services — but it means their presence at a node creates less traceable emergence. A high-financial_services node attracts trade; a high-hospitality node pulls food supply. Both are valuable interactions but the latter is more legible.
Recommendation: The sim should implement service demand multipliers as node-level modifiers on commodity consumption rates, not as production chain entries. Suggested multipliers (per unit of service throughput per tick):
| Service | Commodity | Multiplier |
|---|---|---|
| habitation_berths | consumer_goods | +0.3 units/contract |
| habitation_berths | processed_food | +0.2 units/contract |
| habitation_berths | water | +0.1 units/contract |
| medical_services | medical_goods | +0.4 units/contract |
| medical_services | chemicals | +0.2 units/contract |
| medical_services | electronics | +0.1 units/contract |
| hospitality | agricultural_produce | +0.5 units/contract |
| hospitality | processed_food | +0.3 units/contract |
| tourism | consumer_goods | +0.4 units/contract |
| entertainment | electronics | +0.1 units/contract |
| entertainment | fusion_fuel | +0.05 units/contract |
These are calibration-quality estimates; Burnelli-Sheldon should validate the coefficient magnitudes.
6. Findings Summary
Passes
| Check | Result |
|---|---|
| All chain inputs reference valid commodity IDs | ✓ PASS |
| All raws consumed in at least one chain | ✓ PASS |
| All intermediates appear as both chain inputs and outputs (except fusion_fuel — see below) | ✓ PASS with flag |
| All finals are chain outputs only (not consumed by other chains) | ✓ PASS |
| No circular dependencies in chain graph | ✓ PASS |
| Three chokepoints intact in final TOML | ✓ PASS |
| rail_infrastructure sensible inputs and creates competition with habitat_modules | ✓ PASS |
| All 28 D-175 lore-taxonomy archetypes have commodity slots | ✓ PASS |
| All 6 D-175 behavioral archetypes have commodity slots | ✓ PASS |
| All D-131 economic verbs have backing | ✓ PASS |
| All services have defined goods-demand effects | ✓ PASS |
Issues Requiring Action
[DESIGN FLAG — ACTION REQUIRED]
F-01: fusion_fuel has zero Leontief chain demand.
fusion_fuel is produced by fuel_refining but is not an input to any production chain. Its entire demand must come from the demand_model = utility exogenous mechanism. If the sim implements demand only from the Leontief matrix, fusion_fuel will have no buyers and its price will collapse.
Required action for server team: Implement a utility consumption mechanism separate from the Leontief chain demand. All commodities with demand_model = utility require a population × per-capita consumption rate multiplier applied at each active node, independent of chain inputs. Document this in the simulation architecture. This is not a data error — it is a simulation requirement flagged by the schema design.
Minor Observations (no action required)
O-01: Elasticity reduced from 5 to 4 classes. The schema-final.md elasticity enum has 4 values (perfectly_inelastic, inelastic, unit_elastic, elastic). D-173 specified 5 categories. The 5th class (highly_elastic) was applicable primarily to luxury_goods, which was removed per lead directive (f). With luxury_goods gone, 4 classes cover the catalog adequately. No action required, but the D-173 record may need a minor note that the 5th class was merged into elastic with luxury_goods' removal.
O-02: Logistics management archetype has no dedicated service commodity. Minor coverage gap per D-175. The archetype can operate on commercial_intelligence. Acceptable design choice; document during corporation authoring.
O-03: Water generates both Leontief demand AND utility demand. Unlike fusion_fuel (utility-only), water has both chain demand (fuel_refining, food_processing, chemical_processing, chemical_from_organics) AND utility demand (drinking, life support). The sim should sum both demand signals for water, not choose between them. This is the intended behavior but worth explicit documentation.
O-04: Chokepoint 3 is broader than schema-final.md describes. schema-final.md describes water chokepoint as "water → fusion_fuel (8:1)." The full scope is: water disruption also cascades through chemical_processing → chemicals → textiles, lattice_substrate, implant_hardware, habitat_modules. A severe water shortage is a civilization-ending event, not just an energy crisis. The sim should model this correctly given the chain structure — this observation is just to ensure the cascade documentation reflects the full graph.
Validation complete. Files are internally consistent and structurally sound. One design-flag issue (F-01: fusion_fuel Leontief demand) requires explicit handling in simulation implementation.