PolicyEngine / PolicyEngine/policyengine-scorecard

Universal Credit administrative caseload and element composition (mode 1): the largest UK benefit has no published caseload on the scorecard

Open
#87 0 comments 0 reactions 1 assignee View on GitHub

@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.py with 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_TIME and a month condition, 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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.