Reproducibility & data

How every number is regenerable, and the data that backs it.

The reproducibility promise is the point of the whole project: anyone can regenerate any published number. That promise has two halves — the engine, and the data.

The engine half

results = f(scenario file, data-pack checksum, engine git hash). Every CLI output embeds that determinism triple plus a per-file SHA-256 for every data-pack file it consumed. Every number published anywhere gets a pinned regression test: scenario committed, expected output committed, CI fails on drift. Investigation scenarios live in the engine repo under investigations/<slug>/ at a pinned engine tag and double as those CI fixtures.

The data half

The engine’s data packs are fetched and built, never committed. This repository — and the engine’s — carry only data/packs/*.sha256 checksum manifests. Anyone rebuilds a pack from primary sources with the committed scripts; the manifest pins what a correct build must produce.

Two reproduction tiers

Tier Scenarios How you reproduce it
GB — open pack 12 of 14, incl. 2024 reference, FES 2025, CCC CB7, Royal Society 37-year Download the CC-BY-4.0 GB pack (~150 MB) or rebuild from open NESO / Elexon / Copernicus sources with the committed fetch scripts
Continental — bring your own token gb-2024-5zone, gb-2024-8zone Get a free ENTSO-E Transparency Platform token, run the committed scripts/fetch-entsoe pipeline yourself

The continental scenarios depend on ENTSO-E-derived load / generation / capacity, which cannot be redistributed — only used. Posts that rely on them carry a “continental-tier reproduction” note. The engine already sources GB↔︎FR and GB↔︎BE interconnector flows from Elexon / NESO, never ENTSO-E.

Licensing and attribution

The code is dual-licensed MIT OR Apache-2.0. The derived data packs are licensed separately, under CC-BY-4.0, with a PROVENANCE.md per-file manifest. Sources are kept physically separable — one pack per source family — so a takedown of one source cannot poison the rest.

Required attribution strings, reproduced from the engine’s data/PROVENANCE.md:

  • Copernicus / ERA5 — “Contains modified Copernicus Climate Change Service information [year]. Neither the European Commission nor ECMWF is responsible for any use that may be made of the Copernicus information or data it contains.”
  • NESO — “Supported by National Energy SO Open Data.”
  • Elexon BMRS — “Contains BMRS data © Elexon Limited copyright and database right [year].”

Drift-proofing

Live third-party APIs update in place, so a working pack is not a durable reproduction target. The durable target is a Zenodo-frozen pack with a DOI; R2 serves the working copy; a SHA-256 proves the working copy equals the DOI-of-record. Archived reproduction artifacts pin Docker by digest and vendor their dependencies so they do not rot.

Note

The Zenodo DOI and the hosted GB pack are Phase-0 launch items, not yet cut on this scaffold. The manifests, scripts and licences they depend on are already public in the engine repo.