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>
This commit is contained in:
@@ -0,0 +1,236 @@
|
||||
# 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
|
||||
|
||||
```toml
|
||||
[[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 |
|
||||
Reference in New Issue
Block a user