Skip to content

Screen ESA and JSA reports for each claim - #2679

Merged
juaristi22 merged 4 commits into
mainfrom
fix-esa-jsa-report-screening-2263
Oct 26, 2026
Merged

juaristi22 merged 4 commits into
mainfrom
fix-esa-jsa-report-screening-2263

Conversation

@juaristi22

@juaristi22 juaristi22 commented Oct 26, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #2263

Screen income-related Employment and Support Allowance (ESA) and income-based Jobseeker’s Allowance (JSA) reports separately for the claimant and partner, and for each reporting person outside that couple. A failed couple claim no longer removes another member’s screened award, and a successful couple claim no longer admits a working outside member’s report. Apply tariff income to each separate claim.

Use the same calculation when attributing an award to the claimant and partner, including the benefit-cap readers. The Housing Benefit reader now passes the ESA callback that accepts unsummed reports and an optional member mask. Preserve explicit award inputs, zero values, reform overrides and the existing value-based attribution convention. The model continues to use benefit-unit capital as a proxy for these separate claims; this change does not introduce observed personal capital or claim histories.

The 16–19 bursary receipt helper reads screened income-related ESA status or the existing contributory ESA variable. It retains explicit helper inputs and the Universal Credit report path. This change does not alter the bursary age rules or assess a new contributory entitlement.

Validation: the initial implementation passed 160 focused nodes across six commands. The callback repair separately passed three Python nodes and 116 benefit-cap YAML cases. Its executions used working files before final formatting; the commit preserves their Python ASTs. The later tariff-fixture correction separately passed three YAML cases across two commands on working files preserved by b584be53. Independent review of b584be53 is complete with no open findings.

The later review follow-up restores pinpoint citations and spacing in the eligibility documentation. One new callback-contract node failed with the stale Housing Benefit callback and passed with the corrected callback, in separate executions over b584be53 and the corresponding working-file overlays. Subsequent Ruff formatting preserved the four modified Python ASTs. Earlier test batches were not rerun. Independent incremental review of 9a5464b7 is COMPLETE / APPROVE with no open findings or material gaps.

Reproducer: policyengine_uk/tests/test_reported_legacy_award_screening.py::test_hb_specified_benefit_reader_honours_report_callback_contract

axiom: needed

@juaristi22 juaristi22 self-assigned this Oct 26, 2026
@github-actions

github-actions Bot commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

Aggregate impact on certified data: pass

Base fba0c0a53e against head 382f27a4fb, both on enhanced_frs_2024_25.h5 (policyengine-uk-data 1.58.1, sha256 056e80fd8e91), fiscal years 2025-26 to 2031-32. Each year is a full microsimulation run on each side.

Checks: 0 broken by this change, 1 failing on both sides, 0 fixed. Moves flagged for review: 0 (thresholds in report_spec.yaml; a flag does not fail the job).

Workflow run and full report

Notes

  • In the years a figure from fewer than 10 records is suppressed (spending.disabled_students_allowance), every total containing it, and the decile incomes, are rebuilt from their other components, so no published total includes it. Those totals are marked †. A change is withheld where the two sides leave out different figures and can't be lined up.

Moves flagged for review

None.

Spending by benefit and service

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed

Caseloads

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed

Standard reform costings (change in gov_balance)

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise additional rate by 3pp 0 0 0 0 0 suppressed suppressed

Standard reforms: change in each reform's target

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise additional rate by 3pp: change in income_tax 0 0 0 0 0 suppressed suppressed

Household net income by decile

No household's net income changes in any year.

No change in any year: receipts by tax head; government balance, each component counted once; model totals; household income totals; population; poverty rates; people in poverty; inequality; mean household net income in each side's own deciles.

Checks failing on both base and head (1)
  • VAT excluding private school fees is never negative (sign:vat): 2025-26: 76 units below zero, a weighted £-53,889,156 in total; 2026-27: 76 units below zero, a weighted £-55,420,387 in total; 2027-28: 76 units below zero, a weighted £-56,618,038 in total
Counted-once check

Each of 91 components was raised by £1 per unit in 2026-27, and every head of its totals was read household by household: its own head must rise by exactly £1, no other tax head may move, no other benefit may rise, and the model's own total must move by what its heads moved. A head that breaks a rule is measured again twice: with every other head held at its baseline value, and with every other head held at its value after the first £1 while the component rises again. It fails where either still shows the response. 0 failed; 0 were skipped.

  • widowed_parents_allowance: pension_credit responds only through other heads in fewer than 10 households (other heads that moved there: carers_allowance; gov_spending; not a failure)
  • widowed_parents_allowance: pension_credit responds only through other heads in fewer than 10 households (other heads that moved there: carers_allowance; household_benefits; not a failure)
Provenance
Side Commit Runtime Environment hash Partition hash Time
base main fba0c0a53e uk 2.162.3 (files 094c8502b994), core 3.33.2, py 3.13.17 aarch64 6e6b7066671c 4f86ac4248d9 1906.1s
head #2679 merged into main 382f27a4fb uk 2.162.3 (files e84e7be1b9ed), core 3.33.2, py 3.13.17 aarch64 6e6b7066671c 4f86ac4248d9 1904.28s

Dataset: hf://policyengine/policyengine-uk-data-private/enhanced_frs_2024_25.h5@2526edbbb687a3b54dbb11272e5389e4b62d2ac2, sha256 056e80fd8e9151d78f432a25cde863340baee81304c6216a37fb575ce8563784 (verified on both sides), policyengine-uk-data 1.58.1.

Receipts by tax head: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Final charge on cash interest in non-cash ISAs £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Lifetime ISA withdrawal charge £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Income tax £298.70bn £318.31bn £335.60bn £350.52bn £365.79bn £383.53bn £401.03bn
National Insurance (employee and self-employed) £52.37bn £54.71bn £56.48bn £58.15bn £60.22bn £62.11bn £64.44bn
National Insurance (employer) £150.59bn £156.99bn £161.74bn £166.13bn £173.24bn £178.59bn £185.29bn
Employer NI change borne by capital £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Employer NI change borne by consumers £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Capital gains tax £12.61bn £13.05bn £13.53bn £14.02bn £14.52bn £15.05bn £15.58bn
Student loan repayments £7.91bn £8.21bn £8.43bn £8.63bn £8.85bn £9.10bn £9.42bn
VAT excluding private school fees £249.37bn £255.28bn £261.81bn £267.87bn £274.12bn £280.56bn £286.81bn
Change in VAT from its baseline £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
VAT on private school fees £1.95bn £2.00bn £2.05bn £2.10bn £2.21bn £2.21bn £2.31bn
Change in private school VAT from its baseline £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Fuel duties £24.53bn £24.64bn £26.64bn £26.69bn £26.42bn £25.76bn £26.35bn
Alcohol duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Tobacco duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Vehicle excise duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Betting and gaming duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
TV licence fee £4.26bn £4.41bn £4.42bn £4.44bn £4.45bn £4.47bn £4.48bn
Council tax £49.21bn £51.88bn £54.97bn £58.29bn £61.55bn £64.92bn £68.49bn
High value council tax surcharge £0.00bn £0.00bn £0.00bn £0.48bn £0.49bn £0.50bn £0.51bn
Northern Ireland domestic rates £0.55bn £0.58bn £0.60bn £0.63bn £0.66bn £0.69bn £0.72bn
Business rates £34.68bn £38.04bn £38.88bn £39.76bn £43.07bn £43.13bn £44.57bn
Stamp duty land tax on the household's own purchases £6.90bn £7.39bn £7.81bn £8.21bn £8.62bn £9.02bn £9.42bn
Stamp duty land tax paid by companies £4.81bn £5.98bn £6.73bn £7.46bn £8.21bn £8.87bn £9.16bn
Land transaction tax (Wales) £0.07bn £0.08bn £0.09bn £0.09bn £0.10bn £0.10bn £0.11bn
Land and buildings transaction tax (Scotland) £0.31bn £0.32bn £0.34bn £0.35bn £0.37bn £0.38bn £0.40bn
Unspecified tax change borne by capital £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Unspecified tax change borne by consumers £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Wealth tax £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Wealth tax excluding the main residence £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Land value tax £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Carbon tax £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Spending by benefit and service: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Lifetime ISA bonus £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
State Pension £121.64bn £126.07bn £127.08bn £128.87bn £132.52bn £136.31bn £140.08bn
Pension Credit £6.66bn £7.04bn £7.32bn £7.46bn £7.60bn £7.77bn £7.94bn
Winter Fuel Payment £1.86bn £1.86bn £1.80bn £1.78bn £1.79bn £1.79bn £1.80bn
Pension Age Winter Heating Payment (Scotland) £0.19bn £0.20bn £0.20bn £0.21bn £0.21bn £0.22bn £0.22bn
Universal Credit £75.21bn £80.38bn £82.93bn £84.23bn £85.58bn £86.87bn £87.97bn
Housing Benefit £8.55bn £8.89bn £9.17bn £9.31bn £9.58bn £9.84bn £10.10bn
Council Tax Reduction £1.98bn £2.02bn £2.07bn £2.11bn £2.16bn £2.21bn £2.25bn
Employment and Support Allowance (income-related) £0.79bn £0.81bn £0.83bn £0.85bn £0.86bn £0.89bn £0.90bn
Employment and Support Allowance (contribution-based) £5.20bn £5.34bn £5.46bn £5.59bn £5.72bn £5.85bn £5.99bn
Jobseeker's Allowance (income-based) £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Jobseeker's Allowance (contribution-based) £0.29bn £0.30bn £0.30bn £0.31bn £0.32bn £0.32bn £0.33bn
Income Support £0.12bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Working Tax Credit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Child Tax Credit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Incapacity Benefit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Personal Independence Payment £26.94bn £28.06bn £29.13bn £29.83bn £30.54bn £31.26bn £31.96bn
Disability Living Allowance £7.49bn £7.80bn £8.10bn £8.29bn £8.49bn £8.69bn £8.88bn
Attendance Allowance £8.68bn £9.04bn £9.38bn £9.61bn £9.83bn £10.07bn £10.29bn
Carer's Allowance £4.48bn £4.67bn £4.84bn £4.96bn £5.08bn £5.19bn £5.31bn
Carer Support Payment (Scotland) £0.31bn £0.32bn £0.33bn £0.34bn £0.35bn £0.36bn £0.37bn
Carer's Allowance Supplement (Scotland) £0.00bn £0.04bn £0.04bn £0.04bn £0.04bn £0.04bn £0.04bn
Severe Disablement Allowance £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn
Industrial Injuries Disablement Benefit £0.50bn £0.52bn £0.53bn £0.54bn £0.55bn £0.57bn £0.58bn
Armed Forces Compensation Scheme £0.61bn £0.62bn £0.64bn £0.65bn £0.67bn £0.68bn £0.70bn
War Widow's or Widower's Pension £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Child Benefit £16.16bn £16.83bn £17.43bn £17.85bn £18.26bn £18.69bn £19.10bn
Scottish Child Payment £0.49bn £0.52bn £0.54bn £0.55bn £0.56bn £0.57bn £0.56bn
Two Child Limit Payment (Scotland, counterfactual) £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Healthy Start vouchers £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn
Maternity Allowance £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Statutory Maternity Pay £3.30bn £3.39bn £3.47bn £3.55bn £3.63bn £3.72bn £3.80bn
Statutory Paternity Pay £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Statutory Sick Pay £1.12bn £1.15bn £1.18bn £1.21bn £1.24bn £1.27bn £1.29bn
Sure Start Maternity Grant £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn
Bereavement Support Payment £0.67bn £0.69bn £0.70bn £0.72bn £0.73bn £0.75bn £0.77bn
Widowed Parent's Allowance £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Tax-Free Childcare £0.55bn £0.56bn £0.57bn £0.58bn £0.59bn £0.61bn £0.59bn
Extended childcare entitlement £2.99bn £3.50bn £3.60bn £3.67bn £3.77bn £3.85bn £3.94bn
Universal childcare entitlement £2.05bn £2.23bn £2.28bn £2.34bn £2.40bn £2.47bn £2.52bn
Targeted childcare entitlement £0.50bn £0.51bn £0.52bn £0.53bn £0.54bn £0.56bn £0.52bn
Childcare Offer for Wales £0.26bn £0.28bn £0.28bn £0.29bn £0.30bn £0.30bn £0.31bn
Care to Learn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Childcare Grant £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Parents' Learning Allowance £0.20bn £0.20bn £0.20bn £0.20bn £0.20bn £0.20bn £0.20bn
Adult Dependants' Grant £0.06bn £0.06bn £0.04bn £0.04bn £0.04bn £0.04bn £0.04bn
Travel Grant £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed
16 to 19 Bursary Fund £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
NHS spending £203.83bn £204.54bn £205.13bn £205.79bn £206.49bn £207.23bn £207.73bn
State education spending £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn
Transport subsidy spending £25.05bn £25.13bn £25.21bn £25.29bn £25.37bn £25.46bn £25.53bn
Cost-of-living support payment £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Energy Bills Rebate £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Energy Price Guarantee subsidy £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Basic income £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Disability basic income £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Other public spending budget change £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Caseloads: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Lifetime ISA bonus 0k 0k 0k 0k 0k 0k 0k
State Pension 11,261k 11,158k 10,849k 10,746k 10,783k 10,822k 10,848k
Pension Credit 1,485k 1,483k 1,480k 1,461k 1,462k 1,464k 1,460k
Winter Fuel Payment 7,842k 7,793k 7,494k 7,407k 7,432k 7,459k 7,477k
Pension Age Winter Heating Payment (Scotland) 803k 803k 803k 800k 803k 806k 808k
Universal Credit 6,334k 6,341k 6,366k 6,347k 6,345k 6,333k 6,298k
Housing Benefit 1,249k 1,247k 1,250k 1,234k 1,238k 1,240k 1,239k
Council Tax Reduction 3,175k 3,198k 3,209k 3,229k 3,244k 3,257k 3,264k
Employment and Support Allowance (income-related) 71k 71k 71k 71k 71k 72k 72k
Employment and Support Allowance (contribution-based) 719k 721k 723k 726k 728k 731k 732k
Jobseeker's Allowance (income-based) 0k 0k 0k 0k 0k 0k 0k
Jobseeker's Allowance (contribution-based) 67k 67k 67k 68k 68k 68k 68k
Income Support 25k 0k 0k 0k 0k 0k 0k
Working Tax Credit 0k 0k 0k 0k 0k 0k 0k
Child Tax Credit 0k 0k 0k 0k 0k 0k 0k
Incapacity Benefit 0k 0k 0k 0k 0k 0k 0k
Personal Independence Payment 3,566k 3,579k 3,589k 3,601k 3,613k 3,626k 3,635k
Disability Living Allowance 1,291k 1,295k 1,299k 1,303k 1,308k 1,312k 1,316k
Attendance Allowance 1,694k 1,700k 1,705k 1,711k 1,716k 1,723k 1,727k
Carer's Allowance 1,034k 1,038k 1,041k 1,044k 1,048k 1,051k 1,053k
Carer Support Payment (Scotland) 71k 71k 72k 72k 72k 72k 73k
Carer's Allowance Supplement (Scotland) 0k 71k 72k 72k 72k 72k 73k
Severe Disablement Allowance 4k 4k 4k 4k 4k 4k 4k
Industrial Injuries Disablement Benefit 137k 137k 138k 138k 139k 139k 140k
Armed Forces Compensation Scheme 93k 93k 94k 94k 94k 95k 95k
War Widow's or Widower's Pension 0k 0k 0k 0k 0k 0k 0k
Child Benefit 8,102k 8,128k 8,142k 8,165k 8,191k 8,216k 8,232k
Scottish Child Payment 350k 352k 353k 357k 354k 355k 342k
Two Child Limit Payment (Scotland, counterfactual) 0k 0k 0k 0k 0k 0k 0k
Healthy Start vouchers 199k 200k 201k 201k 202k 203k 203k
Maternity Allowance 0k 0k 0k 0k 0k 0k 0k
Statutory Maternity Pay 332k 334k 335k 336k 337k 338k 339k
Statutory Paternity Pay 0k 0k 0k 0k 0k 0k 0k
Statutory Sick Pay 181k 182k 182k 183k 183k 184k 185k
Sure Start Maternity Grant 26k 26k 26k 26k 26k 27k 27k
Bereavement Support Payment 98k 98k 98k 99k 99k 99k 100k
Widowed Parent's Allowance 0k 0k 0k 0k 0k 0k 0k
Tax-Free Childcare 1,014k 1,024k 1,024k 1,027k 1,027k 1,031k 1,013k
Extended childcare entitlement 796k 801k 806k 809k 815k 819k 820k
Universal childcare entitlement 1,071k 1,074k 1,077k 1,080k 1,086k 1,096k 1,097k
Targeted childcare entitlement 165k 156k 154k 155k 155k 156k 144k
Childcare Offer for Wales 39k 39k 39k 39k 39k 39k 39k
Care to Learn 0k 0k 0k 0k 0k 0k 0k
Childcare Grant 0k 0k 0k 0k 0k 0k 0k
Parents' Learning Allowance 98k 98k 99k 99k 99k 100k 100k
Adult Dependants' Grant 18k 18k 12k 12k 12k 13k 13k
Travel Grant 0k 0k 0k 0k 0k 0k 0k
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed
16 to 19 Bursary Fund 0k 0k 0k 0k 0k 0k 0k
Cost-of-living support payment 0k 0k 0k 0k 0k 0k 0k
Energy Bills Rebate 0k 0k 0k 0k 0k 0k 0k
Energy Price Guarantee subsidy 0k 0k 0k 0k 0k 0k 0k
Basic income 0k 0k 0k 0k 0k 0k 0k
Disability basic income 0k 0k 0k 0k 0k 0k 0k
Government balance, each component counted once: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Government receipts, each component once £898.82bn £941.86bn £980.11bn £1,013.84bn £1,052.89bn £1,089.01bn £1,129.10bn
Government spending £528.87bn † £543.67bn † £551.43bn † £557.71bn † £566.13bn † £574.77bn † £582.74bn †
Government balance, each receipt once £369.95bn † £398.19bn † £428.68bn † £456.13bn † £486.76bn † £514.23bn † £546.36bn †
Benefits in household_benefits but not in gov_spending £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Model totals: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
gov_tax £898.82bn £941.86bn £980.11bn £1,013.84bn £1,052.89bn £1,089.01bn £1,129.10bn
household_tax £496.91bn £527.60bn £554.51bn £577.74bn £603.32bn £627.65bn £654.69bn
pre_budget_change_household_tax £489.00bn £519.39bn £546.08bn £568.63bn £593.98bn £618.05bn £644.75bn
gov_spending £528.87bn † £543.67bn † £551.43bn † £557.71bn † £566.13bn † £574.77bn † £582.74bn †
household_benefits £528.87bn † £543.67bn † £551.43bn † £557.71bn † £566.13bn † £574.77bn † £582.74bn †
gov_balance £369.95bn † £398.19bn † £428.68bn † £456.13bn † £486.76bn † £514.23bn † £546.36bn †
Household income totals: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Household market income £1,651.49bn £1,713.03bn £1,764.05bn £1,812.97bn £1,862.19bn £1,918.39bn £1,985.28bn
Household net income £1,644.34bn † £1,688.53bn † £1,719.29bn † £1,750.26bn † £1,781.23bn † £1,820.53bn † £1,866.75bn †
Household net income (HBAI definition) £1,457.21bn £1,504.32bn £1,537.33bn £1,569.01bn £1,602.22bn £1,639.95bn £1,686.40bn
Population: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
People 69,224k 69,466k 69,668k 69,891k 70,128k 70,381k 70,550k
Benefit units 35,100k 35,223k 35,325k 35,438k 35,558k 35,686k 35,772k
Households 31,037k 31,145k 31,236k 31,336k 31,442k 31,555k 31,631k
Poverty rates: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Absolute poverty, before housing costs: everyone 16.0% 15.1% 15.5% 15.6% 15.7% 15.8% 15.8%
Absolute poverty, before housing costs: children 24.0% 21.2% 21.5% 21.5% 21.7% 21.9% 21.8%
Absolute poverty, before housing costs: working-age adults 13.8% 13.5% 14.0% 14.1% 14.2% 14.2% 14.3%
Absolute poverty, before housing costs: pensioners 13.7% 13.2% 13.1% 13.4% 13.5% 13.5% 13.5%
Absolute poverty, after housing costs: everyone 21.5% 20.8% 21.3% 21.5% 21.8% 21.9% 22.2%
Absolute poverty, after housing costs: children 33.1% 30.7% 31.1% 31.1% 31.4% 31.7% 32.3%
Absolute poverty, after housing costs: working-age adults 19.8% 19.6% 20.3% 20.5% 20.7% 20.9% 21.1%
Absolute poverty, after housing costs: pensioners 12.7% 12.4% 12.3% 12.5% 12.9% 12.9% 13.0%
Relative poverty, before housing costs: everyone 17.2% 16.4% 16.5% 16.4% 16.3% 16.4% 16.6%
Relative poverty, before housing costs: children 26.2% 23.5% 23.4% 23.1% 22.8% 23.0% 23.3%
Relative poverty, before housing costs: working-age adults 14.6% 14.4% 14.7% 14.7% 14.6% 14.7% 14.9%
Relative poverty, before housing costs: pensioners 15.0% 14.8% 14.1% 14.1% 14.0% 14.0% 14.2%
Relative poverty, after housing costs: everyone 21.6% 21.0% 21.2% 21.2% 21.3% 21.4% 21.8%
Relative poverty, after housing costs: children 33.3% 31.2% 30.9% 30.7% 31.0% 31.0% 31.5%
Relative poverty, after housing costs: working-age adults 19.9% 19.8% 20.1% 20.3% 20.5% 20.5% 20.8%
Relative poverty, after housing costs: pensioners 12.9% 12.4% 12.1% 11.9% 11.8% 11.9% 12.8%
People in poverty: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Absolute poverty, before housing costs: everyone 11,051k 10,489k 10,774k 10,897k 11,005k 11,092k 11,140k
Absolute poverty, before housing costs: children 3,580k 3,185k 3,232k 3,242k 3,284k 3,321k 3,324k
Absolute poverty, before housing costs: working-age adults 5,846k 5,754k 6,039k 6,139k 6,191k 6,232k 6,270k
Absolute poverty, before housing costs: pensioners 1,625k 1,550k 1,504k 1,517k 1,530k 1,539k 1,545k
Absolute poverty, after housing costs: everyone 14,858k 14,424k 14,825k 15,016k 15,271k 15,438k 15,663k
Absolute poverty, after housing costs: children 4,944k 4,610k 4,671k 4,688k 4,757k 4,821k 4,919k
Absolute poverty, after housing costs: working-age adults 8,410k 8,361k 8,749k 8,916k 9,053k 9,141k 9,257k
Absolute poverty, after housing costs: pensioners 1,504k 1,454k 1,405k 1,412k 1,461k 1,475k 1,487k
Relative poverty, before housing costs: everyone 11,898k 11,405k 11,470k 11,490k 11,425k 11,528k 11,710k
Relative poverty, before housing costs: children 3,918k 3,524k 3,519k 3,491k 3,451k 3,492k 3,550k
Relative poverty, before housing costs: working-age adults 6,203k 6,137k 6,339k 6,402k 6,387k 6,441k 6,540k
Relative poverty, before housing costs: pensioners 1,776k 1,744k 1,611k 1,597k 1,587k 1,595k 1,621k
Relative poverty, after housing costs: everyone 14,969k 14,592k 14,740k 14,824k 14,961k 15,048k 15,363k
Relative poverty, after housing costs: children 4,977k 4,676k 4,652k 4,634k 4,691k 4,712k 4,794k
Relative poverty, after housing costs: working-age adults 8,455k 8,452k 8,697k 8,846k 8,924k 8,983k 9,107k
Relative poverty, after housing costs: pensioners 1,537k 1,464k 1,391k 1,344k 1,346k 1,354k 1,462k
Inequality: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Gini coefficient, equivalised HBAI income before housing costs 0.3086 0.3059 0.3066 0.3072 0.3077 0.3083 0.3096
Mean household net income in each side's own deciles: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Decile 1: mean household_net_income per household £17,773 † £17,876 † £17,831 † £17,889 † £18,127 † £18,315 † £18,445 †
Decile 2: mean household_net_income per household £27,956 † £28,855 † £28,514 † £28,878 † £29,157 † £29,624 † £30,132 †
Decile 3: mean household_net_income per household £34,379 † £35,481 † £36,103 † £36,490 † £36,752 † £37,303 † £38,128 †
Decile 4: mean household_net_income per household £38,782 † £40,746 † £41,895 † £42,415 † £43,112 † £43,928 † £44,188 †
Decile 5: mean household_net_income per household £43,785 † £44,532 † £45,603 † £46,280 † £47,374 † £48,286 † £49,557 †
Decile 6: mean household_net_income per household £48,210 † £49,520 † £50,751 † £51,516 † £52,206 † £53,079 † £54,258 †
Decile 7: mean household_net_income per household £56,210 † £57,193 † £57,748 † £58,266 † £58,991 † £60,089 † £61,812 †
Decile 8: mean household_net_income per household £69,153 † £70,584 † £71,803 † £73,070 † £74,090 † £75,614 † £77,419 †
Decile 9: mean household_net_income per household £79,488 † £81,416 † £82,836 † £84,144 † £85,527 † £87,051 † £89,927 †
Decile 10: mean household_net_income per household £117,580 † £120,294 † £121,931 † £124,160 † £126,041 † £128,335 † £131,104 †
Standard reform costings (change in gov_balance): head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise basic rate by 1pp £6.47bn £6.76bn £6.67bn £6.86bn £7.06bn £7.35bn £7.55bn
Raise higher rate by 1pp £3.69bn £3.98bn £4.03bn £4.29bn £4.46bn £4.78bn £4.91bn
Raise personal allowance by ~800GBP/year £-3.82bn £-3.94bn £-4.01bn £-4.09bn £-4.18bn £-4.18bn £-2.00bn
Raise child benefit by 25GBP/week per additional child £-1.99bn £-1.75bn £-1.56bn £-1.46bn £-1.35bn £-1.24bn £-1.12bn
Reduce Universal Credit taper rate to 20% £-20.39bn £-20.96bn £-21.38bn £-21.57bn £-21.87bn £-22.17bn £-22.60bn
Raise Class 1 main employee NICs rate to 10% £11.02bn £11.42bn £11.77bn £12.07bn £12.37bn £12.75bn £13.07bn
Raise VAT standard rate by 2pp £24.89bn £25.55bn £26.14bn £26.75bn £27.39bn £28.03bn £28.66bn
Raise additional rate by 3pp £2.96bn £3.21bn £3.26bn £3.46bn £3.65bn suppressed suppressed
Raise the Universal Credit standard allowance by 10% £-3.02bn £-3.15bn £-3.26bn £-3.30bn £-3.34bn £-3.39bn £-3.44bn
Raise the State Pension by 10% £-7.79bn £-8.02bn £-8.01bn £-8.12bn £-8.43bn £-8.54bn £-8.87bn
Standard reforms: change in each reform's target: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise basic rate by 1pp: change in income_tax £6.61bn £6.91bn £6.83bn £7.03bn £7.24bn £7.47bn £7.73bn
Raise higher rate by 1pp: change in income_tax £3.69bn £3.99bn £4.04bn £4.25bn £4.47bn £4.74bn £4.93bn
Raise personal allowance by ~800GBP/year: change in income_tax £-3.95bn £-4.08bn £-4.17bn £-4.24bn £-4.34bn £-4.41bn £-1.76bn
Raise child benefit by 25GBP/week per additional child: change in child_benefit £2.33bn £2.14bn £1.95bn £1.84bn £1.73bn £1.62bn £1.50bn
Reduce Universal Credit taper rate to 20%: change in universal_credit £20.39bn £20.95bn £21.37bn £21.62bn £21.87bn £22.22bn £22.61bn
Raise Class 1 main employee NICs rate to 10%: change in national_insurance £11.28bn £11.74bn £12.06bn £12.37bn £12.69bn £13.03bn £13.49bn
Raise VAT standard rate by 2pp: change in vat £24.69bn £25.35bn £25.94bn £26.54bn £27.17bn £27.81bn £28.43bn
Raise additional rate by 3pp: change in income_tax £2.96bn £3.21bn £3.26bn £3.46bn £3.66bn suppressed suppressed
Raise the Universal Credit standard allowance by 10%: change in universal_credit £3.02bn £3.15bn £3.26bn £3.32bn £3.39bn £3.44bn £3.48bn
Raise the State Pension by 10%: change in state_pension £10.68bn £11.18bn £11.31bn £11.55bn £12.00bn £12.44bn £12.94bn

