Skip to content

Freeze the UC LCWRA element for 2026-27 to 2029-30 (UC Act 2025 s. 3) - #2284

Draft
MaxGhenis wants to merge 7 commits into
mainfrom
uc-lcwra-s3-freeze
Draft

MaxGhenis wants to merge 7 commits into
mainfrom
uc-lcwra-s3-freeze

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 10, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #2280.

What was wrong

gov.dwp.universal_credit.elements.disabled.amount, the LCWRA element (£217.26 a month from April 2026), was uprated by gov.benefit_uprating_cpi. The model therefore projected £222.26 for 2027-28, £226.70 for 2028-29, £231.24 for 2029-30 and £235.86 for 2030-31. The Universal Credit Act 2025 freezes the element for 2026-27 to 2029-30.

The law

Universal Credit Act 2025 s. 3(1):

Subsections (1) and (2) of section 150 of the Social Security Administration Act 1992 (annual up-rating of benefits) do not apply, in the tax years ending with 5 April 2026, 5 April 2027, 5 April 2028 and 5 April 2029, to the LCWRA element or the LCW element.

The disapplied years are the years in which the review is made, not the years whose rates are frozen:

  • SSAA 1992 s. 150(1) has the Secretary of State review the Universal Credit amounts (s. 150(1)(n)) in each tax year.
  • An up-rating order brings its changes into force "in the week beginning with the first Monday in the tax year following that in which the order is made" (s. 150(10)(a)(i)). For Universal Credit, that is from the first assessment period beginning on or after that day (s. 150(10ZA)-(10ZB)).
  • So the four disapplied reviews (2025-26 to 2028-29) are the ones that would have changed the rates for 2026-27 to 2029-30, the years the section's heading names: "Freeze of LCWRA and LCW elements for tax years 2026-27 to 2029-30".

DWP's 2026-27 rates confirm the first year. The LCW element stayed at £158.76, while the lower disabled child addition, also £158.76 in 2025-26, rose to £164.79 (3.8%).

The review in 2029-30 is not disapplied, so the element can rise again from April 2030. s. 150(3), which lists the sums that must rise at least with prices, does not include the Universal Credit amounts, so the 2030-31 increase is discretionary under s. 150(2)(b). The model assumes it follows the benefit uprating index, as for every other UC amount. s. 150(2) provides only for increases, so the element never falls.

The report that started this (on #1925) said the freeze runs "through the tax year ending 5 April 2029", meaning no CPI uprating in 2027-28 or 2028-29. Read with s. 150(10), it runs a year longer: 2029-30 is frozen too.

Scope

  • The LCW element (reg. 27, saved for pre-April 2017 claimants) is not modelled in PolicyEngine UK, so nothing else changes.
  • s. 3 also freezes the protected (pre-2026) LCWRA amount. s. 4 then requires increases to it, which universal_credit_july_2025_reform applies for 2026-27 to 2029-30 (Pay pre-2026 UC health element claimants the legislated protected amount #2248, merged). This PR does not change that.

Changes

  • rebalancing/health_element_freeze.yaml (new, bool): true for the rates of 2026-27 to 2029-30, keyed from 6 April 2026 and false from 6 April 2030. Each value cites s. 3(1).
  • rebalancing/create_health_element_uprating.py (new) runs in process_parameters, after the economic assumption indices and threshold indexation and before uprating. It builds gov.dwp.universal_credit.elements.disabled.uprating. That index is gov.benefit_uprating_cpi as uprating will extend it, with any reform to it included and each year read at the 30 April sampling date. It stays flat in each year where health_element_freeze and rebalancing.active are both true, and it never falls.
  • elements/disabled/amount.yaml is uprated by that index. Its description now names the new-claimant row and the freeze, and it cites ss. 2 and 3.
  • rebalancing/new_claimant_health_element.yaml is uprated by the same index. For 2026-27 to 2029-30, universal_credit_july_2025_reform pays new claimants this second copy of the s. 2 amount, which was a flat £217.26. Without this change, lifting the freeze would have moved the parameter but no simulated award in those years (review round 1). The two amounts now follow one path.
  • Docs. uc-rebalancing.md explains the freeze, says which of the two parameters a simulation reads in which years, and gives an example of lifting the freeze.

The result. The element is £217.26 a month for 2026-27 to 2029-30. From 2030-31 it rises by one year's benefit-index growth at a time, from £217.26 rather than from a CPI path that also counts the frozen years: £221.60 for 2030-31, against £235.86 on main.

Reforms

Design notes

Review

Independent reviews on Subfleet, read-only:

  • Round 1 (Opus 5.5, head b30bc54): request changes. Lifting the freeze did not reach simulated new claimants in 2026-29, because the reform modifier pays them a second, flat copy of the s. 2 amount. Fixed in f68400f by uprating that copy by the same index. Three nits: two fixed, the label kept stable per model-structure.md.
  • Round 2 (GPT-6.1 Sol, head f68400f): request changes. The uprating index stopped at the calendar year of the last benefit-index entry, so a value dated after 30 April was lost. Reproduced and fixed in this head's predecessor commit; two nits fixed.
  • Round 3 (GPT-6.1 Sol, head ebe82be): running.

Files: ~/reviews/uk-lcwra-s3-freeze/review-r{1,2,3}.md and the responses beside them.

Invariants

  1. Freeze. In each tax year where health_element_freeze and rebalancing.active are both true (2026-27 to 2029-30 in law), the amount equals the previous year's, for any CPI path.
  2. Uprating otherwise. In any other year the amount is the previous year's × max(1, the benefit index's growth). It never falls, and with non-negative CPI it grows exactly with the benefit index.
  3. Differential. On the full pipeline, the amount equals an independent recursion over the processed benefit index, read at the 30 April sampling date, for 2026-27 to 2040-41, in both parameters.gov and the unconverted parameters.baseline. This holds also when a benefit-index value is dated after 30 April: it reaches the next tax year (review round 2).
  4. Reforms take effect.
    • A changed amount is held, then uprated, from its value.
    • Switching the freeze or the reforms off restores CPI uprating.
    • A different CPI forecast leaves the frozen years alone and moves the later ones.
  5. One path. rebalancing.new_claimant_health_element equals elements.disabled.amount in every year from 2026-27, under any freeze schedule or CPI path. So a lifted freeze reaches a simulated new claimant.

Tests

policyengine_uk/tests/test_uc_health_element_freeze.py (21 tests):

  • Examples. £217.26 in each of 2026-27 to 2029-30. 2030-31 = £217.26 × one year of benefit-index growth, below main's four-year path. A household with LCWRA gets 12 × the 2030-31 amount.
  • Differential. Invariant 3.
  • A benefit-index change after 30 April. A one-year change from 1 June 2038 restores the stated value on 1 June 2039, which first shows in 2040-41. Both amounts follow it there (£434.52 against the recursion's £434.52; before the fix they stayed at £217.26).
  • Reforms on the full pipeline:
    • freeze off, or active off: CPI uprating from 2027-28, main's path;
    • 2028-29 unfrozen: that year uprates and 2029-30 holds;
    • a one-year £250 amount for 2027-28;
    • a reform= dict.
  • One path. Invariant 5 on the baseline, in the freeze and CPI reform tests, and in the tree properties. In a simulation, a forced new claimant gets £217.26 a month in each of 2026-27 to 2029-30. With the freeze lifted for 2028-29 and 2029-30, they get £217.26 × the benefit index's growth in those years (£221.60, then £226.04) and £217.26 in 2027-28. The test states the claim status too where Stop deciding a household's UC health element rate by its position #2251's input exists, so it holds before and after Stop deciding a household's UC health element rate by its position #2251.
  • Hypothesis, full pipeline: random OBR CPI paths for 2025-2032 (−5% to +15%, through Scenario(applied_before_data_load=True)). Frozen years stay at £217.26, and later years follow invariant 2.
  • Hypothesis, small parameter tree run through the same builder and core's uprate_parameters (200 examples each):
    • any CPI path, falling prices included;
    • exact CPI growth after the freeze;
    • any schedule of frozen and inactive years;
    • a reformed amount from any year;
    • up to three benefit-index values at any date, including after 30 April and after the last uprating entry.

uc_LCWRA_element.yaml: 2027, 2028 and 2029 cases at £2,607.12 a year (12 × £217.26).

Mutation check. Each of these fails tests:

  • main's uprating (gov.benefit_uprating_cpi): 8 pytest cases and the 3 new YAML cases.
  • No floor on falls: 3 properties.
  • Ignoring rebalancing.active: 2 tests.
  • No uprating on new_claimant_health_element: 5 tests.
  • The year range ending at the last entry's calendar year (the round 2 bug): 2 tests.

Local runs (one process each, fresh --basetemp):

  • At ebe82be (round 2 fix, main 4d80b29 merged): the new file with test_uc_rebalancing.py, test_no_economic_assumptions.py, test_fiscal_year_parameters.py and test_threshold_indexation.py: 141 passed, 1 xpassed. UC YAML policy tests: 417 passed.
  • Before merging main and before the review fix: the new file with test_uc_rebalancing.py, test_parameter_metadata.py, test_build_metadata.py, test_fiscal_year_parameters.py, test_no_economic_assumptions.py, test_threshold_indexation.py, test_lagged_series.py and code_health/test_cached_arrays_not_written_in_place.py: 225 passed, 1 skipped, 1 xpassed.
  • At the current head: test_parameter_metadata.py, test_build_metadata.py, test_fiscal_year_parameters.py, test_no_economic_assumptions.py, test_threshold_indexation.py, test_lagged_series.py and code_health/test_cached_arrays_not_written_in_place.py: 204 passed, 1 skipped, 1 xpassed. UC YAML policy tests (tests/policy/baseline/finance/benefit/family/universal_credit): 417 passed.
  • Ruff format and check: clean.
  • The full suite was not run locally; CI runs it.

Impact

Two full microsimulation runs on enhanced_frs_2024_25.h5@1.58.0: main at 9475c95 and this branch at f68400f, for 2026-27 to 2030-31. Nothing is scaled. £bn, branch minus main.

2026 2027 2028 2029 2030
universal_credit 0 0 0 0 −0.407
uc_LCWRA_element (every benefit unit with LCWRA) 0 0 0 0 −1.212
gov_balance 0 0 0 0 +0.406
household_net_income 0 0 0 0 −0.406

2026-27 to 2029-30: nothing changes, in any household or benefit unit (the largest change in any of the four variables is exactly 0). In those years universal_credit_july_2025_reform sets every claimant's element: new claimants from rebalancing.new_claimant_health_element, which was already a flat £217.26, and protected claimants from the s. 4 floor. So simulated awards already had the freeze. What was wrong before 2030-31 was the parameter itself, which is what a calculation without the modifier reads (the YAML test runner, or rebalancing.active false) and what the parameter listing shows.

2030-31: the element is £221.60 a month, not £235.86, which is £14.25 a month or £171.05 a year lower for each claimant with LCWRA.

  • Losers: 2.22m households (7.0% of households, 4.70m people) lose £406m in total, £183 a year on average.
    • 1.93m lose exactly £171.05 (one claimant) and 0.15m exactly £342.10 (two).
    • The range is £0.07 to £855.
  • Winners: none.
  • Universal Credit falls for 2.23m benefit units. uc_LCWRA_element is computed for every benefit unit with LCWRA, on Universal Credit or not (6.64m), so it moves by more than Universal Credit does.

Read the 2030-31 figures with #2282 in mind. From 2030-31 the model pays elements.disabled.amount to every LCWRA claimant, including protected claimants who keep a much higher amount in law. On main, uc_LCWRA_element falls from £32.3bn in 2029-30 to £20.1bn in 2030-31 for that reason; here it falls to £18.8bn. This PR corrects the amount new claimants get in 2030-31. Its effect is spread over all claimants only because of #2282. Once #2282 is fixed it will apply to new claimants alone, and the national figure needs a new run then.

Overlaps

Follow-ups (not in this PR)

axiom: TheAxiomFoundation/rulespec-uk#367 queued (UC Act 2025 s. 3, labelled pe-parity; s. 3 companion cases added there). The encoder path is blocked: uk/statute/ukpga/2025/22/3 is not in the served corpus (404 on 2026-10-10). rulespec-uk uk/regulations/uksi/2013/376/36.yaml lcwra_ordinary_claimant_amount is 217.26 with no later version, which agrees for the frozen years.

🤖 Generated with Claude Code

MaxGhenis and others added 4 commits October 10, 2026 18:45
Universal Credit Act 2025 s. 3(1) disapplies SSAA 1992 s. 150(1) and (2)
for the LCWRA and LCW elements in the tax years ending 5 April 2026 to
5 April 2029. An up-rating order takes effect from the tax year after it is
made (s. 150(10)), so the rates for 2026-27 to 2029-30 are not uprated.

The element was uprated by gov.benefit_uprating_cpi, giving £222.26 for
2027-28. It is now uprated by gov.dwp.universal_credit.elements.disabled.
uprating, which a process_parameters builder makes from the benefit index
(as uprating extends it), held flat while rebalancing.health_element_freeze
and rebalancing.active are true, and never falling.

Refs #2280.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Examples for 2026-27 to 2030-31; a differential against the processed
benefit index; reforms (freeze or rebalancing off, one year unfrozen, a
changed amount, a reform dict); and Hypothesis properties: frozen years hold
for any CPI path, later years grow with the benefit index and never fall,
any freeze/active schedule holds exactly its years, and a reformed amount is
held or uprated from its value. YAML cases pin 2027-28 to 2029-30 at
£2,607.12 a year.

Mutation check: main's uprating fails 8 pytest and 3 YAML cases; dropping
the no-fall floor fails 3 properties; ignoring rebalancing.active fails 2.

Refs #2280.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Refs #2280.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	docs/book/policy/uc-rebalancing.md
MaxGhenis and others added 3 commits October 10, 2026 20:18
Review finding: for 2026-27 to 2029-30 the rebalancing scenario pays new
claimants rebalancing.new_claimant_health_element, a flat £217.26, so
lifting the freeze changed elements.disabled.amount but no simulated award
in those years.

new_claimant_health_element is now uprated by
gov.dwp.universal_credit.elements.disabled.uprating as well. The two
amounts follow one path under any freeze schedule or CPI forecast, and a
lifted freeze reaches a simulated new claimant (£221.60 in 2028-29 with the
freeze lifted from that year). Baseline amounts do not change.

Tests: the one-path invariant on the baseline, under freeze and CPI
reforms, and in the tree properties; a simulation test with a forced new
claimant. Without the uprating line 5 tests fail.

Docs: say which parameter a simulation reads in which years, apply the
example before the data load, and note the no-fall floor is this element's
only. The index's description says how to change it.

Refs #2280.

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

Review round 2: the uprating index stopped at the calendar year of the last
benefit-index (or lagged CPI) entry. A value dated after 30 April first
reaches the next tax year's 30 April sample, so that year's change was lost.
Reproduced on the full pipeline: a one-year change to the benefit index from
1 June 2038 restores the stated value on 1 June 2039; the processed index
doubles from 2039-40 to 2040-41, but the element stayed at £217.26 instead
of £434.52.

index_years now runs to the first tax year whose 30 April sample sees the
last entry, using create_threshold_indexation.first_tax_year. Baseline
amounts do not change.

Tests: the reviewer's case on the full pipeline (both amounts, against the
independent recursion), and a property with up to three benefit-index values
at any date, including after 30 April and past the last uprating entry.
Reverting the fix fails both.

Also from the review: the docs say a reform to either amount does not move
the other, and a test comment describes core's latest-stated-value rule
rather than calling it the statutory path.

Refs #2280.

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

This branch has not been deployed

No deployments
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.

UC LCWRA element is CPI-uprated in 2027-28 to 2029-30, but UC Act 2025 s. 3 freezes it

1 participant