How the model works

← Back to the chart

A look under the hood of the v2 engine that drives projection-mode Sankey charts — for the US and, since mid-2026, every individual state. Everything visible in this app — the lever sliders, the projection trajectories, the per-source tooltips — is computed from primitives shown here. Pick a section to explore.

Generation sources

Nine sources the engine knows about — Solar, Nuclear, Hydro, Wind, Geothermal, Natural Gas, Coal, Biomass, Petroleum. Each carries ~25 researched values (capex, fixed O&M, LCOE, capacity factor, retirement schedule, learning rate, …) drawn from NREL ATB, EIA, EPA eGRID, and peer-reviewed literature.

Coming soon: per-source card grid with the full reference- value table + quality badges + the engine's projection-year trajectory for each value.

Submodels

Structural sub-models that override the simple per-sector monolithic growth math for high-leverage end-uses:

Coming soon: click-to-expand diagrams for each submodel showing input research values → engine math → output flows.

Feedback loops

The engine isn't a one-pass calculation. A handful of loops connect per-year outputs back into next-year inputs:

One loop the engine deliberately compresses: real-world interconnection queues, permitting, and equipment supply chains are modeled as per-source build caps (D44). The uncompressed version — who actually gates each step and why — is its own explainer: Gridlock: why it's hard to plug in.

Coming soon: a node-link diagram of all feedback loops showing which research values feed which engine outputs.

Levers & scenarios

56 user-exposed levers across four families: generation (Wright's-law rates, retirement schedules, build caps), demand (per-sector growth + elasticity), T&D (per-ISO markups), and submodels (storage, vehicle stock, data centers, hydrogen, building heating). Defaults come from research; overrides land in a "basket" the engine consumes per-projection-year.

Wondering why even aggressive lever pulls move the projection gradually? The build caps are doing that on purpose — they compress the real world's interconnection queues, siting fights, and equipment backlogs into per-source annual limits. Gridlock: why it's hard to plug in maps that friction in full, including a "Speed it up" mode whose model-runnable fixes stage these very levers.

Coming soon: the full lever tree as a browseable tree with each lever's path, default, range, and the engine math it touches.

Policy layer

A closed-enum mechanism resolver (D29) that turns time-bounded policies — federal IRA tax credits, state RPS targets, carbon prices — into engine input adjustments. 15 mechanisms across carrots (production credit, consumer credit, capex offset, …), sticks (regulatory capex, excise tax, …), quantity constraints (mandate floors, electrification mandates), and supply-chain deployment capacity. Jurisdiction-aware: federal policies fire in every region; a state policy fires at full strength in its own state and in states that formally adopted it (§177-style adoption_states), and at a researched spillover share in the US aggregate.

Coming soon: per-policy cards with the mechanism enum + how each one threads into the engine + the active-policy timeline.

State-scale modeling

Every state has a full historical Sankey (EIA SEDS, 2018–2023) and a committed default projection to 2050 — the same engine, re-grounded per state:

A "sum of 50 states" aggregation mode exists as a validation harness (each state projected independently, every flow summed) — comparing it against the direct US projection is how per-state parameters earn their keep.

Research values & quality tiers

Every quantitative model input is wrapped in a ResearchedValue (D21) with a quality tier:

One accounting convention worth knowing: every CO₂ number in the app uses the fossil-combustion basis — biomass counts zero, matching the EIA / Ember / LLNL biogenic-zero convention every published benchmark uses. The physical biomass stack CO₂ (~93 Mt per Quad burned) is never hidden: it appears as an explicit "biogenic (not counted)" line on the impact card and the biomass tooltips (D104).

Coming soon: a filterable table of all ~430 research values across the project, with quality breakdown, last-validated dates, and the engine consumers of each.

Decision history

The engine's architecture grew through 100+ numbered design decisions (D1–D107 to date) recorded in DECISIONS.md. Each entry carries the call, the rationale, and a review-by date so the design stays auditable — including the negative results (mechanisms built, backtested, and deliberately kept off).

Coming soon: an interactive timeline of all decisions grouped by theme (rendering, engine, feedback loops, policy, per-state, tooltips) with click-to-expand context.