Files
settled-reach/docs/workshops/commodity-catalog/burnelli-sheldon-validation.md
T
jpmschweitzerandClaude Opus 4.6 ac05dbd21f data(economics): commodity catalog — 36 types, 21 production chains
Workshop #801 deliverable: commodities.toml (36 commodities across
5 tiers), production_chains.toml (21 Leontief recipes including
2 substitution routes), schema.md (SQL DDL + validation rules).

Key design choices: brands are not commodities (separate layer),
water→fuel at 8:1 yield, 3 political sub-flags replacing single
boolean, gate energy-over-gate as commercial service. Wiki stub
pages generated for all 36 commodities.

Tickets #811–#815 created for follow-up work. #801 closed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 22:00:33 +02:00

17 KiB
Raw Blame History

Burnelli-Sheldon: Economics Validation

Validated against commodities-final.toml (38 commodities: 9R + 10I + 9F + 7S_prof + 3S_lux) and production-chains-final.toml (21 chains: 12 R→I incl. 2 substitution, 9 I→F).


1. Price Formation Sanity

Raw → Intermediate Margins

Chain Inputs (cost) Output (price) Margin Verdict
smelt_ore 2.0 ore (20T) refined_metals (30T) 50% ✓ Bulk processing
alloy_fabrication 1.5 ore + 0.3 rare_min (39T) advanced_alloys (100T) 156% ✓ High-tech value-add
fuel_refining 8.0 water (16T) fusion_fuel (20T) 25% ⚠ See FLAG-1
food_processing 1.5 agri + 0.2 water (7.9T) processed_food (15T) 90%
electronics_fabrication 0.5 rare_min + 0.3 ref_met (49T) electronics (120T) 145% ✓ Fab value-add
chemical_processing 2.0 feedstock + 0.5 water (25T) chemicals (60T) 140%
chemical_from_organics 1.0 organics + 0.3 water (35.6T) 0.8× chemicals (48T rev) 35% eff ✓ Substitution penalty correct
textile_production 0.8 organics + 0.2 chemicals (40T) textiles (50T) 25% ⚠ Thin — see FLAG-2
panel_from_timber 1.0 timber + 0.5 ref_met (30T) structural_panels (45T) 50%
panel_from_stone 1.5 stone + 0.5 ref_met (27T) 0.8× panels (36T rev) 33% eff ✓ Substitution viable but inferior
drive_core_assembly 0.4 rare_min + 0.8 alloys (112T) drive_cores (200T) 79%
lattice_processing 1.0 lattice_mat + 0.3 chem (138T) lattice_substrate (180T) 30% ✓ Strategic, thin margin is realistic

Intermediate → Final Margins

Chain Inputs (cost) Output (price) Margin Verdict
heavy_equipment_assembly 1.0 ref_met + 0.3 elec + 0.2 cores (106T) heavy_equip (250T) 136%
vehicle_manufacturing 0.8 alloys + 0.3 elec + 0.3 cores (176T) transport_vehicles (350T) 99%
freight_hauler_construction 1.5 ref_met + 0.5 cores + 0.3 elec (181T) freight_haulers (300T) 66%
consumer_goods_assembly 0.3 food + 0.3 textiles + 0.2 elec (43.5T) consumer_goods (80T) 84%
implant_fabrication 0.5 elec + 0.3 chem + 0.4 latt_sub (150T) implant_hardware (400T) 167% ✓ Political premium
medical_goods_production 0.4 chem + 0.3 elec + 0.2 alloys (80T) medical_goods (200T) 150%
gate_component_assembly 1.0 alloys + 0.5 cores + 0.3 latt_sub (254T) gate_components (800T) 215% ✓ Monopoly — below 300% flag
habitat_module_assembly 1.2 panels + 0.3 elec + 0.2 chem (102T) habitat_modules (150T) 47% ✓ Thin — commoditized construction
rail_construction 1.5 panels + 0.3 elec + 1.0 ref_met (133.5T) rail_infrastructure (180T) 35% ✓ Infrastructure margin

Summary

  • No negative margins.
  • No margins above 300%. ✓ (Highest: gate_components at 215%)
  • Substitution routes correctly penalized. Stone panels yield 0.8x; organic chemicals yield 0.8x. Primary routes preferred, substitutions viable fallback.

FLAGS

