Repository navigation
Set DWP benefit rates to the announced amounts, not CPI projections - #1925
Conversation
Audited every parameter under gov/dwp against DWP's "Benefit and pension rates" publications (each fiscal year 2019-20 to 2026-27 appears in two editions) and, for 2025-26 and 2026-27, the Social Security Benefits Up-rating Orders (SI 2025/295, SI 2026/148). Tax credit rates were checked against HMRC's rates page and the Tax Credits Up-rating Regulations. - 2025-26 values written as 2024-25 x 1.017 without DWP's rounding, or on the wrong basis, now match the Order: Pension Credit standard minimum guarantee 227.10/346.60 (earnings-linked, not CPI), savings credit threshold, the pension-age Housing Benefit allowances 244.40/366.00, working-age HB allowances, carer premium and addition, AA, DLA, PIP, Carer's Allowance, SDA. - Parameters uprated from a fixed start_instant (legacy disability premiums, Constant Attendance Allowance, Pension Credit child and severe disability additions) had every later published rate overwritten by projections and jumped when projections began. Their full published history is written out and start_instant removed. - Income Support personal allowances held the 2020-21 rate from 2015 and were CPI-uprated from there: 8-10% too high every year. - The carer premium for two carers is paid for each carer, so twice the rate. - Housing Benefit non-dependant deductions: 2019-20, 2020-21 and 2025-26 bands and amounts added, and the 2022 bands moved off 2021-22 (the 2021 Order left them unchanged). - WTC childcare limits (175/300, also Housing Benefit's childcare limit) and the CTC family element (545) are fixed in law and no longer projected. - UC 2020-21 standard allowances and child element, UC non-dependant deduction, IIDB, and the unread ESA/JSA amount parameters also corrected. - The pension-age HB allowances cite SI 2006/214 Sch 3 para 1 (and NI SR 2006/406) instead of the working-age SI 2006/213. Tests: test_dwp_published_rates.py checks every audited parameter against a fixture of the published rates for each year, that no fixed-start uprating remains, and that projections continue from the last published rate; YAML tests check the 2025-26 amounts through the variables that use them. Existing tests that pinned the old projected values are updated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ctions
- Income Support personal allowances and the ESA couple rate: set the 2015 keys
to the 2015-16 rates (frozen to 2019-20), so 2015-18 no longer use the
2020-21 rate; IIDB 2015-18 set to the published rates. The fixture covers
these years.
- Housing Benefit non-dependant deductions: bands include their lower edge
("not less than", HB Regs 2006 reg 74(2)), and a non-dependant with no
income pays the lowest deduction (reg 74(1)(b)). The HB and CTR formulas no
longer call the scale with right=True, which put £183.00 in the band below
and gave £0 income no deduction. The scale is now uprated after 2026-27
instead of frozen.
- The income-related ESA personal allowances cite the Universal Credit Act
2025 s.5 for 2026-27, not SI 2026/148.
- Tests: the two-carer premium is twice the one-carer premium in every year;
the non-dependant table, edges and monotonicity for 2019-20 to 2026-27;
derived fixture rows are labelled.
- Removed the carer premium's 2010 key (the one-carer rate) and titled a bare
GOV.UK reference.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Response to the independent review (Opus, subfleet job 20260930-092129-review-1925), addressed in 45290f3:
Re-run after the changes:
The review didn't run tests or the impact itself, so those are this session's runs. |
|
Reviewed: approve with nits. Every value I checked is right. I checked every 2024-2026 test value against DWP's 2025-26 and 2026-27 "Benefit and pension rates" pages. 113 of 131 appear there, and the other 18 are explained (doubled or combined rows, HMRC tax credits, a percentage). Checked by hand:
The two-carer doubling is correct (
CI Test and two smoke-import jobs were still pending when I looked. |
The follow-up review (GPT-6.1 Sol) found that making zero income pay the lowest non-dependant deduction charges non-dependants whom HB Regs 2006 reg 74(7) exempts (e.g. a full-time student with no income): the eligibility variable checks only age and rent liability, and the old strict banding had been giving zero income no deduction. The correct fix applies the reg 74(6)-(7) exemptions together with the inclusive bands, in HB and CTR, so it moves to its own PR. This PR keeps the published non-dependant bands and amounts and their uprating, and restores the formulas and their tests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Follow-up review (GPT-6.1 Sol, subfleet job 20260930-114706-rereview2-1925-1913, which ran the tests and reproduction scripts) on 45290f3:
Impact re-run at 1233fe4; the body table is from that run. 2025-26 is unchanged (net income +£606m). 2026-27 is +£0.2m. 2027-28 on is about −£10m a year. The tests pass: 1,335 in |
Codex review — historical-source verification remainsReviewed commit No actionable code defect or mismatch was found in the independently checked rate samples. The earlier non-dependant banding formula change is absent from this head, so that old regression should not block this PR. The new regression fixture exercises loaded model parameters and future uprating; it is authored in this PR and therefore is not independent proof of every historical value. Source checks corroborated the named current rates in DWP 2025/26 and 2026/27, plus ESA/IIDB/carer samples using the official 2019/20, 2021/22 and 2023/24 tables. No mismatch was found in those samples. Complete historical reconciliation is still needed before I can give a fresh source-based merge recommendation; existing human approval is separate evidence. Outstanding evidence/decision:
Validation: 1,404 focused tests passed, with 61 expected skips for inapplicable uprating/ended series. Tests include the loaded parameter fixture and final Pension Credit/household-income integration. Five official HTML originals were inspected and their cached bytes verified. The full 2015–2026 historical table was not independently reconciled cell by cell. Focused tests used an existing cached Python 3.13 environment (Core 3.32.9, NumPy 2.1.3, pandas 2.3.1, microdf-python 1.2.1, Hypothesis 6.168.2, pytest 8.4.2) with this PR’s isolated source snapshot. No dependencies were installed; this was not a freshly synced lock environment or a full-suite/population run. This is a review comment, not a formal GitHub review vote. Live check before posting (2026-10-02T10:41:02.821043+00:00): same commit, CLEAN; all reported CI checks pass. |
|
Review pass (Claude Code, on Vahid's behalf) at Short version: still approve, with one small should-fix on the historical years. The open question on this PR is whether the 2015–2018 cells are reconciled. They are, for the 21 parameters the fixture covers from 2015. Two series it doesn't cover still carry a later rate back into 2015–2018, and the 2018-19 DWP rates PDF shows the right values. Round-1 items
Historical-source verification (the outstanding request) I evaluated the parameters at 30 April of each year from 2015 to 2027 on this branch and compared them with the fixture and with DWP's own tables.
Should-fix
Nit
Checked and correct
|
|
Coordination note from #2051, which fixes the Child Tax Credit family element (#2050). This PR's hunk in
It keeps this PR's two reference entries verbatim. Whichever PR merges second should take #2051's version of that file. Nothing else in the two PRs overlaps. #1759 (WTC 30-hour element) is fixed by this PR's |
Main's new tests pinned the CPI-projected 2025-26 rates; they now use the published ones (DWP, Benefit and pension rates 2025 to 2026; SI 2025/295): - HB and IS personal allowances (legacy_claimant_relationships, legacy_family_definitions): 92.05, 72.90, 144.65 and 110.15 a week, not 92.04, 72.92, 144.67, 110.14 (HB) or 101.00, 80.01, 158.67 (IS). - HB childcare limit for one child: 175 a week, not 312.06. - WTC childcare limit for one child in 2020-21: 175 a week, not 248.64. - UC couple standard allowance in 2020-21: 594.04 a month, not 596.58. - PC carer addition 2025-26: 46.40 a week (main's test had 46.37). This PR's own 2025-26 tests now set the inputs main's formulas read (claimant and partner ages, Carer's Allowance entitlement, disabled claimants or partners). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#2001 deleted carer_premium/couple.yaml and pays the premium per qualifying person, so couple.yaml stays deleted and care.yaml takes main's version. single.yaml keeps main's 2025 legal reference and both sets of metadata references. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Describe fixed-start uprating as core implements it: years without a key, and every year after the last key, are projected from the start value (changelog, test docstring). - Invariant 3 leaves out the UC standard allowances and LCWRA element, which the Universal Credit Act 2025 ss.1 and 3 do not uprate by CPI. - Drop the two-carer invariant and fixture row: #2001 deleted carer_premium/couple.yaml and pays the premium per qualifying person. - PC carer addition: add the 2018-19 rate, £36.00, so 2019-20's is not backdated. - Main's tests that pinned projected 2025-26 rates now use the published ones: PC minimum guarantee £227.10, HB/CTR allowance £92.05, Carer's Allowance £83.30. - Fix stale test names and comments, the dead SI 2025/234 link, the tax credit up-rating regulation titles, the fixture header (UC 2021-22) and six truncated fixture labels. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Coordination note from #2284 (fixes #2280), which implements the Universal Credit Act 2025 s. 3 freeze this PR's continuity test (invariant 3) skips. What the Act says. s. 3(1) disapplies SSAA 1992 s. 150(1) and (2) for the LCWRA and LCW elements "in the tax years ending with 5 April 2026, 5 April 2027, 5 April 2028 and 5 April 2029". Those are the years in which the review is made. An order takes effect from the first Monday of the following tax year (s. 150(10)(a)(i)), so the frozen rates are those for 2026-27 to 2029-30, as this PR's docstring already says and as the section's heading says. The review report read it as ending with 2028-29; 2029-30 is frozen too. Uprating resumes in 2030-31. What #2284 does. The one-line change. With #2284 in, this parameter no longer needs the skip: UC_ACT_2025_EXCEPTIONS = {
"gov.dwp.universal_credit.standard_allowance.amount.SINGLE_YOUNG",
"gov.dwp.universal_credit.standard_allowance.amount.SINGLE_OLD",
"gov.dwp.universal_credit.standard_allowance.amount.COUPLE_YOUNG",
"gov.dwp.universal_credit.standard_allowance.amount.COUPLE_OLD",
- "gov.dwp.universal_credit.elements.disabled.amount",
}Checked on a local merge of #2284 (b30bc54) and this branch (e1bf98b) with that line removed: Whichever of the two PRs merges second should make the change (and update the invariant 3 docstring and the comment above the set). If this PR merges first, I will do it in #2284. |
|
Merged at the reviewed head e1bf98b (merge commit 4dfc979). Gates: |
…cohorts council_tax_reduction_applicable_amount takes main's is_council_tax_reduction_lone_parent and single definitions, with this PR's cohort amounts after them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… fixes - test_housing_benefit_pension_age_cohorts: STATUTE_HIGHER_RATES holds SI 2006/214 Sch 3 para 1(1)(b)/(2)(b) for 2021-22 to 2026-27, now that #1925 set them to the published amounts, so both rates are hard-coded from law. - From #1925's review: the rates fixture header and test docstring say 2026-27 has only its own edition so far (and name UC's 2021-22 exception), and a CTR test comment shows 7,199.40 and 1,173.56. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Summary
Closes #2110.
An agent reported on 2026-09-29 that PolicyEngine UK's 2025-26 DWP parameters look CPI-projected rather than announced. I audited every parameter under
parameters/gov/dwp/(254 series) against DWP's Benefit and pension rates publications, and fixed the values and their references.Each fiscal year from 2018-19 to 2025-26 appears in two editions: that year's, and the next year's previous-year column. I checked both. 2026-27 has only its own edition so far, which I checked against SI 2026/148. For 2025-26 and 2026-27 I also checked the Social Security Benefits Up-rating Orders (SI 2025/295, SI 2026/148). Tax credits were checked against HMRC's rates page and the Tax Credits Up-rating Regulations. An independent verifier re-derived every published amount. As a differential check, the fixture was also compared with a separate extraction from DWP's rate PDFs (2014-15 to 2026-27) and the 2010-2013 Up-rating Orders. That extraction was made by another session for its own uprating work, and all 367 overlapping values agree.
The report was right, and the problem was wider than 2025-26.
start_instant: years without a key were projected from the start value, and from 2027-28 projections restarted from it rather than from the latest published rate. The premiums and CAA held only a 2015 key, set at the 2020-21 rate, so 2027-28 jumped by up to 12%References.
allowances/{single,couple,lone_parent}/aged.yaml) cited SI 2006/213 Sch 3, the working-age regulations. They now cite SI 2006/214 Sch 3 para 1(1)(b)/(2)(b), plus NI SR 2006/406 Sch 4 para 1, and their descriptions say they are the rates for people who reached State Pension age before 1 April 2021.Not in this PR:
right=True, so a lower edge falls in the band below and zero income pays nothing, and they don't apply the reg 74(6)-(7) exemptions (e.g. full-time students). Fixing the banding without the exemptions charges exempt people, so both go in a separate PR.gov.benefit_uprating_cpifrom 2027-28. The September-CPI uprating work and its follow-up (PC SMG earnings) cover the basis.housing_benefit/means_test/income_disregard/*): Take Housing Benefit earnings disregards from net earnings only #1908, now merged.housing_benefit/takeup.yaml: owned by Abolish working-age Housing Benefit from 1 July 2026 (NI 1 October 2026) #1910.LHA.means_test.*parameters.start_instant(e.g.agedholds £181 for 2015-18, the 2019-20 rate).Tests
test_dwp_published_rates.py+fixtures/dwp_benefit_and_pension_rates.yaml: 130 parameters, each with its published rate per fiscal year and a source URL per year, plus the non-dependant deduction table. The derived row (SDA with the age addition) is labelled. Invariants:benefit_rates_2025_26.yaml: YAML tests of 2025-26 amounts through the variables that use them: PC minimum guarantee, HB allowances (working-age and pension-age), IS allowances, disability and carer premiums, AA/DLA/PIP, CA.legacy_claimant_relationships,legacy_family_definitions): £92.05, £72.90, £144.65 and £110.15 a week, not HB's £92.04, £72.92, £144.67 and £110.14 or IS's £101.00, £80.01 and £158.67;carer_premium/couple.yaml, so this PR no longer sets it.test_dwp_published_rates.py1,291 passed and 66 skipped (61 series that end before 2026-27 or are not uprated, and the 5 UC Act 2025 exceptions); the full YAML suite passes (2,972). CI runs the full pytest suite.Impact (Enhanced FRS 2024-25)
These are two real runs over the same dataset:
main(3173baa) and this PR (e1bf98b), fiscal years 2025-26 to 2030-31, both on policyengine-core 3.33.2. Nothing is scaled.would_claim_pc); 14.2k more benefit units get Pension Credit.main, the disability, enhanced and severe disability premiums are uprated from a 2015 start value and jump in 2027-28 (single disability premium £44.85 → £50.22; single severe disability premium £86.05 → £96.20); here they go to £45.88 and £88.03. In 2027-28, rerunning this PR withmain's premium files puts −£0.83m of the −£1.09m HB change and −£2.14m of the −£2.16m CTR change on the premiums. The −£1.6m of Pension Credit, which changes for 816k benefit units, does not come from the premiums.Axiom
axiom: 2025-26 rates (SI 2025/295) queued TheAxiomFoundation/rulespec-uk#382 | 2026-27 rates encoded-correct where encoded (uk/regulations/uksi/2026/148/*, HB/PC/ESA pipelines) | IS and income-based JSA personal allowances queued TheAxiomFoundation/rulespec-uk#382 | HB childcare limits (SI 2006/213 reg 27(3), SI 2006/214 reg 30(3)) queued TheAxiomFoundation/rulespec-uk#382 (step 5)uk/regulations/uksi/2026/148/article/{4,6,14}.yaml,schedule/1.yamland the program pipelines). No module has a 2025-26 amount:git grep … origin/main -- ukon 1bdb9837 finds none of 227.10, 346.60, 244.40, 366.00, 92.05, 144.65, 72.90, 43.20, 61.65, 83.30, 46.40, 198.27 or 314.34.uksi/2002/1792/6.yaml(PC minimum guarantee and additions) applies the 2026-27 amounts to every earlier period througheffective_from: '0001-01-01'versions, so for 2025-26 it is wrong, not just missing.govuk/carers-allowance.yamlhas a0001-01-01version too, but the rate it imports (SI 2026/148 Sch 1) starts on 2026-04-06, so for 2025-26 it has no value.review_findingand companion tests whose expectations are this PR's fixture values.🤖 Generated with Claude Code