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
})Supply Chain Cascade Model
Beyond Fertilizers: 10 Supply Chains Through the Hormuz Chokepoint
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.
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." }
})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
- Assessment: asmt_2026_010_supply_chain_cascade.md
- Canonical YAML: model_2026_010.yaml
- Validation: confidence.pl (Prolog)
- Methodology: How to Read a Zbigniew Assessment
- Dashboard version: HTML Explorer
“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