An editorial investigation of electricity transitions across 58 grids, 2010–2024. It pairs six traceable findings with linked country comparisons, annual time controls, generation-mix bars, demand/clean/trade decompositions, a clearly illustrative scenario lab, downloadable tables, and a six-page PDF.
This is a local research edition of demo 04. The archived data vintage is 30 May 2025. Annual observations end in 2024; the report does not claim to show the latest release or real-time electricity.
From the task directory:
python3 outputs/serve.py
Open GRID ATLAS. The server binds to 127.0.0.1:43104 only. There is one static server, no build step, no database, no external runtime requests, and no paid API. If the port is already occupied by this demo, reuse it. Stop with Ctrl-C in the launching terminal. Starting a second copy fails without replacing the existing server.
If you extracted the source bundle and are already inside the output folder, run python3 serve.py instead.
The report uses standard JavaScript modules, SVG, CSS and local font files. Use the server for the interactive report; a direct file:// load cannot fetch its JSON data. evidence.html is a static, JavaScript-free alternative with calculation traces, endpoint tables and the full ranking.
Each finding is tied to endpoint tables and immutable source links in the evidence companion. The ranking is cohort-specific, not a claim about all countries or causal policy effectiveness.
The raw file is the complete OWID Energy CSV, losslessly compressed locally. The analysis extracts only electricity columns and the common 2010–2024 interval. A cleaned all-candidate table preserves 3,119 country-year rows; the qualifying panel has 870 rows.
f419e8f3a5e92f796f4f2e49ef5da187510d2f94 in owid/energy-data.64a3276e21703577bb4e4cd11d0dae4aaa2b94aaacc4132d9b8f0c1495c74e2c.data/source-manifest.json.data/evidence/coverage.csv.change in fossil = change in demand − change in clean − change in net imports + reconciliation. Both annual identities balance exactly at the source's decimal precision in all 870 qualifying rows.0.000 remains zero. “Other clean” is a separately labeled residual, only calculated if the necessary inputs are available. A hatched unallocated portion makes incomplete mix detail visible.The original CSV's physical line number, including its header, is included in every cleaned row. data/evidence/verification.json contains independently recomputed Decimal formulas and the complete original source records for 12 sample countries.
The core analysis needs only Python's standard library. It does not call the network.
python3 outputs/analysis/analyze.py
python3 outputs/analysis/verify.py
python3 outputs/analysis/evidence.py
node outputs/analysis/test_model.mjs
test_model.mjs checks the JavaScript implementation against the Python results, verifies three complete ranking orders, and checks scenario identities, compounding, the zero fossil floor, surplus, and CSV missing-value semantics.
To refetch the same immutable data vintage, explicitly run:
python3 outputs/analysis/acquire.py
It rejects a CSV whose uncompressed checksum differs from the pinned value. The data and codebook are immutable GitHub URLs; the current methodology URL can change, so its retrieved bytes are separately preserved and hashed. The offline reproduction above uses the supplied snapshot and does not refetch methodology.
The briefing was built with Python 3.12.13, ReportLab 4.4.9, and the local Instrument Serif fonts. PDF QA uses pypdf 6.10.0 and Poppler. The PDF contains real vector charts and selectable text; no chart screenshots are substituted for data.
In this showcase workspace, use the shared resource wrapper for installations, PDF creation and rendering:
python3 /Users/matthewberman/Documents/ChatGPT/tests/showcase/scripts/with-resource-slot.py /Users/matthewberman/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/bin/python3 outputs/analysis/make_briefing.py
python3 /Users/matthewberman/Documents/ChatGPT/tests/showcase/scripts/with-resource-slot.py /Users/matthewberman/.cache/codex-runtimes/codex-primary-runtime/dependencies/bin/override/pdftoppm -r 125 -png outputs/grid-atlas-briefing.pdf outputs/qa/briefing-page
On another machine, install outputs/analysis/requirements.txt into a virtual environment, run make_briefing.py with that environment's Python, and render the PDF with pdftoppm. Core analysis and the interactive report do not need these document dependencies.
| File | Purpose |
|---|---|
index.html, app.mjs, model.mjs, styles.css |
Interactive report and inspectable calculations |
evidence.html |
Static calculation traces and accessible tables |
grid-atlas-briefing.pdf |
Six-page shareable briefing |
analysis/ |
Acquisition, analysis, independent verification, PDF builder and behavioral checks |
data/raw/ |
Original compressed CSV, codebook, source README, historical processing and methodology |
data/clean/ |
Qualifying panel and all-candidate electricity data |
data/evidence/ |
Rankings, coverage, baseline sensitivity, claims and calculation verification |
data/source-manifest.json |
URLs, retrieval timestamp, definitions, licensing, hashes and missing semantics |
screenshots/ |
Original JPEG browser captures (.jpg) of the opening, balances, scenario and mobile layout |
qa/ |
All six rendered PDF pages and machine-readable checks, including the actual downloaded filtered CSV |
QA.md |
What was tested and what remains outside the claim |
grid-atlas-source.zip |
Complete local handoff, including source, data, PDF, screenshots and verification receipts |
SHA256SUMS.txt |
SHA-256 checksums for the packaged files |
demo-manifest.json |
Machine-readable demo receipt and launch details |
To rebuild the handoff archive in this workspace:
python3 /Users/matthewberman/Documents/ChatGPT/tests/showcase/scripts/with-resource-slot.py python3 outputs/analysis/package.py
The archive excludes itself and includes the file checksum list. The packaging script checks that JPEG and PNG extensions match their file signatures. Extract it into a fresh directory and run python3 serve.py inside the extracted grid-atlas folder.
OWID-produced material is CC BY. The preserved Ember metadata records CC BY 4.0. Source material from other producers retains its original terms; this project does not assert a blanket relicensing of Energy Institute data. Use the source manifest and original codebook for attribution. Instrument Serif is distributed under the SIL Open Font License; assets/OFL.txt is included, with the font files obtained from Google Fonts' Instrument Serif directory.
No accounts were mutated, no site was published, no private personal data were used, and no paid API calls were made. This is a historical accounting investigation and an illustrative annual scenario, with no causal policy model, grid-dispatch model, forecast, investment recommendation or full accessibility certification.
# GRID ATLAS An editorial investigation of electricity transitions across **58 grids, 2010–2024**. It pairs six traceable findings with linked country comparisons, annual time controls, generation-mix bars, demand/clean/trade decompositions, a clearly illustrative scenario lab, downloadable tables, and a six-page PDF. This is a local research edition of demo 04. The archived data vintage is **30 May 2025**. Annual observations end in 2024; the report does not claim to show the latest release or real-time electricity. ## Open the report From the task directory: ```sh python3 outputs/serve.py ``` Open [GRID ATLAS](http://127.0.0.1:43104). The server binds to `127.0.0.1:43104` only. There is one static server, no build step, no database, no external runtime requests, and no paid API. If the port is already occupied by this demo, reuse it. Stop with Ctrl-C in the launching terminal. Starting a second copy fails without replacing the existing server. If you extracted the source bundle and are already inside the output folder, run `python3 serve.py` instead. The report uses standard JavaScript modules, SVG, CSS and local font files. Use the server for the interactive report; a direct `file://` load cannot fetch its JSON data. `evidence.html` is a static, JavaScript-free alternative with calculation traces, endpoint tables and the full ranking. ## A 60-second demonstration 1. **0–10 seconds:** Start with Denmark and China. Denmark's fossil share falls 56.0 points; China's falls 17.6. Click **Fossil output**. China now shows **+2,893 TWh** while Denmark shows a decline. 2. **10–20 seconds:** Select **United Kingdom** as the focus country. Scrub the year or use the year-step arrows. All linked charts, country totals, balances, model baselines and table filters update. Reset to 2024. 3. **20–30 seconds:** Scroll to **Every change has to balance**. The UK reconciles exactly: **−70.20 demand − 97.32 clean − 30.53 net imports = −198.05 TWh fossil output**. Compare with China's demand growth. Open the clean-generation ledger. 4. **30–40 seconds:** Open field note 04's comparison, Germany and France. Germany's wind and solar additions coexist with a large nuclear decline. The **Trace calculation** link opens source rows and the formulas without requiring JavaScript. 5. **40–50 seconds:** In **Scenario lab**, increase clean additions or reduce demand growth. The dashed illustrative paths change. When the balance goes beyond zero fossil generation, surplus appears explicitly; it is never represented as negative fossil output. 6. **50–60 seconds:** Open **The ledger**, choose **Observations**, and export the selected table. Show a source blank as “—” and open the **Coverage audit** or the six-page briefing. **Reset** restores the initial comparison and assumptions. ## The findings - Denmark is first by fossil-share decline speed in the screened cohort: **−55.960 pp** over 14 years, about **−4.00 pp/year**. - The UK fossil decline of **198.05 TWh** balances with lower demand, more clean generation and more net imports. - China's fossil share falls while fossil generation rises **2,892.96 TWh**. India's change has the same direction. - Germany adds **153.92 TWh** of wind and solar, loses **140.56 TWh** of nuclear generation, and gains **27.97 TWh** of clean output overall. - The US has the largest absolute fossil decline in the cohort, **334.54 TWh**, while ranking 26th by share-speed. Large coal-to-gas substitution stays within the fossil category. - Norway starts at only **4.21%** fossil share; a small subsequent decline should not be read as a poor transition score. Brazil's share also falls while its absolute fossil output rises. Each finding is tied to endpoint tables and immutable source links in [the evidence companion](evidence.html). The ranking is cohort-specific, not a claim about all countries or causal policy effectiveness. ## Data and methodology The raw file is the complete OWID Energy CSV, losslessly compressed locally. The analysis extracts only electricity columns and the common 2010–2024 interval. A cleaned all-candidate table preserves 3,119 country-year rows; the qualifying panel has 870 rows. - **Pinned commit:** `f419e8f3a5e92f796f4f2e49ef5da187510d2f94` in [owid/energy-data](https://github.com/owid/energy-data/tree/f419e8f3a5e92f796f4f2e49ef5da187510d2f94). - **CSV SHA-256, before compression:** `64a3276e21703577bb4e4cd11d0dae4aaa2b94aaacc4132d9b8f0c1495c74e2c`. - **Retrieved:** 3 September 2026 UTC, while this task ran on 2 September in Los Angeles. Exact timestamp and file hashes are in `data/source-manifest.json`. - **Upstream hierarchy:** OWID combines Ember (2025) and Energy Institute (2024), giving Ember priority on overlapping observations. The pinned processing code and source metadata are included. - **Screen:** ISO-3 country/territory code, at least 20 TWh of generation in 2010, and complete total/fossil/low-carbon data for all 15 years. 58 of 220 candidate grids qualify. The complete exclusion reasons are in `data/evidence/coverage.csv`. - **Speed:** ending fossil share minus starting share, divided by elapsed years. There are 15 annual observations but 14 years of change from 2010 to 2024. All 2015 and 2020 sensitivity rankings keep the same cohort; Belarus leads those shorter windows. - **Accounting:** `change in fossil = change in demand − change in clean − change in net imports + reconciliation`. Both annual identities balance exactly at the source's decimal precision in all 870 qualifying rows. - **Units:** generation and demand are TWh. Capacity in GW, total primary energy, and economy-wide emissions are outside the analysis. Shares use domestic generation, excluding imports from their denominator. - **Clean grouping:** nuclear plus renewables, including bioenergy. “Clean” is a source grouping, not a claim of zero impact. Bioenergy climate impacts depend on feedstocks and accounting. - **Missing data:** raw blanks remain null in JSON and blank in CSV. They are never interpolated or zero-filled. There are 339 missing detailed cells in the qualifying panel. Reported `0.000` remains zero. “Other clean” is a separately labeled residual, only calculated if the necessary inputs are available. A hatched unallocated portion makes incomplete mix detail visible. - **Uncertainty:** the export contains no row-level uncertainty intervals or estimate flags. It can inherit source estimates, carried-forward imports and revisions. The preserved current Ember methodology is a reference and may differ from the historical release's exact methods. A start-date sensitivity check is not a confidence interval. The original CSV's physical line number, including its header, is included in every cleaned row. `data/evidence/verification.json` contains independently recomputed Decimal formulas and the complete original source records for 12 sample countries. ## Reproduce offline The core analysis needs only Python's standard library. It does not call the network. ```sh python3 outputs/analysis/analyze.py python3 outputs/analysis/verify.py python3 outputs/analysis/evidence.py node outputs/analysis/test_model.mjs ``` `test_model.mjs` checks the JavaScript implementation against the Python results, verifies three complete ranking orders, and checks scenario identities, compounding, the zero fossil floor, surplus, and CSV missing-value semantics. To refetch the same immutable data vintage, explicitly run: ```sh python3 outputs/analysis/acquire.py ``` It rejects a CSV whose uncompressed checksum differs from the pinned value. The data and codebook are immutable GitHub URLs; the current methodology URL can change, so its retrieved bytes are separately preserved and hashed. The offline reproduction above uses the supplied snapshot and does not refetch methodology. ## Rebuild the PDF The briefing was built with Python 3.12.13, ReportLab 4.4.9, and the local Instrument Serif fonts. PDF QA uses pypdf 6.10.0 and Poppler. The PDF contains real vector charts and selectable text; no chart screenshots are substituted for data. In this showcase workspace, use the shared resource wrapper for installations, PDF creation and rendering: ```sh python3 /Users/matthewberman/Documents/ChatGPT/tests/showcase/scripts/with-resource-slot.py /Users/matthewberman/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/bin/python3 outputs/analysis/make_briefing.py python3 /Users/matthewberman/Documents/ChatGPT/tests/showcase/scripts/with-resource-slot.py /Users/matthewberman/.cache/codex-runtimes/codex-primary-runtime/dependencies/bin/override/pdftoppm -r 125 -png outputs/grid-atlas-briefing.pdf outputs/qa/briefing-page ``` On another machine, install `outputs/analysis/requirements.txt` into a virtual environment, run `make_briefing.py` with that environment's Python, and render the PDF with `pdftoppm`. Core analysis and the interactive report do not need these document dependencies. ## Deliverable map | File | Purpose | | --- | --- | | `index.html`, `app.mjs`, `model.mjs`, `styles.css` | Interactive report and inspectable calculations | | `evidence.html` | Static calculation traces and accessible tables | | `grid-atlas-briefing.pdf` | Six-page shareable briefing | | `analysis/` | Acquisition, analysis, independent verification, PDF builder and behavioral checks | | `data/raw/` | Original compressed CSV, codebook, source README, historical processing and methodology | | `data/clean/` | Qualifying panel and all-candidate electricity data | | `data/evidence/` | Rankings, coverage, baseline sensitivity, claims and calculation verification | | `data/source-manifest.json` | URLs, retrieval timestamp, definitions, licensing, hashes and missing semantics | | `screenshots/` | Original JPEG browser captures (`.jpg`) of the opening, balances, scenario and mobile layout | | `qa/` | All six rendered PDF pages and machine-readable checks, including the actual downloaded filtered CSV | | `QA.md` | What was tested and what remains outside the claim | | `grid-atlas-source.zip` | Complete local handoff, including source, data, PDF, screenshots and verification receipts | | `SHA256SUMS.txt` | SHA-256 checksums for the packaged files | | `demo-manifest.json` | Machine-readable demo receipt and launch details | To rebuild the handoff archive in this workspace: ```sh python3 /Users/matthewberman/Documents/ChatGPT/tests/showcase/scripts/with-resource-slot.py python3 outputs/analysis/package.py ``` The archive excludes itself and includes the file checksum list. The packaging script checks that JPEG and PNG extensions match their file signatures. Extract it into a fresh directory and run `python3 serve.py` inside the extracted `grid-atlas` folder. ## Licensing and scope OWID-produced material is CC BY. The preserved Ember metadata records CC BY 4.0. Source material from other producers retains its original terms; this project does not assert a blanket relicensing of Energy Institute data. Use the source manifest and original codebook for attribution. Instrument Serif is distributed under the SIL Open Font License; `assets/OFL.txt` is included, with the font files obtained from [Google Fonts' Instrument Serif directory](https://github.com/google/fonts/tree/main/ofl/instrumentserif). No accounts were mutated, no site was published, no private personal data were used, and no paid API calls were made. This is a historical accounting investigation and an illustrative annual scenario, with no causal policy model, grid-dispatch model, forecast, investment recommendation or full accessibility certification.