Supply Chain Cascade Model

Beyond Fertilizers: 10 Supply Chains Through the Hormuz Chokepoint

Author

por. Zbigniew

Published

March 8, 2026

Methodology

This notebook is a transparent, interactive model derived from Assessment asmt_2026_010. Every formula is visible. Every threshold is documented. Every source fact is cited.

How to read this: Adjust the inputs below. Watch how changes cascade through 5 layers - from chokepoint closure to geopolitical outcomes. Each node shows its formula, current value, severity level, and the real-world data backing the calculation.

Confidence validation: Downstream effects never claim higher confidence than upstream causes. This is enforced by Prolog validation.

For the dashboard version (no formulas), see the HTML Explorer.

Full methodology: How to Read a Zbigniew Assessment.


Inputs

Adjust these parameters to model different scenarios.

viewof hormuz = Inputs.range([0, 16], {
  value: 4, step: 1,
  label: "Hormuz Closure Duration (weeks)"
})

viewof redsea = Inputs.select(
  new Map([["Open", 0], ["Restricted", 1], ["Closed", 2]]),
  { value: 1, label: "Red Sea / Bab el-Mandeb" }
)

viewof retaliation = Inputs.select(
  new Map([["None", 0], ["Limited", 1], ["Moderate", 2], ["Full", 3]]),
  { value: 1, label: "Iranian Retaliation Intensity" }
)

viewof reserves = Inputs.toggle({
  label: "Strategic Reserve Releases",
  value: false
})

Presets

viewof preset = Inputs.radio(
  new Map([
    ["Quick Resolution (2wk)", "quick"],
    ["Current Situation", "current"],
    ["Prolonged Crisis", "prolonged"],
    ["Double Chokepoint", "double"],
    ["Worst Case", "worst"]
  ]),
  { label: "Load scenario:", value: "current" }
)
Preset definitions
presets = ({
  quick:     { hormuz: 2,  redsea: 0, retaliation: 0, reserves: true,  desc: "Hormuz reopens in 2 weeks. No infrastructure damage. Reserves released." },
  current:   { hormuz: 4,  redsea: 1, retaliation: 1, reserves: false, desc: "As of 2026-03-08. Hormuz closed ~4 weeks. Houthis threatening Red Sea. Limited retaliation." },
  prolonged: { hormuz: 8,  redsea: 1, retaliation: 2, reserves: true,  desc: "2-month closure. Moderate Iranian strikes. Reserves deployed but insufficient." },
  double:    { hormuz: 6,  redsea: 2, retaliation: 2, reserves: false, desc: "Both Hormuz and Red Sea closed. Cape of Good Hope only viable route." },
  worst:     { hormuz: 16, redsea: 2, retaliation: 3, reserves: false, desc: "Prolonged closure. Full Iranian infrastructure strikes. Both chokepoints. No reserves." }
})
Note

Selected scenario:


Layer 1: Primary Effects

Direct consequences of chokepoint closure and military action.

Tanker Transit

Formula: clamp(100 - hormuz * 12 + (reserves ? 15 : 0), 5, 100)
clamp = (v, min, max) => Math.min(Math.max(v, min), max)

tanker_traffic = clamp(100 - hormuz * 12 + (reserves ? 15 : 0), 5, 100)

severity_tanker = tanker_traffic > 80 ? "NORMAL" :
                  tanker_traffic > 50 ? "REDUCED" :
                  tanker_traffic > 20 ? "MINIMAL" : "BLOCKED"

color_tanker = tanker_traffic > 80 ? "green" :
               tanker_traffic > 50 ? "yellow" :
               tanker_traffic > 20 ? "orange" : "red"