@vahid-ahmadi

Copy link
Copy Markdown
Collaborator

Round 1 at b584be536.

Verdict: the approach is sound and matches the law. There are no musts and three shoulds, mostly cleanup. It is still a draft, so this is a comment, not an approval.

The law supports separate claims. Welfare Reform Act 2007 Sch 1 para 6(1)(d) and 6(2) join only the other member of the couple to a claim, and ESA Regs 2008 reg 118 and JSA Regs 1996 reg 116 apply tariff income per claimant. So a non-dependent adult's report is their own claim, with their own work test and their own tariff. The tariff arithmetic in the tests and docs checks out: £1,000 above £6,000 is 4 steps, £208 a year; £4,000 above is 16 steps, £832.

Findings

  1. should: the Housing Benefit cap still passes the old callback. variables/gov/dwp/housing_benefit/benefit_cap/is_housing_benefit_benefit_cap_exempt_specified_benefit.py:6 imports income_related_esa_award and passes it to award_of_couple at :115. award_of_members now calls the callback with unsummed person reports and a fourth members argument (utils/benefit_unit.py:97-98), so the old three-argument helper would raise. It is not reached today: couple there is is_claimant_or_partner, so award_of_couple returns early at utils/benefit_unit.py:191-192. The UC twin was switched in 3adfe55. Please switch this one to income_related_esa_award_on_reports too, so the next change to couple does not break it.
  2. should: some published prose has lost its spaces around numbers. esa_income_eligible.py:15 has "work24hours", and jsa_income_eligible.py:15 has "less than16hours" and "less than24hours". These strings are the variables' documentation, so they show up in the API and the app. The YAML comment at bursary_fund_16_to_19.yaml:287-288 has the same problem ("at20", "section3.1", "excludes19+").
  3. should: the rewritten documentation for esa_income_eligible and jsa_income_eligible drops every pinpoint citation the old text gave. For ESA these were Sch 1 para 6(1)(b), (e) and (f), regs 42(1), 43(2)(c) and 110, and IS Regs Sch 1B para 4. For JSA they were Jobseekers Act 1995 s.1(2)(e), s.1(2B)(b), s.3(1)(e) and s.35(1), and JSA Regs 1996 regs 3E and 51(1)(a)/(b). The reference tuples remain, but the prose no longer says which rule does what, for example the joint-claim exception in reg 3E. Please put the citations back next to the rules they support.
  4. nit: the JSA documentation says "ESA also excludes the couple's reports on a UC claim" (jsa_income_eligible.py:22). That sentence was copied from the ESA file and reads oddly here.
  5. nit: the outside-claim screen is now written twice. It is in esa_income.py:33-35 and jsa_income.py:41-43, and again in own_report_is_paid (_legacy_award_payee.py:65-72), which sets the person's status. The two agree today. A shared helper would stop the award and the status drifting apart.
  6. nit, judgement: each outside claim deducts the full benefit-unit tariff (esa_income.py:34, jsa_income.py:42). The same stock of capital is therefore counted once per claim: £208 three times in the docs example. That follows from the capital being held at household level (esa_income_assessable_capital), and the docs say so. I'd leave it, but Max may want to confirm it as the convention.

