06 / System dynamics
27-stock ODE
Beneath FaIR sits a coupled system-dynamics model whose state vector has 31 components (27 stocks for the climate, energy, land and economy, and 4 tipping stocks), integrated forward in time by scipy's solve_ivp with the LSODA solver; the tipping stocks are described in section 07. It describes one stylised world economy, normalised to 2020 (GDP = 1), and the selected player's policies for the round drive the server step. The browser fallback uses the game's policy records. The server integrates it once per round, starting round 1 from the model's own 2025 state; round steps are queued so each continues from the preceding server result. If a step fails or exceeds the 8-second timeout, the game keeps using its simplified browser model until reset; it does not resume a server history that has missed a period. The stocks span two classes.
Physical and technology stocks (21) are atmospheric carbon (C_atm), the carbon sink (C_sink), temperature anomaly (T_anom), clean, fossil, grid, storage and hydrogen capital (K_clean, K_fossil, K_grid, K_storage, K_hydrogen), coal plant's share of fossil capital (Coal_share, added in version 4.2.0 so that a coal phase-out retires coal only), fossil and electric vehicle fleet shares (V_fossil, V_electric), fossil and clean building heat (B_fossil, B_clean), forest and agricultural land (L_forest, L_agri), soil carbon (Soil_carbon), the industrial process-abatement share (I_clean), and four land stocks added in model version 3.1.0: restored forest (L_restored), farmland under improved practice (Ag_practice), the shift to low-meat, low-waste diets (Diet) and the no-policy forest-clearing rate (Clearing). In the game each round starts from FaIR's current temperature; in the validation runs FaIR's temperature and CO₂ replace the ODE's own climate stocks throughout. Every parameter is listed in docs/20-stock-parameters.csv (the file keeps the name it had when the model had 20 stocks) with its source and a confidence label. The carbon-sink rate is calibrated to Global Carbon Budget uptake and fitted to FaIR's CO₂, capital lifetimes come from IEA and IRENA, and baseline deforestation from FAO's Forest Resources Assessment, but 91 of the 161 parameters are labelled educational estimates.
Socioeconomic stocks (6) are unrepaired climate damage (D_damage), GDP, fiscal capacity (F), public support (S), policy capacity (P_capacity) and, new in version 4.0.0, output lost to unserved energy (Unserved_loss). Policy delivery runs through them: policy effectiveness is 0.30 + 0.70 × S × P_capacity (each capped at 0.85), so inside this model low support or weak institutions weaken every lever. In the game that gate does not reach the CO₂ cut on a policy card, which comes from the country emissions model (section 05). It scales how far policies move the indicator stocks and how much of a deal a partner delivers. These stocks are stylised, calibrated to make decisions feel realistic rather than to be macroeconomically precise. They still interact with the physical stocks in ways that reflect real political constraints: damage is 0.74% of GDP per °C² of warming and is repaired over about ten years, spending levers drain fiscal capacity, and public support rises as clean energy grows and, once emissions are falling, as warming is felt, but falls when spending weighs on the budget, when energy demand goes unserved, when carbon-price revenue is kept rather than returned to households, and when a phase-out closes plants with no support for the workers. With nothing pushing them, support and capacity rest at their 2020 values, 0.65 and 0.60, and gains taper as support nears consensus. Preparedness, diplomatic cooperation, energy affordability, employment pressure and inequality risk are tracked outside the ODE, in the game's own set of30 indicator stocks that the scores read; when the server's model answers, its results replace the matching index stocks (energy mix, grid, storage, EV share, building efficiency, forest cover, damage, public trust, governance capacity, fiscal capacity and carbon price).
Energy investment is demand-driven. Total clean plus fossil capacity follows energy demand, which grows with GDP at an elasticity of 0.58 at 2020 income that falls as income rises (efficiency decouples the two). Emissions from transport, buildings and industry follow income the same way, each with its own elasticity. Private investors, funded by the economy rather than the government's budget, replace retiring plants, build for the demand growth they expect and close any gap over about ten years. New capacity splits between clean and fossil by a cost logit (exponent 3): learning makes clean cheaper as wind and solar capacity grows (18% per doubling), the carbon price (lever × $250/t) makes fossil dearer, clean output the grid can't carry or store earns less, and public support tilts toward clean. A clean subsidy works like a tax credit, covering up to 50% of new clean capital cost. A phase-out blocks new fossil plants and retires up to 10% of fossil capacity a year, more slowly when nothing deliverable can replace it. Clean capacity is split into firm (hydro, nuclear, bioenergy, geothermal) and variable (wind, solar). A unit of variable capacity needs 1.11 units of grid, and storage that rises with the variable share of all capacity; the 2020 grid and storage are just adequate. A shortfall curtails wind and solar output, and fossil plants make it up until they run flat out; with no programme, grid operators work a backlog off over about ten years. Investors build ahead of a shortfall they expect, so no validation scenario leaves more than 0.1% of demand unserved in any year; demand left unserved costs output and keeps fossil plants open longer. Each spending lever has its own cost to the fiscal stock at full strength, from 0.03% of GDP a year for diet programmes to 0.47% for clean-energy subsidies (2.4% for all seventeen together), and six levers also carry a private cost for firms and households. The carbon price costs the budget nothing and raises revenue. The fiscal stock can spend at most 30% of itself a year; when it can't cover the portfolio, every spending lever is scaled back by the same funded share. Public grid and storage programmes close a share of the actual shortfall each year.
Policy levers enter the ODE as parameters held constant over each round. A Policy Lab card's level (10–100%) becomes a lever value of the same share, 0 to 1, through POLICY_LEVER_MAP (primary) and POLICY_LEVER_MAP_SECONDARY (secondary, with a scale factor); cards that share a lever add up, capped at 1. Each mapped card drives a lever through these mappings, with weights where needed (see section 05). Some cards bundle interventions that are deployed together in practice. Grid & Storage, for instance, drives both grid_investment and storage_investment at 0.6×. That mirrors how the two are built out together, and saves students from managing every sub-lever by hand.
Validation. Nine scenarios are run from 2020 to 2100 with FaIR coupled in, each against a benchmark set by its policy ambition rather than tuned to a target. These are scenario runs of the server model (version 4.2.0), not gameplay. With every lever at zero the model reaches 2.85°C (5.13°F) in 2100, inside the SSP2-4.5 range of 2.1–3.5°C (3.8–6.3°F) that it is benchmarked on: current-policies projections now sit there rather than in the high-end pathways (Hausfather & Peters, 2020). The two other no-new-policy scenarios, 2.76°C (4.97°F) and 2.84°C (5.11°F), are checked against the same range. Full Ambition, with every mitigation lever at full strength, ends at 1.94°C (3.49°F), inside the SSP1-2.6 range of 1.3–2.4°C (2.3–4.3°F). The five intermediate portfolios land between 2.39°C (4.30°F) and 2.57°C (4.63°F) and are checked for their place between the two. All nine pass. The rule was fixed before Full Ambition was first run; it is the third change of benchmarks and the first change of rule. The game's own no-new-policies line comes from the country emissions model, whose no-policy path is aligned with this model's, and also reaches 2.85°C (5.13°F).