replication report — define-uk · UK · experimental · deltas only
DEFINE-UK: running and gating an unlicensed ecological SFC model.
The authors' unmodified R code runs at a pinned commit; the manual's baseline macro block replicates; the emissions path diverges; no numeric scenario results are published to replicate against. This report records exactly what is gated, what diverged, and why the adapter serves scenario deltas only, never levels.
Climate policy meets the UK financial system.
DEFINE-UK is the ecological stock-flow consistent (E-SFC) model of the UK built by George, Dafermos, Nikolaidi and co-authors (define-model.org/define-uk). It simulates the UK macrofinancial system together with its environmental impacts under climate-policy scenarios — a fossil-fuel ban, power-sector subsidies, housing regulation, green public investment, and a mixed package — with particular attention to the housing stock, the monetary/non-monetary financial institution distinction, and the power sector. No other model in the suite answers the question it is here for: who bears a climate-policy scenario. Versions 1.0 and 1.1 were released in April 2026; the specification is the DEFINE-UK Model Manual, Version 1.1 and the accompanying paper “Evaluating climate policy mixes in the UK: an E-SFC approach”.
The suite's standard is that a model earns its place by replication: run the published code or reimplement the published equations, then compare against the published results with recorded tolerances. This report applies that standard to DEFINE-UK and records where it hits a ceiling the publications themselves impose.
No licence upstream, so nothing is vendored.
The upstream repository is public but carries no
licence, so its code is never vendored or hosted. The
adapter (github.com/PolicyEngine/define-uk-model)
fetches the upstream code at a pinned commit
(846081a) at runtime and executes it as published, in
R, unmodified. On 2026-08-01 the full notebook ran end to end
through define_uk.runner.run (R 4.3.0, rstudioapi
shim only), producing 151 output files — figures and tables for all
four scenario blocks plus tables/Multiplier_Summary.csv.
This architecture also fixes the run surface: DEFINE-UK is
local-only, never hosted, and the eventual hosting
path is the clean-room reimplementation described in
section 08.
A model that runs has proven nothing yet.
The run record is explicit that execution ≠
validation: rendering the notebook end to end demonstrates
only that the pinned code executes, not that its outputs mean
anything. The adapter's VALIDATION.md opens with the
gate — nothing built on the repository may present model output as
meaningful until the file records passing replications against the
published outputs, the same bar applied to the suite's other
replications (boe-svar,
us-hank). The sections below record what that
gate has since established.
Table 4 macro passes; emissions diverge; scenario designs pin exactly.
Macro block: PASS (2026-08-04,
tests/test_replication_baseline.py). Manual
Table 4's macro block — real GDP growth, unemployment,
population 16+, labour force at 2025/2030/2040, S1 baseline —
replicates within stated tolerances (population and labour force
±0.01m; growth ±0.31pp; unemployment ±0.2pp): population and labour
force exact to 0.01m, growth exact at 2030/2040 and −0.30pp at
2025, unemployment within 0.2pp, and the 2025–40 mean and
standard deviation of growth and unemployment match the table. The
run is calendar-anchored on the population path (1987Q1–2040Q4,
2025 = t153).
Emissions: DIVERGENCE. The pinned code runs below
the published Table 4 emissions, widening with horizon —
393 vs 407 MtCO2e/yr in 2025 (−3.5%),
343 vs 382 in 2030 (−10%), and
249 vs 324 by 2040 (−23%). The components
(EMIS_NELEC + EMIS_ELEC) sum exactly to EMIS and the
baseline is identical across scenario folders, so this is a
vintage/calibration gap between the published table and commit
846081a, not an extraction error. The divergence has
been queried with the upstream authors, and the tests gate at the
observed ratios so any further drift fails loudly.
Scenario design: gated exactly. No machine-readable
numeric scenario results are published for v1.1 — the manual's
results stop at the baseline plus scenario design
parameters, and the accompanying SSRN paper is paywalled with no
open mirror. What is verifiable is verified:
tests/test_scenario_design.py pins that each cached
scenario toggles exactly the policy switches its published
description claims (FF_BAN plus capacity/investment ban timings for
the ban scenarios; POWER_SUB alone for the subsidy; green public
investment toggles GVT_INVEST + GREEN_BONDS + GREEN_POWER
exactly; the housing variant pins the published 40% subsidy rate,
HOUSING_SUB_RATE = 0.4).
Anchors from the open 2023 vintage. Two coarse numeric anchors survive in the open FMM 2023 conference version of the paper, held at wide tolerances because it is a pre-1.0 vintage: green public investment peaks “around +1% of GDP” — the cached run peaks at +0.92% — and the current-policies baseline emits “just under 350 MtCO2e” in 2030 — the cached run gives 342.8. Both anchor.
The baseline against official numbers, computed not prose.
Since 2026-08-05 the comparison against official data is an
artifact, not a paragraph:
define_uk.validation.baseline_calibration() recomputes
every row from the cached pinned run against vintage-exact external
observations, the result is committed as
validation/baseline_vs_external.csv, and
tests/test_validation.py fails on any drift between the
committed table and a recomputation. The headline rows: the model's
2025 real GDP growth of 4.66% (annual-mean convention; Table 4
prints 4.96%) stands against an ONS outturn of
1.31% y/y, and its 2025 unemployment of 4.39%
against an ONS annual mean of 4.88%. Population 16+
(55.66m vs ≈56m) is consistent; the labour force (35.97m) is
slightly high; emissions start above the DESNZ actuals. The full
table is on the validation
page.
The implication drives the product: near-term baseline levels are not competitive with the OBR emulator or the BoE SVAR and must never be presented as forecasts. The manual itself says the baseline “should not be seen as a prediction”; we take that literally. The defensible outputs are scenario deltas, with the demand-led caveat stated — which is exactly what the adapter serves.
The fiscal multiplier, stated honestly.
Our own computation of the model's cumulative
green-public-investment multiplier — cumulative ΔGDP over cumulative
ΔSPEND_GVT, nominal, over the full simulation — is
1.78 (define_uk.validation.gpi_multiplier,
pinned in the test suite). IMF estimates of green-spending
multipliers run 1.1–1.5 (Batini et al. 2021); the OBR's
capital-spending impact multiplier is ≈1.0. Above but near the
IMF range, as the demand-led closure predicts, and labelled
accordingly wherever a delta is served.
The upstream repository's own Multiplier_Summary.csv is
documented unusable: its multiplier columns are
identical across all eight scenarios, and its ΔG figure matches the
cumulative delta of no variable in the scenario file. It is never
quoted; our computation supersedes it.
Closed at the achievable ceiling, with a named upgrade path.
The scenario replication targets are closed at the
achievable ceiling (2026-08-05): an exhaustive search
established that no machine-readable numeric scenario results are
published for v1.1. The manual stops at the baseline; the
George/Dafermos SSRN paper is paywalled with no open mirror, and its
scenario set (carbon pricing, subsidies) predates v1.1's regulation
policies anyway. So the gate stack is: the pinned upstream run as
oracle, exact scenario-design pins, and the two FMM 2023 anchors —
and the adapter's scenario surface returns annualised
scenario-minus-baseline delta paths only, framed with mandatory
caveats, via pe-macro define-scenario (local-only,
experimental). The upgrade path is equally explicit: the authors
publish scenario tables, or the SSRN paper becomes accessible, and
the published-figure gate reopens.
Reimplementing the published equations, milestone by milestone.
Because the upstream code cannot be hosted, the hosting path is a
from-scratch Python implementation of the published equations — the
same play as the OBR emulator. The protocol is
clean-room: the specification sources are the manual, the paper, and
Dafermos, Nikolaidi & Galanis (2017); the upstream repository is
an output oracle only, its source never read to write
equations, and every equation must carry a manual_ref
naming the manual section and equation number it implements.
Milestone 1: PASS (2026-08-04). The §2.2
transactions and balance-sheet matrices and the full §5 parameter
and initial-value tables (Tables 5–6) are transcribed, and
every Table 1/2 row and column identity holds on the §5 initial
values within the manual's own 4-significant-figure printing
precision — 27 identity tests in
tests/test_accounting.py. One documented manual
inconsistency is pinned exactly rather than papered over: Table 6
LENDM_ROW omits the DIVN_ROW term of Eq. (383), so the MFI/RoW
transaction columns miss LEND by ∓DIVN_ROW (= 5.44; the manual
itself tabulates overall LENDM = 5.44 where it “should
equal 0”). Milestones 2–5 — macro and production block,
sectoral equations, ecosystem block, policy scenarios — validate
against the oracle and the published figures under the same
standard. The model design belongs to its authors; the
implementation is ours, AGPL-3.0, and independent — not the
authors' code, and not endorsed by them.
Cite this work
Ahmadi, Vahid (2026). “DEFINE-UK: running and gating an unlicensed ecological SFC model.” PolicyEngine Macro replication report. https://policyengine-macro.vercel.app/reports/define-uk-replication
@techreport{policyengine2026defineuk,
title = {DEFINE-UK: running and gating an unlicensed ecological SFC model},
author = {Ahmadi, Vahid},
year = {2026},
institution = {PolicyEngine},
url = {https://policyengine-macro.vercel.app/reports/define-uk-replication},
note = {PolicyEngine Macro replication report}
}No DOI is assigned. For an exact version stamp, cite the git commit of the artifact you used from github.com/PolicyEngine/define-uk-model. Full validation record: VALIDATION.md and REIMPLEMENTATION.md in that repository, mirrored on the validation page.