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.

01 — why this model

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.

02 — the licensing constraint

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.

03 — execution vs validation

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.

04 — the replication gates

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.

05 — calibration vs external data

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.

06 — the multiplier question

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.

07 — the ceiling

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.

08 — the clean-room track

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

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.