Not changed by this PR, for the record. Contributory ESA and contributory JSA pass the reported amounts straight through (esa_contrib.py, adds = ["esa_contrib_reported"]). The duration limits are therefore not modelled: 365 days for contributory ESA outside the support group (WRA 2007 s.1A), and 182 days for contribution-based JSA (Jobseekers Act 1995 s.5(1)). A current report already reflects them, and nothing here makes this worse. The 2013 ESA and JSA Regulations (new style) have no income-related element, so they are out of scope.

Aggregate impact. The CI report at this head (run 40290663254, head_sha b584be536) shows no moves in any year from 2025-26 to 2031-32. That fits the issue's point that no Enhanced FRS record has a reporter outside the couple. With nothing moving, there is nothing to compare against the DWP benefit expenditure tables.

What I ran

  • A fresh worktree at b584be536 with a fresh uv venv. I ran the new test_reported_legacy_award_screening.py and the seven changed Python test files: 165 passed.
  • The YAML test directories esa_income, jsa_income, legacy_award_readers and bursary_fund_16_to_19: 206 passed.
  • CI at the head: all checks pass.
  • Law checked on legislation.gov.uk: WRA 2007 s.1A and Sch 1 para 6; ESA Regs 2008 regs 110 and 118; JSA Regs 1996 regs 107 and 116; Jobseekers Act 1995 ss.1 and 5; ESA Regs 2013 and JSA Regs 2013 reg 1.

