← the model

Methodology — the model, explained

CLAUDE.md says what the invariants are; this says why they are economics and how the pipeline reads.

0. What this is

A one-period, annual, flow-of-funds model of the AI capital build. Money enters as compute demand from AI labs, passes through six balance sheets that decide how much to spend, is allocated across five physical supply tiers, and lands as revenue and profit on twenty-six named public companies. Every levered decision in the chain is priced off the US Treasury curve plus a per-issuer credit spread.

It is a what-if engine, not a forecast. Live data sets the sliders' default positions; the user can move any of them. The output is not "what will happen" but "if this driver moves, who is exposed, by how much, and through which channel."


1. The chain, stage by stage

The solver runs top to bottom. Each stage consumes the one above it.

Stage 0 — Pricing layer

Inputs: y10, y20, y30 (UST yields, live from FRED) and spread_multiple (live from ICE BofA OAS buckets, base 1.0).

Each entity carries a rating bucket (AAA → B) and a hand-set issuer spread in basis points.

all_in_cost_of_debt = treasury_yield + issuer_spread × spread_multiple

Design choice: the live OAS feed scales the level of spreads per rating bucket. The issuer-specific spread stays hand-set. This keeps knowledge like "Oracle trades wide of its BBB rating" intact across a live refresh. This layer is computed first because every downstream node consumes Δ(all_in_cost_of_debt) versus base.

Stage 1 — Demand

OpenAI, Anthropic, and "everyone else" carry a compute-spend figure relative to a base year. A capex driver scales this demand (1.0 = base; 0.40 = the "winter" case).

These figures are commitments and press reports. Neither lab files with the SEC. They are permanently flagged ESTIMATE and nothing in the ingest pipeline may present them otherwise.

Stage 2 — Capex carriers

Six hyperscalers — Amazon, Google, Microsoft, Meta, Oracle, SpaceX/xAI — convert demand into capex, damped two ways:

System capex at base is the sum of the six carriers' capex, 704.1 ($B).

Stage 3 — Allocation

CAPEX_SPLIT distributes each capex dollar across destinations: silicon; power & grid equipment; utilities / IPPs; oil & gas midstream; telecom / fiber; land & construction.

Within the power dollar there is a zero-sum sub-allocation between gas-fired and utility-procured power:

gas_tilt  = gas_share / BASE_GAS               # BASE_GAS = 0.25
util_tilt = (1 - gas_share) / (1 - BASE_GAS)

Raising gas_share moves dollars from NextEra / Dominion / AEP to Williams / Energy Transfer / Kinder Morgan / Cheniere / EQT. Same procurement dollar, different pipe. At gas_share = BASE_GAS both tilts are exactly 1.0.

BASE_GAS is a calibration constant. When EIA data moves the live gas_share, it moves the slider's default position, not the baseline the tilts are computed against.

Stage 4 — Supplier revenue

For each of the 26 suppliers:

Δrevenue ≈ base_revenue × ai_exposure × Δ(tier_flow) × cushion_damping
pct      = Δrevenue / base_revenue

Two estimated parameters dominate this stage:

At base every pct is exactly 0.00% (INV-1).

Stage 5 — Supplier profit

Revenue change becomes profit through:

  1. Operating leverage — fixed-cost businesses amplify revenue moves in both directions.
  2. Input costspower_price_index (EIA wholesale power vs. trailing 3-year mean) and Henry Hub gas for the gas-exposed names.
  3. The supplier's own finance drag — the BB/B-rated names (Vistra, Talen, Vertiv, Lumen) refinance at the widened spread.

margin ≥ -0.30 is the floor. A single scenario can hit one company three times: demand, input cost, refinancing.

Stage 6 — Hyperscaler profit and the depreciation wall

Hyperscaler profit is a delta off a stated base, not a rebuilt income statement. The critical equation:

dep = (prior_cohort × depreciable_share / life)
    + (current_capex × depreciable_share / life) × new_in_service_share

Last year's chips and buildings are already in service and keep depreciating whether or not this year's capex is cut. In the winter case, capex falls ~78% while system depreciation moves only 109 → 106 ($B). About 84% of depreciation is locked.

