Skip to content

Pin benefit cap exemption rules with regression tests and legal references (#1818) - #1820

Merged
MaxGhenis merged 10 commits into
mainfrom
fix/benefit-cap-exemption-defects
Oct 22, 2026
Merged

MaxGhenis merged 10 commits into
mainfrom
fix/benefit-cap-exemption-defects

Conversation

@vahid-ahmadi

@vahid-ahmadi vahid-ahmadi commented Aug 13, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes defects in the benefit cap exceptions, found while investigating #1818 (the model caps 222k UC households against DWP's 111k for Great Britain, November 2025). None of them is the main cause of the over-capping, which is believed to lie in calibration and rents.

Reproducer: policyengine_uk/tests/policy/baseline/gov/dwp/benefit_cap/is_uc_benefit_cap_exempt_earnings.yaml::The 2026-27 earnings threshold rises to 881 a month

axiom: TheAxiomFoundation/rulespec-uk#399 queued (UC reg 82 threshold and earned income)

Main is merged in at 07534c3 (merge 88fd2be). Four of this PR's original fixes have since landed on main and are kept as they are there:

What this PR still changes relative to main is the regs 55, 57 and Finance Act 2004 s. 188 references and comments on is_uc_benefit_cap_exempt_earnings, plus regression tests. The reproducer now passes on main as well, since #2523 fixed the threshold.

Tests

  • policyengine_uk/tests/policy/baseline/gov/dwp/benefit_cap/is_uc_benefit_cap_exempt_earnings.yaml, 10 cases: the same earnings either side of the 2025-26 and 2026-27 thresholds, unearned income and couples, and the earnings regressions from the earlier review (tax on a private pension; one partner's pension contributions against the other's pay; contributions after 75 in a mixed-age couple). Before Pension annual allowance on survey data, the UC benefit-cap earnings threshold, and the loss-relief pension rule: fixes before Microcosm UK locks the next release #2523 the reproducer failed on main; all 10 now pass on main too.
  • benefit_cap_specified_benefits.yaml: the paired final-award AFIP cases from the earlier review, now in the scheme-split names (a young person's AFIP on UC leaves the award capped at £22,054.80; on legacy HB it is paid in full at £30,000). They pass on main and pin the award, which main's flag-only case does not.
  • test_uc_single_claim_properties.py generates AFIP for both members and keeps the partner-only AFIP example, asserted against the UC and HB specified-benefit variables.

Results at 88fd2be (fresh venv):

  • Ruff: format and check clean on the changed Python files.
  • Benefit cap YAML: 116 passed. Full YAML policy suite: 4,023 passed.
  • test_benefit_cap_*.py, test_abolish_benefit_cap_scenario.py, test_disable_simulated_benefits_benefit_cap.py, test_uc_deductions.py and test_uc_single_claim_properties.py: 74 passed.

Refs #1818.

🤖 Generated with Claude Code

@vahid-ahmadi
vahid-ahmadi requested a review from MaxGhenis August 13, 2026 13:05
@vahid-ahmadi

Copy link
Copy Markdown
Collaborator Author

@MaxGhenis review request — benefit cap exemption defects found while investigating #1818.

The thing to decide is timing, not correctness. The main fix (using earnings-attributable tax rather than total income tax in the reg. 82 test) reduces capping and moves with the known over-capping. But parameterising the stale earnings threshold raises it from GBP 846 to GBP 881/month for 2026-27, which removes exemptions and increases capping — correct by law, wrong direction for #1818. 2025 is unchanged, since the new parameter resolves to GBP 846 exactly.

So this makes 2026 capping modestly worse while #1818 is open. It is still right, but you may prefer it lands alongside the calibration work rather than before it.

Worth knowing: AFIP produces no numeric change. The variable has no formula and nothing in policyengine-uk-data populates it. The exemption is legally correct to add, but nobody should expect the number to move. I would rather that were stated than discovered later.

The dead-code removal keeps return semantics byte-identical apart from AFIP, and no pre-existing policy test changed (1118 → 1130, all additions) — which was the signal I asked to watch for. Gated Test job passes.

@MaxGhenis

MaxGhenis commented Sep 30, 2026 •

Copy link
Copy Markdown
Collaborator

Coordination with #1944 (mixed-age couples on UC: benefit cap and CTR pensioner status). The UC benefit cap has no age exception that reaches a mixed-age couple. UC Regs 2013 regs 79, 82 and 83 turn only on earnings and benefit receipt; the one age-based exception, SI 2014/1230 reg 60C, covers only claims where every claimant has reached the qualifying age; and GOV.UK says "If you're part of a couple and one of you is under State Pension age, the cap may apply."

#1944 therefore replaces has_pensioner in is_benefit_cap_exempt_other with a new housing_benefit_pension_age_regulations_apply. Under HB Regs 2006 reg 5, pension-age HB has no cap, and a family on UC is never under it.

Two effects on this PR:

  1. is_benefit_cap_exempt_other.py conflicts. Keep Apply the benefit cap to mixed-age couples on Universal Credit, and keep them off pensioner Council Tax Reduction #1944's formula; the AFCS and contributory-ESA terms are unchanged.
  2. This PR's new comment in is_benefit_cap_exempt_earnings says households with pension income are "generally already exempt through the state pension age exception". After Apply the benefit cap to mixed-age couples on Universal Credit, and keep them off pensioner Council Tax Reduction #1944, that no longer holds for a mixed-age couple on UC, which is capped unless an earnings, health or disability exception applies. Please reword it when rebasing.

#1944 leaves the dead has_pensioner blocks in _earnings and _health_disability for this PR to remove. Your "State pension age excepts from the benefit cap" case (single, aged 70) still passes on #1944.

🤖 Generated with Claude Code

@MaxGhenis

Copy link
Copy Markdown
Collaborator

Coordination with #1999 (fixes #1986), which rewrites is_benefit_cap_exempt_earnings. It covers this PR's defects 1 and 2:

When rebasing, keep #1999's is_benefit_cap_exempt_earnings.py, and drop benefit_cap_earnings_exemption.yaml and the earnings cases that duplicate #1999's benefit_cap_earnings_exception.yaml. AFIP and the dead-code removal in _health_disability and _other still stand. #1999 leaves those two files alone, and #1944 rewrites _other.

🤖 Generated with Claude Code

@MaxGhenis

Copy link
Copy Markdown
Collaborator

Coordination with #2076, stacked on #2027.

#2076 removes the unused benefit sums from is_benefit_cap_exempt_other.py and is_benefit_cap_exempt_earnings.py. It also moves the afcs and ESA terms out of is_benefit_cap_exempt_other into is_benefit_cap_exempt_health_disability, limited to the claimant and partner. Before, any member's AFCS or contributory ESA lifted the cap.

Whichever lands second: keep this PR's age or earnings test, and drop the afcs and esa_support_component terms and the dead QUAL_* lists from _other and _earnings.

@MaxGhenis

Copy link
Copy Markdown
Collaborator

Coordination with #2089 (each scheme its own benefit cap), stacked on #2084.

#2089 deletes the shared exception files this PR edits (is_benefit_cap_exempt*.py) and gives each scheme its own:

  • UC: universal_credit/benefit_cap/is_uc_benefit_cap_exempt_earnings.py (reg 82) and _specified_benefit.py (reg 83);
  • HB: housing_benefit/benefit_cap/is_housing_benefit_benefit_cap_exempt_*.py (75E, 75F, reg 5).

This PR's earnings-test fix overlaps #1999, which ports the same way, into the UC earnings file. Its other defect fixes belong in whichever scheme's file the regulation names.

@juaristi22

Copy link
Copy Markdown
Collaborator

Review of #1820 — Fix benefit cap exemption defects (#1818)

Base repository: PolicyEngine/policyengine-uk
PR number: 1820
Reviewed head SHA: 35efb46
Merge base SHA: 3d12d26
Mode: full
Scope: changed behavior and affected dependencies
Source evidence: Official sources are linked below; local source copies and validation artifacts were retained.
Review status: COMPLETE

Source Documents

Critical

None.

Should Address

None.

Suggestions

None.

Evidence Gaps

No material gaps reported.

Notes

  • Snapshot imports verified; no private population run.
  • Property-income capital premise is unestablished; sensitivity only, not a confirmed finding.
  • Changed threshold/earnings/AFIP rules corroborated; inherited mixed-age rule and residual pension tax are explicit scope notes.

Validation Summary

187 passed, 11.34s pytest /15.06s CLI; actual ordinary threshold/pension and asymmetric partner AFIP/member-order cases through final UC/HB/net income; named source-base earnings control completed (sensitivity only).

Original statutory/government/JRF sources read with SHA-bound extracts. current-pr-1820-review-sources.json; current-pr-1820-review-source-cache-check.json. No duplicate calculation diagnostics; original PDF extraction via bundled pypdf. Canonical source-manifest validator exited 0.

CI at 35efb46: Install + smoke-import (py3.9)=SUCCESS, Install + smoke-import (py3.10)=SUCCESS, Install + smoke-import (py3.11)=SUCCESS, Install + smoke-import (py3.12)=SUCCESS, Install + smoke-import (py3.13)=SUCCESS, Install + smoke-import (py3.14)=SUCCESS, Lint=SUCCESS, Test=SUCCESS.

Detailed code, policy, source and reproduction artifacts were retained locally.

Timing

elapsed seconds: 1151.70s; setup seconds: 272.25s

Review Severity

APPROVE. Open findings: 0 critical, 0 should address, 0 suggestions.

@vahid-ahmadi
vahid-ahmadi force-pushed the fix/benefit-cap-exemption-defects branch from 35efb46 to ea2b87c Compare October 8, 2026 15:12
MaxGhenis added a commit that referenced this pull request Oct 11, 2026
Conflicts:
- uc_earned_income.py: main's documentation and references, reading the
  branch's uc_earned_income_before_work_allowance; the work allowance still
  comes off it (max(0, before - work allowance)).
- is_benefit_cap_exempt_earnings.py: the branch's version for now; it is
  reworked on top of #1820 in the next merge.

Semantic follow-ups to main's claimant rule (is_uc_assessed_claimant, from
#1978): uc_earned_income_before_work_allowance and benefit_cap_earned_income
now sum over the assessed claimants with add_for_members, as main's
uc_earned_income did. uc_individual_earned_income_before_mif is main's (the
branch's copy was identical). benefit_cap_earned_income documents that
miscellaneous_income is counted as the award counts it (#1961). The CTR
helper comment names the Default Scheme regulations correctly.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 11, 2026
This branch is stacked on #1820 and must not
merge before it. #1820's changes (AFIP exception, dated earnings threshold
parameter, earnings-attributable tax in the reg. 82 test, dead-code removal,
its YAML tests, changelog fragment and the dividend xfail removal) are
Vahid's and land through #1820.

Conflicts:
- is_benefit_cap_exempt_health_disability.py: main's claimant scoping
  (not_a_claimant, add_for_members) kept; #1820's removal of the dead
  earnings block and its AFIP entry applied on top.
- is_benefit_cap_exempt_earnings.py: #1820's version. The next commit
  replaces only its earned income measure for #1986.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 11, 2026
#1820 measures the benefit cap's earned income as earnings less
earned_income_tax, national_insurance and pension_contributions. That still
deducts tax on pension and property income, all Class 3 (the #1986
counterexample: a partner's 923 of voluntary Class 3 removed a couple's
exception) and contributions paid after 75. Replace only that measure with
benefit_cap_earned_income: each claimant's uc_individual_earned_income_before_mif
(earnings less their own tax and NI on those earnings and relievable pension
contributions), summed over the claimants, without minimum income floor
income (reg. 82(4)). #1820's structure, threshold parameter and comments stay;
the comments its measure made untrue are edited.

Reg. 82(1) excepts "an award of universal credit", so the exception no longer
lifts the cap on a Housing Benefit award without Universal Credit (HB's own
work exception is WTC entitlement, HB Regs 2006 reg. 75E). Families with
neither award keep the income test, so #1820's YAML cases are unchanged.

Threshold: drop #1999's own NLW derivation (benefit_cap_earnings_threshold,
uc_benefit_cap_earnings_threshold_met and the earnings_exception parameters)
in favour of #1820's gov.dwp.benefit_cap_earnings_exemption, extended back
with cited values: 430 a month from 29 April 2013 (reg. 82(1)(a) as made),
then 520, 542 and 569 for 2017-18 to 2019-20 (S.I. 2017/138; NMW Regs 2015
reg. 4; reg. 6(1A)(za)). A differential test checks every dated value from
April 2017 against floor(16 x NLW x 52 / 12) from gov.hmrc.minimum_wage.

Tests: the cap YAML moves onto the parameter with boundary pairs for 2016,
2017, 2018, 2019 and 2023 (722 a month); the property file computes the
income test from the parameter and loads the model once per module; a rent
pin joins #1820's de-xfailed dividend case; the floor childcare case names
the responsible carer, since main now defaults the nomination to the elder.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis

Copy link
Copy Markdown
Collaborator

Coordination note on #1999 (fixes #1986), replacing the 1 October note above.

#1999 is now stacked on this PR at ea2b87cec and depends on it: it stays a draft and will not merge before this PR does. It keeps this PR's threshold parameter, the AFIP exception and the exception-file changes as they are. On top it adds only:

Once this PR is on main, #1999 merges main and its diff reduces to those.

🤖 Generated with Claude Code

MaxGhenis added a commit that referenced this pull request Oct 12, 2026
Includes the reform-contract and tax-band fixes; preserves the stack on #1820 without conflicts.

Co-Authored-By: OpenAI Codex <noreply@openai.com>
vahid-ahmadi and others added 2 commits October 12, 2026 08:22
Four defects in the benefit cap exception logic:

1. The earnings exception subtracted total income tax liability from
   earnings, so tax on property, savings, dividend and pension income
   reduced measured net earnings. Regulation 55(5) of the Universal
   Credit Regulations 2013 deducts only the tax paid in respect of the
   employment, primary Class 1 NI and relievable pension contributions.
   Now uses earned_income_tax, national_insurance and
   pension_contributions.

2. The earnings threshold was hardcoded as 10_152 in three files. Moved
   to the dated parameter gov.dwp.benefit_cap_earnings_exemption,
   expressed monthly as reg. 82 and DWP do, with values for 2020-21 to
   2026-27 derived from 16 hours a week at the National Living Wage.

3. Armed Forces Independence Payment is a statutory exception but was
   never checked. Added to the health/disability qualifying benefits.

4. Removed dead copy-pasted code from all three is_benefit_cap_exempt_*
   variables, keeping each one's return semantics unchanged apart from
   defect 3.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…s fix makes it pass

The earnings exception to the benefit cap now nets only earned_income_tax off
earnings, so tax on dividends no longer removes it (#1986).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@vahid-ahmadi
vahid-ahmadi force-pushed the fix/benefit-cap-exemption-defects branch from ea2b87c to 4a5174c Compare October 12, 2026 07:15
@vahid-ahmadi

Copy link
Copy Markdown
Collaborator Author

Rebased onto main at 4a5174c. The threshold parameter (benefit_cap_earnings_exemption.yaml), the AFIP exception and the exception files keep the same names and paths, so #1999 can merge main cleanly.

Resolve conflicts with #2399, #2076 and #1965:

- is_benefit_cap_exempt_earnings: keep main's per-claimant
  uc_individual_earned_income_before_mif test and documentation; keep this
  PR's dated threshold parameter in place of 10_152 and its reg 57 and
  FA 2004 s.188 references.
- is_benefit_cap_exempt_health_disability: take main's version (#2076) and
  add the UC route for AFIP: on a Universal Credit award only a claimant's
  counts; otherwise Housing Benefit's young person counts too.
- is_benefit_cap_exempt: take main's label.
- test_uc_single_claim_properties: keep main's AFCS assertions and this
  PR's partner-only AFIP example.

Pin main's young-person AFIP YAML case to the Housing Benefit route, and
give the specified-benefits property oracle the family's scheme. Rewrite
the changelog fragment to what the PR still changes relative to main.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@vahid-ahmadi

Copy link
Copy Markdown
Collaborator Author

@MaxGhenis thanks for the merge-order note. I've merged main into this branch (01e90fe, a merge, no rebase or force-push), so CI now runs on the combined code.

Conflicts

Two of main's tests changed because they assumed AFIP had the same scope in both schemes. The benefit_cap_specified_benefits.yaml case "A young person's armed forces independence payment lifts the cap (HB reg 75F(1)(ea))" now enters universal_credit_pre_benefit_cap: 0, so it tests the Housing Benefit route its name cites. The reference in test_benefit_cap_specified_benefits_properties.py now takes the family's scheme.

What the PR still changes relative to main: the threshold parameter (2025-26 stays at £846 a month, 2026-27 rises to £881), the AFIP split by scheme, and the 17 regression cases in is_benefit_cap_exempt.yaml. Run on main's code, two of them fail (the 2026-27 threshold and the young person's AFIP on UC), so the Reproducer: line now names just those two. I've updated the description and changelog fragment to match.

Tests (fresh venv, at 01e90fe): benefit cap YAML 110 passed, gov/dwp YAML 571 passed, full YAML policy suite 3,429 passed. The 33 pytest files touching the cap or AFIP: 497 passed, 1 skipped (needs a dataset token), 1 xfailed (#1947). That includes test_uc_statutory_pay_properties.py, so the release-test failure you mentioned passes on the combined code. Ruff is clean on the changed files, and .github/check_fix_pr.py passes against the new description.

@juaristi22 juaristi22 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.

Re-reviewed 01e90fe28badede6d11e2fe51e679e08f4b94fee. Both blockers from my earlier change request are resolved, and I am approving.

  • A qualifying young person’s AFIP no longer exempts a UC claimant from the cap, while the separate Housing Benefit route remains. The paired final-award regressions pass: UC £22,054.80 and legacy HB £30,000. This matches UC reg.83(1)(c) and HB reg.75F(1)(ea).
  • The earnings exception preserves main’s earnings-specific tax/NI helper, including company earnings and statutory pay, without a separate company term. The £10,300 wages/£5,000 pension case now deducts £0 tax on earnings and pays UC £33,876.72.
  • All seven 2020–2026 thresholds match the DWP table; below/at/above-threshold final-UC checks pass. The Reproducer and axiom lines are present.

Validation:174 focused tests and diagnostics passed at this head; all captured hosted CI checks pass. I inspected the changed Hypothesis tests but did not execute them locally because the existing environment lacks Hypothesis.

@MaxGhenis

Copy link
Copy Markdown
Collaborator

#2089 merged on 2026-10-17 as 0583e23ec, so each scheme now has its own benefit cap exceptions on main. As promised on #2089, here is what that means for this PR:

vahid-ahmadi and others added 2 commits October 18, 2026 20:17
#2089 split the benefit cap by scheme and deleted the shared
is_benefit_cap_exempt_health_disability. Its UC and HB specified-benefit
variables already place armed forces independence payment as this PR did
(UC Regs 2013 regs 2, 83(1)(c); HB Regs 2006 reg 75F(1)(ea)), so the
deleted file is dropped and the two property tests take main's version.

- The earnings threshold parameter follows the move into
  is_uc_benefit_cap_exempt_earnings.
- The earnings YAML cases move to is_uc_benefit_cap_exempt_earnings.yaml
  under the new variable names; the AFIP cases there are dropped, main
  covers them, except the paired final-award cases, kept in
  benefit_cap_specified_benefits.yaml.
- test_uc_single_claim_properties.py keeps the partner AFIP example,
  asserted against the scheme-split variables.
- test_benefit_cap_lha_scheme_split_properties.py: the old shared
  earnings reference reads the threshold parameter instead of 10_152.
- Changelog no longer claims the AFIP fix.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@vahid-ahmadi

Copy link
Copy Markdown
Collaborator Author

@MaxGhenis thanks for the #2089 note. I've merged main into this branch (44d696c, then ce3e0bc for the later commits; merges, no rebase or force-push), so it is mergeable again.

The three conflicts

  • is_benefit_cap_exempt_health_disability.py: dropped. Give Universal Credit and Housing Benefit their own benefit cap and LHA shared-accommodation rules #2089's is_uc_benefit_cap_exempt_specified_benefit already counts AFIP for a claimant only (UC Regs 2013 regs 2 and 83(1)(c)), and is_housing_benefit_benefit_cap_exempt_specified_benefit counts it for the claimant, partner or a young person (HB Regs 2006 reg 75F(1)(ea)). That is the fix this PR made, so there was nothing left to carry over.
  • test_benefit_cap_specified_benefits_properties.py: main's version, which already has the per-scheme AFIP reference.
  • test_uc_single_claim_properties.py: main's version, plus this PR's partner-only AFIP example, now asserted against the UC and HB specified-benefit variables.

What follows from that

  • The earnings threshold parameter is in universal_credit/benefit_cap/is_uc_benefit_cap_exempt_earnings.py on Fix benefit-cap statutory-pay earnings exemption #2399's measure, as you expected, so the £10,152 literal goes when this lands.
  • test_benefit_cap_lha_scheme_split_properties.py re-adds the old shared earnings formula with the 10_152 literal and compares it with the new schemes at 2026. Its reference now reads the same parameter, so it keeps testing the split rather than the threshold.
  • The earnings YAML cases moved to is_uc_benefit_cap_exempt_earnings.yaml under the new names. The paired final-award AFIP cases (UC £22,054.80, legacy HB £30,000) are in benefit_cap_specified_benefits.yaml beside main's flag-only case.
  • The changelog no longer claims the AFIP fix, and the PR body's reproducer is now only the 2026-27 threshold case. It fails against main's earnings formula.

Benefit cap YAML 105 passed, gov/dwp YAML 606 passed, full YAML policy suite 3,587 passed, and the 28 benefit cap and AFIP pytest files 351 passed with 1 xfailed (#1947). check_fix_pr.py passes on the new body and head.

🤖 Generated with Claude Code

@juaristi22 juaristi22 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.

Re-reviewed ce3e0bccc01879c5eed826d6d7756b4fb1b0286c.

The main merge and #2089 conflict resolutions preserve the previously approved benefit-cap behavior. The remaining dated earnings parameter is unchanged from the verified 2020–2026 table. The renamed earnings test aggregates claimant earnings before the minimum income floor and annualises the monthly threshold once.

162 focused tests pass, including the pension-tax and young-person AFIP final-award regressions. Current-head hosted checks pass. The changed property tests were inspected; Hypothesis was unavailable in the selected local runtime, so their execution evidence is hosted CI. I am renewing approval for this commit.

Review status: COMPLETE. No open critical findings.

@vahid-ahmadi
vahid-ahmadi added this pull request to the merge queue Oct 20, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Oct 20, 2026
@juaristi22

Copy link
Copy Markdown
Collaborator

@vahid-ahmadi, #2536 (item 2 of #2523) also replaces the hard-coded 10,152 in is_uc_benefit_cap_exempt_earnings.py, so this PR and #2536 overlap there and in the scheme-split property test's reference.

The thresholds agree for 2020-21 to 2026-27 (£604 to £881 a month). The difference is where they come from:

Your tests run on #2536's threshold. I merged this branch onto #2536 locally, keeping #2536's threshold, and ran the tests this PR adds or changes:

  • is_uc_benefit_cap_exempt_earnings.yaml: every case passes;
  • test_uc_single_claim_properties.py: 8 passed.

One new case also fails on main without #2536, so main has moved since it was written: "A dependent young person's AFIP does not lift the Universal Credit cap, so the award is capped". It gives universal_credit_pre_benefit_cap of 46,615.92 in 2026 against the expected 52,792.44.

Proposal: once #2536 lands, drop gov.dwp.benefit_cap_earnings_exemption and the formula change here, keep the tests and update the AFIP case. Or, if you'd rather, I can carry the tests into #2536 and you close this one. Which do you prefer?

🤖 Generated with Claude Code

vahid-ahmadi and others added 2 commits October 20, 2026 23:47
…on cap test

Main (5092abf) now restricts the UC higher disabled child addition to
UC Regs 2013 reg 24(2)(b) (DLA care highest, PIP daily living enhanced or
Scottish equivalents, or blindness), so the 17-year-old's AFIP no longer
adds 6,176.52. Update the test's pre-cap UC and cap reduction; the capped
award (22,054.80) and the cap outcome are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@vahid-ahmadi

Copy link
Copy Markdown
Collaborator Author

@juaristi22 the merge queue run failed on one test this PR adds: "A dependent young person's AFIP does not lift the Universal Credit cap". I merged main and changed that test's expected values in 9dcd1cc. No model code changed.

Why: main now limits the UC higher disabled child addition to the conditions in UC Regs 2013 reg 24(2)(b) (5092abf): DLA care at the highest rate, PIP daily living at the enhanced rate, the Scottish equivalents, or blindness. AFIP is not on that list, so the 17-year-old no longer gets the £6,176.52 addition. Pre-cap UC goes from 52,792.44 to 46,615.92 and the cap reduction goes from 30,737.64 to 24,561.12. The household is still capped and the capped UC is unchanged at 22,054.80. I also added uc_disability_elements: 0 to the test and a line in its comment about reg 24.

Locally, the full YAML suite passes (3,912) and so do the benefit cap Python tests (65).

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

Aggregate impact on certified data: pass

Base 07534c3a64 against head a0baf159a3, 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

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; components the model counts twice; household income totals; population; poverty rates; people in poverty; inequality; mean household net income in each side's own deciles; standard reform costings (change in gov_balance); standard reforms: change in each reform's target.

Checks failing on both base and head (1)
  • VAT is never negative (sign:vat): 2025-26: 76 units below zero, a weighted £-54,797,972 in total; 2026-27: 76 units below zero, a weighted £-56,271,349 in total; 2027-28: 76 units below zero, a weighted £-57,609,146 in total
Counted-once check

Each of 84 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.

Provenance
Side Commit Runtime Environment hash Partition hash Time
base main 07534c3a64 uk 2.142.0 (files d1b1554fa402), core 3.33.2, py 3.13.16 aarch64 03cf147b5f6e f210f83d5be4 1058.3s
head #1820 merged into main a0baf159a3 uk 2.142.0 (files 20b07d3d9389), core 3.33.2, py 3.13.16 aarch64 03cf147b5f6e f210f83d5be4 1074.01s

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
Income tax £299.36bn £319.12bn £336.63bn £351.79bn £367.34bn £385.47bn £403.77bn
National Insurance (employee and self-employed) £52.58bn £54.94bn £56.75bn £58.48bn £60.62bn £62.57bn £65.03bn
National Insurance (employer) £152.64bn £159.18bn £164.14bn £168.73bn £176.11bn £181.72bn £188.90bn
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.62bn £13.06bn £13.55bn £14.04bn £14.54bn £15.09bn £15.65bn
Student loan repayments £7.83bn £8.12bn £8.35bn £8.56bn £8.79bn £9.04bn £9.38bn
VAT £253.71bn £260.53bn £266.72bn £273.14bn £279.83bn £286.71bn £293.71bn
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 £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
TV licence fee £4.28bn £4.43bn £4.44bn £4.46bn £4.49bn £4.51bn £4.53bn
Council tax £49.56bn £52.45bn £55.78bn £59.39bn £62.98bn £66.74bn £70.70bn
High value council tax surcharge £0.00bn £0.00bn £0.00bn £0.48bn £0.49bn £0.51bn £0.52bn
Northern Ireland domestic rates £0.55bn £0.58bn £0.61bn £0.63bn £0.67bn £0.70bn £0.73bn
Business rates £31.73bn £31.73bn £31.73bn £31.73bn £31.73bn £31.73bn £31.73bn
Stamp duty land tax (own purchases, and corporate until the £10.06bn £10.56bn £10.98bn £11.40bn £11.81bn £12.23bn £12.64bn
Land transaction tax (Wales) £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Land and buildings transaction tax (Scotland) £0.01bn £0.01bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn
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
State Pension £122.50bn £127.12bn £128.28bn £130.21bn £134.05bn £138.02bn £142.08bn
Pension Credit £6.66bn £7.04bn £7.02bn £7.09bn £7.21bn £7.34bn £7.44bn
Winter Fuel Payment £1.70bn £1.68bn £1.59bn £1.57bn £1.57bn £1.55bn £1.52bn
Pension Age Winter Heating Payment (Scotland) £0.19bn £0.20bn £0.20bn £0.21bn £0.21bn £0.22bn £0.22bn
Universal Credit £78.78bn £83.08bn £84.89bn £86.65bn £87.58bn £88.99bn £90.32bn
Housing Benefit £8.59bn £8.92bn £9.19bn £9.33bn £9.61bn £9.87bn £10.15bn
Council Tax Reduction £1.99bn £2.03bn £2.08bn £2.13bn £2.18bn £2.23bn £2.28bn
Employment and Support Allowance (income-related) £2.12bn £2.18bn £2.23bn £2.28bn £2.33bn £2.39bn £2.45bn
Employment and Support Allowance (contribution-based) £5.22bn £5.36bn £5.49bn £5.62bn £5.76bn £5.90bn £6.04bn
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.33bn £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 £27.05bn £28.19bn £28.94bn £29.64bn £30.37bn £31.11bn £31.87bn
Disability Living Allowance £7.52bn £7.83bn £8.04bn £8.24bn £8.44bn £8.65bn £8.86bn
Attendance Allowance £8.71bn £9.08bn £9.32bn £9.55bn £9.78bn £10.02bn £10.26bn
Carer's Allowance £4.50bn £4.69bn £4.81bn £4.93bn £5.05bn £5.17bn £5.29bn
Carer Support Payment (Scotland) £0.35bn £0.37bn £0.38bn £0.39bn £0.40bn £0.41bn £0.41bn
Carer's Allowance Supplement (Scotland) £0.00bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn
Severe Disablement Allowance £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn
Industrial Injuries Disablement Benefit £0.51bn £0.52bn £0.53bn £0.54bn £0.56bn £0.57bn £0.59bn
Armed Forces Compensation Scheme £0.61bn £0.62bn £0.64bn £0.65bn £0.67bn £0.69bn £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.23bn £16.91bn £17.32bn £17.73bn £18.16bn £18.60bn £19.04bn
Scottish Child Payment £0.50bn £0.52bn £0.53bn £0.55bn £0.56bn £0.57bn £0.58bn
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.32bn £3.41bn £3.49bn £3.57bn £3.66bn £3.75bn £3.84bn
Statutory Paternity Pay £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Statutory Sick Pay £1.13bn £1.16bn £1.19bn £1.22bn £1.25bn £1.28bn £1.31bn
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.74bn £0.76bn £0.78bn
Tax-Free Childcare £0.55bn £0.56bn £0.57bn £0.58bn £0.60bn £0.61bn £0.59bn
Extended childcare entitlement £2.66bn £3.14bn £3.23bn £3.30bn £3.38bn £3.47bn £3.55bn
Universal childcare entitlement £3.32bn £3.59bn £3.69bn £3.78bn £3.88bn £3.99bn £4.08bn
Targeted childcare entitlement £0.57bn £0.60bn £0.62bn £0.63bn £0.65bn £0.66bn £0.67bn
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 £204.68bn £205.46bn £206.22bn £207.04bn £207.96bn £208.89bn £209.79bn
State education spending £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn
Transport subsidy spending £25.15bn £25.25bn £25.34bn £25.44bn £25.55bn £25.67bn £25.78bn
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
State Pension 11,308k 11,208k 10,906k 10,812k 10,860k 10,908k 10,955k
Pension Credit 1,490k 1,489k 1,477k 1,455k 1,457k 1,454k 1,450k
Winter Fuel Payment 7,091k 7,008k 6,593k 6,509k 6,491k 6,377k 6,242k
Pension Age Winter Heating Payment (Scotland) 806k 807k 807k 805k 809k 812k 816k
Universal Credit 6,371k 6,379k 6,409k 6,419k 6,395k 6,387k 6,371k
Housing Benefit 1,254k 1,252k 1,254k 1,240k 1,244k 1,247k 1,249k
Council Tax Reduction 3,184k 3,210k 3,223k 3,244k 3,261k 3,279k 3,292k
Employment and Support Allowance (income-related) 187k 188k 188k 189k 190k 190k 191k
Employment and Support Allowance (contribution-based) 722k 724k 727k 730k 733k 737k 740k
Jobseeker's Allowance (income-based) 0k 0k 0k 0k 0k 0k 0k
Jobseeker's Allowance (contribution-based) 67k 67k 68k 68k 68k 69k 69k
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,581k 3,595k 3,608k 3,623k 3,639k 3,655k 3,671k
Disability Living Allowance 1,296k 1,301k 1,306k 1,311k 1,317k 1,323k 1,329k
Attendance Allowance 1,701k 1,708k 1,714k 1,721k 1,729k 1,736k 1,744k
Carer's Allowance 1,038k 1,042k 1,046k 1,050k 1,055k 1,059k 1,064k
Carer Support Payment (Scotland) 81k 82k 82k 82k 83k 83k 83k
Carer's Allowance Supplement (Scotland) 0k 82k 82k 82k 83k 83k 83k
Severe Disablement Allowance 4k 4k 4k 4k 4k 4k 4k
Industrial Injuries Disablement Benefit 137k 138k 139k 139k 140k 140k 141k
Armed Forces Compensation Scheme 94k 94k 94k 95k 95k 95k 96k
War Widow's or Widower's Pension 0k 0k 0k 0k 0k 0k 0k
Child Benefit 8,136k 8,165k 8,185k 8,215k 8,249k 8,282k 8,314k
Scottish Child Payment 352k 354k 355k 356k 357k 358k 357k
Two Child Limit Payment (Scotland, counterfactual) 0k 0k 0k 0k 0k 0k 0k
Healthy Start vouchers 200k 201k 202k 203k 204k 204k 205k
Maternity Allowance 0k 0k 0k 0k 0k 0k 0k
Statutory Maternity Pay 334k 335k 336k 338k 339k 341k 342k
Statutory Paternity Pay 0k 0k 0k 0k 0k 0k 0k
Statutory Sick Pay 182k 183k 183k 184k 185k 186k 186k
Sure Start Maternity Grant 26k 26k 26k 27k 27k 27k 27k
Bereavement Support Payment 98k 98k 99k 99k 100k 100k 101k
Tax-Free Childcare 1,017k 1,028k 1,028k 1,033k 1,034k 1,038k 1,023k
Extended childcare entitlement 665k 671k 675k 677k 682k 686k 687k
Universal childcare entitlement 986k 989k 992k 997k 1,002k 1,013k 1,015k
Targeted childcare entitlement 119k 120k 120k 121k 121k 122k 121k
Care to Learn 0k 0k 0k 0k 0k 0k 0k
Childcare Grant 0k 0k 0k 0k 0k 0k 0k
Parents' Learning Allowance 98k 99k 99k 100k 100k 100k 101k
Adult Dependants' Grant 18k 18k 12k 13k 13k 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 £899.46bn £939.35bn £976.35bn £1,009.56bn £1,045.84bn £1,082.79bn £1,123.66bn
Government spending £536.58bn † £550.91bn † £557.25bn † £564.32bn † £572.87bn † £582.12bn † £591.27bn †
Government balance, each receipt once £362.88bn † £388.44bn † £419.09bn † £445.24bn † £472.97bn † £500.67bn † £532.39bn †
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 £902.59bn £942.48bn £979.48bn £1,012.69bn £1,048.97bn £1,085.92bn £1,126.79bn
household_tax £496.24bn £522.77bn £548.61bn £570.81bn £593.03bn £617.48bn £644.19bn
pre_budget_change_household_tax £488.42bn £514.65bn £540.26bn £561.77bn £583.75bn £607.94bn £634.29bn
gov_spending £536.58bn † £550.91bn † £557.25bn † £564.32bn † £572.87bn † £582.12bn † £591.27bn †
household_benefits £536.58bn † £550.91bn † £557.25bn † £564.32bn † £572.87bn † £582.12bn † £591.27bn †
gov_balance £366.01bn † £391.57bn † £422.22bn † £448.37bn † £476.10bn † £503.80bn † £535.52bn †
Components the model counts twice: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
corporate_sdlt, counted again inside expected_sdlt £3.13bn £3.13bn £3.13bn £3.13bn £3.13bn £3.13bn £3.13bn
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,657.06bn £1,719.25bn £1,771.68bn £1,821.99bn £1,872.88bn £1,930.99bn £2,001.98bn
Household net income £1,658.12bn † £1,706.63bn † £1,738.44bn † £1,772.55bn † £1,808.65bn † £1,850.28bn † £1,902.01bn †
Household net income (HBAI definition) £1,466.68bn £1,513.41bn £1,545.63bn £1,578.61bn £1,612.63bn £1,651.68bn £1,702.11bn
Population: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
People 69,514k 69,778k 70,036k 70,316k 70,626k 70,944k 71,249k
Benefit units 35,247k 35,381k 35,512k 35,654k 35,811k 35,972k 36,127k
Households 31,167k 31,285k 31,401k 31,526k 31,665k 31,808k 31,944k
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 15.9% 14.9% 15.5% 15.6% 15.7% 15.8% 15.7%
Absolute poverty, before housing costs: children 23.7% 20.9% 21.6% 21.4% 21.6% 21.8% 21.7%
Absolute poverty, before housing costs: working-age adults 13.8% 13.4% 14.0% 14.1% 14.2% 14.3% 14.3%
Absolute poverty, before housing costs: pensioners 13.7% 13.1% 13.2% 13.4% 13.5% 13.6% 13.6%
Absolute poverty, after housing costs: everyone 21.1% 20.6% 21.3% 21.5% 21.9% 22.2% 22.3%
Absolute poverty, after housing costs: children 32.1% 30.3% 30.9% 31.1% 31.7% 32.3% 32.5%
Absolute poverty, after housing costs: working-age adults 19.6% 19.4% 20.2% 20.4% 20.8% 21.0% 21.0%
Absolute poverty, after housing costs: pensioners 12.7% 12.5% 12.6% 12.9% 13.0% 13.1% 13.4%
Relative poverty, before housing costs: everyone 16.9% 16.4% 16.4% 16.5% 16.6% 16.7% 16.7%
Relative poverty, before housing costs: children 25.6% 23.5% 23.2% 23.2% 23.3% 23.4% 23.4%
Relative poverty, before housing costs: working-age adults 14.4% 14.4% 14.7% 14.8% 14.9% 15.1% 15.0%
Relative poverty, before housing costs: pensioners 14.8% 14.9% 14.1% 14.3% 14.2% 14.2% 14.4%
Relative poverty, after housing costs: everyone 21.7% 21.3% 21.4% 21.5% 21.7% 21.8% 22.0%
Relative poverty, after housing costs: children 33.0% 31.6% 31.2% 31.1% 31.5% 31.6% 32.0%
Relative poverty, after housing costs: working-age adults 20.0% 20.0% 20.3% 20.4% 20.6% 20.8% 20.9%
Relative poverty, after housing costs: pensioners 13.5% 13.1% 12.7% 12.8% 12.7% 12.7% 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,427k 10,848k 10,947k 11,079k 11,209k 11,220k
Absolute poverty, before housing costs: children 3,560k 3,141k 3,261k 3,253k 3,298k 3,334k 3,335k
Absolute poverty, before housing costs: working-age adults 5,864k 5,737k 6,070k 6,165k 6,237k 6,315k 6,321k
Absolute poverty, before housing costs: pensioners 1,627k 1,549k 1,517k 1,529k 1,544k 1,561k 1,565k
Absolute poverty, after housing costs: everyone 14,659k 14,362k 14,899k 15,116k 15,444k 15,724k 15,870k
Absolute poverty, after housing costs: children 4,809k 4,556k 4,676k 4,719k 4,835k 4,939k 4,994k
Absolute poverty, after housing costs: working-age adults 8,333k 8,326k 8,775k 8,931k 9,122k 9,275k 9,329k
Absolute poverty, after housing costs: pensioners 1,518k 1,480k 1,449k 1,466k 1,487k 1,509k 1,547k
Relative poverty, before housing costs: everyone 11,760k 11,456k 11,504k 11,625k 11,706k 11,868k 11,916k
Relative poverty, before housing costs: children 3,840k 3,538k 3,514k 3,525k 3,546k 3,582k 3,603k
Relative poverty, before housing costs: working-age adults 6,154k 6,160k 6,365k 6,465k 6,537k 6,651k 6,652k
Relative poverty, before housing costs: pensioners 1,766k 1,758k 1,625k 1,634k 1,623k 1,634k 1,661k
Relative poverty, after housing costs: everyone 15,065k 14,863k 14,993k 15,090k 15,319k 15,490k 15,653k
Relative poverty, after housing costs: children 4,948k 4,756k 4,711k 4,715k 4,798k 4,840k 4,919k
Relative poverty, after housing costs: working-age adults 8,511k 8,559k 8,822k 8,917k 9,070k 9,192k 9,260k
Relative poverty, after housing costs: pensioners 1,605k 1,548k 1,460k 1,458k 1,452k 1,457k 1,475k
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.3074 0.3051 0.3065 0.3071 0.3077 0.3083 0.3094
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,707 † £17,997 † £17,941 † £17,992 † £18,326 † £18,523 † £18,684 †
Decile 2: mean household_net_income per household £28,362 † £29,049 † £28,672 † £29,013 † £29,373 † £29,779 † £30,332 †
Decile 3: mean household_net_income per household £34,607 † £35,886 † £36,508 † £37,008 † £37,263 † £37,824 † £38,511 †
Decile 4: mean household_net_income per household £39,329 † £40,908 † £41,807 † £42,695 † £43,186 † £43,984 † £45,129 †
Decile 5: mean household_net_income per household £44,871 † £46,147 † £47,077 † £47,609 † £48,379 † £49,251 † £50,073 †
Decile 6: mean household_net_income per household £47,930 † £49,324 † £50,272 † £51,070 † £52,170 † £52,939 † £54,222 †
Decile 7: mean household_net_income per household £56,320 † £57,578 † £58,469 † £59,414 † £60,124 † £61,607 † £63,192 †
Decile 8: mean household_net_income per household £69,250 † £70,361 † £71,635 † £72,869 † £74,327 † £75,790 † £77,563 †
Decile 9: mean household_net_income per household £79,686 † £82,010 † £83,245 † £84,446 † £86,085 † £87,570 † £90,640 †
Decile 10: mean household_net_income per household £117,623 † £120,464 † £122,413 † £124,563 † £126,773 † £129,082 † £131,885 †
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.22bn £6.50bn £6.71bn £6.90bn £7.11bn £7.35bn £7.62bn
Raise higher rate by 1pp £3.54bn £3.82bn £4.05bn £4.27bn £4.49bn £4.76bn £4.96bn
Raise personal allowance by ~800GBP/year £-3.83bn £-3.96bn £-4.03bn £-4.10bn £-4.20bn £-4.30bn £-2.02bn
Raise child benefit by 25GBP/week per additional child £-2.00bn £-1.76bn £-1.64bn £-1.54bn £-1.44bn £-1.34bn £-1.24bn
Reduce Universal Credit taper rate to 20% £-20.54bn £-21.09bn £-21.45bn £-21.87bn £-21.95bn £-22.32bn £-22.79bn
Raise Class 1 main employee NICs rate to 10% £11.06bn £11.51bn £11.83bn £12.14bn £12.47bn £12.81bn £13.29bn
Raise VAT standard rate by 2pp £25.01bn £25.68bn £26.29bn £26.92bn £27.58bn £28.26bn £28.95bn
Raise additional rate by 3pp £2.83bn £3.07bn £3.27bn £3.47bn £3.67bn £3.91bn £4.23bn
Raise the Universal Credit standard allowance by 10% £-3.04bn £-3.17bn £-3.24bn £-3.32bn £-3.37bn £-3.42bn £-3.47bn
Raise the State Pension by 10% £-8.92bn £-9.13bn £-9.03bn £-9.06bn £-9.26bn £-9.51bn £-9.78bn
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.36bn £6.65bn £6.87bn £7.07bn £7.29bn £7.53bn £7.81bn
Raise higher rate by 1pp: change in income_tax £3.55bn £3.83bn £4.06bn £4.28bn £4.50bn £4.78bn £4.97bn
Raise personal allowance by ~800GBP/year: change in income_tax £-3.96bn £-4.11bn £-4.19bn £-4.27bn £-4.36bn £-4.47bn £-1.77bn
Raise child benefit by 25GBP/week per additional child: change in child_benefit £2.34bn £2.15bn £2.03bn £1.92bn £1.82bn £1.71bn £1.59bn
Reduce Universal Credit taper rate to 20%: change in universal_credit £20.53bn £21.08bn £21.44bn £21.86bn £21.95bn £22.32bn £22.78bn
Raise Class 1 main employee NICs rate to 10%: change in national_insurance £11.33bn £11.79bn £12.13bn £12.44bn £12.78bn £13.13bn £13.62bn
Raise VAT standard rate by 2pp: change in vat £25.01bn £25.68bn £26.29bn £26.92bn £27.58bn £28.26bn £28.95bn
Raise additional rate by 3pp: change in income_tax £2.83bn £3.07bn £3.27bn £3.47bn £3.67bn £3.91bn £4.23bn
Raise the Universal Credit standard allowance by 10%: change in universal_credit £3.04bn £3.17bn £3.25bn £3.32bn £3.37bn £3.43bn £3.47bn
Raise the State Pension by 10%: change in state_pension £12.25bn £12.71bn £12.83bn £13.02bn £13.41bn £13.80bn £14.21bn

Resolve the conflict with #2523 (9387f49), which derives the UC benefit cap
earnings threshold from 16 hours at the national living wage in
uc_benefit_cap_earnings_exception_threshold. is_uc_benefit_cap_exempt_earnings
now reads that variable, keeping this PR's per-claimant earned income comments
and references. The PR's own dated parameter gov.dwp.benefit_cap_earnings_exemption
is removed: main's variable gives the same 604 to 881 a month for 2020-21 to
2026-27 and also covers earlier years, so keeping both would be two sources
for one threshold. The changelog fragment drops the parameter bullet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@vahid-ahmadi

Copy link
Copy Markdown
Collaborator Author

@juaristi22 I merged main (88fd2be) to clear the conflict with your #2523 (9387f49). is_uc_benefit_cap_exempt_earnings now reads your uc_benefit_cap_earnings_exception_threshold, and I dropped this PR's duplicate parameter gov.dwp.benefit_cap_earnings_exemption and its changelog bullet, so there is one source for the threshold. The figures are the same as the ones you approved (£604 to £881 a month for 2020-21 to 2026-27, checked year by year), and the per-claimant earned income references and the regression tests are unchanged. Full YAML suite 4,023 passed; the benefit cap Python tests 74 passed.

🤖 Generated with Claude Code

@vahid-ahmadi vahid-ahmadi changed the title Fix benefit cap exemption defects (#1818) Pin benefit cap exemption rules with regression tests and legal references (#1818) Oct 21, 2026
@MaxGhenis
MaxGhenis added this pull request to the merge queue Oct 21, 2026
Merged via the queue into main with commit 09a236a Oct 22, 2026
16 of 17 checks passed
@MaxGhenis
MaxGhenis deleted the fix/benefit-cap-exemption-defects branch October 22, 2026 00:06
@MaxGhenis

Copy link
Copy Markdown
Collaborator

Merged by the UK hub (session local_8e19f9d5, Opus 5.5) on Max's explicit instruction to merge the team's ready PRs before the Budget (21 October, about 23:00Z: "go ahead and merge them. none of us has time to wait on each other"). One merge-queue enqueue, pinned to head 88fd2be572a92a3de6734e15ea3786eab0a4b9f1.

  • Gates at this head: every check passes; GitHub reports MERGEABLE; not a draft; vahid-ahmadi, review decision APPROVED. The merge queue re-tests against current main.
  • Review: no independent agent review was run at this head before merging, on Max's instruction. Any finding after merge goes to a follow-up PR.
  • Budget: the Budget runs on a locked pe-uk release (microcosm#1333). This change reaches Budget-day numbers only if the lock moves to a release that contains it.

🤖 Generated with Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci-recheck Re-triggers Fix evidence without changing the PR (UK hub, 2026-10-12)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants