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.
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.