Skip to content

Start cost-of-living payments in 2022, per benefit unit and person - #2855

Queued
MaxGhenis wants to merge 4 commits into
mainfrom
claude/cost-of-living-2022-backdate-7cp6xq
Queued

MaxGhenis wants to merge 4 commits into
mainfrom
claude/cost-of-living-2022-backdate-7cp6xq

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Nov 3, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #2847

Also fixes #2848.

Reproducer: policyengine_uk/tests/policy/baseline/gov/treasury/cost_of_living_support/cost_of_living_support_payment.yaml::2021 a household qualifying for every strand gets no Cost of Living Payment, policyengine_uk/tests/policy/baseline/gov/treasury/cost_of_living_support/cost_of_living_support_payment.yaml::2022 a benefit unit on Housing Benefit alone gets no means-tested payment
axiom: TheAxiomFoundation/rulespec-uk#532 queued

What the code does now

  • The three amounts under gov.treasury.cost_of_living_support read zero from 0001-01-01 until 2022 (Backdating pays the 2022-23 cost-of-living payments in 2015-16 to 2021-22 #2847). backdate_parameters gives each parameter its earliest value from 2015-01-01 up to its first stated date, so the model now pays nothing from 2015-16 to 2021-22, where main pays £650, £300 and £150. The 2022, 2023 and 2024 values stay as they were.
  • The model pays the means-tested amount, £650 in 2022-23 and £900 in 2023-24, to each benefit unit with Universal Credit, Pension Credit, income-based JSA, income-related ESA or Income Support, through the new cost_of_living_means_tested_payment (benefit unit; Cost-of-living payments use the wrong qualifying benefits and pay per household #2848). It drops housing_benefit from that list. A unit with none of those benefits qualifies through the new qualifying_tax_credits list (Child Tax Credit, Working Tax Credit) when its yearly award of either credit exceeds zero and reaches the new minimum_tax_credit_award: £26 from 2022-01-01 and £0 from 2023-01-01. A unit with a benefit and a tax credit gets one payment.
  • The model pays £150 to each person with PIP, DLA, Attendance Allowance or Armed Forces Independence Payment, through the new cost_of_living_disability_payment (person; Cost-of-living payments use the wrong qualifying benefits and pay per household #2848).
  • cost_of_living_support_payment keeps its name and still gives the household total that household_benefits, hbai_household_net_income, hbai_benefits, gov_spending and pre_budget_change_household_benefits read. It sums the two new variables over the household's benefit units and members, and adds the pensioner payment once per household with a Winter Fuel Payment, as before.
  • In programs.yaml, we name cost_of_living_support_payment as the programme's variable and list what the model leaves out. fiscal_partition.yaml keeps cost_of_living_support_payment as the spending head, with the two new variables inside it. The partition lists components only for tax heads, and its schema test rejects an exclusion that names a spending head, so it needs no new entry. The programme page now describes the new rules, model-baseline.md links to the 2022 values on line 4, and the future-dating guide shows the leading zero.

The law

Parliament set out the payments in the Social Security (Additional Payments) Act 2022 and the Social Security (Additional Payments) Act 2023.

  • Under section 1(1) and (3) of each Act, the Secretary of State must secure a payment to each person with a qualifying entitlement to Universal Credit, Pension Credit, income-based JSA, income-related ESA or Income Support. Neither list includes Housing Benefit.
  • Under section 1(2) of each Act, HMRC must secure a payment to each person with a qualifying entitlement to Child Tax Credit or Working Tax Credit "but not to a social security benefit", so a unit with both gets one payment.
  • Under section 2(2) of the 2022 Act, a tax credit counts on either qualifying day only if "the payment or award of the credit in question is of at least £26 or HMRC expects the person to receive total payments or have an award of the credit in question of at least £26 in respect of the tax year 2022-23". Under section 4, HMRC must also secure final payments, on a £26 test of the year's payments or award, to people with a tax credit in a qualifying period and no entitlement under section 1. The model compares each credit's own yearly award with £26, following "the credit in question", so £20 of each credit doesn't qualify. Under section 3(1) of the 2023 Act, any payment of the credit counts.
  • Under section 1(6) of the 2022 Act and section 1(9) of the 2023 Act, "references to a 'person' are to an individual or to a couple (but not to each member of a couple separately)". The model's benefit unit holds a single adult or a couple, so each benefit unit qualifies on its own.
  • Under section 5(1) and (2) of each Act, the Secretary of State must secure £150 "to each individual" with a listed disability benefit. Parliament also listed constant attendance allowance, Adult Disability Payment, Child Disability Payment and the mobility supplement in section 5(2), and the model has no variables for them.

The model holds yearly amounts, so it tests receipt over the year, not in the month ending with each qualifying day. Neither Act covers the pensioner payment, which the model still pays once per household.

Invariants

The model keeps these properties for any amounts of the benefits its formulas read.

  1. In every model year from 2015 (the first the model computes) to 2021, and from 2024 to 2040, every household's, benefit unit's and person's payment comes to zero.
  2. In 2022 and in 2023, a household's payment equals the means-tested amount (£326 + £324, then £301 + £300 + £299) times its qualifying benefit units, plus £150 times its qualifying people, plus £300 if it has a Winter Fuel Payment. Each benefit unit's and person's own payment matches its part of that sum.
  3. In 2022 and in 2023, adding a qualifying benefit unit raises the household's payment by that unit's own payments, and adding a person with a qualifying disability benefit raises it by £150, so neither ever lowers it.
  4. The formulas read only the year's parameters and the listed benefit amounts, so the same inputs give the same payments.

Tests

  • cost_of_living_support_payment.yaml: 12 new cases, which we worked by hand from the Acts (each comment shows the sum), and the 4 existing cases, which still pass. Each case sets every listed benefit as an input, because when a case sets none, the model computes Universal Credit for a working-age adult with no income (£4,018.92 in 2022) and Pension Credit for a pensioner with no income.
  • test_cost_of_living_payment_properties.py: 5 Hypothesis properties for invariants 1 to 3, 40 examples each, with up to eight households (sixteen for invariant 3) in one simulation per example, plus pinned households for each rule. The properties hard-code the Acts' lists and amounts and the £300 pensioner amount, and read no model parameter. The two properties for invariant 1 check all 24 unpaid years in each example.
  • We ran the tests on a copy of this branch with main's parameters and variable, without the Working Tax Credit case. All 11 other new YAML cases fail and the 4 existing cases pass. On the household total alone, 8 new cases fail on value: 2021 (£1,100, not £0), the all-strands household in 2022 (£1,100, not £1,750), Housing Benefit alone in 2022 (£650) and 2023 (£900), £26 of Child Tax Credit in 2022 (£0, not £650), a small award in 2023 (£0, not £900), two qualifying units (£1,200, not £2,100) and two people on PIP (£150, not £300). All 5 properties fail, with the pinned households or without them. Without them, Hypothesis shrinks the household property for invariant 1 to one household with a Winter Fuel Payment, which main pays £300 in 2015.
  • We made 12 one-line mutants of the formulas and parameters: summing the credits before the £26 test, a strict > at £26, no award > 0 check (so every unit qualifies in 2023), Housing Benefit back on the list, the means-tested or the disability payment once per household, no 2022 minimum, the minimum kept in 2023, each of the three amounts without its leading zero, and the tax credit route paying beside a benefit. Each one fails at least one YAML case and at least one property.
  • The tests that read this variable pass: test_disable_simulated_benefits_winter_heating.py, test_pawhp_household_income_properties.py and test_trading_loss_properties.py (31 tests), and the 5 cases of winter_heating_payments_in_income.yaml. None of their properties broke when this branch added the tax credit test. Seven other modules that simulate household income in 2015 to 2023 pass too (105 tests), and so does the whole YAML policy suite (5,478 cases).
  • code_health passes on this head (3,095 tests), and so do test_program_registry.py, test_parameter_descriptions.py and both fiscal partition modules. ruff format --check, ruff check and git diff --check come back clean.

Impact

The Aggregate impact report covers 2025-26 onwards (report_spec.yaml sets the horizon at 2025 to 2031), where all three amounts read zero, so it can't show this change. CI's report at e4d61659 flags no move, and this change breaks none of its checks. We ran no survey-data simulation for 2022-23 or 2023-24.

🤖 Generated with Claude Code

…erson

Give the three cost-of-living amounts a zero before 2022, so backdating no
longer pays them in 2015 to 2021 (#2847).

Pay the means-tested amount to each benefit unit with a benefit listed in
section 1(3) of the Social Security (Additional Payments) Acts 2022 and
2023, which leave out Housing Benefit, or with Child Tax Credit or Working
Tax Credit and none of those benefits (section 1(2)), at least £26 of a
credit for the year in 2022-23 (2022 Act section 2(2)). Pay the £150
disability amount to each person with a listed disability benefit
(section 5). The household total adds both to the pensioner payment (#2848).

Claude-Session: https://claude.ai/code/session_01WR8LHckHwu75WHHEdzLyNc
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Check every unpaid year in each dates example, both paid years in each
decomposition example, and the exact rise when a qualifying benefit unit
or person joins a household, all within one simulation per example. Take
the £300 pensioner amount from the sources its parameter cites, not from
the parameter. Add a 2023 Housing Benefit case.

Cite section 4 of the 2022 Act beside section 2(2) for the £26 minimum,
make Parliament, the Secretary of State or HMRC the actor in descriptions,
test names and docs, move the model-baseline links to the 2022 amounts,
and note the leading zero in the future-dating guide.

Claude-Session: https://claude.ai/code/session_01WR8LHckHwu75WHHEdzLyNc
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis

Copy link
Copy Markdown
Collaborator Author

AXIOM_ISSUE.md

Title: Encode who gets the Social Security (Additional Payments) Acts 2022 and 2023 payments (sections 1 to 5)

Labels: pe-parity

## Modules and corpus citations

rulespec-uk encodes only the payment amounts today: `uk/statutes/ukpga/2022/38/1.yaml`, `uk/statutes/ukpga/2022/38/5.yaml`, `uk/statutes/ukpga/2023/7/1.yaml` and `uk/statutes/ukpga/2023/7/5.yaml`. This issue covers who qualifies, which PolicyEngine/policyengine-uk#2855 now follows.

| Module | Corpus citation | Status |
|---|---|---|
| `uk/statutes/ukpga/2022/38/1.yaml` | `uk/statute/ukpga/2022/38/1` | extend: section 1(2), (3) and (6) |
| `uk/statutes/ukpga/2022/38/2.yaml` | `uk/statute/ukpga/2022/38/2` | new: section 2(1) and (2) |
| `uk/statutes/ukpga/2022/38/4.yaml` | `uk/statute/ukpga/2022/38/4` | new: section 4(1) and (2) |
| `uk/statutes/ukpga/2022/38/5.yaml` | `uk/statute/ukpga/2022/38/5` | extend: section 5(1) and (2) |
| `uk/statutes/ukpga/2023/7/1.yaml` | `uk/statute/ukpga/2023/7/1` | extend: section 1(2), (3) and (9) |
| `uk/statutes/ukpga/2023/7/2.yaml` | `uk/statute/ukpga/2023/7/2` | new: section 2(1) |
| `uk/statutes/ukpga/2023/7/3.yaml` | `uk/statute/ukpga/2023/7/3` | new: section 3(1) |
| `uk/statutes/ukpga/2023/7/5.yaml` | `uk/statute/ukpga/2023/7/5` | extend: section 5(1) and (2) |

## Verbatim law

Source: legislation.gov.uk data.xml of each Act as enacted, fetched 3 November 2026.

Social Security (Additional Payments) Act 2022 (c. 38):

> **1(1)** The Secretary of State must secure that— (a) a single payment of £326 is made to any person who has a qualifying entitlement to a social security benefit in respect of 25 May 2022 (the first "qualifying day"), and (b) a single payment of £324 is made to any person who has a qualifying entitlement to a social security benefit in respect of the second qualifying day.
>
> **1(2)** HMRC must secure that— (a) a single payment of £326 is made to any person who has a qualifying entitlement to child tax credit or working tax credit, but not to a social security benefit, in respect of 25 May 2022, and (b) a single payment of £324 is made to any person who has a qualifying entitlement to child tax credit or working tax credit, but not to a social security benefit, in respect of the second qualifying day.
>
> **1(3)** The social security benefits are— (a) universal credit under the Welfare Reform Act 2012 or the Welfare Reform (Northern Ireland) Order 2015 ( S.I. 2015/2006 (N.I. 1) ); (b) state pension credit under the State Pension Credit Act 2002 or the State Pension Credit Act (Northern Ireland) 2002; (c) an income-based jobseeker's allowance under the Jobseekers Act 1995 or the Jobseekers (Northern Ireland) Order 1995 ( S.I. 1995/2705 (N.I. 15) ); (d) an income-related employment and support allowance under Part 1 of the Welfare Reform Act 2007 or Part 1 of the Welfare Reform Act (Northern Ireland) 2007; (e) income support under section 124 of the Social Security Contributions and Benefits Act 1992 or section 123 of the Social Security Contributions and Benefits (Northern Ireland) Act 1992.
>
> **1(4)** The second qualifying day is such day, not later than 31 October 2022, as may be specified by the Secretary of State in regulations.
>
> **1(6)** In this section, and in sections 2 to 4 , references to a "person" are to an individual or to a couple (but not to each member of a couple separately).
>
> **2(1)** A person has a qualifying entitlement to a social security benefit in respect of a qualifying day if— (a) in respect of universal credit, the person is entitled to a payment of at least 1p in respect of an assessment period ending during the period of one month ending with the qualifying day; (b) in respect of state pension credit, an income-based jobseeker's allowance, an income-related employment and support allowance or income support, the person is entitled to a payment of at least 1p in respect of any day during the period of one month ending with the qualifying day.
>
> **2(2)** A person has a qualifying entitlement to child tax credit or working tax credit in respect of a qualifying day if— (a) where the qualifying day is 25 May 2022, the person receives a payment or has an award of the credit in question in the period beginning with 26 April 2022 and ending with 25 May 2022; (b) where the qualifying day is the second qualifying day, the person receives a payment or has an award of the credit in question in the period of one month ending with the second qualifying day, and, in either case, the payment or award of the credit in question is of at least £26 or HMRC expects the person to receive total payments or have an award of the credit in question of at least £26 in respect of the tax year 2022-23.
>
> **4(1)** HMRC must secure that a single payment of £326 is made to any person who— (a) receives a payment or has an award of child tax credit or working tax credit in respect of the period beginning with 26 April 2022 and ending with 25 May 2022, (b) is not entitled to a payment under section 1 (1) (a) or (2) (a) , and (c) receives total payments or has an award of the credit in question of at least £26 in respect of the tax year 2022-23.
>
> **4(2)** HMRC must secure that a single payment of £324 is made to any person who— (a) receives a payment or has an award of child tax credit or working tax credit in respect of the period of one month ending with the second qualifying day, (b) is not entitled to a payment under section 1 (1) (b) or (2) (b) , and (c) receives total payments or has an award of the credit in question of at least £26 in respect of the tax year 2022-23.
>
> **5(1)** The Secretary of State must secure that a single payment of £150 (a "disability additional payment") is made to each individual who is entitled to a payment of a disability benefit that is payable in respect of 25 May 2022.
>
> **5(2)** The disability benefits are— (a) a disability living allowance under section 71 of the Social Security Contributions and Benefits Act 1992 or section 71 of the Social Security Contributions and Benefits (Northern Ireland) Act 1992; (b) a personal independence payment under the Welfare Reform Act 2012 or Part 5 of the Welfare Reform (Northern Ireland) Order 2015; (c) an attendance allowance under section 64 of the Social Security Contributions and Benefits Act 1992 or section 64 of the Social Security Contributions and Benefits (Northern Ireland) Act 1992; (d) a constant attendance allowance under section 104 of the Social Security Contributions and Benefits Act 1992 or section 104 of the Social Security Contributions and Benefits (Northern Ireland) Act 1992; (e) an adult disability payment under the Disability Assistance for Working Age People (Scotland) Regulations 2022 ( S.S.I. 2022/54 ); (f) a child disability payment under the Disability Assistance for Children and Young People (Scotland) Regulations 2021 ( S.S.I. 2021/174 ); (g) an armed forces independence payment under article 24A of the Armed Forces and Reserve Forces (Compensation Scheme) Order 2011 ( S.I. 2011/517 ); (h) a constant attendance allowance under— (i) article 14 or 43 of the Personal Injuries (Civilians) Scheme 1983 ( S.I. 1983/686 ); (ii) article 8 of the Naval, Military and Air Forces etc. (Disablement and Death) Service Pensions Order 2006 ( S.I. 2006/606 ); (i) a mobility supplement under— (i) article 25A or 48A of the Personal Injuries (Civilians) Scheme 1983; (ii) article 20 of the Naval, Military and Air Forces etc. (Disablement and Death) Service Pensions Order 2006.

Social Security (Additional Payments) Act 2023 (c. 7):

> **1(1)** The Secretary of State must secure that— (a) a single payment of £301 is made to any person who has a qualifying entitlement to a social security benefit in respect of the first qualifying day, (b) a single payment of £300 is made to any person who has a qualifying entitlement to a social security benefit in respect of the second qualifying day, and (c) a single payment of £299 is made to any person who has a qualifying entitlement to a social security benefit in respect of the third qualifying day.
>
> **1(2)** HMRC must secure that— (a) a single payment of £301 is made to any person who has a qualifying entitlement to child tax credit or working tax credit, but not to a social security benefit, in respect of the first qualifying day, (b) a single payment of £300 is made to any person who has a qualifying entitlement to child tax credit or working tax credit, but not to a social security benefit, in respect of the second qualifying day, and (c) a single payment of £299 is made to any person who has a qualifying entitlement to child tax credit or working tax credit, but not to a social security benefit, in respect of the third qualifying day.
>
> **1(3)** The social security benefits are— (a) universal credit under the Welfare Reform Act 2012 or the Welfare Reform (Northern Ireland) Order 2015 ( S.I. 2015/2006 (N.I. 1)) ; (b) state pension credit under the State Pension Credit Act 2002 or the State Pension Credit Act (Northern Ireland) 2002; (c) an income-based jobseeker's allowance under the Jobseekers Act 1995 or the Jobseekers (Northern Ireland) Order 1995 ( S.I. 1995/2705 (N.I. 15)) ; (d) an income-related employment and support allowance under Part 1 of the Welfare Reform Act 2007 or Part 1 of the Welfare Reform Act (Northern Ireland) 2007; (e) income support under section 124 of the Social Security Contributions and Benefits Act 1992 or section 123 of the Social Security Contributions and Benefits (Northern Ireland) Act 1992.
>
> **1(9)** In this section, and in sections 2 to 4 , references to a "person" are to an individual or to a couple (but not to each member of a couple separately).
>
> **2(1)** A person has a qualifying entitlement to a social security benefit in respect of a qualifying day if— (a) in respect of universal credit, the person is entitled to a payment of at least 1p in respect of an assessment period ending during the period of one month ending with the qualifying day; (b) in respect of state pension credit, an income-based jobseeker's allowance, an income-related employment and support allowance or income support, the person is entitled to a payment of at least 1p in respect of any day during the period of one month ending with the qualifying day.
>
> **3(1)** A person has a qualifying entitlement to child tax credit or working tax credit in respect of a qualifying day if HMRC makes a payment to the person of the credit in question in respect of a day falling within the period of one month ending with that qualifying day (the "qualifying period").
>
> **5(1)** The Secretary of State must secure that a single payment of £150 (a "disability additional payment") is made to each individual who is entitled to a payment of a disability benefit that is payable in respect of the disability additional payment day.
>
> **5(2)** The disability benefits are— (a) a disability living allowance under section 71 of the Social Security Contributions and Benefits Act 1992 or section 71 of the Social Security Contributions and Benefits (Northern Ireland) Act 1992; (b) a personal independence payment under the Welfare Reform Act 2012 or Part 5 of the Welfare Reform (Northern Ireland) Order 2015 ( S.I. 2015/2006 (N.I. 1)) ; (c) an attendance allowance under section 64 of the Social Security Contributions and Benefits Act 1992 or section 64 of the Social Security Contributions and Benefits (Northern Ireland) Act 1992; (d) a constant attendance allowance under section 104 of the Social Security Contributions and Benefits Act 1992 or section 104 of the Social Security Contributions and Benefits (Northern Ireland) Act 1992; (e) an adult disability payment under the Disability Assistance for Working Age People (Scotland) Regulations 2022 ( S.S.I. 2022/54 ) or the Disability Assistance for Working Age People (Transitional Provisions and Miscellaneous Amendment) (Scotland) Regulations 2022 ( S.S.I. 2022/217 ); (f) a child disability payment under the Disability Assistance for Children and Young People (Scotland) Regulations 2021 ( S.S.I. 2021/174 ); (g) an armed forces independence payment under article 24A of the Armed Forces and Reserve Forces (Compensation Scheme) Order 2011 ( S.I. 2011/517 ); (h) a constant attendance allowance under— (i) article 14 or 43 of the Personal Injuries (Civilians) Scheme 1983 ( S.I. 1983/686 ); (ii) article 8 of the Naval, Military and Air Forces etc. (Disablement and Death) Service Pensions Order 2006 ( S.I. 2006/606 ); (i) a mobility supplement under— (i) article 25A or 48A of the Personal Injuries (Civilians) Scheme 1983; (ii) article 20 of the Naval, Military and Air Forces etc. (Disablement and Death) Service Pensions Order 2006 ( S.I. 2006/606 ).

## Required outputs

For each Act, per person (an individual or a couple) and per qualifying day:

1. `social_security_benefits`: the section 1(3) list, (a) to (e). Parliament left Housing Benefit off it.
2. `has_qualifying_entitlement_to_social_security_benefit`: section 2(1) of each Act, at least 1p of a listed benefit in the month ending with the qualifying day.
3. `has_qualifying_entitlement_to_tax_credit`, tested for each credit on its own ("the credit in question"):
   - 2022 Act section 2(2): a payment or award in the window, and at least £26 of that credit, paid, awarded or expected for 2022-23;
   - 2023 Act section 3(1): any payment of that credit in the month ending with the qualifying day, with no minimum.
4. `tax_credit_minimum_award`: £26 under the 2022 Act (section 2(2)); none under the 2023 Act.
5. `means_tested_additional_payment`: the Secretary of State's payment under section 1(1) where output 2 holds, otherwise HMRC's under section 1(2) where output 3 holds for either credit, otherwise nothing. One payment per person per qualifying day, never both.
6. 2022 Act only, `final_means_tested_additional_payment`: section 4(1) and (2), for a person with a credit in the window, no payment under section 1(1) or (2) for that day, and at least £26 of the credit for 2022-23.
7. `disability_benefits`: the section 5(2) list, (a) to (i), in each Act.
8. `disability_additional_payment`: £150 to each individual, not each couple, entitled to a payment of any listed disability benefit payable for 25 May 2022 (2022 Act) or the disability additional payment day (2023 Act).

## Companion cases

Each expected value comes from the law quoted above, worked by hand.

| Case | Facts | Expected |
|---|---|---|
| C1 | 2022 Act. A single person entitled to Universal Credit only for assessment periods ending before 26 April 2022. | £0: no qualifying entitlement in the month ending with 25 May 2022 or with the second qualifying day (section 2(1)(a)). |
| C2 | 2022 Act. A single person entitled to £100 of Universal Credit for assessment periods ending in the month ending with each qualifying day. | £326 + £324 = £650 from the Secretary of State (section 1(1), 1(3)(a)). |
| C3 | 2022 Act. A single person entitled to Housing Benefit throughout, with no listed benefit and no tax credit. | £0: Parliament left Housing Benefit off the section 1(3) list. |
| C4 | 2022 Act. A person with an award of Child Tax Credit in each window, which HMRC expects to come to £26 for 2022-23, and no listed benefit. | £326 + £324 = £650 from HMRC (section 1(2), 2(2)). |
| C5 | As C4, but with each payment under £26 and £25.99 of Child Tax Credit paid, awarded and expected for 2022-23. | £0: the credit in question comes to less than £26 (section 2(2)); section 4(1)(c) and (2)(c) fail too. |
| C6 | 2022 Act. A person with £20 of Child Tax Credit and £20 of Working Tax Credit for 2022-23, each payment under £26, and no listed benefit. | £0: neither credit comes to £26, and section 2(2) looks at "the credit in question" alone. |
| C7 | 2022 Act. A person entitled to Universal Credit and to £2,000 of Child Tax Credit on both qualifying days. | £650 from the Secretary of State under section 1(1); nothing from HMRC, which pays under section 1(2) only a person with no qualifying entitlement to a social security benefit. |
| C8 | 2022 Act. A couple jointly entitled to Pension Credit on both qualifying days. | £650: the couple counts as one person (section 1(6)). |
| C9 | 2023 Act. One household: an adult son entitled to Universal Credit and his parents, a couple, entitled to Pension Credit, on all three qualifying days. | Two persons, £301 + £300 + £299 = £900 each, £1,800 in all (section 1(1), 1(9)). |
| C10 | 2023 Act. A person paid £10 of Child Tax Credit for a day in the month ending with each qualifying day, with no listed benefit. | £301 + £300 + £299 = £900 from HMRC: Parliament set no minimum in section 3(1). |
| C11 | 2023 Act. A single person entitled to Housing Benefit throughout, with no listed benefit and no tax credit. | £0. |
| C12 | 2022 Act. A couple, each entitled to Personal Independence Payment payable for 25 May 2022. | £150 to each individual, £300 in all (section 5(1), 5(2)(b)). |
| C13 | 2022 Act. An individual entitled to constant attendance allowance under section 104 of the Social Security Contributions and Benefits Act 1992, payable for 25 May 2022, and to no other listed benefit. | £150 (section 5(2)(d)). |
| C14 | 2023 Act. An individual entitled to adult disability payment payable on the disability additional payment day. | £150 (section 5(2)(e)). |

### review_finding (paste as-is)

```yaml
review_finding:
  source: PolicyEngine/policyengine-uk#2855
  issues: [PolicyEngine/policyengine-uk#2847, PolicyEngine/policyengine-uk#2848]
  provisions:
    - uk/statute/ukpga/2022/38/1
    - uk/statute/ukpga/2022/38/2
    - uk/statute/ukpga/2022/38/4
    - uk/statute/ukpga/2022/38/5
    - uk/statute/ukpga/2023/7/1
    - uk/statute/ukpga/2023/7/2
    - uk/statute/ukpga/2023/7/3
    - uk/statute/ukpga/2023/7/5
  rulespec_today: >-
    Encodes the amounts in sections 1 and 5 of both Acts (£326, £324, £301,
    £300, £299 and £150) and nothing about who qualifies.
  gap:
    - section 1(3) list of social security benefits, without Housing Benefit
    - section 1(2) tax credit route, only for a person with no listed benefit
    - a person as an individual or a couple (2022 s.1(6), 2023 s.1(9))
    - qualifying entitlement (2022 s.2(1) and (2); 2023 s.2(1) and s.3(1)),
      including the 2022 £26 minimum for each credit on its own
    - 2022 s.4 final payments on the same £26 test
    - section 5 disability payment to each individual, and the s.5(2) list
  policyengine_uk_after_pr:
    means_tested: >-
      Each benefit unit with Universal Credit, Pension Credit, income-based
      JSA, income-related ESA or Income Support, or with none of those and a
      yearly award of Child Tax Credit or Working Tax Credit of at least £26
      (2022-23) or above zero (2023-24): £650 in 2022-23, £900 in 2023-24.
    disability: >-
      £150 to each person with PIP, DLA, Attendance Allowance or Armed
      Forces Independence Payment.
    approximations:
      - yearly receipt stands in for entitlement in the month ending with each qualifying day
      - the yearly award of each credit stands in for the 2022 s.2(2) and s.4 £26 tests
      - no variables for constant attendance allowance, adult disability payment, child disability payment or the mobility supplement
  companion_cases: [C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14]
  out_of_scope:
    - the Pensioner Cost of Living Payment, for which this issue quotes no statute
    - fraud exclusions (2022 s.2(3) and s.4(4); 2023 s.3(2)(b)) and 2023 s.3(2)(a)
    - "2022 s.3 and 2023 s.4: the benefit a payment refers to, with no effect on its amount"
```

## Completion boundary

An approved follow-up must:

- **Ingest** sections 1, 2, 4 and 5 of the 2022 Act and sections 1, 2, 3 and 5 of the 2023 Act into the corpus at the citation paths above, from the same legislation.gov.uk data.xml.
- **Encode** outputs 1 to 8 in the modules above, keeping the existing amount rules and their proofs, with "person" (an individual or a couple) for sections 1 to 4 and "individual" for section 5.
- **Prove** each list member, each amount and the £26 minimum with proof atoms citing excerpts of the quoted text, and pass companion cases C1 to C14.

It must not encode the items under `out_of_scope` above, and it must not take expected values from policyengine-uk.

Generated by Claude Code

@github-actions

github-actions Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

Aggregate impact on certified data: pass

Base 9b456bda65 against head df72d05f26, 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 Class 1 main employee NICs rate to 10% 0 0 0 0 0 suppressed suppressed
Raise additional rate by 3pp 0 0 0 0 0 suppressed suppressed

The report suppresses a reform's costing and target change in these years, for the reasons below (privacy.py):

  • Raise Class 1 main employee NICs rate to 10%, 2030-31 to 2031-32 (base and head): the reform changes income_tax in fewer than 10 records.
  • Raise additional rate by 3pp, 2030-31 to 2031-32 (base and head): the reform changes universal_credit in fewer than 10 records.

Standard reforms: change in each reform's target

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise Class 1 main employee NICs rate to 10%: change in national_insurance 0 0 0 0 0 suppressed suppressed
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,888,684 in total; 2026-27: 76 units below zero, a weighted £-55,777,260 in total; 2027-28: 76 units below zero, a weighted £-57,727,917 in total
Counted-once check

Each of 92 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 9b456bda65 uk 2.173.0 (files 83d3a26ceff6), core 3.34.1, py 3.13.18 aarch64 7303799c4893 7cb61324a46b 1991.62s
head #2855 merged into main df72d05f26 uk 2.173.0 (files 0872ba6bf399), core 3.34.1, py 3.13.18 aarch64 7303799c4893 7cb61324a46b 1981.33s

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 £294.46bn £315.23bn £335.82bn £351.28bn £366.96bn £385.36bn £400.00bn
National Insurance (employee and self-employed) £51.70bn £54.14bn £56.13bn £57.73bn £59.76bn £61.64bn £63.51bn
National Insurance (employer) £148.71bn £155.37bn £160.88bn £165.09bn £172.06bn £177.36bn £182.57bn
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.60bn £13.15bn £13.60bn £14.11bn £14.67bn £15.24bn £15.80bn
Student loan repayments £7.82bn £8.13bn £8.39bn £8.58bn £8.79bn £9.04bn £9.29bn
VAT excluding private school fees £249.37bn £256.87bn £266.33bn £272.70bn £278.97bn £285.24bn £291.59bn
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.01bn £2.09bn £2.14bn £2.20bn £2.26bn £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.71bn £24.13bn £26.00bn £26.83bn £26.51bn £25.78bn £24.63bn
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.40bn £4.41bn £4.42bn £4.43bn £4.44bn £4.45bn
Council tax £49.21bn £52.16bn £54.89bn £57.95bn £61.16bn £64.47bn £67.91bn
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 £36.20bn £38.00bn £39.46bn £42.27bn £43.25bn £44.29bn
Stamp duty land tax on the household's own purchases £6.88bn £7.32bn £7.66bn £8.06bn £8.47bn £8.91bn £9.35bn
Stamp duty land tax paid by companies £4.72bn £4.57bn £5.29bn £6.03bn £6.37bn £6.92bn £7.45bn
Land transaction tax (Wales) £0.07bn £0.08bn £0.08bn £0.09bn £0.10bn £0.10bn £0.11bn
Land and buildings transaction tax (Scotland) £0.31bn £0.32bn £0.33bn £0.35bn £0.36bn £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.68bn £125.92bn £126.72bn £129.49bn £132.99bn £136.66bn £140.42bn
Pension Credit £6.66bn £7.03bn £7.29bn £7.48bn £7.60bn £7.84bn £8.03bn
Winter Fuel Payment £1.86bn £1.85bn £1.79bn £1.77bn £1.78bn £1.78bn £1.78bn
Pension Age Winter Heating Payment (Scotland) £0.19bn £0.20bn £0.20bn £0.21bn £0.21bn £0.22bn £0.22bn
Universal Credit £75.48bn £80.52bn £82.95bn £84.96bn £86.11bn £87.61bn £88.21bn
Housing Benefit £8.56bn £8.89bn £9.23bn £9.46bn £9.69bn £9.99bn £10.27bn
Council Tax Reduction £2.07bn £2.20bn £2.31bn £2.45bn £2.58bn £2.72bn £2.86bn
Employment and Support Allowance (income-related) £0.79bn £0.82bn £0.84bn £0.86bn £0.88bn £0.90bn £0.92bn
Employment and Support Allowance (contribution-based) £5.20bn £5.37bn £5.56bn £5.69bn £5.82bn £5.95bn £6.09bn
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.31bn £0.31bn £0.32bn £0.33bn £0.34bn
Income Support £0.11bn £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.95bn £28.03bn £29.05bn £30.09bn £30.75bn £31.51bn £32.21bn
Disability Living Allowance £7.49bn £7.79bn £8.07bn £8.36bn £8.55bn £8.76bn £8.95bn
Attendance Allowance £8.68bn £9.03bn £9.36bn £9.69bn £9.90bn £10.15bn £10.38bn
Carer's Allowance £4.48bn £4.66bn £4.83bn £5.00bn £5.11bn £5.27bn £5.42bn
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.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.50bn £0.52bn £0.54bn £0.55bn £0.56bn £0.58bn £0.59bn
Armed Forces Compensation Scheme £0.61bn £0.63bn £0.65bn £0.66bn £0.68bn £0.69bn £0.71bn
War Widow's or Widower's Pension £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Child Benefit £16.19bn £16.82bn £17.39bn £18.00bn £18.39bn £18.84bn £19.25bn
Scottish Child Payment £0.49bn £0.52bn £0.53bn £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.41bn £3.54bn £3.62bn £3.70bn £3.78bn £3.87bn
Statutory Paternity Pay £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Statutory Sick Pay £1.12bn £1.16bn £1.20bn £1.23bn £1.26bn £1.29bn £1.32bn
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.71bn £0.73bn £0.75bn £0.76bn £0.78bn
Widowed Parent's Allowance £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Tax-Free Childcare £0.56bn £0.57bn £0.57bn £0.58bn £0.60bn £0.61bn £0.59bn
Extended childcare entitlement £2.99bn £3.50bn £3.59bn £3.71bn £3.78bn £3.86bn £3.93bn
Universal childcare entitlement £2.06bn £2.22bn £2.29bn £2.37bn £2.43bn £2.48bn £2.53bn
Targeted childcare entitlement £0.50bn £0.51bn £0.52bn £0.54bn £0.55bn £0.57bn £0.56bn
Childcare Offer for Wales £0.26bn £0.28bn £0.28bn £0.29bn £0.30bn £0.31bn £0.32bn
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.89bn £204.30bn £204.56bn £204.91bn £205.34bn £205.85bn £206.35bn
State education spending £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn
Transport subsidy spending £25.05bn £25.10bn £25.14bn £25.18bn £25.23bn £25.30bn £25.36bn
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
Household Energy Payment £0.00bn £2.11bn £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,264k 11,145k 10,819k 10,700k 10,723k 10,750k 10,776k
Pension Credit 1,486k 1,480k 1,472k 1,452k 1,450k 1,455k 1,464k
Winter Fuel Payment 7,844k 7,783k 7,473k 7,375k 7,391k 7,409k 7,427k
Pension Age Winter Heating Payment (Scotland) 803k 802k 800k 797k 799k 801k 802k
Universal Credit 6,342k 6,347k 6,336k 6,297k 6,292k 6,271k 6,223k
Housing Benefit 1,249k 1,245k 1,244k 1,227k 1,227k 1,229k 1,232k
Council Tax Reduction 3,176k 3,195k 3,200k 3,214k 3,224k 3,235k 3,242k
Employment and Support Allowance (income-related) 71k 71k 71k 71k 71k 71k 71k
Employment and Support Allowance (contribution-based) 719k 720k 721k 722k 724k 726k 728k
Jobseeker's Allowance (income-based) 0k 0k 0k 0k 0k 0k 0k
Jobseeker's Allowance (contribution-based) 67k 67k 67k 67k 67k 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,567k 3,575k 3,579k 3,585k 3,593k 3,602k 3,611k
Disability Living Allowance 1,291k 1,294k 1,296k 1,298k 1,300k 1,304k 1,307k
Attendance Allowance 1,695k 1,698k 1,700k 1,703k 1,707k 1,711k 1,715k
Carer's Allowance 1,034k 1,037k 1,038k 1,040k 1,042k 1,060k 1,062k
Carer Support Payment (Scotland) 71k 71k 71k 72k 72k 72k 72k
Carer's Allowance Supplement (Scotland) 0k 71k 71k 72k 72k 72k 72k
Severe Disablement Allowance 4k 4k 4k 4k 4k 4k 4k
Industrial Injuries Disablement Benefit 137k 137k 137k 138k 138k 138k 139k
Armed Forces Compensation Scheme 93k 93k 94k 94k 94k 94k 94k
War Widow's or Widower's Pension 0k 0k 0k 0k 0k 0k 0k
Child Benefit 8,123k 8,120k 8,120k 8,130k 8,145k 8,161k 8,178k
Scottish Child Payment 351k 352k 352k 353k 350k 348k 337k
Two Child Limit Payment (Scotland, counterfactual) 0k 0k 0k 0k 0k 0k 0k
Healthy Start vouchers 200k 200k 200k 201k 201k 201k 202k
Maternity Allowance 0k 0k 0k 0k 0k 0k 0k
Statutory Maternity Pay 333k 333k 334k 334k 335k 336k 337k
Statutory Paternity Pay 0k 0k 0k 0k 0k 0k 0k
Statutory Sick Pay 181k 182k 182k 182k 182k 183k 183k
Sure Start Maternity Grant 26k 26k 26k 26k 26k 26k 26k
Bereavement Support Payment 98k 98k 98k 98k 98k 99k 99k
Widowed Parent's Allowance 0k 0k 0k 0k 0k 0k 0k
Tax-Free Childcare 1,043k 1,027k 1,014k 1,009k 1,011k 1,009k 993k
Extended childcare entitlement 795k 800k 796k 797k 798k 798k 792k
Universal childcare entitlement 1,071k 1,072k 1,072k 1,073k 1,076k 1,079k 1,074k
Targeted childcare entitlement 165k 156k 154k 154k 155k 155k 150k
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 98k 99k 99k 99k 99k
Adult Dependants' Grant 18k 18k 12k 12k 12k 12k 12k
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
Household Energy Payment 0k 21,065k 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 £892.00bn £934.66bn £980.50bn £1,015.93bn £1,054.24bn £1,091.56bn £1,124.89bn
Government spending £529.38bn † £545.66bn † £550.77bn † £559.51bn † £567.20bn † £575.95bn † £583.60bn †
Government balance, each receipt once £362.62bn † £389.00bn † £429.74bn † £456.42bn † £487.04bn † £515.61bn † £541.29bn †
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 £892.00bn £934.66bn £980.50bn £1,015.93bn £1,054.24bn £1,091.56bn £1,124.89bn
household_tax £491.97bn £520.41bn £551.21bn £576.01bn £601.00bn £626.70bn £648.42bn
pre_budget_change_household_tax £484.15bn £512.28bn £542.82bn £566.95bn £591.72bn £617.16bn £638.61bn
gov_spending £529.38bn † £545.66bn † £550.77bn † £559.51bn † £567.20bn † £575.95bn † £583.60bn †
household_benefits £529.38bn † £545.66bn † £550.77bn † £559.51bn † £567.20bn † £575.95bn † £583.60bn †
gov_balance £362.62bn † £389.00bn † £429.74bn † £456.42bn † £487.04bn † £515.61bn † £541.29bn †
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,637.96bn £1,702.77bn £1,757.35bn £1,806.41bn £1,855.97bn £1,912.43bn £1,970.44bn
Household net income £1,636.69bn † £1,687.82bn † £1,715.45bn † £1,747.49bn † £1,778.69bn † £1,817.02bn † £1,859.69bn †
Household net income (HBAI definition) £1,449.57bn £1,499.83bn £1,530.86bn £1,565.17bn £1,597.89bn £1,635.60bn £1,676.61bn
Population: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
People 69,245k 69,383k 69,473k 69,592k 69,738k 69,912k 70,080k
Benefit units 35,110k 35,181k 35,226k 35,286k 35,360k 35,449k 35,534k
Households 31,046k 31,108k 31,149k 31,201k 31,267k 31,345k 31,420k
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.3% 15.5% 16.4% 16.3% 16.5% 16.5% 16.6%
Absolute poverty, before housing costs: children 24.7% 22.1% 23.3% 22.9% 23.1% 23.2% 23.5%
Absolute poverty, before housing costs: working-age adults 14.1% 13.8% 14.7% 14.7% 14.8% 14.8% 15.0%
Absolute poverty, before housing costs: pensioners 13.7% 13.4% 14.0% 13.8% 13.9% 13.9% 13.9%
Absolute poverty, after housing costs: everyone 21.6% 21.0% 22.0% 22.6% 22.9% 23.1% 23.4%
Absolute poverty, after housing costs: children 33.3% 31.3% 32.3% 32.5% 32.9% 33.4% 34.2%
Absolute poverty, after housing costs: working-age adults 19.9% 19.8% 20.8% 21.6% 21.9% 22.0% 22.3%
Absolute poverty, after housing costs: pensioners 12.7% 12.4% 13.2% 13.2% 13.3% 13.4% 13.6%
Relative poverty, before housing costs: everyone 17.0% 16.0% 16.4% 16.3% 16.4% 16.3% 16.6%
Relative poverty, before housing costs: children 25.9% 22.9% 23.3% 22.9% 23.0% 22.9% 23.5%
Relative poverty, before housing costs: working-age adults 14.5% 14.1% 14.6% 14.7% 14.7% 14.7% 15.0%
Relative poverty, before housing costs: pensioners 14.5% 14.0% 13.9% 13.8% 13.8% 13.9% 13.9%
Relative poverty, after housing costs: everyone 21.4% 21.0% 21.3% 21.3% 21.3% 21.5% 21.7%
Relative poverty, after housing costs: children 33.1% 31.1% 31.2% 31.0% 31.1% 31.2% 31.8%
Relative poverty, after housing costs: working-age adults 19.9% 19.8% 20.2% 20.4% 20.5% 20.6% 20.8%
Relative poverty, after housing costs: pensioners 12.5% 12.4% 12.2% 11.7% 11.7% 11.8% 12.0%
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,278k 10,779k 11,402k 11,365k 11,476k 11,513k 11,651k
Absolute poverty, before housing costs: children 3,688k 3,314k 3,496k 3,445k 3,480k 3,502k 3,549k
Absolute poverty, before housing costs: working-age adults 5,965k 5,893k 6,308k 6,362k 6,420k 6,430k 6,521k
Absolute poverty, before housing costs: pensioners 1,624k 1,572k 1,598k 1,558k 1,576k 1,580k 1,581k
Absolute poverty, after housing costs: everyone 14,944k 14,600k 15,310k 15,721k 15,937k 16,141k 16,426k
Absolute poverty, after housing costs: children 4,975k 4,682k 4,837k 4,888k 4,945k 5,040k 5,179k
Absolute poverty, after housing costs: working-age adults 8,463k 8,461k 8,971k 9,344k 9,491k 9,584k 9,706k
Absolute poverty, after housing costs: pensioners 1,506k 1,457k 1,502k 1,490k 1,501k 1,517k 1,542k
Relative poverty, before housing costs: everyone 11,750k 11,084k 11,388k 11,364k 11,416k 11,415k 11,651k
Relative poverty, before housing costs: children 3,872k 3,423k 3,496k 3,445k 3,466k 3,454k 3,549k
Relative poverty, before housing costs: working-age adults 6,159k 6,013k 6,301k 6,362k 6,389k 6,389k 6,521k
Relative poverty, before housing costs: pensioners 1,720k 1,648k 1,590k 1,557k 1,562k 1,572k 1,581k
Relative poverty, after housing costs: everyone 14,849k 14,552k 14,776k 14,809k 14,874k 15,014k 15,234k
Relative poverty, after housing costs: children 4,942k 4,660k 4,673k 4,663k 4,679k 4,707k 4,806k
Relative poverty, after housing costs: working-age adults 8,426k 8,440k 8,711k 8,823k 8,873k 8,967k 9,062k
Relative poverty, after housing costs: pensioners 1,482k 1,452k 1,392k 1,323k 1,322k 1,339k 1,365k
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.3080 0.3052 0.3058 0.3058 0.3063 0.3069 0.3085
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,681 † £17,997 † £17,915 † £18,152 † £18,307 † £18,531 † £18,717 †
Decile 2: mean household_net_income per household £27,939 † £29,023 † £28,711 † £29,013 † £29,276 † £29,691 † £30,150 †
Decile 3: mean household_net_income per household £34,320 † £35,485 † £36,073 † £36,611 † £37,197 † £37,737 † £38,187 †
Decile 4: mean household_net_income per household £38,933 † £40,687 † £41,723 † £42,727 † £43,334 † £44,132 † £44,432 †
Decile 5: mean household_net_income per household £43,239 † £45,567 † £46,014 † £46,959 † £47,712 † £48,584 † £50,282 †
Decile 6: mean household_net_income per household £47,927 † £49,210 † £50,892 † £51,939 † £52,945 † £53,942 † £54,680 †
Decile 7: mean household_net_income per household £55,662 † £56,571 † £57,442 † £57,670 † £58,729 † £59,657 † £61,082 †
Decile 8: mean household_net_income per household £68,789 † £70,803 † £71,858 † £73,466 † £73,880 † £75,320 † £77,178 †
Decile 9: mean household_net_income per household £78,890 † £81,013 † £80,861 † £82,646 † £85,464 † £86,946 † £89,509 †
Decile 10: mean household_net_income per household £117,005 † £120,339 † £124,742 † £126,632 † £125,971 † £128,600 † £130,938 †
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.41bn £6.66bn £6.63bn £6.85bn £7.03bn £7.25bn £7.49bn
Raise higher rate by 1pp £3.61bn £3.87bn £4.00bn £4.22bn £4.44bn £4.71bn £4.83bn
Raise personal allowance by ~800GBP/year £-3.80bn £-3.92bn £-3.98bn £-4.04bn £-4.10bn £-4.23bn £-1.95bn
Raise child benefit by 25GBP/week per additional child £-1.99bn £-1.75bn £-1.55bn £-1.38bn £-1.30bn £-1.18bn £-1.07bn
Reduce Universal Credit taper rate to 20% £-20.77bn £-21.32bn £-21.75bn £-21.99bn £-22.34bn £-22.75bn £-22.94bn
Raise Class 1 main employee NICs rate to 10% £10.89bn £11.30bn £11.71bn £12.01bn £12.31bn suppressed suppressed
Raise VAT standard rate by 2pp £24.89bn £25.71bn £26.63bn £27.24bn £27.87bn £28.50bn £29.14bn
Raise additional rate by 3pp £2.90bn £3.15bn £3.22bn £3.41bn £3.61bn suppressed suppressed
Raise the Universal Credit standard allowance by 10% £-3.06bn £-3.18bn £-3.26bn £-3.35bn £-3.44bn £-3.49bn £-3.50bn
Raise the State Pension by 10% £-7.78bn £-8.01bn £-8.24bn £-8.47bn £-8.82bn £-8.55bn £-8.89bn
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.55bn £6.86bn £6.79bn £7.00bn £7.20bn £7.44bn £7.66bn
Raise higher rate by 1pp: change in income_tax £3.61bn £3.92bn £4.01bn £4.23bn £4.45bn £4.72bn £4.84bn
Raise personal allowance by ~800GBP/year: change in income_tax £-3.93bn £-4.07bn £-4.13bn £-4.18bn £-4.22bn £-4.40bn £-1.75bn
Raise child benefit by 25GBP/week per additional child: change in child_benefit £2.33bn £2.14bn £1.94bn £1.76bn £1.65bn £1.52bn £1.40bn
Reduce Universal Credit taper rate to 20%: change in universal_credit £20.74bn £21.31bn £21.78bn £22.04bn £22.37bn £22.78bn £22.99bn
Raise Class 1 main employee NICs rate to 10%: change in national_insurance £11.15bn £11.63bn £12.00bn £12.29bn £12.61bn suppressed suppressed
Raise VAT standard rate by 2pp: change in vat £24.69bn £25.51bn £26.42bn £27.03bn £27.65bn £28.28bn £28.91bn
Raise additional rate by 3pp: change in income_tax £2.90bn £3.15bn £3.22bn £3.42bn £3.62bn suppressed suppressed
Raise the Universal Credit standard allowance by 10%: change in universal_credit £3.06bn £3.19bn £3.28bn £3.37bn £3.43bn £3.49bn £3.51bn
Raise the State Pension by 10%: change in state_pension £10.68bn £11.17bn £11.28bn £11.60bn £12.03bn £12.47bn £12.97bn

@MaxGhenis

Copy link
Copy Markdown
Collaborator Author

Ready for hub review

Findings and how I resolved them

From a review of the first commit on four fronts (the law, code and tests, the writing rules, the brief). A second check confirmed or refuted 6 of the 25 findings; I stopped it there, once I had fixed every remaining finding in e4d61659.

  1. Monotonicity property was vacuous (confirmed). It drew 2 paid years among 26 and additions that often didn't qualify. test_adding_a_qualifying_unit_or_person_never_lowers_the_payment (test_cost_of_living_payment_properties.py:389) now works in 2022 and 2023, adds a unit with a listed benefit or a credit of at least £26, or a person with a disability benefit, and checks both "never lower" and the exact rise. Mutants M2, M5, M6 and M12 now fail it as well.
  2. Dates properties checked one sampled year per example (confirmed). Each example now sets its inputs in, and checks, all 24 unpaid years (:319, :329; situation() at :240).
  3. Docstring claimed one simulation per example while monotonicity built two (confirmed). Monotonicity now puts each household beside its grown copy in one simulation (:408), and the docstring says so.
  4. Decomposition property read the pensioner amount from the model (refuted, since the YAML cases pin £300). I hard-coded £300 anyway (:79), citing the sources its parameter cites, so no property reads a model parameter.
  5. £26 description paraphrased section 2(2) loosely and left out section 4 (the finding came back without detail, and the second check refuted it on that ground; I acted on its title). minimum_tax_credit_award.yaml:1 now follows section 2(2) and names section 4's final payments; both the parameter (:12) and cost_of_living_means_tested_payment.py:23 cite section 4.
  6. programs.yaml keeps status: complete despite listed gaps (refuted: income_tax, household_energy_payment, fuel_duty and carers_allowance are complete with documented gaps). Kept.
  7. Writing (fixed before verification finished): Acts or sections acting in both qualifying-benefit descriptions and on the docs page (cost-of-living-payments.md:164); YAML case names making a year or a benefit the actor (renamed, YAML :79 to :341); "the pensioner amount adds" (now "the formula adds"); the YAML header claiming the £300 comes from the Acts; both variable docstrings (cost_of_living_means_tested_payment.py:12, cost_of_living_support_payment.py:7); docs :127 (backdating as payer) and :137; programs.yaml:604 ("program, ended 2023"); the changelog, which now names the four disability benefits and the per-credit £26.
  8. model-baseline.md:69: its three #L3 anchors would land on the new zero row; now #L4.
  9. future-date-announcements.md:124: the one page that teaches the one-off pattern now shows the leading zero and why.

Found while working:

  1. With nothing set, the model computes Universal Credit for a working-age adult (£4,018.92 in 2022) and Pension Credit for a 70-year-old (£9,495.20), so a "Housing Benefit alone" case would qualify through computed UC. Every YAML case and every property sets each listed benefit explicitly.
  2. Mutant M3 (no award > 0 check, so the zero 2023 minimum pays every unit) passed every YAML case in the first run. "2023 a benefit unit on Housing Benefit alone gets no means-tested payment" (YAML :197) now fails it.
  3. At 20 examples the first strategy drew no unit on Housing Benefit alone. Units now draw their benefits from pools (none, Housing Benefit alone, tax credits alone, listed benefits alone, any): in one 20-example sample, 20 units had Housing Benefit alone and 28 qualified through tax credits. I also raised max_examples to 40.
  4. On main the payment raises ParameterNotFoundError before 2015: the lists start in 2022 and backdating reaches 2015. The rest of the model fails there too (income_tax in 2014), so I left it and start the properties at 2015.
  5. The brief's example title runs to 74 characters; the PR uses a 66-character one.

Tests run

What Head Result
cost_of_living_support_payment.yaml e4d61659 15 passed (11 new, 4 existing)
winter_heating_payments_in_income.yaml e4d61659 5 passed
test_cost_of_living_payment_properties.py e4d61659 5 passed, 34 s
code_health (-n 4) e4d61659 3,095 passed
Whole YAML policy suite e4d61659 5,478 passed
test_program_registry.py, test_parameter_descriptions.py e4d61659 passed (149 with the properties)
code_health with the registry, description and both fiscal partition modules 8db4ea9d 3,293 passed
test_disable_simulated_benefits_winter_heating.py, test_pawhp_household_income_properties.py, test_trading_loss_properties.py 8db4ea9d 31 passed. None broke when tax credits started to gate the payment, so I changed none of them.
Seven modules that simulate household income in 2015 to 2023 (absolute poverty reference year, mixed-age couples, Pension Credit child amount, Energy Bills Rebate HBAI, disable-simulated-benefits carers, NI director 2022, company car benefit) 8db4ea9d 105 passed
ruff format --check, ruff check, ruff check --select F811,F821 policyengine_uk, git diff --check e4d61659 clean
.github/check_fix_pr.py on the PR body e4d61659 PASS, 2 changed executable tests

e4d61659 changes no formula or parameter value after 8db4ea9d, only text and tests.

Revert and mutation checks

Revert (a scratch copy with main's cost_of_living_support parameters and variable, and without the new files):

  • YAML as written: all 11 new cases fail (the new variables don't exist on main); the 4 existing pass.
  • Household total only: 8 new cases fail on value: 2021 (£1,100, not £0); the all-strands household in 2022 (£1,100, not £1,750); Housing Benefit alone in 2022 (£650) and 2023 (£900); £26 of Child Tax Credit in 2022 (£0, not £650); a small award in 2023 (£0, not £900); two qualifying units (£1,200, not £2,100); two people on PIP (£150, not £300). The £25.99, £20-each and UC-with-tax-credits cases pass on the total, because main also pays £0, £0 and £650 there.
  • Properties: all 5 fail. The two dates properties and the decomposition property fail on value; the per-unit property fails because the variables don't exist; monotonicity fails because main pays a second qualifying unit nothing. With the pinned households removed, all 5 still fail, and the dates property shrinks to one household with a Winter Fuel Payment, paid £300 in 2015.

Mutation (12 one-line mutants against the final tests): every mutant fails at least one YAML case and at least one property.

Mutant YAML cases that fail Properties that fail
M1 sum the credits before the £26 test £20 of each tax credit decomposition, per-unit
M2 strict > at £26 £26 of Child Tax Credit decomposition, per-unit, monotonicity
M3 no award > 0 check 2023 Housing Benefit alone decomposition, per-unit
M4 Housing Benefit back on the list 2022 and 2023 Housing Benefit alone decomposition, per-unit
M5 means-tested payment once per household all-strands 2022, two qualifying units decomposition, monotonicity
M6 disability payment once per household two people on PIP decomposition, monotonicity
M7 no 2022 minimum £25.99, £20 of each decomposition, per-unit
M8 minimum kept in 2023 small 2023 award decomposition, per-unit
M9 disability amount without its leading zero 2021 both dates properties
M10 pensioner amount without its leading zero 2021 household dates property
M11 means-tested amount without its leading zero 2021 both dates properties
M12 tax credit route pays beside a benefit Universal Credit with tax credits decomposition, per-unit, monotonicity

Skipped, and why

  • Anything that needs a survey dataset: I have no access to the private Hugging Face data, so I ran no microsimulation test or Aggregate impact report myself; CI ran the report (above). The data-backed tests and the report use 2025 onwards, where all three amounts read zero, and no survey run measured 2022-23 or 2023-24.
  • The full Python suite: I left it to CI, which passed it (above).
  • legislation.gov.uk is unreachable from here. I quoted only the Acts' text in the brief, and needed no other provision.

Judgment calls

  1. The £26 test applies to each credit on its own, following "the credit in question" in section 2(2); in section 3(2) of the 2022 Act, too, a person holds a qualifying entitlement to each credit separately. So £20 of each credit gets nothing in 2022-23 (YAML :283). If the hub reads it as the credits' sum, replace the loop in cost_of_living_means_tested_payment.py:36 with add() and change that case to £650; mutant M1 is that change.
  2. The yearly award stands in for both £26 tests: section 2(2)'s test on the qualifying day's payment, award or expected award, and section 4's on the year's total. The parameter description says so.
  3. No zero before 2022 for minimum_tax_credit_award or the lists: backdating gives them their 2022 values from 2015, which pays nothing because the amounts read zero then.
  4. programs.yaml: added variable: cost_of_living_support_payment (the brief says the file names the variable; it didn't), rewrote the notes, kept status: complete.
  5. No fiscal_partition.yaml change: the partition lists components only for tax heads, and test_partition_schema requires an exclusion's head to be a tax head. The new variables stay out of household_benefits, gov_spending and the HBAI lists, which would count them twice.
  6. Labels: kept the existing parameter labels (the guide asks for stable labels) and rewrote descriptions that said "households". The qualifying-benefits list now follows the order of section 1(3).
  7. Properties set the benefits as inputs instead of computing them, so they test the payment rules for any benefit amounts, not the benefits' own formulas. They hard-code the Acts' amounts and the £300 pensioner amount.
  8. Docs beyond the named page: the model-baseline.md anchors and one sentence in future-date-announcements.md.
  9. GitHub writes (this PR, the pick-up note, these comments) went through the GitHub MCP tools rather than gh api, which this session reserves for search; the REST effect is the same.

Hub documents

AXIOM_ISSUE.md is in the comment above, ready for the hub to file and to fill the PR's axiom: line.


Generated by Claude Code

@MaxGhenis

Copy link
Copy Markdown
Collaborator Author

Ready for hub review

Verdict: APPROVE WITH NITS at e4d61659269516ede0984b46644bd5595bdbb10a

I reviewed 52b30809f..e4d616592 in a detached scratch worktree, against the provisions quoted in TheAxiomFoundation/rulespec-uk#532. I found no wrong result, no broken check and no false claim a reader would rely on. The findings below are one test gap and three wording fixes. Separately, #2302 needs four expectations changed whichever of the two lands second (see "Merges and neighbours").

Findings

P1

None.

P2

None against this PR. See "Merges and neighbours" for #2302.

P3

1. No YAML case covers a unit on Working Tax Credit alone, so dropping working_tax_credit from the list passes every case.
policyengine_uk/parameters/gov/treasury/cost_of_living_support/means_tested_households/qualifying_tax_credits.yaml:15, policyengine_uk/tests/policy/baseline/gov/treasury/cost_of_living_support/cost_of_living_support_payment.yaml.
My mutant M13 deletes the line - working_tax_credit. Command: uv run policyengine-core test .../cost_of_living_support_payment.yaml -c policyengine_uk gives 15 passed. The properties kill it (see "Invariants and mutants" below), so the suite as a whole catches it, but section 1(2) names both credits and the hand-worked cases test only Child Tax Credit on its own. Suggested case, after :310:

- name: 2022 a benefit unit on £26 of Working Tax Credit alone gets the means-tested payment
  # A yearly award of £26 meets section 2(2)'s "at least £26" for 2022-23, and
  # the unit has no listed benefit, so HMRC pays £326 + £324 = £650
  # (section 1(2)).
  period: 2022
  input:
    people:
      worker:
        age: 30
    benunits:
      worker_unit:
        members: [worker]
        universal_credit: 0
        pension_credit: 0
        jsa_income: 0
        esa_income: 0
        income_support: 0
        child_tax_credit: 0
        working_tax_credit: 26
    households:
      household:
        members: [worker]
        winter_fuel_allowance: 0
  output:
    cost_of_living_means_tested_payment: 650
    cost_of_living_support_payment: 650

I haven't run this case; it follows the £26 Child Tax Credit case at :226.

2. "the war pension mobility supplement" narrows section 5(2)(i).
Section 5(2)(i) of each Act lists a mobility supplement under the Personal Injuries (Civilians) Scheme 1983 (article 25A or 48A) as well as under the Naval, Military and Air Forces etc. (Disablement and Death) Service Pensions Order 2006 (article 20). The text appears in:

  • policyengine_uk/parameters/gov/treasury/cost_of_living_support/disabled/qualifying_benefits.yaml:1
  • policyengine_uk/programs.yaml:614
  • docs/book/programs/gov/treasury/cost-of-living-payments.md:166
  • the PR body's section 5 bullet.

Command: grep -rn "war pension mobility" policyengine_uk docs. Replace "the war pension mobility supplement" with "the mobility supplement" in each, as rulespec-uk#532 does. In the same lists, "constant attendance allowance" already covers both 5(2)(d) and 5(2)(h), so it can stay.

3. The pensioner amount's description names a test the formula doesn't apply.
policyengine_uk/parameters/gov/treasury/cost_of_living_support/pensioners/amount.yaml:1 says the top-up goes to "households with someone of State Pension age". The formula (cost_of_living_support_payment.py, on_pensioner_benefit) pays it once to each household with a Winter Fuel Payment, which the PR's own docs page, body and programs.yaml say. Replace with:

One-off Pensioner Cost-of-Living Payment, a £300 top-up to the Winter Fuel Payment, which the formula pays once to each household with a Winter Fuel Payment in 2022-23 and 2023-24. The amount reads zero before 2022 and from 2024.

4. The YAML header turns "not later than 31 October 2022" into a range of qualifying days.
cost_of_living_support_payment.yaml:70-71 says the Secretary of State and HMRC "pay £326 and £324 for qualifying days from 25 May 2022 to 31 October 2022 (section 1(1), (2) and (4))". Section 1(4) sets one second qualifying day, "not later than 31 October 2022". Replace with:

Under the 2022 Act the Secretary of State and HMRC pay £326 for 25 May 2022 and £324 for a second qualifying day no later than 31 October 2022 (section 1(1), (2) and (4)), £650 in all,

Previous round: the hand-off's findings

# Status Evidence
1 Vacuous monotonicity Closed test_adding_a_qualifying_unit_or_person_never_lowers_the_payment (:389) works in 2022 and 2023 only, qualifying_units() forces a listed benefit or a credit of at least £26, qualifying_people() forces a disability benefit, and it checks the exact rise. It killed M5 and M12 in my runs.
2 Dates checked one year Closed Both date properties loop over UNPAID_YEARS, which holds 24 years (2015 to 2021, 2024 to 2040). situation() sets every input in each of them.
3 One simulation per example Closed Monotonicity simulates households_ + grown once (:409); the docstring matches.
4 Pensioner amount from the model Closed PENSIONER_AMOUNT = 300 (:79). No property reads a model parameter.
5 £26 description Closed minimum_tax_credit_award.yaml:1 follows section 2(2) and names section 4; both appear in its references and in the variable's.
6 status: complete Agree, kept test_program_registry.py passes.
7 Writing Closed, apart from P3 2 to 4 Read every added description, docstring, comment and docs paragraph.
8 model-baseline.md anchors Closed Line 4 of each amount.yaml is now the 2022-01-01 row.
9 Future-dating guide Closed and accurate backdate_parameters (utils/parameters.py:31) updates only when BACKDATED_FROM (2015-01-01, utils/dated_reforms.py:208) falls before the earliest stated instant, so a 0001-01-01 row stops it.
10 Computed UC and PC Confirmed A 30-year-old alone with nothing set gets universal_credit 4,018.92 in 2022; a 70-year-old gets pension_credit 9,495.20. Same on main and the head.
11 M3 needed a case Closed M3 fails 1 YAML case (below).
12 Strategies miss HB-alone and tax-credit-only units Closed BENEFIT_POOLS (:120) draws from none, UNLISTED_BENEFITS (Housing Benefit alone), TAX_CREDITS alone, LISTED_BENEFITS alone or all of them, and PINNED_HOUSEHOLDS holds a Housing-Benefit-only unit and £26/£25.99/£20+£20 tax-credit units. I didn't recount the 20-example sample.
13 ParameterNotFoundError before 2015 Confirmed, unchanged by this PR In 2014, cost_of_living_support_payment raises ParameterNotFoundError on means_tested_households[qualifying_benefits] on both main and the head. income_tax raises it too (on gov.simulation.labour_supply_responses[income_elasticity]), so the model doesn't run in 2014 at all.
14 Title length Closed The live title has 66 characters.

The law

  • Housing Benefit. Section 1(3) of each Act lists (a) to (e) without it. qualifying_benefits.yaml holds universal_credit, pension_credit, jsa_income, esa_income and income_support, all benefit-unit variables. The formula combines the routes as on_benefit | on_tax_credit, so the tax credit route pays only a unit with no listed benefit, and never adds a second payment (section 1(2), "but not to a social security benefit"). A unit with Housing Benefit and a tax credit qualifies through HMRC, which matches the Acts.
  • The £26 test, judgment call 1. I agree. Section 2(2) and section 4(1)(c) and (2)(c) each speak of "the credit in question", and section 1(2) gives a qualifying entitlement "to child tax credit or working tax credit", so each credit stands or falls on its own. The formula's loop matches that reading; M1 (sum first) fails the £20-each case.
  • Judgment call 2. I think it's fair. A payment or award of at least £26 on the qualifying day implies a yearly award of at least £26, apart from later reductions. Section 2(2)'s "HMRC expects ... at least £26 in respect of the tax year 2022-23" limb and section 4's final payments both test the year's total. What the yearly award loses is the window: a unit whose award ended before 26 April 2022, or started after the second qualifying day, gets paid by the model and not under the Act. The body, docs page and programs.yaml all state this approximation.
  • 2023 minimum. Section 3(1) sets no amount. The parameter reads £0 from 2023, and (award > 0) & (award >= 0) needs a positive award. M3 fails "2023 a benefit unit on Housing Benefit alone".
  • "Person". 2022 s.1(6) and 2023 s.1(9): an individual or a couple. The formula runs on BenUnit (a single adult or a couple with their children); the household sums its units.
  • Section 5. The model's list holds pip (5(2)(b)), dla (5(2)(a)), attendance_allowance (5(2)(c)) and armed_forces_independence_payment (5(2)(g)), all person variables, paid per person. The Acts also list (d) and (h) constant attendance allowance, (e) Adult Disability Payment, (f) Child Disability Payment and (i) the mobility supplement. grep -rniE "adult_disability|child_disability|constant_attendance|mobility_supplement" policyengine_uk/variables finds no such variable, so the "no variables" claim holds. afcs, iidb and sda, which the old docs table listed, aren't on section 5(2) and weren't on main's parameter list either.

Dates

uv run python params.py read each parameter at 30 April of each year:

Years means-tested pensioner disability minimum_tax_credit_award lists
2014 0 0 0 none none
2015 to 2021 0 0 0 26 2022 lists
2022 650 300 150 26 2022 lists
2023 900 300 150 0 2022 lists
2024 to 2040 0 0 0 0 2022 lists

The leading zeros do what the body says: each amount reads zero in 2015 to 2021. A 70-year-old alone with nothing set gets cost_of_living_support_payment 950 (£650 through computed Pension Credit plus £300) in 2015 and in 2021 on main, and 0 on the head, which supports "where main pays £650, £300 and £150". The minimum and the lists carry their 2022 values back to 2015, which pays nothing because the amounts read zero (judgment call 3).

Code

  • household_benefits.py:36, hbai_household_net_income.py:58, hbai_benefits.py:39, gov_spending.py:37 and pre_budget_change_household_benefits.py:35 each list cost_of_living_support_payment once. grep -rn cost_of_living_means_tested_payment\|cost_of_living_disability_payment outside the tests finds only the three variable files and the docs page, so neither new variable is counted twice.
  • Judgment call 5 holds. test_partition_schema requires each exclusion's head to be in ids, the tax heads (test_fiscal_partition.py:163, :193), so a component entry naming the spending head cost_of_living_support_payment would fail. Other spending components such as pip_dl or ctc_entitlement have no entry either.
  • programs.yaml: variable: cost_of_living_support_payment resolves, and test_program_registry.py passes.

Cases

I worked all 11 new cases by hand from the quoted law; each expected value matches:

Case My sum
2021 every strand amounts read 0: 0, [0, 0], [0, 0, 0]
2022 every strand PC unit £326 + £324 = £650 (s.1(1), 1(3)(b)); CTC £2,000 ≥ £26, no listed benefit, £650 (s.1(2), 2(2)); AA £150 (s.5(2)(c)); £300; £1,750
2022 HB alone not in s.1(3), no credit: 0
2023 HB alone same under the 2023 Act: 0
2022 £26 CTC "at least £26": £650
2022 £25.99 CTC short of £26: 0
2022 £20 + £20 neither credit reaches £26 alone: 0
2023 £10 CTC no minimum (s.3(1)): £301 + £300 + £299 = £900
2022 UC + tax credits s.1(1) £650 only
2023 two units two persons (s.1(9)) × £900 + £300 = £2,100
2022 couple on PIP £150 to each individual (s.5(1)): £300; no means-tested payment

They cover companion cases C3 to C7 and C9 to C12 of rulespec-uk#532, with the same expected values. C2 matches the existing £650 Universal Credit case. No case covers C8 (a couple on Pension Credit), and C13 and C14 name benefits the model has no variable for.

Invariants and mutants

The five properties match invariants 1 to 3: two for invariant 1 (household, then unit and person), two for invariant 2 (household total, then each unit and person) and one for invariant 3. Invariant 4 has no test, and the body doesn't claim one. Each property sets every input the formulas read, takes its amounts from constants (:71 to :79) and checks with atol=0.01 or exact equality.

I applied each mutant to the scratch worktree, ran cost_of_living_support_payment.yaml and test_cost_of_living_payment_properties.py -n 4, and restored with git checkout:

Mutant YAML Properties Result
M1 sum the credits before the £26 test 1 failed, 14 passed decomposition, per-unit failed killed
M3 no award > 0 check 1 failed, 14 passed per-unit, decomposition failed killed
M5 means-tested payment once per household (household.max(...)) 2 failed, 13 passed decomposition, monotonicity failed killed
M12 p.amount * on_benefit + p.amount * on_tax_credit 1 failed, 14 passed decomposition, per-unit, monotonicity failed killed
M13 (mine) drop working_tax_credit from qualifying_tax_credits 15 passed decomposition, per-unit, monotonicity failed killed by the properties only (P3 1)

The YAML cases each mutant fails:

  • M1: "2022 a benefit unit on £20 of each tax credit gets nothing" (650, not 0).
  • M3: "2023 a benefit unit on Housing Benefit alone gets no means-tested payment" (900, not 0).
  • M5: "2022 a household qualifying for every strand gets all three payments" (1,100, not 1,750) and "2023 two qualifying benefit units in one household get two means-tested payments" (1,200, not 2,100).
  • M12: "2022 a benefit unit on Universal Credit and tax credits gets one means-tested payment" (1,300, not 650).

For M1, M3, M5 and M12, the failing YAML cases and properties match the hand-off's table.

Text

  • Title and body: I ran .github/check_fix_pr.py from main at 1d4d020a on the live title, body and labels and on git diff --name-status --no-renames -z 52b30809f e4d61659, with --repo-root a main checkout, as pr_fix_evidence.yaml does. Output: Fix evidence: PASS ('Start cost-of-living payments in 2022, per benefit unit and person') - Fix PR has valid reproducer evidence. Changed executable tests: 2.
  • Body numbers I reran: 15 YAML cases (11 new, 4 existing), 5 properties with 40 examples each, up to 8 or 16 households, 24 unpaid years, UC £4,018.92, code_health 3,095, 149 for the properties with the registry and description modules, ruff format --check, ruff check and git diff --check clean.
  • Body numbers I didn't rerun: the revert check (all 11 new cases and all 5 properties failing on main's rules, and the eight household totals), mutants M2, M4, M6 to M11, the 105-test and 31-test modules, and the whole YAML suite (5,478).
  • The changelog fragment, docs page, both new variable docstrings and the parameter descriptions match the code, apart from P3 2 to 4. They name an actor in each sentence I read, and none describes fix history.

Tests

Command (at e4d61659, HUGGING_FACE_TOKEN and POLICYENGINE_UK_DEFAULT_DATASET unset) Result
uv run policyengine-core test .../cost_of_living_support_payment.yaml -c policyengine_uk 15 passed
uv run policyengine-core test .../winter_heating_payments_in_income.yaml -c policyengine_uk 5 passed
uv run pytest test_cost_of_living_payment_properties.py test_program_registry.py test_parameter_descriptions.py -n 4 149 passed in 61 s
uv run pytest policyengine_uk/tests/code_health -n 4 3,095 passed in 247 s (rerun on a clean tree after the mutants)

CI

gh api repos/PolicyEngine/policyengine-uk/commits/e4d61659.../check-runs returns 22 runs, all completed and success: Fix evidence (twice, from the push and an edit), Test / Result, Test / Python 1/7 to 7/7, Test / YAML, Install + smoke-import on 3.11 to 3.14, Documentation build, Release build records the commit, Changes, Lint, Aggregate impact, Changelog fragments and Test documentation builds. None fails. The Aggregate impact comment (6603623680) compares base 1d4d020aa1 with head 2ccf24326a, GitHub's merge of this head into main, over 2025-26 to 2031-32: 0 checks broken, 1 failing on both sides, 0 moves flagged. All three amounts read zero in those years, so the report can't show this change.

Merges and neighbours

File Case Expected Got
finance/benefit/family/child_tax_credit_school_leaver_routes.yaml:428 Case 18, a 16-year-old school leaver who receives Income Support in their own right is not a qualifying young person household_net_income 6,338.30 (2018) 6,188.30 (−£150 disability payment)
finance/benefit/family/child_tax_credit_school_leaver_routes.yaml:469 Case 19, the same family without Income Support for the 16-year-old gets CTC until 31 August 2018 10,739.70 (2018) 10,589.70 (−£150)
finance/benefit/qualifying_young_person_income_support.yaml:192 Case 8, a student-carer on Income Support of their own is not the pensioner's qualifying young person 15,905.70 (2019) 14,805.70 (−£1,100)

The fourth expectation is in Python: test_qualifying_young_person_income_support_properties.py::test_a_reform_paying_no_income_support_restores_the_severe_disability_addition (household_net_income 16,319.10 expected, 15,219.10 on the merge, −£1,100; passes on #2302's head). The fix belongs in #2302: its comments at those cases say the model applies the 2022 amounts to earlier years, which #2847 calls a bug. Whichever PR lands second needs those four expectations lowered by the amounts above and the comments that explain them removed.

Checked and sound

  • Each rule against the quoted sections 1(2), 1(3), 1(6), 2(2), 4 and 5 of the 2022 Act and 1(2), 1(3), 1(9), 3(1) and 5 of the 2023 Act (above).
  • Every parameter's value from 2014 to 2040 at 30 April (above), and backdate_parameters and BACKDATED_FROM read from source.
  • The three formulas, the seven parameter files and the five aggregates that read the household total.
  • The 11 new cases by hand; the five properties against invariants 1 to 3; M1, M3, M5, M12 and M13 rebuilt.
  • model-baseline.md anchors (line 4 of each amount.yaml is the 2022 row); future-date-announcements.md against the backdating code.
  • Fix evidence on the live title and body; CI check runs; three merge trees.

What I couldn't check

  • legislation.gov.uk doesn't resolve from here, so I relied on the text quoted in rulespec-uk#532 and checked no SHA-256.
  • No survey-data run: I have no Hugging Face access, so no microsimulation for 2022-23 or 2023-24 and no Aggregate impact report of my own.
  • The revert check and mutants M2, M4 and M6 to M11 rest on the hand-off; I didn't rebuild them.
  • The 105-test and 31-test modules and the whole YAML suite: CI's Test jobs passed them; I didn't rerun them.
  • Whether the hand-off's 20-example sample drew 20 Housing-Benefit-only units and 28 tax-credit-only units; I checked the pools in the code instead.

Generated by Claude Code

Add a YAML case for a benefit unit on £26 of Working Tax Credit alone, which
gets the £650 means-tested payment under sections 1(2) and 2(2) of the 2022
Act. Name the mobility supplement as section 5(2)(i) of each Act lists it, say
that the formula pays the pensioner top-up once to each household with a
Winter Fuel Payment, and give the 2022 Act's second qualifying day as section
1(4) sets it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis marked this pull request as ready for review November 3, 2026 15:33

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

Reviewed 461b933ca2eb24fa69b4888b4e091d9f24efa02c. COMPLETE — no critical findings or material evidence gaps; one nonblocking reference correction remains.

S1: the newly added pensioner guidance URL in policyengine_uk/variables/gov/treasury/cost_of_living_support/cost_of_living_support_payment.py:21 returns HTTP 404. Replace it with the live official pensioner guidance. The historical amount is corroborated; this is a reference issue, not a cash calculation defect.

The Acts support the per-benefit-unit means-tested and per-person disability payments, separate £26 test for each credit in 2022, couple counting and tax/benefit disregards. The actual filed #532 contract and companion cases were checked. The documented annual receipt proxy remains distinct from exact qualifying-day entitlement.

All 171 focused checks passed. Native annual-proxy cases produced £1,900 in 2022 and £2,400 in 2023 across two qualifying units/two disability recipients, zero in 2021/2024. All five final household/spending measures changed exactly once by those amounts; UC, PC, tax and WFP were unchanged against the labelled control. The initial collection-only external-script typo was corrected before any PR test executed; its log is retained separately. Current-head CI is green.

Approval is withheld while S1 remains open.

GOV.UK returns 404 for the guidance page cost-of-living-payment-pensioner. The variable's reference and the pensioner amount parameter's reference now open the pensioner section of DWP's cost-of-living payment guidance.

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

@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 90e8418cb883db9a90527dc8e5f76183d31478eb. COMPLETE — no open findings or material evidence gaps. S1 is resolved: both the variable and pensioner parameter now use the verified live official guidance URL and pensioner anchor.

The delta contains exactly those two reference replacements. Python behavior, parameter values and the remaining tracked tree are unchanged. Independent code/source retention checks verified the prior 171 passing checks and native final-income/spending results, current runtime/dependency pins and the actual filed Axiom #532 evidence. No tests or model calculations were rerun; the documented annual entitlement proxy and other scope limits remain.

Approval is deferred because checks at this new head are still running. I will check CI on a later monitor run without repeating the completed code review.

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

Rechecked 90e8418cb883db9a90527dc8e5f76183d31478eb after CI completed. COMPLETE — no open findings or material evidence gaps. S1 remains resolved.

The head, description, runtime/dependency pins and filed Axiom #532 evidence are unchanged from the completed review. The prior independent policy assessment, 171 passing checks and qualified final-accounting results remain valid; their stored evidence and source bindings were verified without rerunning tests or repeating the code/source investigation. The documented annual-entitlement and other model scope limits remain.

The PR is ready and applicable checks pass at this exact head. Approved.

@juaristi22
juaristi22 added this pull request to the merge queue Nov 3, 2026
Any commits made after this event will not be merged.

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

3 participants