PolicyEngine / PolicyEngine/policyengine-scorecard
Universal Credit administrative caseload and element composition (mode 1): the largest UK benefit has no published caseload on the scorecard
@vahid-ahmadi is already working on this.
Since Aug 24, 2026.
- Dominant language
- Python
- Stars
- 0
- Forks
- 0
- Avg merge
- 6d 12h
- Merged PRs (30d)
- 32
Description
Universal Credit is the largest working-age benefit in the UK and the scorecard carries almost nothing about it. Today the only UC rows are OBR expenditure forecasts (obr / benefit_cost) and UKMOD's modelled caseload — no published administrative caseload at all, and nothing about the composition that PE-UK actually computes.
DWP publishes UC statistics through Stat-Xplore and the quarterly UC statistical releases: people on UC by conditionality regime, by family type, by whether the award includes the child / housing / limited-capability / carer elements, and households subject to the benefit cap and the (now abolished) two-child limit.
Why this one
The engine models the composition in detail — uc_child_element, uc_individual_child_element, uc_housing_costs_element, uc_carer_element, uc_disability_elements, uc_LCWRA_element, uc_childcare_element, uc_individual_disabled_child_element, uc_individual_severely_disabled_child_element — and not one of those variables is validated against anything. An aggregate expenditure forecast can be right while every element beneath it is wrong.
It also gives the two-child-limit work a published denominator. #49's case battery reasons about the limit household by household and pre_ab2025 is registered as a world; a published count of households affected is the population-level counterpart to those cases.
The calibration question to settle FIRST
pe-uk-data may consume some DWP UC caseload series as calibration targets. If it does, those rows are consumed_as_target and agreement on them is a tautology, not a validation win — the distinction #48 made for the OBR welfare lines, where only the consumed programs are marked. Read the consumption surfaces at the certified pin before staging anything, and split the family accordingly. A wrongly held-out row is a fake win, which is worse than no row.
Steps
- Determine per series whether pe-uk-data consumes it; record the evidence in
relationships.pywith the pin and the date read - Harvest lane: Stat-Xplore extracts + the quarterly release tables, primary sources, Wayback originals, SHA-256 pinned. Stat-Xplore is query-built, so the exact query definition is provenance and must be vendored alongside the extract
-
uk_aliases: element vocabulary (child,housing,lcwra,carer,childcare), conditionality-regime values, family-type values — all closed, and DISTINCT from the UKMOD family vocabulary where the units differ - Point-in-time vs annual: caseload is a count at a date, so
TimeBasis.POINT_IN_TIMEand amonthcondition, not an annual average dressed up as one - Counterpart compute is a later run on #51's machinery, and the element-level rows are exactly what its per-benefit fullpart validation would exercise
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.