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>
27 KiB
Gestalt — #801 Commodity Catalog: Round 2 Converged Proposal
Date: 2026-04-05 Status: Round 2 proposal
What I'm Taking From Each Agent
Tyre: Flat slug IDs. Production chain TOML with location_bound and output_quantity fields. Hard build-step validation. The energy-as-non-physical carve-out problem is now cleanly resolved by the water→fuel chain.
Miri: Commission certification as a distinct service (not collapsed into legal). Re-embodiment as a required luxury service. Cooperage timber as a separate Calloway chain input. Lattice-grade materials anchoring the east reach. Prometheus maintenance network sparsity as a geographic availability constraint.
Burnelli-Sheldon: production_ubiquity flag (guides initialization geographic distribution). demand_model field (utility/compliance changes tâtonnement behavior). Panic mechanism for critical supply goods. Price table with margin analysis. Transport cost differentials showing geographic specialization emergence.
My own Round 1: 3 political sub-flags (commission_cert_required / compact_contested / shadow_viable). Service demand multiplier mechanics. Chokepoint identification. Elasticity classes with α modifiers.
1. The Luxury Goods Tension — Resolved
The problem: Calloway whisky (12–20y aging, terroir lock), Kvitfjell marble (800t/y geological ceiling), and VGV wine (F8V stellar lock) have radically different production constraints. But they are all "luxury goods." One commodity record cannot encode all three simultaneously without becoming three commodity records.
The solution: Per-site, location-bound production chains. The commodity record carries the category-level properties. The chain records carry the constraint-specific properties.
The luxury_goods commodity record:
tier = finalproduction_ubiquity = monopolisticelasticity_class = e4_elasticbase_price = 500T
Each real-world luxury source has its own chain record:
| Chain ID | Location | Key inputs | Aging | Ceiling | Corporate archetype |
|---|---|---|---|---|---|
luxury_calloway |
Calloway Reach | agri_produce(0.4), timber(0.15, cooperage), industrial_chemicals(0.05) | 12–20 game years | D-177 seeding bounds | Specialist |
luxury_vgv_long |
Confluent (F8V) | agri_produce(0.5, F8V grapes), industrial_chemicals(0.03) | 5+ game years | F8V stellar lock | Monopolist |
luxury_vgv_short |
Confluent (F8V) | agri_produce(0.5, F8V grapes) | 1–2 game years | F8V stellar lock | Producer |
luxury_kvitfjell |
Kvitfjell/Nyrheim | stone_aggregate(1.0, Kvitfjell Blue) | None | 800t/y hard ceiling | Monopolist |
luxury_thrds |
Braemar | organic_biomass(0.6, brach fiber), textiles_composites(0.3) | None | Herd ceiling; actively defended monopoly | Specialist |
Brand premiums live in the corporate behavioral layer, not the commodity catalog. The Specialist archetype running the luxury_calloway chain maintains elevated pricing through behavioral parameters. A Monopolist running luxury_kvitfjell holds pricing through the 800t/y ceiling constraint. The underlying luxury_goods commodity price reflects the aggregate market; corporate agents extract rent by being the only licensed operators of site-bound chains.
Miri's VGV split (Grand Vide Classé vs. Vins de Corridors) is preserved without two commodity entries. Two chains at the same site with different aging depths, run by VGV behaving as both Monopolist (long line) and Producer (short line) with different behavioral pricing parameters. The simulation sees one luxury_goods commodity; the player observes that VGV bottles trade at very different prices and can investigate why.
The aging_ticks field on the chain record encodes the pipeline delay. At game start, the Calloway pipeline already contains 12–20 years of maturing stock — D-177 states pipeline contents are fixed by lore, not seeded. The sim inherits this initial state and manages forward flow.
2. The Water→Fuel Chain (Lead Directive)
This is the most important structural change from Round 1. It resolves Tyre's "energy-as-non-physical carve-out" problem entirely.
Water/volatiles becomes an explicit raw material with demand_model = utility.
Fusion fuel becomes an intermediate — refined from water at low yield.
Chain: chain_fusion_fuel
inputs: water_volatiles (6.0)
output: fusion_fuel (1.0)
description: "Deuterium/tritium extraction via centrifuge and electrolysis.
6 tonnes of water processed per tonne of fusion fuel.
Processing overhead is baked into base_price markup, not
modeled as an additional input."
Geographic implications:
- water_volatiles base_price ≈ 2T (near-free on ocean worlds and ice moons; expensive on bare-rock stations)
- fusion_fuel base_price ≈ 30T (input cost: 12T of water + processing overhead)
- Remote, dry stations pay full transport cost on both water AND fuel — compounding disadvantage
- Ocean worlds and ice-moon systems have structural fuel production advantage
- Every active station consumes fusion_fuel continuously (
demand_model = utility): demand floor never drops to zero
What this replaces: My Round 1's R-06 (Energy raw: fissile, reaction mass) is removed. The fissile/nuclear concept is folded into the fusion model — the Reach runs on fusion power. "Energy-rich" systems in the lore = systems with ocean worlds or ice moons that can produce cheap water → cheap fuel. Tyre's energy commodity (non-physical, chain-input carve-out) is no longer needed; fusion_fuel is a standard transportable intermediate.
3. Unified Schema
Commodity Record (wiki/economics/commodities.toml)
[commodity_id]
name = "..." # Display name, Title Case
tier = "raw | intermediate | final | service_professional | service_luxury"
elasticity_class = "e1_perfectly_inelastic | e2_inelastic | e3_moderate | e4_elastic | e5_location_bound"
demand_model = "market | utility | compliance"
base_price = 0.0 # Equilibrium price in Tractus; must be > 0
bulk_class = "dense_bulk | standard | perishable | precision | oversized | non_physical"
production_ubiquity = "ubiquitous | common | regional | concentrated | monopolistic"
commission_cert_required = false # Commission must certify; costs Tractus; Compact friction
compact_contested = false # Compact rejects Commission authority over this commodity
shadow_viable = false # Shadow market routinely operates for this commodity
panic_flagged = false # Critical supply: stockpile-target mechanism applies
panic_threshold_weeks = 0 # Only set when panic_flagged = true
unit = "tonnes | units | contracts"
description = "..." # Optional flavor; wiki/UI tooltip
Field provenance and rationale:
| Field | Source | Over alternative |
|---|---|---|
tier (5 values) |
Tyre | Services as tiers rather than a separate file — clean single-record approach |
elasticity_class |
Gestalt / Tyre | I defined numeric behavior + α modifiers; Tyre named the enum |
demand_model |
Burnelli-Sheldon | Utility/compliance goods have floors that never go to zero — not derivable from elasticity alone |
base_price |
Burnelli-Sheldon | Single equilibrium anchor; tâtonnement starts here |
bulk_class (6 values) |
Gestalt (synthesized from B-S 5-class) | Transport cost multiplier; drives geographic price differentials |
production_ubiquity |
Burnelli-Sheldon | Guides generate_corporations binary; determines initialization distribution |
commission_cert_required |
Gestalt | Encodes the Assembly/Compact friction mechanism precisely |
compact_contested |
Gestalt | Encodes "principled resistance" framing of D-174; not derivable from cert flag alone |
shadow_viable |
Gestalt | Encodes shadow economy risk per commodity; interacts with node-level intensity |
panic_flagged + panic_threshold_weeks |
Burnelli-Sheldon | Critical supply goods have qualitatively different shortage behavior |
unit |
Tyre | Keeps chain recipe quantities unambiguous |
Eliminated:
- Tyre's single
political_sensitivityboolean → superseded by 3 sub-flags; lead-endorsed - Tyre's
transportable→ derivable frombulk_class == non_physical - Tyre's
energycommodity (non-physical carve-out) → replaced by water→fuel chain
Production Chain Record (wiki/economics/production_chains.toml)
[chain_id]
output = "commodity_id"
output_quantity = 1.0 # Units produced per cycle; default 1.0
inputs = [
{ commodity = "commodity_id", quantity = 0.0 },
]
location_bound = false # If true, chain only operates at site_id
site_id = "" # Body reference from systems.db; requires location_bound = true
max_output_per_cycle = 0.0 # Optional hard ceiling (Kvitfjell 800t/y equivalent)
aging_ticks = 0 # Optional pipeline delay (Calloway 12-20 game years)
description = "..."
4. Full Commodity List
Raw Materials (8)
One raw added versus D-173's 7: water_volatiles, required by the water→fuel chain (lead directive). stone_aggregate absorbs my Round 1's silicate_mineral. organic_biomass absorbs my Round 1's chemical_feedstock (both are organic sources for the industrial chemicals chain). timber added as a separate raw from organic_biomass because its 40–60y recovery cycle and cooperage-specific use in the Calloway chain are mechanically distinct.
| ID | Name | Elasticity | Demand | Bulk class | Ubiquity | Cert | Contested | Shadow | Notes |
|---|---|---|---|---|---|---|---|---|---|
metallic_ore |
Metallic Ore | E-2 | market | dense_bulk | common | No | No | No | Stalownia primary; asteroid and planetary mines |
stone_aggregate |
Stone / Aggregate | E-3 | market | dense_bulk | common | No | No | Partial | Kvitfjell Blue marble = monopolistic luxury variant; standard aggregate ubiquitous |
agricultural_produce |
Agricultural Produce | E-1 | utility | perishable | ubiquitous | Partial | No | No | Crops, grain, grapes, livestock; F8V and terroir constraints per site |
organic_biomass |
Organic Biomass | E-2 | market | standard | regional | No | No | No | Brach fiber (Braemar hard lock), marine catch, biological feedstock; chemical chain input |
water_volatiles |
Water / Volatiles | E-1 | utility | dense_bulk | ubiquitous | No | No | No | Ocean worlds cheap; bare-rock stations expensive; primary fusion fuel input |
rare_minerals |
Rare Minerals | E-3 | market | precision | concentrated | No | No | Partial | Rare earths, crystals; 5–10 systems; electronics and alloys bottleneck |
timber |
Timber | E-3 | market | perishable | regional | No | No | No | Nordmark structural; Dunbar cooperage grade (Calloway chain); 40–60y recovery cycle |
lattice_grade_material |
Lattice-Grade Material | E-4 | market | precision | monopolistic | Yes (strategic) | No | High | East reach anchor export; neural/gate substrate; Gate Corp strategic interest; no substitute |
Intermediate Goods (8)
fusion_fuel replaces my Round 1's power_cell_fuel (renamed and now derived from water). electronics_components absorbs the "fabricated components" dependency role — it is now the intermediate required by the most finals. structural_materials has two production chain routes (stone or timber), giving flexibility in supply.
| ID | Name | Primary inputs | Elasticity | Bulk class | Ubiquity | Cert | Contested | Shadow | Notes |
|---|---|---|---|---|---|---|---|---|---|
refined_metals |
Refined Metals | metallic_ore | E-2 | standard | common | No | No | No | Smelted steel and alloys; Stalownia processes |
structural_materials |
Structural Materials | stone_aggregate OR timber + refined_metals | E-3 | oversized | regional | No | No | No | Prefab panels, construction composites; two substitute routes |
processed_food |
Processed Food | agricultural_produce OR organic_biomass | E-1 | standard | common | Partial | No | No | Shelf-stable; fisheries = second route; Mercado distribution |
textiles_composites |
Textiles / Composites | organic_biomass | E-3 | standard | regional | No | No | No | Clothing, technical fabrics; brach fiber variant = premium Braemar-locked route |
industrial_chemicals |
Industrial Chemicals | organic_biomass | E-2 | standard | regional | Yes (hazmat) | Yes | Yes | Pharma, solvents, reagents; cert = Assembly tariff by another name |
electronics_components |
Electronics / Components | rare_minerals + refined_metals | E-3 | precision | concentrated | No | No | No | Circuits, processors; rare minerals bottleneck cascades to implants, gates, vehicles |
fusion_fuel |
Fusion Fuel | water_volatiles (6:1 input) | E-1 | standard | common | Yes (safety) | Yes | Yes | 6t water → 1t fuel; every station consumes continuously; water-rich systems have structural advantage |
lattice_substrate |
Lattice Substrate | lattice_grade_material | E-2 | precision | monopolistic | Yes (strategic) | No | High | No substitute; feeds implant_hardware and gate_infrastructure — THE dual chokepoint |
Final Goods (7)
habitat_modules (Burnelli-Sheldon's F7) is folded into heavy_industrial_equipment as a production chain variant. Its demand function (population-driven) is handled at the corporate behavioral layer, not the commodity catalog. Count stays at 7.
| ID | Name | Inputs | Elasticity | Bulk class | Ubiquity | Cert | Contested | Shadow | Notes |
|---|---|---|---|---|---|---|---|---|---|
heavy_industrial_equipment |
Heavy Industrial Equipment | refined_metals + electronics_components + structural_materials | E-4 | oversized | regional | No | No | No | Stalownia rigs, Cygni B station sections; 1–3y lead time; B-5 means manufacturing hubs are structural |
consumer_goods |
Consumer Goods | processed_food + textiles_composites | E-3 | standard | common | No | No | Partial | Daily necessities; uncertified variants undercut in low-coverage nodes |
luxury_goods |
Luxury Goods | [5 site-bound chains — see §1] | E-4 | precision/oversized | monopolistic | Partial | No | Yes | One catalog entry; brand in corporate behavior; biological ceilings on production chains |
transport_vehicles |
Transport Vehicles | refined_metals + fusion_fuel + electronics_components | E-4 | oversized | regional | Yes (safety) | Partial | Partial | Ships, MVG; Commission registration; Compact often operates unregistered |
implant_hardware |
Implant Hardware | lattice_substrate + electronics_components | E-4 | precision | concentrated | Yes (medical) | High | High | THE political flashpoint; D-037 adjacent; Commission cert = THE Compact grievance |
gate_infrastructure |
Gate / Infrastructure | refined_metals + lattice_substrate + electronics_components + fusion_fuel | E-4 | oversized | monopolistic | Yes (strategic) | Extreme | High | Gate Corp monopoly + Commission cert = maximum structural extraction; double chokepoint dependency |
medical_goods |
Medical Goods | industrial_chemicals + electronics_components | E-2 | precision | regional | Yes (medical) | Partial | High | Healthcare + re-embodiment supporting goods; D-174 canonical contraband adjacent |
5. Service List (9 total)
Why 6 professional services (not 5): Commission certification has demand_model = compliance, is only available in Commission-presence systems, and is mechanically the smuggling incentive mechanism from D-174. It cannot be collapsed into legal_services without losing that behavior. The lead directive explicitly endorsed it.
Why logistics management was removed: Logistics management is redundant with the transport cost model. The 5–12%/hop gate cost already encodes logistics overhead. Sova Logistics and other logistics corporations operate on commercial_intelligence and habitation_berths (berth and route management), not a separate logistics-management service commodity.
Why re_embodiment is not collapsed into medical_goods: Medical goods is a transportable physical commodity. Re_embodiment is a location-bound procedure. Different bulk class (non_physical vs. precision), different demand model (compliance vs. market), different shadow economy profile. D-174 names unlicensed re-embodiment as canonical contraband — the licensed service must be distinct.
Professional Services (6)
| ID | Name | Demand | Cert | Contested | Shadow | Key simulation behavior |
|---|---|---|---|---|---|---|
legal_services |
Legal Services | market | No | No | Partial | Demand = f(economic activity, dispute rate); FM south reach, Crown's Hollow west reach |
commission_certification |
Commission Certification | compliance | N/A (IS certification) | High | High | Demand = f(regulated goods production); only in Commission-presence nodes; IS the smuggling incentive from D-174 |
financial_services |
Financial Services | market | No | Partial | Partial | Tractus velocity; cross-zone trade friction; Groombridge clearing house = priority Tier 1 gap |
insurance |
Insurance | market | No | No | No | Affects trade volume via risk pricing; no goods demand; mutual insurance in south reach |
commercial_intelligence |
Commercial Intelligence | market | No | No | Partial | Improves official_coverage_ratio signal; consolidates B-S's "information brokerage" per lead directive |
habitation_berths |
Habitation / Berths | utility | No | No | Partial | Covers D-131 "rent" verb; fixed supply per node; booming nodes run out of berths → real estate signal |
Luxury / Experiential Services (3)
| ID | Name | Demand | Notes |
|---|---|---|---|
tourism |
Tourism | market | Pulls luxury_goods and consumer_goods demand; deep-corridor prestige; Confluent estates, Calloway distillery circuit |
entertainment_media |
Entertainment / Media | market | Holo-content, cultural production; pulls fusion_fuel and electronics_components |
re_embodiment |
Re-embodiment Services | compliance | Commission-licensed; Prometheus-adjacent; shadow market = unlicensed (D-174 canonical); demand_model = compliance because clients go where licensed facilities exist |
6. Complete Chain Graph (Summary)
Raws → Intermediates
| Chain ID | Output | Inputs | Sub routes? |
|---|---|---|---|
ore_smelting |
refined_metals | metallic_ore(2.0) | — |
stone_panel_fab |
structural_materials | stone_aggregate(1.5) + refined_metals(0.5) | Substitute for timber route |
timber_panel_fab |
structural_materials | timber(1.0) + refined_metals(0.3) | Substitute for stone route; Nordmark territory |
food_processing |
processed_food | agricultural_produce(1.5) | Main food chain |
seafood_processing |
processed_food | organic_biomass(1.2) | Alternative; east reach fisheries anchor |
fiber_processing |
textiles_composites | organic_biomass(0.8) | Brach fiber = premium Braemar-locked variant of same chain |
chemical_synthesis |
industrial_chemicals | organic_biomass(1.0) | Pharma + industrial reagents |
electronics_fab |
electronics_components | rare_minerals(0.5) + refined_metals(0.3) | Rare minerals bottleneck |
fusion_fuel_extraction |
fusion_fuel | water_volatiles(6.0) | Low yield; key new chain |
lattice_processing |
lattice_substrate | lattice_grade_material(1.0) | No substitute |
Intermediates → Finals
| Chain ID | Output | Inputs |
|---|---|---|
industrial_assembly |
heavy_industrial_equipment | refined_metals(1.0) + electronics_components(0.3) + structural_materials(0.5) |
consumer_assembly |
consumer_goods | processed_food(0.3) + textiles_composites(0.3) |
luxury_calloway |
luxury_goods | agricultural_produce(0.4) + timber(0.15, cooperage) + industrial_chemicals(0.05) |
luxury_vgv_long |
luxury_goods | agricultural_produce(0.5, F8V grapes) + industrial_chemicals(0.03) |
luxury_vgv_short |
luxury_goods | agricultural_produce(0.5, F8V grapes) |
luxury_kvitfjell |
luxury_goods | stone_aggregate(1.0, Kvitfjell Blue) |
luxury_thrds |
luxury_goods | organic_biomass(0.6, brach fiber) + textiles_composites(0.3) |
vehicle_assembly |
transport_vehicles | refined_metals(0.8) + fusion_fuel(0.3) + electronics_components(0.3) |
implant_manufacturing |
implant_hardware | lattice_substrate(0.5) + electronics_components(0.3) |
gate_construction |
gate_infrastructure | refined_metals(1.0) + lattice_substrate(0.5) + electronics_components(0.4) + fusion_fuel(0.2) |
medical_manufacturing |
medical_goods | industrial_chemicals(0.3) + electronics_components(0.2) |
7. Chokepoints — Updated for Round 2
Three chokepoints drive gameplay tension, same locations as Round 1 but one upgraded:
1. Lattice chain: lattice_grade_material → lattice_substrate → implant_hardware + gate_infrastructure
- Still the richest chokepoint
- Now strengthened:
gate_infrastructurerequires lattice_substrate AND fusion_fuel (two chokepoints converge on gates) - Geographic anchor: east reach. If east reach lattice-grade material exports are disrupted, both Commission-certified implants AND gate maintenance cascade
2. Electronics cascade: rare_minerals → electronics_components
- Required by: transport_vehicles, implant_hardware, gate_infrastructure, heavy_industrial_equipment, medical_goods
- That's 5 of 7 finals
- Replaces my Round 1's "fabricated components" as the broad dependency
- Rare minerals at 5–10 systems means geographic concentration; a single region controlling rare mineral supply has leverage over ALL manufacturing
3. Luxury goods biological ceilings
- Now structurally encoded in per-chain
max_output_per_cycleandaging_ticksfields - The player observes that no amount of economic activity can increase Kvitfjell marble output past 800t/y
- This is the simulation teaching its own rules: some scarcity is structural, not addressable through trade
8. Base Prices (Reference Table)
Building on Burnelli-Sheldon's margin analysis, adjusted for the water→fuel chain.
| Commodity | Base price (T) | Key margin note |
|---|---|---|
| water_volatiles | 2 | Near-free on ocean worlds; expensive on dry stations |
| agricultural_produce | 5 | Common output; staple food chain anchor |
| stone_aggregate | 8 | Ubiquitous; Kvitfjell Blue commands 15–50× at source |
| metallic_ore | 10 | Bulk mining reference commodity |
| organic_biomass | 18 | Complex biospheres only; brach fiber in premium tier |
| timber | 15 | Less common; cooperage grade commands premium |
| rare_minerals | 80 | Scarce; location-specific; electronics bottleneck |
| lattice_grade_material | 120 | Strategic; monopolistic; east reach anchor |
| refined_metals | 28 | ~180% margin on ore; bulk volume |
| structural_materials | 40 | Input cost ~25T; moderate margin |
| processed_food | 15 | Near-input-cost; high volume, low margin |
| textiles_composites | 50 | Value-add from organic biomass |
| industrial_chemicals | 60 | Higher value-add; hazmat cert adds friction |
| electronics_components | 120 | High value-add from rare minerals bottleneck |
| fusion_fuel | 30 | 12T input (6× water) + ~18T processing overhead |
| lattice_substrate | 180 | Near-input-cost; value is the raw material scarcity |
| heavy_industrial_equipment | 250 | Complex assembly; B-5 bulk protects manufacturing hubs |
| consumer_goods | 80 | Mass market; broad input mix |
| luxury_goods | 500 | Price is demand-driven, not cost-driven; brand premium in corporate layer |
| transport_vehicles | 350 | Three-input assembly; fusion_fuel dependency |
| implant_hardware | 400 | Enormous value-add; political premium |
| gate_infrastructure | 800 | Monopoly pricing; strategic premium; four-input cascade |
| medical_goods | 150 | High-value; regulatory overhead in cert cost |
9. Delta from Round 1
| Change | Round 1 | Round 2 | Why |
|---|---|---|---|
| Energy raw removed | R-06 (fissile, reaction mass) | Removed | Lead directive; replaced by water→fuel chain |
| Raw count | 7 | 8 | water_volatiles required; directive-driven |
| Silicate/mineral | Separate raw | Merged into stone_aggregate | Same production chains |
| Chemical feedstock | Separate raw (R-05) | Merged into organic_biomass | Both organic sources for industrial chemicals |
| Fabricated components | Separate intermediate | Dissolved; electronics_components inherits role | Electronics is the natural high-tech bottleneck |
| Timber | Not separate | Added as 8th raw | Cooperage dependency; 40–60y recovery is distinct behavior |
| Luxury goods | One commodity, no chain detail | One commodity, 5 site-bound chains with aging_ticks and ceilings | Resolves brand vs. commodity tension |
| Services | 5 professional + 3 luxury | 6 professional + 3 luxury | Commission certification added per lead directive |
| Logistics management | In service list | Removed | Redundant with transport cost model |
| Schema: political_sensitivity | 1 boolean | 3 sub-flags | Lead-endorsed; richer encoding |
| Schema: production_ubiquity | Absent | Added | B-S contribution; initialization distribution |
| Schema: demand_model | Absent | Added | B-S contribution; utility/compliance tâtonnement behavior |
| Schema: panic_flagged | Absent | Added | B-S contribution; stockpile mechanism |
10. Outstanding Questions for Round 3
Q1: Rare minerals vs. lattice-grade material — one or two raws? I kept them separate: rare_minerals feeds electronics_components and advanced manufacturing broadly; lattice_grade_material is the specialized neural/gate substrate. If we collapse them, east reach loses its distinctive export identity (it would just be another rare minerals source). Recommendation: keep separate.
Q2: thrds garments — luxury_goods or consumer_goods output? Argument for luxury: brach exclusivity makes it a prestige product. Argument for consumer: north reach workers treat it as functional gear, not luxury. My proposal puts it in luxury_goods with Specialist markup. If we want thrds penetration in everyday outer-corridor markets, it might need a consumer_goods production variant alongside the luxury output. Worth discussion.
Q3: Habitat modules as a separate final? Burnelli-Sheldon argued for distinct demand function (population-driven vs. industrial-driven). I folded it into heavy_industrial_equipment as a production chain variant. If the simulation needs to model new-settlement expansion as a distinct signal, habitat_modules may need its own entry. Flagged.
Q4: water_volatiles bulk class
I set it as dense_bulk (shippable as ice or liquid). Is there an argument for splitting the bulk class into "water-as-infrastructure" (local plumbing, not a cargo item) vs. "water-as-cargo" (ice hauled from a distant source)? Or does dense_bulk handle both cases correctly via transport cost?
Total: 8 raw + 8 intermediate + 7 final + 9 services = 32 commodity types.
One above Burnelli-Sheldon's 32 (we have the same count by different routes). Within D-173's "approximately 30" spirit. The additions are lead-directive-driven (water/fuel chain, commission_certification) — not scope creep.