Value: \({tanker_traffic.toFixed(0)}% of normal | **Severity:** <span class="severity-\){color_tanker}“>

Source: Tanker traffic through Hormuz down ~90% currently. 150+ ships anchored outside.

Gulf Production

Formula: clamp(hormuz > 0 ? hormuz * 5 + retaliation * 10 : retaliation * 5, 0, 90)
gulf_production = clamp(hormuz > 0 ? hormuz * 5 + retaliation * 10 : retaliation * 5, 0, 90)

severity_gulf = gulf_production <= 15 ? "NORMAL" :
                gulf_production <= 35 ? "DISRUPTED" :
                gulf_production <= 60 ? "SEVERE" : "HALTED"

color_gulf = gulf_production <= 15 ? "green" :
             gulf_production <= 35 ? "yellow" :
             gulf_production <= 60 ? "orange" : "red"

Value: \({gulf_production.toFixed(0)}% offline | **Severity:** <span class="severity-\){color_gulf}“>

Source: QatarEnergy declared force majeure. Alba (Bahrain) force majeure on aluminum.

Shipping Cost

Formula: clamp((1 + hormuz0.15 + redseaCost) dualMultiplier, 1, 6)
redsea_cost = redsea === 1 ? 0.5 : redsea === 2 ? 1.2 : 0
dual_multiplier = (hormuz > 0 && redsea === 2) ? 1.4 : 1.0
shipping_cost = clamp((1.0 + hormuz * 0.15 + redsea_cost) * dual_multiplier, 1.0, 6.0)

severity_ship = shipping_cost <= 1.5 ? "NORMAL" :
                shipping_cost <= 2.5 ? "ELEVATED" :
                shipping_cost <= 4.0 ? "SURGING" : "EXTREME"

color_ship = shipping_cost <= 1.5 ? "green" :
             shipping_cost <= 2.5 ? "yellow" :
             shipping_cost <= 4.0 ? "orange" : "red"

Value: \({shipping_cost.toFixed(1)}x baseline | **Severity:** <span class="severity-\){color_ship}“>

Source: War risk surcharge $1,500-$4,000/TEU. Air freight +400% in 48h. Cape routing adds 2 weeks.

Infrastructure Damage

Formula: retaliation (direct mapping)
infra_damage = retaliation

severity_infra = infra_damage <= 0 ? "INTACT" :
                 infra_damage <= 1 ? "MINOR" :
                 infra_damage <= 2 ? "SIGNIFICANT" : "SEVERE"

color_infra = infra_damage <= 0 ? "green" :
              infra_damage <= 1 ? "yellow" :
              infra_damage <= 2 ? "orange" : "red"

Value: Level \({infra_damage} | **Severity:** <span class="severity-\){color_infra}“>

Source: Iranian drones hit AWS facilities, Qeshm desal plant, Fujairah power station, Kuwait desal.


Layer 2: Sector Disruptions

How primary effects hit specific supply chains.

LNG Supply

Formula: clamp(gulf_production * 0.20 * (reserves ? 0.7 : 1.0), 0, 20)
lng = clamp(gulf_production * 0.20 * (reserves ? 0.7 : 1.0), 0, 20)

severity_lng = lng <= 5 ? "ADEQUATE" :
               lng <= 10 ? "TIGHT" :
               lng <= 15 ? "STRAINED" : "CRITICAL"

color_lng = lng <= 5 ? "green" : lng <= 10 ? "yellow" : lng <= 15 ? "orange" : "red"

Value: \({lng.toFixed(1)}% global deficit | **Severity:** <span class="severity-\){color_lng}“>

Source: Qatar = world’s largest LNG exporter. EU needs 700 cargoes to refill. Germany storage at 21.6%.

Petrochemicals

Formula: clamp(gulf_production * 0.35 + (100 - tanker_traffic) * 0.15, 0, 95)
petrochems = clamp(gulf_production * 0.35 + (100 - tanker_traffic) * 0.15, 0, 95)

severity_petro = petrochems <= 10 ? "NORMAL" :
                 petrochems <= 25 ? "DISRUPTED" :
                 petrochems <= 50 ? "SEVERE" : "COLLAPSED"

color_petro = petrochems <= 10 ? "green" : petrochems <= 25 ? "yellow" : petrochems <= 50 ? "orange" : "red"

Value: \({petrochems.toFixed(1)}% disrupted | **Severity:** <span class="severity-\){color_petro}“>

Source: Hormuz controls 35-45% seaborne methanol. Iran = 2nd largest methanol producer (17M t/yr).

Helium

Formula: clamp(gulf_production * 0.30, 0, 30)
helium = clamp(gulf_production * 0.30, 0, 30)

severity_he = helium <= 5 ? "NORMAL" :
              helium <= 12 ? "CONSTRAINED" :
              helium <= 20 ? "CRITICAL" : "COLLAPSED"

color_he = helium <= 5 ? "green" : helium <= 12 ? "yellow" : helium <= 20 ? "orange" : "red"

Value: \({helium.toFixed(1)}% global loss | **Severity:** <span class="severity-\){color_he}“>

Source: Qatar = ~30% global helium. Gulf = 90% of semiconductor helium. No substitute exists.

Aluminum

Formula: clamp(gulf_production * 0.12 + (100 - tanker_traffic) * 0.08, 0, 95)
aluminum = clamp(gulf_production * 0.12 + (100 - tanker_traffic) * 0.08, 0, 95)

severity_al = aluminum <= 5 ? "NORMAL" :
              aluminum <= 12 ? "TIGHT" :
              aluminum <= 25 ? "SHORTAGE" : "FORCE MAJEURE"

color_al = aluminum <= 5 ? "green" : aluminum <= 12 ? "yellow" : aluminum <= 25 ? "orange" : "red"

Value: \({aluminum.toFixed(1)}% disrupted | **Severity:** <span class="severity-\){color_al}“>

Source: Gulf = 12% global primary aluminum. Alba + Qatalum declared force majeure. LME at $3,226/t.

Desalination

Formula: clamp(retaliation * 25 + (retaliation >= 2 ? (retaliation - 1) * 15 : 0), 0, 90)
water = clamp(retaliation * 25 + (retaliation >= 2 ? (retaliation - 1) * 15 : 0), 0, 90)

severity_water = water <= 10 ? "STABLE" :
                 water <= 30 ? "AT RISK" :
                 water <= 55 ? "EMERGENCY" : "CATASTROPHIC"

color_water = water <= 10 ? "green" : water <= 30 ? "yellow" : water <= 55 ? "orange" : "red"

Value: \({water.toFixed(0)}% capacity at risk | **Severity:** <span class="severity-\){color_water}“>

Source: GCC = 40% global desal. Kuwait 90% dependent. Qatar: 3 days without desal. Riyadh: 1-week evacuation.


Layer 3: Cascading Effects

How sector disruptions compound into broader crises.

European Energy

Formula: clamp((lng * 2.5 + (shipping_cost - 1) * 8) * (reserves ? 0.75 : 1.0), 0, 100)
euro_energy = clamp((lng * 2.5 + (shipping_cost - 1) * 8) * (reserves ? 0.75 : 1.0), 0, 100)

severity_eu = euro_energy <= 15 ? "MANAGED" :
              euro_energy <= 35 ? "STRAINED" :
              euro_energy <= 60 ? "CRISIS" : "SEVERE CRISIS"

color_eu = euro_energy <= 15 ? "green" : euro_energy <= 35 ? "yellow" : euro_energy <= 60 ? "orange" : "red"

Value: \({euro_energy.toFixed(1)} stress index | **Severity:** <span class="severity-\){color_eu}“>

Source: EU gas storage ~30% (vs 60% last year). European gas futures jumped 30%.

Semiconductors

Formula: clamp(helium * 3, 0, 95)
semiconductors = clamp(helium * 3, 0, 95)

severity_semi = semiconductors <= 10 ? "NORMAL" :
                semiconductors <= 30 ? "CURTAILED" :
                semiconductors <= 55 ? "MAJOR CUTS" : "FAB SHUTDOWNS"

color_semi = semiconductors <= 10 ? "green" : semiconductors <= 30 ? "yellow" : semiconductors <= 55 ? "orange" : "red"

Value: \({semiconductors.toFixed(1)}% production at risk | **Severity:** <span class="severity-\){color_semi}“>

Source: Helium cools wafers during fab. Samsung evacuated staff. SK Hynix exposed. Weeks to curtailment.

Pharmaceuticals

Formula: clamp(petrochems * 0.4 + (shipping_cost - 1) * 12, 0, 90)
pharma = clamp(petrochems * 0.4 + (shipping_cost - 1) * 12, 0, 90)

severity_ph = pharma <= 10 ? "NORMAL" :
              pharma <= 25 ? "DELAYS" :
              pharma <= 50 ? "SHORTAGES" : "CRISIS"

color_ph = pharma <= 10 ? "green" : pharma <= 25 ? "yellow" : pharma <= 50 ? "orange" : "red"

Value: \({pharma.toFixed(1)}% supply at risk | **Severity:** <span class="severity-\){color_ph}“>

Source: India = 40% US generics. PE/PP from Gulf = IV bags, syringes. Multiple force majeure notices.

Air Cargo

Formula: clamp((gulf threshold check) + (shipping_cost - 1) * 5, 0, 50)
air_cargo = clamp(
  (gulf_production > 20 ? 18 : gulf_production > 5 ? 10 : 0) + (shipping_cost - 1) * 5,
  0, 50
)

severity_air = air_cargo <= 5 ? "NORMAL" :
               air_cargo <= 12 ? "REDUCED" :
               air_cargo <= 25 ? "SEVERELY CUT" : "GROUNDED"

color_air = air_cargo <= 5 ? "green" : air_cargo <= 12 ? "yellow" : air_cargo <= 25 ? "orange" : "red"

Value: \({air_cargo.toFixed(1)}% capacity lost | **Severity:** <span class="severity-\){color_air}“>

Source: Qatar/Emirates/Etihad = 13% global air cargo. All grounded. Rates +400% in 48h. 18% capacity gone.

Digital Infrastructure

Formula: clamp(retaliation * 20 + (redsea === 2 ? 15 : redsea === 1 ? 5 : 0), 0, 80)
data_infra = clamp(retaliation * 20 + (redsea === 2 ? 15 : redsea === 1 ? 5 : 0), 0, 80)

severity_data = data_infra <= 10 ? "STABLE" :
                data_infra <= 25 ? "DEGRADED" :
                data_infra <= 45 ? "MAJOR OUTAGES" : "CRITICAL"

color_data = data_infra <= 10 ? "green" : data_infra <= 25 ? "yellow" : data_infra <= 45 ? "orange" : "red"

Value: \({data_infra.toFixed(0)} disruption index | **Severity:** <span class="severity-\){color_data}“>

Source: Both submarine cable routes closed (first ever). 2 AWS facilities hit. $2T in Gulf tech investment at risk.


Layer 4: Systemic Effects

When cascading disruptions converge into system-level failures.

Global Manufacturing

Formula: clamp(euro_energy * 0.3 + semiconductors * 0.3 + aluminum * 0.5 + petrochems * 0.2, 0, 95)
manufacturing = clamp(euro_energy * 0.3 + semiconductors * 0.3 + aluminum * 0.5 + petrochems * 0.2, 0, 95)

severity_mfg = manufacturing <= 10 ? "NORMAL" :
               manufacturing <= 25 ? "SLOWING" :
               manufacturing <= 50 ? "CONTRACTING" : "RECESSION"

color_mfg = manufacturing <= 10 ? "green" : manufacturing <= 25 ? "yellow" : manufacturing <= 50 ? "orange" : "red"

Value: \({manufacturing.toFixed(1)} disruption index | **Severity:** <span class="severity-\){color_mfg}“>

Defense Supply Chain

Formula: clamp(semiconductors * 0.4 + manufacturing * 0.3 + (hormuz > 4 ? 20 : 0), 0, 90)
defense = clamp(semiconductors * 0.4 + manufacturing * 0.3 + (hormuz > 4 ? 20 : 0), 0, 90)

severity_def = defense <= 10 ? "READY" :
               defense <= 25 ? "STRAINED" :
               defense <= 45 ? "DEPLETING" : "CRITICAL GAP"

color_def = defense <= 10 ? "green" : defense <= 25 ? "yellow" : defense <= 45 ? "orange" : "red"

Value: \({defense.toFixed(1)} strain index | **Severity:** <span class="severity-\){color_def}“>

Source: China rare earth military ban active. F-35, Tomahawks, subs all need China-controlled inputs.

Food Security

Formula: clamp(water * 0.4 + air_cargo * 0.5 + pharma * 0.15, 0, 90)
food_security = clamp(water * 0.4 + air_cargo * 0.5 + pharma * 0.15, 0, 90)

severity_food = food_security <= 10 ? "STABLE" :
                food_security <= 25 ? "STRESSED" :
                food_security <= 45 ? "CRISIS" : "HUMANITARIAN"

color_food = food_security <= 10 ? "green" : food_security <= 25 ? "yellow" : food_security <= 45 ? "orange" : "red"

Value: \({food_security.toFixed(1)} risk index | **Severity:** <span class="severity-\){color_food}“>


Layer 5: Geopolitical Outcomes

The strategic endgame - who wins, who loses.

Global Inflation

Formula: clamp((shipping_cost - 1) * 2 + manufacturing * 0.08 + euro_energy * 0.05, 0, 15)
inflation = clamp((shipping_cost - 1) * 2 + manufacturing * 0.08 + euro_energy * 0.05, 0, 15)

severity_inf = inflation <= 1.5 ? "+low" :
               inflation <= 3.0 ? "+moderate" :
               inflation <= 6.0 ? "+high" : "+severe"

color_inf = inflation <= 1.5 ? "green" : inflation <= 3.0 ? "yellow" : inflation <= 6.0 ? "orange" : "red"

Value: +\({inflation.toFixed(1)}% above baseline | **Severity:** <span class="severity-\){color_inf}“>

Political Stability

Formula: clamp(food_security * 0.3 + inflation * 5 + water * 0.3, 0, 100)
stability = clamp(food_security * 0.3 + inflation * 5 + water * 0.3, 0, 100)

severity_stab = stability <= 15 ? "STABLE" :
                stability <= 35 ? "STRESSED" :
                stability <= 60 ? "VOLATILE" : "CRISIS"

color_stab = stability <= 15 ? "green" : stability <= 35 ? "yellow" : stability <= 60 ? "orange" : "red"

Value: \({stability.toFixed(1)} risk index | **Severity:** <span class="severity-\){color_stab}“>

China/Russia Leverage

Formula: clamp(defense * 0.3 + data_infra * 0.2 + stability * 0.15, 0, 90)
china_advantage = clamp(defense * 0.3 + data_infra * 0.2 + stability * 0.15, 0, 90)

severity_china = china_advantage <= 10 ? "MINIMAL" :
                 china_advantage <= 25 ? "GROWING" :
                 china_advantage <= 45 ? "SIGNIFICANT" : "DOMINANT"

color_china = china_advantage <= 10 ? "green" : china_advantage <= 25 ? "yellow" : china_advantage <= 45 ? "orange" : "red"

Value: \({china_advantage.toFixed(1)} advantage index | **Severity:** <span class="severity-\){color_china}“>

Source: Russia gains: gas, fertilizer, aluminum, grain competitors offline. China gains: rare earth leverage, cheap Iranian oil.


Summary Table

summary = [
  { layer: "1-Primary", node: "Tanker Transit", value: tanker_traffic.toFixed(0) + "% normal", severity: severity_tanker },
  { layer: "1-Primary", node: "Gulf Production", value: gulf_production.toFixed(0) + "% offline", severity: severity_gulf },
  { layer: "1-Primary", node: "Shipping Cost", value: shipping_cost.toFixed(1) + "x", severity: severity_ship },
  { layer: "1-Primary", node: "Infra Damage", value: "Level " + infra_damage, severity: severity_infra },
  { layer: "2-Sector", node: "LNG", value: lng.toFixed(1) + "% deficit", severity: severity_lng },
  { layer: "2-Sector", node: "Petrochemicals", value: petrochems.toFixed(1) + "% disrupted", severity: severity_petro },
  { layer: "2-Sector", node: "Helium", value: helium.toFixed(1) + "% lost", severity: severity_he },
  { layer: "2-Sector", node: "Aluminum", value: aluminum.toFixed(1) + "% disrupted", severity: severity_al },
  { layer: "2-Sector", node: "Desalination", value: water.toFixed(0) + "% at risk", severity: severity_water },
  { layer: "3-Cascade", node: "EU Energy", value: euro_energy.toFixed(1), severity: severity_eu },
  { layer: "3-Cascade", node: "Semiconductors", value: semiconductors.toFixed(1) + "% at risk", severity: severity_semi },
  { layer: "3-Cascade", node: "Pharma", value: pharma.toFixed(1) + "% at risk", severity: severity_ph },
  { layer: "3-Cascade", node: "Air Cargo", value: air_cargo.toFixed(1) + "% lost", severity: severity_air },
  { layer: "3-Cascade", node: "Digital Infra", value: data_infra.toFixed(0), severity: severity_data },
  { layer: "4-Systemic", node: "Manufacturing", value: manufacturing.toFixed(1), severity: severity_mfg },
  { layer: "4-Systemic", node: "Defense", value: defense.toFixed(1), severity: severity_def },
  { layer: "4-Systemic", node: "Food Security", value: food_security.toFixed(1), severity: severity_food },
  { layer: "5-Geopolitical", node: "Inflation", value: "+" + inflation.toFixed(1) + "%", severity: severity_inf },
  { layer: "5-Geopolitical", node: "Stability", value: stability.toFixed(1), severity: severity_stab },
  { layer: "5-Geopolitical", node: "China/Russia", value: china_advantage.toFixed(1), severity: severity_china }
]

Inputs.table(summary, {
  columns: ["layer", "node", "value", "severity"],
  header: { layer: "Layer", node: "Node", value: "Value", severity: "Severity" },
  width: { layer: 120, node: 150, value: 120, severity: 120 }
})

Dependency Graph

Cascade dependency structure
md`
The model follows a 5-layer cascade:

**Inputs** (4) - Hormuz duration, Red Sea status, Retaliation intensity, Reserve releases

**Layer 1** (4 nodes) - Tanker Transit, Gulf Production, Shipping Cost, Infrastructure Damage

**Layer 2** (5 nodes) - LNG, Petrochemicals, Helium, Aluminum, Desalination

**Layer 3** (5 nodes) - EU Energy, Semiconductors, Pharma, Air Cargo, Digital Infra

**Layer 4** (3 nodes) - Manufacturing, Defense, Food Security

**Layer 5** (3 nodes) - Inflation, Political Stability, China/Russia Leverage

**Total:** 4 inputs, 20 computed nodes, 32 causal edges, 5 presets
`

Threshold Reference

All thresholds are continuous (no gaps between severity bands).

Node GREEN YELLOW ORANGE RED
Tanker Transit >80% 50-80% 20-50% <20%
Gulf Production <15% offline 15-35% 35-60% >60%
Shipping Cost <1.5x 1.5-2.5x 2.5-4x >4x
LNG <5% deficit 5-10% 10-15% >15%
Helium <5% loss 5-12% 12-20% >20%
Semiconductors <10% risk 10-30% 30-55% >55%
Inflation <+1.5% +1.5-3% +3-6% >+6%
China/Russia <10 10-25 25-45 >45

Source & Methodology

“The question is not ‘who is an asset.’ The question is: ‘Why does this policy portfolio perfectly match the wish-list of adversaries?’”

por. Zbigniew - Pattern recognition, not prophecy