The UK contract carries 30 UC target ids; the national calibration activates 1 of them. 29 are declared, mapped and inert.
uk/uk_national_targets.json — 30 dwp.uc.* ids of 187 total, split evenly:
dwp_universal_credit 15 (households, 4 family types, 5 child counts, payment bands, Scotland)
dwp_two_child_limit 15
uk/target_references.json — 15 references, of which UC is:
dwp.uc.households period=2025 entity=benunit measure=dwp/uc/households
obr.universal_credit_in_cap period=2025 entity=benunit measure=obr/universal_credit_in_cap
So national_calibration.py calibrates UC on one caseload count and one expenditure aggregate. The family-type and child-count composition is unconstrained, and this is where the error actually sits (policyengine-uk-data, enhanced FRS 2023-24 v1.56.16, 2025):
| Target |
Model |
DWP |
Err |
dwp.uc.households (activated) |
6.395m |
6.700m |
-4.6% |
households_single_no_children |
3.210m |
2.868m |
+11.9% |
households_couple_no_children |
0.280m |
0.231m |
+21.1% |
households_children_3 |
0.369m |
0.473m |
-22.0% |
households_children_4 |
0.136m |
0.167m |
-18.3% |
households_children_5_or_more |
0.064m |
0.076m |
-16.2% |
The one activated count is the best-fitting number in the set. Activating the composition rows is what moves the double-digit errors.
Blocker on the two-child limit half: all 15 dwp_two_child_limit ids resolve to targets that are structurally zero from 2026-04-06 (limit abolished, Budget 2025). See PolicyEngine/policyengine-uk-data#465 — activating them before that lands would calibrate against zero.
Not a defect, checked: the payment-distribution many-to-one mapping is correct — dwp.uc.payment_distribution_* carries groupby_dimension: dwp.uc_monthly_award_band, so the per-band uk-data names collapse to one banded id by design.
Next steps
- Activate the 4 family-type and 5 child-count references at period 2025, alongside the existing
dwp.uc.households. Needs the chronicle facts for those ids.
- Keep the 15 two-child-limit ids deferred until uk-data#465 moves them to 2025.
- Element-level references (housing, LCWRA, carer, childcare) have no contract ids at all yet — they land here only after uk-data#466 adds the targets upstream.
cc @MaxGhenis @vahid-ahmadi
The UK contract carries 30 UC target ids; the national calibration activates 1 of them. 29 are declared, mapped and inert.
uk/uk_national_targets.json— 30dwp.uc.*ids of 187 total, split evenly:uk/target_references.json— 15 references, of which UC is:So
national_calibration.pycalibrates UC on one caseload count and one expenditure aggregate. The family-type and child-count composition is unconstrained, and this is where the error actually sits (policyengine-uk-data, enhanced FRS 2023-24 v1.56.16, 2025):dwp.uc.households(activated)households_single_no_childrenhouseholds_couple_no_childrenhouseholds_children_3households_children_4households_children_5_or_moreThe one activated count is the best-fitting number in the set. Activating the composition rows is what moves the double-digit errors.
Blocker on the two-child limit half: all 15
dwp_two_child_limitids resolve to targets that are structurally zero from 2026-04-06 (limit abolished, Budget 2025). See PolicyEngine/policyengine-uk-data#465 — activating them before that lands would calibrate against zero.Not a defect, checked: the payment-distribution many-to-one mapping is correct —
dwp.uc.payment_distribution_*carriesgroupby_dimension: dwp.uc_monthly_award_band, so the per-band uk-data names collapse to one banded id by design.Next steps
dwp.uc.households. Needs the chronicle facts for those ids.cc @MaxGhenis @vahid-ahmadi