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.