What I did not read or run

  • The full YAML or Python suites, or any microsimulation (CI covers these).
  • The DfE 16 to 19 Bursary guide 2026-27, section 3.1.

🤖 Generated with Claude Code

@juaristi22

Copy link
Copy Markdown
Collaborator Author

Addressed the three shoulds and the copied JSA wording in 9a5464b. The HB cap now passes income_related_esa_award_on_reports; the prose spacing, rule-specific citations and JSA closure explanation are corrected, as is the bursary comment.

One added HB-consumer regression fails with the old callback and passes with the repair, using the same assertions. Scoped Ruff and whitespace checks passed. The shared-screen refactor, capital-proxy convention and contributory duration limits remain separate from this correction.

@vahid-ahmadi

Copy link
Copy Markdown
Collaborator

Round 2 at 9a5464b7d.

Verdict: all three shoulds and the JSA wording nit are fixed, and I have no new findings. CI is green at this head. Not approving because the PR is still a draft. Once it is ready, I have nothing blocking.

Round 1 findings

  1. should, fixed. is_housing_benefit_benefit_cap_exempt_specified_benefit.py:6-8 now imports income_related_esa_award_on_reports and passes it at :117. The only remaining caller of the old income_related_esa_award is esa_income.py:27, its own module. The new test test_hb_specified_benefit_reader_honours_report_callback_contract routes the real HB reader through award_of_members. I put the round 1 version of the HB file back and the test fails with a broadcast ValueError in esa_income.py:10, so it does catch the old callback.
  2. should, fixed. esa_income_eligible.py now says "24 hours a week" and jsa_income_eligible.py says "less than 16 hours a week" and "less than 24 hours". The bursary comment at bursary_fund_16_to_19.yaml:287-288 is fixed too. A scan of the added lines in the PR found no other run-together words and numbers.
  3. should, fixed. The citations are back next to their rules. I checked the new ones on legislation.gov.uk: ESA Regs 2008 reg 42(1) (partner, 24 hours) and reg 43(2)(c) (IS Regs Sch 1B para 4); Jobseekers Act 1995 s.3(1)(e) (partner not in remunerative work) and s.13(2A) (joint-claim capital); JSA Regs 1996 reg 51(1)(a) and (b) (16 and 24 hours) and reg 3E(2)(g) (16 hours or more but less than 24). All match.
  4. nit, fixed. The copied ESA sentence is gone from the JSA docs. They now name person_legacy_benefits_closed, which is what jsa_income_eligible.py:44 and jsa_income.py:64 read.
  5. nit, left. The duplicated outside-claim screen stays. That is fine as a follow-up.
  6. nit, left. Counting the shared capital proxy once per claim is still the convention, and the docs say so. Max may still want to confirm it.