FLAG-1: Fusion fuel margin is 25%. Input cost 16T, price 20T. At nodes importing water over 3+ hops (water at ~2.7T), fuel input cost rises to 21.6T — margin goes NEGATIVE. Only nodes with local water can sustain fuel refining profitably.

  • Assessment: This might be INTENDED — creates the geographic fuel production pattern (refining at water-rich sites only). But the tâtonnement may struggle to converge if many nodes have negative-margin fuel production. Recommend either:
    • (a) Raise fuel base_price to 25T (56% margin, what I proposed in Round 2), OR
    • (b) Accept 20T and let the sim discover that only water-local refineries are viable (more emergent, but convergence risk)

FLAG-2: Textiles margin is 25%. Organic compounds at 35T are expensive inputs. If organics prices rise 15% (to 40T), textile input cost hits 44T against a 50T price — 14% margin. Textiles become a fragile industry sensitive to organic compound price movements.

  • Assessment: This creates interesting geographic behavior — textile production clusters near biosphere worlds where organic compounds are cheap. Acceptable if intentional. But a combined organic shortage + chemical price spike could make textiles unprofitable, cascading to consumer_goods.

2. Transport Cost Geography

Using bulk class multipliers (my Round 2 values — these are sim parameters, not in the TOML):

Bulk class Multiplier Eff. cost/hop (8% base)
bulk 1.2× 9.6%
liquid 1.3× 10.4%
standard 1.0× 8.0%
compact 0.8× 6.4%
precision 0.6× 4.8%
oversized 2.5× 20.0%

Price at distance (base × compound transport, 8% avg gate rate)

Commodity Base Bulk 5 hops 10 hops 15 hops Ratio 0→15
metallic_ore 10T bulk 15.8T 25.0T 40.2T 4.0×
water 2T liquid 3.3T 5.4T 8.9T 4.5×
rare_minerals 80T precision 101T 128T 161T 2.0×
lattice_mat 120T precision 151T 192T 241T 2.0×
refined_metals 30T standard 44T 65T 95T 3.2×
electronics 120T compact 163T 223T 302T 2.5×
fusion_fuel 20T liquid 33T 54T 89T 4.5×
heavy_equip 250T oversized 622T 1,548T 3,853T 15.4×
gate_comp 800T oversized 1,991T 4,954T 12,326T 15.4×
consumer_goods 80T compact 109T 149T 202T 2.5×
implant_hw 400T precision 504T 640T 805T 2.0×

Geographic specialization verdict

  • Raws and liquids (3-4.5× over 15 hops): Strong geographic gradients. Systems far from sources pay 3-4× for ore, water, fuel. Creates extraction economy clusters. ✓
  • Standard intermediates (3.2× over 15 hops): Moderate gradient. Processing locates near raw sources. ✓
  • Compact/precision goods (2.0-2.5× over 15 hops): Shallow gradient. Electronics, implants worth shipping far. Inter-system trade backbone. ✓
  • Oversized finals (15.4× over 15 hops): Extreme gradient. Manufacturing MUST be regional. Rigs, ships, gates, rail built where they're needed. Durable hubs. ✓

FLAG-3: Oversized dominance in finals

6 of 9 finals are oversized: heavy_equipment, transport_vehicles, freight_haulers, gate_components, habitat_modules, rail_infrastructure. Only consumer_goods (compact), implant_hardware (precision), and medical_goods (compact) flow through inter-system trade at the final tier.

  • Assessment: This means inter-system trade is dominated by raws and intermediates. Finals are produced regionally from imported inputs. This is realistic (mirrors real-world trade patterns where most international trade is intermediate goods). But it means the final-goods price signals in the tâtonnement are very local — a price spike in heavy_equipment at one node barely propagates 3 hops away.
  • Recommendation: Acceptable. The trade volume and price signals that matter (raws, intermediates) flow freely. Finals are correctly localized.

FLAG-4: No perishable bulk class

Agricultural produce (bulk at 1.2×) ships at the same rate as ore. My Round 2 proposed perishable at 1.8×, creating steeper food price gradients and stronger local food production incentives.

  • Impact: Without perishable, food prices equalize more quickly across the network. Frontier stations importing food over 10 hops pay 2.5× (bulk) instead of 5.2× (perishable). The incentive for local food production is halved.
  • Recommendation: Consider adding perishable as a bulk class (1.8×) for agricultural_produce and organic_compounds. These are time-sensitive goods — spoilage and refrigeration costs make them more expensive to ship than inert ore. Without this, the geographic food economy is flatter than it should be.

3. Scarcity Cascade Verification

Cascade map (raw → affected finals)

Raw shortage Direct intermediates Downstream finals Severity
metallic_ore refined_metals, advanced_alloys heavy_equip, freight_haulers, rail_infra (via metals); vehicles, gate_comp, medical (via alloys); + drive_cores cascade BROAD — 7/9 finals. Spares consumer_goods, implant_hw
rare_minerals advanced_alloys, electronics, drive_cores ALL 9 finals (electronics is input to every final chain) MAXIMUM — total economy hit
lattice_grade_material lattice_substrate implant_hardware, gate_components NARROW/POLITICAL — 2 finals, both politically charged
timber structural_panels (timber path) habitat_modules, rail_infrastructure NARROW — 2 finals. Stone substitution softens. But no new stations = political crisis
agricultural_produce processed_food consumer_goods NARROW/HIGH PRICE — 2 finals, but food is inelastic → massive price spike
water fusion_fuel, processed_food, chemicals (both paths) consumer_goods (via food); implant_hw, medical, habitat_mod, gate_comp (via chemicals); fuel utility disruption DEEP — 5+ finals + utility. Deepest cascade in the model
organic_compounds chemicals (organics path), textiles consumer_goods (via textiles); IF feedstock available, chemical cascade buffered LOW if feedstock OK — substitution buffers the hit
stone structural_panels (stone path) habitat_modules, rail_infra (only if timber also scarce) MINIMAL — pure substitution input
chemical_feedstock chemicals (primary path) implant_hw, medical, habitat_mod, gate_comp, textiles→consumer_goods (via chemicals) MODERATE-HIGH — 5 finals. Organics substitution softens

Cascade richness assessment

  • Three strategic chokepoints confirmed:
    1. Rare minerals → everything (broadest)
    2. Lattice material → implant + gate (narrowest, most political)
    3. Water → fuel + food + chemicals (deepest chain)
  • Two buffered cascades (organic_compounds, stone) demonstrate D-173 substitution working correctly — both have alternative routes that soften disruptions
  • One concern: See FLAG-5 below

FLAG-5: Fusion fuel has NO production chain cascade

Fuel is demand_model = "utility" and consumed at every node, but it appears as an INPUT to ZERO production chains. A fuel shortage:

  • Spikes prices (perfectly_inelastic)
  • Increases station operating costs
  • Does NOT cascade through manufacturing

In my Round 2, fuel was an input to smelting, alloys, and electronics. That created a deep cascade: fuel ↓ → metals ↓ → everything. Tyre removed this.

  • Impact: Fuel disruptions are dramatic for living costs but don't cascade to industry. A fuel crisis feels severe (price spikes) but doesn't halt manufacturing. This is economically questionable — real factories shut down during energy crises.
  • Recommendation: Add fuel as an input to at least smelt_ore (smelting is energy-intensive). Even a small coefficient (0.2 fuel per unit refined_metals) creates the cascade: fuel ↓ → metals ↓ → panels/equipment/haulers/rail. This makes fuel disruptions industrially consequential, not just a cost-of-living shock.

4. Brand-Layer Demand Modeling

Proposed interface

Brand corporations appear as fixed-rate demand agents at their production node. Their commodity purchases are REAL demand in the tâtonnement — indistinguishable from other demand sources.

BrandDemand {
    corporation_id: CorporityId,
    node_id: NodeId,
    demands: [{
        commodity: CommodityId,
        base_rate: f64,           // units consumed per tick at equilibrium
        price_ceiling: f64,       // price above which demand reduces
        reduction_slope: f64,     // demand reduction per unit price above ceiling
    }],
}

Behavior

  • Below ceiling: Brand consumes base_rate units/tick. Appears as constant demand in tâtonnement.
  • Above ceiling: Demand reduces linearly: actual_rate = base_rate - reduction_slope × (price - ceiling). Production slowdown.
  • At zero demand: Brand halts production entirely. Commodity demand from this brand drops to zero.
  • Revenue: Brand revenue = f(brand_value, production_volume). NOT modeled in the commodity tâtonnement. Shows up in node GDP separately.

Example: Calloway Distillery at GJ 3325

