Changelog
What changed and when — the citable trail. Figures on this site are recomputed from live data, so a number can move between one visit and the next. When it moves because a correction landed rather than because the underlying record changed, it is recorded below, with a link to the change itself.
Every page carries a data_as_of date and a data_version in the footer, and every API response carries both in its meta block. Quote them alongside any figure you cite and the state you read becomes reproducible.
Two dates are in play and they need not agree. data_as_of is when a policy idea was last edited — the date the Reform Index and the idea pages are computed against. The date inside data_version is when the parliamentary snapshot was last dumped, which is what the coverage and meeting panels are built from and what the “data as of” badge at the foot of those pages reports. The version identifier folds in both, so quoting it alone is enough.
Notable revisions
Corrections that moved a figure the site had already published. Each links to the merged change so the before-and-after can be checked against the diff. Routine weekly data refreshes are not listed here — they are in the commit history of data/pmg_snapshot.json.
Gini coefficient 63.0 -> 54.1, and seven indicator series moved to live sources
The first run of scripts/build_indicators.py --fetch --no-csv replaced seven of the sixteen indicator series with what the IMF WEO DataMapper and World Bank WDI APIs return, each stamped with retrieved_at and a source_url. GDP growth matched the hardcoded series to the decimal for 2014-2025. The Gini series did not: the processed CSV carried 63.0 for 2015, 2018, 2019 and 2022, all carry-forwards of the World Bank's old 2014 figure, while the World Bank's consumption-based series now reads 54.1 for 2022/23 (Income and Expenditure Survey) and 59.6 for 2014/15 (revised from 63.0). The series is now the seven survey years the Poverty and Inequality Platform holds, and the glossary entry that said 'approximately 0.63' says what the series says. Two other published points moved: debt-to-GDP for 2025, 77.3 (Budget Review, fiscal year) to 78.6 (IMF general government, calendar year), and the tariff series now ends at 2022 = 7.31 rather than 2024 = 6.8, because WDI TM.TAX.MRCH.SM.AR.ZS stops there and its overlapping values show the CSV was a different series.
Figures affected: /indicators (Gini, tariff, debt, fiscal balance, investment, life expectancy, GDP growth) · Idea pages: 'Where the numbers stand' under fiscal_space and trade_openness · /glossary Gini coefficient · Outcome briefs and Ask answers that cite an indicator
Package aggregates re-derived from the live idea set
data/reform_packages.json carried idea counts written once and never regenerated: 29/18/42/23/27 = 139 ideas, while the database held 51/26/30/24/40 = 171. Every consumer printed the stale number — package cards, package detail headers, the brief and PPTX exports, the public /api/v1/packages response, and the Reform Index, which divides by idea_count. The index denominators were therefore wrong and every sub-index with them. avg_feasibility, avg_growth_impact and the two status counts had rotted the same way, and idea_ids still named ideas since reassigned to other packages. Fixed structurally rather than by refreshing the literals: the JSON keeps only editorial fields and every countable field is recomputed from the live rows at load time, in both backends, through one shared module. A stored count cannot drift if nothing reads it.
Figures affected: Reform Index score and all five sub-indices · /packages cards and detail headers · /api/v1/packages · Brief and PPTX exports
The Reform Index stopped dating itself from a file mtime
lib/reform-index.ts set last_updated from fs.statSync(dataPath).mtime — filesystem metadata that the deploy pipeline rewrites. The flagship page dated itself 2018-10-20, eight years stale, next to figures it recomputes hourly. The date now comes from the idea data's own MAX(updated_at) and falls back to the newest quarterly snapshot's quarter start. Both are properties of the data; neither is filesystem metadata. The data_as_of and data_version stamps introduced across the site derive from the same rule.
Figures affected: /reform-index · Site footer stamp · API meta blocks
Research abstracts repaired at the extractor
37 of 298 research_papers rows stored a site footer or an author bio as part of the abstract — one row ended in “back to top Join our newsletter … SIGN UP Category Search Search Vacancies”. The cause was in scripts/enrich_paper_abstracts.py: it read a fixed 8,000-character window of HTML from the article container, and a window is a budget rather than a boundary, so on any short article it kept reading into the page chrome. Fixed in the extractor and the affected rows repaired, rather than patched row by row.
Figures affected: /research · /papers detail pages · Research link judging
All 55 international comparisons enriched
Before this, 14 of the 55 comparison rows carried approach, timeline and lessons_for_sa (from migration 008) and 41 did not — a standing validation warning and a visible hole on the idea pages, which render the comparison block from exactly those fields. The 41 were written to the same standard: every claim grounded in the row's own outcome summary or a well-established fact about that documented episode, no new quantitative claim introduced, and lessons written against the linked idea's subject rather than in general terms.
Figures affected: /comparisons · Comparison blocks on idea pages
Internal record references stripped from reader-facing prose
Internal identifiers printed verbatim in published text — “the Energy Bounce-Back scheme (id=20)” — across 21 ideas' descriptions and feasibility notes, including one multi-id form. The prose always names the reform it refers to and the relationships live in the dependency graph, so removing the identifiers lost nothing. A hygiene rule now covers idea and comparison prose fields and fails the validation gate.
Figures affected: /ideas detail pages · /comparisons
Per-committee coverage published: ingest separated from linkage
An absence of recent meetings for a committee had no published explanation, so it read as an absence of parliamentary activity. The /data panel now distinguishes four states — the record has stopped arriving, meetings arrive but none is linked to an idea, older meetings are linked but no recent one is, and both current — computed against the snapshot's own generation date rather than against the time the page was built.
Figures affected: /data
Curated dataset milestones before May 2026 — new data domains, taxonomy changes, bulk editorial passes — are kept in data/CHANGELOG.md.
Weekly briefings
The running narrative: what moved in the parliamentary record each week, which ideas changed status, and what research arrived. Auto-drafted from the ingest pipeline, edited by hand before publishing. This is the same archive as /briefings, read here as change history rather than as a digest.
- 2026-W40·This week in SA reform — water in focus
1 new link between ideas and committee meetings, touching 1 idea; 10 research papers added.
- 2026-W39·This week in SA reform — rail access is signed; operation is not
All 11 train operating companies allocated capacity now hold rail access agreements; the Transport committee takes up port performance; 9 research papers added.
- 2026-W38·This week in SA reform — spectrum is licensed; cheaper data is not
The March 2022 IMT auction cleared R14.5bn; the binding constraint is now operator deployment and ICASA compliance.
- 2026-W37·This week in SA reform — Court Case Backlog and Judicial Efficiency in committee
2 new links between ideas and committee meetings, touching 2 ideas; 40 research papers added.
- 2026-W36·This week in SA reform — Bulk Water Infrastructure Investment Programme in committee
1 new link between ideas and committee meetings, touching 1 idea; 4 research papers added.
- 2026-W35·This week in SA reform — bulk water and the Section 63 receipts
The Water and Sanitation committee pressed DWS on its Section 63 interventions and got a checkable date; the Bulk Water Infrastructure Investment Programme is the idea of the week.
- 2026-W34·This week in SA reform — Infrastructure Delivery Management System in committee
The Infrastructure Delivery Management System — mandated since 2015, adopted by fewer than 40% of departments — was in committee this week, with 22 linked sittings. South Africa returns R5–8bn of capital budgets to Treasury each year because departments cannot plan and execute, not because money is scarce. Also this week: water boards and the NWRIA, and a 567-paper expansion of the research corpus.
- 2026-W33·This week in SA reform — the R2.4 trillion question
6 research papers added. Idea of the week: GEPF Infrastructure Investment Mandate, as the Finance committee moves for urgent PIC oversight.
- 2026-W32·This week in SA reform — withholding the equitable share
4 research papers added. Parliament returns, and Treasury defends withholding equitable-share transfers to municipalities. Idea of the week: Intergovernmental Fiscal Framework Review.
- 2026-W31·This week in SA reform — the water build, mid-transition
5 research papers added. Idea of the week: Bulk Water Infrastructure Investment Programme.
- 2026-W30·This week in SA reform — what spectrum didn't fix
7 research papers added, including TIPS on telecommunications infrastructure. Idea of the week: IMT Spectrum Auction Completion.
- 2026-W29·This week in SA reform — NSFAS under administration
4 research papers added. Idea of the week: NSFAS Fraud Prevention and Administration System Overhaul.
- 2026-W27·This week in SA reform — debt stabilisation, and its limits
Seven papers added, including new DSGE work on the monetary–fiscal policy mix. Idea of the week: Fiscal Consolidation and Debt Stabilisation.
- 2026-W26·This week in SA reform — Inclusive Growth Spending Review in committee
2 idea↔meeting links across 2 ideas; 5 research papers added.
- 2026-W25·This week in SA reform — the graduate backlog is a filing-cabinet problem
2 idea↔meeting links across 2 ideas; 6 research papers added.
- 2026-W24·This week in SA reform — a cheap fix for self-inflicted skills scarcity
2 idea↔meeting links across 2 ideas; 108 research papers added.
- 2026-W23·This week in SA reform — 140,000 graduates locked out of their professions
2 idea↔meeting links across 2 ideas; 102 research papers added.
- 2026-W22·This week in SA reform — the university certification backlog reaches committee
2 idea↔meeting links across 2 ideas; 2 research papers added.
- 2026-W20·This week in SA reform — NSFAS and the loan scheme that isn't
1 idea↔meeting link across 1 idea; 5 research papers added.
- 2026-W18·This week in SA reform — research corpus update
131 research papers added.
- 2026-W17·Issue #1 — a quiet Easter recess, a research corpus goes live
Parliament wound down for the Easter recess, but 138 papers landed in the research corpus and nine ideas picked up new committee meetings. Plus: why the schools-infrastructure meeting on 31 March matters more than it looks.
Data as of 2026-10-10 · latest PMG meeting 2026-10-02