What I ran

In a fresh worktree at 9a5464b7d with a new uv venv:

  • pytest on the eight Python test files the PR changes, including test_reported_legacy_award_screening.py: 166 passed (165 in round 1 plus the new HB test).
  • The same test with the round 1 HB file: 1 failed, as expected.
  • policyengine-core test on the esa_income, jsa_income, legacy_award_readers, bursary_fund_16_to_19 and benefit_cap YAML directories: 322 passed.
  • CI at this head: all checks pass. The Aggregate impact run 40334168631 compares main with 9a5464b7d merged in (382f27a4fb): 0 checks broken, 0 moves flagged, and no household net income change in any year.

Not run: the full test suite or any microsimulation.

🤖 Generated with Claude Code

@juaristi22
juaristi22 marked this pull request as ready for review October 26, 2026 19:00
@juaristi22
juaristi22 added this pull request to the merge queue Oct 26, 2026

@vahid-ahmadi vahid-ahmadi left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving at 9a5464b; see the round 2 comment above. All 19 checks green. 🤖 Generated with Claude Code

Merged via the queue into main with commit e01faba Oct 26, 2026
21 checks passed
@juaristi22
juaristi22 deleted the fix-esa-jsa-report-screening-2263 branch October 26, 2026 21:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Legacy award follow-ups from #2031: the bursary own-right ESA proxy, and one screen for reports outside the couple

2 participants