[[brand_demand]]
corporation_id = "calloway-distillery"
node_id = "gj3325-calloway-reach"
demands = [
    { commodity = "agricultural_produce", base_rate = 5.0, price_ceiling = 12.0, reduction_slope = 1.0 },
    { commodity = "water", base_rate = 2.0, price_ceiling = 5.0, reduction_slope = 0.5 },
]

At equilibrium (agri @ 5T): Calloway buys 5 units/tick of agricultural produce. If agri price rises to 12T (price ceiling), Calloway starts reducing. At 17T, Calloway halts distilling.

Why this works

  • Brand demand is visible to the tâtonnement — solves the stone demand thinness problem. Bífröst's stone purchases create real demand for stone at Nyrheim.
  • Brand demand is price-responsive — brands don't buy at any price. This creates realistic supply-demand interaction: raw material price spikes reduce brand output, which reduces brand revenue, which affects node GDP.
  • Brand demand is authorable — the base_rate and price_ceiling are per-corporation TOML data, not hardcoded. Content team can tune brand economics alongside corporation profiles.
  • Brand revenue is separate — the commodity sim doesn't need to model what brands sell. Only what they buy.

5. Stability Implications

Does the reduced set (no luxury_goods) still produce interesting dynamics?

Yes. Assessment by D-179 criteria:

Criterion Assessment
Cold-start convergence (±5% in 100 days) 28 physical commodities with 21+2 chains is a well-connected graph. Electronics (input to 7/9 finals) and chemicals (input to 6 chains) provide strong cross-commodity coupling. Convergence should be faster than with luxury_goods, not slower — fewer nodes to equilibrate. PASS expected.
Long-run stability (±2% over 1000 days, no events) Two thin-margin chains (fuel 25%, textiles 25%) could oscillate near breakeven. But α=0.03 damping should prevent cobweb oscillation. PASS expected, monitor fuel and textiles.
Shock response (recovery in 200 ticks) Rare minerals cascade (all 9 finals) is the stress test. With fixed-coefficient Leontief, a 20% rare mineral drop cascades to a 20% electronics drop which cascades to proportional drops in all electronics-dependent finals. Recovery depends on rare mineral supply restoration. The cascade is wide but proportional — no amplification. PASS expected.
Cross-zone trade balance (re-stabilize in 50 ticks) 3% Mark/Tractus conversion friction (D-172) applies to cross-zone commodity flows. With 28 physical commodities flowing across zones, the exchange rate adjustment has enough trade volume to work with. PASS expected.

What gets less interesting without luxury_goods

  • Stone's commodity-chain role is thin. Only the substitution route for panels. Brand-layer demand (Bífröst) is the primary demand driver. If brand demand is invisible to the tâtonnement, stone prices flatline. Brand demand visibility is CRITICAL (see section 4).
  • Agricultural produce loses its premium channel. Beverage brands (Calloway, VGV) were the high-margin consumers. Without luxury_goods, agri demand comes only from processed_food (low-margin, high-volume). Agri produce becomes a boring utility commodity unless brand demand is visible.
  • Terroir is invisible at the commodity level. The sim can't distinguish "Calloway Reach agri produce is special" from "generic grain." Terroir differentiation lives entirely in the brand layer. This is correct per directive (f) but means Phase 2 sim testing can't verify terroir dynamics.

What stays interesting

  • Rare minerals as the universal chokepoint (all 9 finals)
  • Lattice material as the political chokepoint (implant + gate)
  • Water as the deepest cascade trigger (fuel + food + chemicals)
  • Oversized bulk creating durable manufacturing hubs
  • Chemical feedstock vs organic compounds substitution dynamics
  • 3-currency cross-zone friction on all trade flows

Summary of Flags

# Issue Severity Recommendation
FLAG-1 Fuel margin 25% — negative at non-local-water nodes Medium Raise base_price to 25T, or accept as emergent geographic constraint
FLAG-2 Textiles margin 25% — fragile to organic price movements Low Acceptable — creates geographic clustering near biospheres
FLAG-3 6/9 finals are oversized — inter-system final goods trade is thin Low Acceptable — mirrors real trade patterns (intermediates dominate)
FLAG-4 No perishable bulk class — food gradient is flat Medium Add perishable class (1.8×) for agri_produce and organic_compounds
FLAG-5 Fuel not a production chain input — no industrial cascade High Add fuel as input to smelt_ore (e.g., 0.2 fuel). Creates fuel→metals→industry cascade