An early prototype used dep = current_capex / life. That made hyperscaler profits *rise* in an AI winter — economically backwards. The corrected form is guarded by INV-2 and is the single most important analytical result the tool produces.

Elasticities

capex_beta and rate_beta are computed numerically: perturb the driver by ±ε, re-solve, take the finite difference of each supplier's revenue. This is a sensitivity, not a regression.

The market-data phase adds a realised 60-day beta of each supplier to an equal-weight capex-proxy basket (AMZN, GOOGL, MSFT, META, ORCL) and shows it next to the modelled beta. Where they diverge sharply, one of two things is true: the model's exposure estimate is wrong, or the market is mispricing the exposure. The page does not decide which. It shows both and labels the gap.


2. Walking a contagion

The "winter" scenario — capex = 0.40, life = 4, spreads widening

  1. Demand is scaled to 40% of base.
  2. Carriers respond unevenly. Amazon, Google and Microsoft have committed multi-year builds and investment-grade balance sheets; stickiness holds their cut below the demand signal. Oracle and xAI financed the build with debt and now face a wider spread multiple; finance drag makes them cut hardest. System capex ends ~78% lower.
  3. Allocation. The surviving 22% is split by CAPEX_SPLIT. Silicon takes the largest absolute cut because it is the largest share.
  4. Supplier revenue. High-exposure, low-cushion names — Vertiv, Talen, the merchant IPPs whose equity story was AI load growth — see revenue fall roughly in proportion. GE Vernova, with a multi-year turbine backlog, barely moves *this year*; the cushion parameter is doing what a backlog does. Caterpillar at low AI exposure is a rounding error.
  5. Supplier profit. Operating leverage turns a −40% revenue move into −60% or worse for the fixed-cost names. The BB/B-rated names take an additional refinancing hit. Margins clamp at −0.30.
  6. Hyperscalers. Capex fell 78%; depreciation fell ~3%. Profit *falls* despite spending less, because assets already bought are amortising against a smaller revenue base. The AI build is a stock, not a flow, and the stock does not unwind when sentiment does.

The "bondshock" scenario — +100bp parallel shift, no demand change

Step 2 is driven by finance drag alone. The story is the dispersion across carriers: Oracle and xAI at roughly −20% capex, Microsoft and Google at roughly −12%. Credit quality, not the level of rates, determines who cuts (INV-3). Everything downstream inherits that ordering.

The "gasPivot" scenario — gas_share 0.25 → 0.70

No new money. Midstream and gas-fired names rise; regulated utilities fall by the same procurement dollar. This is INV-4 in motion, and it is the scenario most likely to be misread as "gas is winning" when it is actually "the same budget moved."


3. Why the invariants are economics

Each regression test in tests/test_invariants.py encodes one economic claim:

InvariantEconomic claim
INV-1 base reconciles to zeroThe model has no hidden bias. Every departure from zero was caused by a driver the user moved.
INV-2 depreciation wallCapital is a stock. A flow cut does not unwind the stock. Profits fall in a winter, they do not rise.
INV-3 credit > risk-freeFor levered issuers, the spread and leverage dominate the Treasury move. Rate shocks are dispersive, not uniform.
INV-4 gas share zero-sumPower procurement is a budget, not an appetite. Fuel mix is a reallocation.
INV-5 provenance never silentYou always know which number is filed, which is live, which is a guess, and which is stale.
INV-6 clamps stayThe model cannot produce absurdities at slider extremes that get screenshotted out of context.

A reader of any scenario output should be able to trace every number back to one of these six claims plus the estimated parameters in §4.


4. Sources and known limitations

Hard figures (FILED / LIVE)

Estimates to challenge (ESTIMATE / GUIDANCE)

What the model does not do

Provenance flags

FlagMeaning
LIVEFetched from a live source within the freshness window; as_of shown
FILEDFrom an SEC filing; fiscal period and XBRL tag shown
GUIDANCECompany-stated forward figure, not yet filed
ESTIMATEAnalyst judgement; will not be upgraded by ingest
STALEA live fetch failed; the value shown is the last good one and is flagged as such
USEROverridden by the user in the assumptions panel

A STALE flag on any field raises a visible banner. The model keeps solving.