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.
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.
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
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
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
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 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
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.
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.
205 new links between ideas and committee meetings, touching 61 ideas; 567 research papers added.
6 research papers added. Idea of the week: GEPF Infrastructure Investment Mandate, as the Finance committee moves for urgent PIC oversight.
4 research papers added. Parliament returns, and Treasury defends withholding equitable-share transfers to municipalities. Idea of the week: Intergovernmental Fiscal Framework Review.
Data as of 2026-08-24 · latest PMG meeting 2026-08-21
5 research papers added. Idea of the week: Bulk Water Infrastructure Investment Programme.
7 research papers added, including TIPS on telecommunications infrastructure. Idea of the week: IMT Spectrum Auction Completion.
4 research papers added. Idea of the week: NSFAS Fraud Prevention and Administration System Overhaul.
Seven papers added, including new DSGE work on the monetary–fiscal policy mix. Idea of the week: Fiscal Consolidation and Debt Stabilisation.
2 idea↔meeting links across 2 ideas; 5 research papers added.
2 idea↔meeting links across 2 ideas; 6 research papers added.
2 idea↔meeting links across 2 ideas; 108 research papers added.
2 idea↔meeting links across 2 ideas; 102 research papers added.
2 idea↔meeting links across 2 ideas; 2 research papers added.
1 idea↔meeting link across 1 ideas; 5 research papers added.
131 research papers added.
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.