Replies: 2 comments
|
Follow-up: origins of the remaining defects referenced above, traced on the tag lineage (blameless, same as the main writeup — each change was reasonable in context; the lesson column is what matters).
Outside this repo, completing the picture: the policyengine.py certification PRs (policyengine.py#409/#427, June) adopted The pattern worth naming: February's defects came from hand-written infrastructure sprints, spring's from agent-authored velocity, and none were caught because review examines the diff while these failures lived in the absence — an emission that stopped, a fallback that vanished, a surface that never had the family. Absence needs machine checks (coverage floors, output benchmarks), not sharper eyes. |
|
Action taken on the certified-default consequence (layer 3 / lesson 4): policyengine.py#491 now reverts the UK certified default from The re-flip condition is written into the PR as a proposed standing rule: |
Uh oh!
There was an error while loading. Please reload this page.
Universal Credit aggregates in shipped UK datasets ran 35–55% below administrative counts from late February to mid-August 2026, across three artifact lines, without any alarm firing. This is the full trace, with measurements and links. It is a blameless postmortem: every contributing change was reasonable on its own terms, and the failure was systemic — nothing watched the output.
Impact
enhanced_frs_2023_24.h5artifacts carried 4.1–4.2m UC benefit units and ~£51bn UC spend against ~6.7m households (DWP, 2025 average) and £75.8bn (OBR).populace_uk_2023, Microcosm) carried 2.17m (72aeefc, June) then 3.26m (dd68c73, the current certification candidate in policyengine.py#491) — its calibration surface has no UC targets at all (Certified UK artifact carries less than half of admin UC caseload (3.26m vs ~6.7m; £36.9bn vs £75.8bn) microcosm#701).Measured timeline
All measurements: weighted benefit units with
universal_credit > 0at 2025, annual basis, policyengine-uk 2.90, HF revisions ofpolicyengine/policyengine-uk-data-private. (Aggregates only.)e00e9c879a4709db625c8e2d004f49dfenhanced_frs_2023_24.h5(sha584ae33d…)populace_uk_2023(72aeefc, then dd68c73)enhanced_frs_2024_25.h5enhanced_frs_2024_25.h5: post-fix live lineWhat happened, in three layers
Layer 1 — the registry rework dropped one target family and mis-set another (#269, February)
#269 replaced ~700 lines of ad-hoc targets with the structured registry — a clear improvement, and the foundation everything since builds on. Two UC-specific regressions rode along, both verified by code archaeology:
obr/universal_credit_jobseekers_count/non_jobseekers_countwas carried intobuild_loss_matrix.py, but the newsources/obr.pynever produced those targets (grep of the Replace ad-hoc targets with structured registry and source modules #269 tree: zero emission sites). The dispatch was dead code from day one — which is exactly why the drop was invisible. It stayed dead until Fix Universal Credit caseload targets #458 deleted it.undercount_relative = 1.27921 / sum(_UC_BY_FAMILY_TYPE.values())divides what looks like millions by a sum in thousands: ×1.0002 instead of the intended-looking ×1.21. The four targets therefore encoded 6.096m rather than ~7.37m, and even a perfect calibration to them would have landed ~13% under administrative counts. This survived until Fix Universal Credit caseload targets #458.Layer 2 — builds stopped completing, and releases shipped anyway (February–April)
The February and March artifacts measure ~4.1m — far below even the 6.096m the mis-set targets encoded, which means the targets were not binding at all in those builds. The best-supported mechanism is in the repo's own changelog: 1.50.3 "reduce OA cloning in GitHub Actions dataset builds so publication completes on hosted runners" and 1.50.4 "CI heartbeats … so dataset release builds do not get canceled while constituency target matrices are being prepared" (also #333). Dataset builds were being canceled mid-calibration on hosted runners, and the release step shipped what existed. The artifact healed to 6.42m at v1.50.6 (17 April) — immediately after #344 made builds fit the runners — with no UC-related target change in that window. (February CI logs have aged out, so this layer is labelled a strongly-evidenced hypothesis rather than a proven mechanism; #456's silent year-resolution drops are a secondary candidate.)
Layer 3 — consumers pinned the broken vintage, and the fixed file froze (April–August)
enhanced_frs_2023_24.h5last changed content on 20 May (v1.55.10). Every release since re-uploads the same bytes; the live build line moved toenhanced_frs_2024_25.h5. A version number advancing while the artifact stays frozen looks exactly like a fix shipping when it isn't.e00e9c87) into August — four months after the April repair existed.populace_uk_2023(June), which won its certification rotation on a 148-target surface containing no benefit targets — the winner was selected on a surface blind to the thing that was broken (Certified UK artifact carries less than half of admin UC caseload (3.26m vs ~6.7m; £36.9bn vs £75.8bn) microcosm#701).Why nothing fired
What is fixed, in flight, and remaining
Fixed: #458 (inert undercount removed; explicit
dwp/uc/householdstotals 6.7m/7.2m derived from the deductions statistics Table 1; dead OBR dispatch deleted) — the post-fix live line measures 6.35m / £75.3bn, deducting households 3.02m / £1.86bn / 47.6% incidence.In flight: the Microcosm chain — chronicle#184 (DWP UC facts, entity-explicit as benefit units), microcosm#727 (contract refresh adding
dwp.uc.households), microcosm#729 (the national calibrate step: an activated reference that cannot resolve aborts the build). Then a populace_uk rebuild + recertification replaces the 3.26m certified default.Remaining: refresh
_UC_BY_FAMILY_TYPEto a current Stat-Xplore month (the stale 6.096m sum still pulls against the 6.7m total — the last ~5% on the live line); #456 (loss shape + silent drops) and #457 (dwellings-vs-households, ~+2.8m total households) as already scoped; and re-validating the deductions documentation on the 2024-25 line.Lessons
Measurement scripts and the full diagnosis trail: #452 (both diagnosis comments), PolicyEngine/microcosm#701.
All reactions