Skip to content

Pay the Scottish Carer Supplement for each Carer Support award week - #2857

Draft
MaxGhenis wants to merge 2 commits into
mainfrom
claude/scottish-carer-supplement-weeks-iwr4se
Draft

MaxGhenis wants to merge 2 commits into
mainfrom
claude/scottish-carer-supplement-weeks-iwr4se

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Nov 3, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #2791
Reproducer: policyengine_uk/tests/policy/baseline/gov/social_security_scotland/scottish_carer_supplement.yaml::Carer in England with 13 weeks of Carer Support Payment gets 13 weeks of supplement
axiom: TheAxiomFoundation/rulespec-uk#398 queued

What the formula does

scottish_carer_supplement now pays the weekly supplement rate for

min(52, max(carer_support_payment_pre_overlap, carer_support_payment) / weekly Carer Support Payment rate)

award weeks where carer_support_payment exceeds 0, and nothing for a carer with no carer_support_payment. It reads both weekly rates from gov.social_security_scotland.carer_support_payment. On main the formula pays 52 weekly rates for any positive payment. A carer who moves to England keeps Carer Support Payment for 13 weeks (13 × £86.45 = £1,123.85). main gives them £608.40 of supplement in 2026-27, where Social Security Scotland would pay 13 × £11.70 = £152.10.

The formula uses four terms:

  • carer_support_payment > 0. Social Security Scotland pays the supplement only for an award week in which Carer Support Payment is payable (regulation 14A). Where an overlapping benefit equals or exceeds the payment, Social Security Scotland gives £0 of it that week (regulation 16(2)(b)), and the formula pays no supplement, as main does.
  • carer_support_payment_pre_overlap. Where the model computes this amount, carer_support_payment_pre_couple_limit returns 52 weekly rates or nothing, and limit_carer_benefit_to_one_partner keeps that amount or sets it to nothing. So a carer whose overlapping benefit reduces the payment but leaves some keeps all 52 weeks.
  • carer_support_payment. Where a user supplies the payment and the model finds no amount before the reduction, as for a carer who has moved to England, the formula divides the payment by the weekly rate to count the weeks.
  • The cap. The model counts 52 award weeks in a year (WEEKS_IN_YEAR), so the formula never pays more than 52 weekly rates.

The formula doesn't round the weeks, so it counts part of a week for a payment that falls between whole numbers of weekly rates. It works out the share of the year, the amount over 52 weekly rates, and pays 52 weekly supplement rates times that share, up to 1. That product equals the weekly rate times the weeks above. The engine stores amounts in float32, so the formula holds the 52 weekly rates in the amount's dtype, as carer_support_payment_pre_couple_limit does for the earnings limit. For a full-year entitlement the formula then computes a share of 1, and wherever the model computes both amounts the supplement equals main's bit for bit. If the formula divided the float32 amount by the rate instead, it would count 51.999999 weeks in 2026 and pay £608.39996, where main pays £608.40002. Under a reform that sets the weekly rate to zero, the formula pays no supplement and never divides by zero.

The law

The Carer's Assistance (Carer Support Payment) (Scotland) Regulations 2023 (SSI 2023/302):

  • Regulation 14A: "An individual is entitled to Scottish Carer Supplement for each award week in which Carer Support Payment is payable to the individual."
  • Regulation 2: "“award week” means a period of 7 days beginning on a Sunday and ending on a Saturday".
  • Regulation 16: "(1) The weekly rate of payment of Carer Support Payment is £86.45. (1A) The weekly rate of payment of Scottish Carer Supplement is £11.70." Under (2), "for any award week where an individual is entitled to one or more overlapping benefit", the amount of Carer Support Payment "is to be reduced— (a) by the amount of the overlapping benefit paid, or (b) where the amount of the overlapping benefit is equal to or greater than the amount of Carer Support Payment, the value of Carer Support Payment that is to be given to the individual is £0."
  • Regulation 42: a carer who moves to another part of the United Kingdom "is to be treated as though the individual meets the condition under regulation 6(1)(a) ... of being ordinarily resident in Scotland for a period of 13 weeks" (paragraph (1)); where the cared-for person dies within those 13 weeks, "for a period of 12 award weeks after the first day of the award week following the award week in which the cared for person died" (paragraph (1A)); and "on the day after the 13-week period ... entitlement to Carer Support ceases" (paragraph (5)). So such a carer receives Carer Support for at most 13 weeks, or up to 25 in all after a death in that time.

Where the count differs from the law

In four cases the formula counts weeks differently from the law, and we name each in the variable's documentation:

  • Where an overlapping benefit or earnings vary within the year, the formula counts 52 weeks or none from the annual amounts, while Social Security Scotland pays the supplement only for the award weeks in which the payment stays payable. main counts the same way, from the annual amounts of carer_support_payment and carer_support_payment_pre_overlap.
  • Where a user supplies a part-year payment and also sets inputs that make the person eligible in Scotland, the formula counts 52 weeks, since the model reads those inputs as a whole year (the YAML case Carer in Scotland the model finds eligible keeps 52 weeks of supplement with a supplied part-year payment).
  • Where a user supplies a payment that an overlapping benefit has reduced, the formula counts fewer weeks than the award weeks in which that payment is payable, unless the model also has the amount before the reduction, supplied or computed (the YAML case Carer with a supplied payment that State Pension reduced keeps 52 weeks of supplement with the amount before the reduction).
  • Under gov.contrib.policyengine.disable_simulated_benefits, the reform makes a Scottish carer's reported Carer's Allowance their carer_support_payment and leaves the amount before the reduction to the model (the comment above reported_care in disable_simulated_benefits.py). So the formula counts 52 weeks for a reported carer the model finds eligible, even where the report covers only part of the year. For any other reported carer, it counts the weeks the report implies at each year's weekly rate. The reform doesn't uprate the report, so for a report of a full year the formula counts fewer weeks in later years.

In line 166 of docs/book/assumptions/carer-support-payment-earnings.md, the supplement "follows CSP actually payable". The formula still pays it only where Carer Support Payment is payable, so we leave that line as it is.

Invariants

For single people aged 14 to 90 in each UK country, in each year from 2024 to 2030:

  1. Bounds. The supplement lies between 0 and 52 weekly supplement rates, as the engine stores that amount.
  2. Paid with the payment. The formula pays a positive supplement where, and only where, carer_support_payment exceeds 0, in years with a positive supplement rate.
  3. Differential. The supplement matches, to within a tenth of a penny, the rule the test rebuilds from the drawn inputs and the parameters' rates.
  4. Monotonic. When a user raises a supplied carer_support_payment, the formula never lowers the supplement.
  5. Whole weeks. For a supplied payment of k weekly rates, with k from 1 to 52, the formula pays k weekly supplements to within a tenth of a penny, and for 52 weekly rates or more it pays 52.
  6. Full year where the model computes both amounts. When a user supplies neither carer_support_payment nor carer_support_payment_pre_overlap, the supplement equals, bit for bit, main's csp.supplement * WEEKS_IN_YEAR * (carer_support_payment > 0), which the test rebuilds.
  7. Zero rate. Under a reform that sets the weekly Carer Support Payment rate to zero, the formula pays no supplement and raises no floating-point error.

Tests

YAML. scottish_carer_supplement.yaml gains 9 cases. We worked each value by hand from regulation 16(1) and (1A), at £86.45 and £11.70 a week in 2026 and at the model's 2027 projections, £89.50 and £12.10:

Case Inputs Supplement
Carer in England with 13 weeks of Carer Support Payment gets 13 weeks of supplement £1,123.85 (13 × £86.45), England 13 × £11.70 = £152.10
Carer in England whose cared-for person dies in week 13 after the move gets 25 weeks of supplement £2,161.25 (25 × £86.45) 25 × £11.70 = £292.50
One week of Carer Support Payment gives one week of supplement £86.45 £11.70
Carer Support Payment worth more than 52 weeks gives 52 weeks of supplement £5,187 (60 × £86.45) 52 × £11.70 = £608.40
Carer in Scotland with no caring inputs and 13 weeks of Carer Support Payment gets 13 weeks of supplement £1,123.85, Scotland £152.10
Carer in Scotland the model finds eligible keeps 52 weeks of supplement with a supplied part-year payment age 35, 40 hours a week, £1,123.85 £608.40
Carer whose State Pension reduces Carer Support Payment and leaves some keeps 52 weeks of supplement age 70, 35 hours, State Pension £2,000 (payment £4,495.40 − £2,000 = £2,495.40) £608.40
Carer with a supplied payment that State Pension reduced keeps 52 weeks of supplement with the amount before the reduction £4,495.40 before the reduction, £2,495.40 paid £608.40
Carer in England with 13 weeks of Carer Support Payment gets 13 weeks of supplement in 2027 £1,163.50 (13 × £89.50) 13 × £12.10 = £157.30

All 13 cases in the file pass, as do the 10 in carer_support_payment_overlapping_benefits.yaml.

Properties. test_scottish_carer_supplement_award_weeks_properties.py holds 7 tests. Each Hypothesis example puts every drawn person in one simulation, with inputs in each year from 2024 to 2030, and checks every year. Each property test draws 12 derandomised examples besides its pinned ones.

  • test_supplied_payment_bounds_and_reference: invariants 1 to 3 with supplied payments, and sometimes supplied amounts before the reduction. It pins the 2026 cases above, and a batch in which the test supplies both amounts.
  • test_computed_payment_bounds_and_reference: invariants 1 to 3 and 6 with State Pension below, above and equal to a year of Carer Support Payment. In a third of the batches it also supplies an amount before the reduction and checks invariants 1 to 3 only.
  • test_supplement_is_monotonic_in_a_supplied_payment: invariant 4, with no tolerance.
  • test_whole_weeks: invariant 5 for k from 1 to 52 and for 52, 52.001, 53, 60, 104 and 1,000 weekly rates, in each year from 2026 to 2030.
  • test_zero_rate_gives_no_supplement (supplied and computed): invariant 7, with only the formula running under np.errstate(all="raise").
  • test_disable_simulated_benefits_pays_the_weeks_the_report_implies: two Scottish carers who each report £4,000 in 2025. The one who would claim keeps 52 weeks (£608.40 in 2026, £629.20 in 2027). The one who wouldn't gets 4,000 / 86.45 × 11.70 = £541.35 in 2026 and 4,000 / 89.50 × 12.10 = £540.78 in 2027.

The 7 tests pass in 62 seconds with -n 4.

Revert check. We ran these tests on a copy of main:

  • 5 of the 9 new YAML cases fail: both 13-week cases in England (2026 and 2027), the 25-week case, the one-week case and the 13-week case in Scotland with no caring inputs. Each gets main's 52 weeks, £608.40 or £629.20. The other 4 pass on main, which pays 52 weeks there too: 60 weeks, the eligible Scottish carer with a supplied part-year payment, and the two State Pension cases.
  • 5 of the 7 property tests fail: supplied bounds and reference, computed bounds and reference (a supplied part-year amount before the reduction), whole weeks, the reform test (£608.40 for the carer who wouldn't claim), and zero rate with a supplied payment (£608.40 at a zero rate). Monotonicity and zero rate with a computed payment pass on main, whose supplement also never falls as the payment rises and comes to £0 when the model pays nothing.

Mutations. We ran each mutation of the formula against both YAML files (23 cases) and the 7 property tests:

Mutation YAML Property tests that fail
Divide by the full year without the guard all pass both zero-rate tests (FloatingPointError)
No cap at 52 weeks 1 fails (60 weeks) supplied reference, whole weeks
Weeks from the payment alone 5 fail supplied reference, computed reference, reform
Weeks from the amount before the reduction alone 6 fail supplied reference, whole weeks, reform
The full year in float64, not the amount's dtype all pass computed reference (invariant 6, bit for bit)
Whole weeks, rounded up all pass supplied reference, computed reference, whole weeks, reform

Tests that read these variables. Every test file that names scottish_carer_supplement or carer_support_payment (git grep -l) passes when we run it on its own with -n 4: 19 Python files with 229 tests, and 14 YAML files with 279 cases. policyengine_uk/tests/code_health passes 3,091 tests. Invariant 5 of test_carer_overlapping_benefits_properties.py still holds. In test_disable_simulated_benefits_carers.py, no carer's supplement changes: in a copy that logged each call, the formula ran 485 times over 1,294 person-years, 456 of them with a positive payment, and every value equalled main's bit for bit. ruff format --check, ruff check, ruff check --select F811,F821 policyengine_uk and git diff --check pass.

Aggregate impact

The Aggregate impact check on certified data passes and flags no move: no household's net income changes in any year from 2025-26 to 2031-32. The certified file, enhanced_frs_2024_25.h5 from policyengine-uk-data 1.58.1, stores carers_allowance_reported but neither carer_support_payment nor carer_support_payment_pre_overlap. So the model computes both amounts for every carer in it, and by invariant 6 each supplement equals main's bit for bit.

🤖 Generated with Claude Code

scottish_carer_supplement paid 52 weekly rates for any positive
carer_support_payment. It now pays the weekly supplement rate for

    min(52, max(carer_support_payment_pre_overlap, carer_support_payment)
        / weekly Carer Support Payment rate)

award weeks where carer_support_payment is positive (SSI 2023/302 reg
14A), so 13 weeks of Carer Support Payment after a move to England (reg
42) bring 13 weekly rates of supplement, £152.10 in 2026-27, rather than
£608.40. The formula holds 52 weekly rates in the amount's float32 dtype,
so where the model computes both amounts the supplement equals main's
bit for bit, and it guards the division against a zero rate.

The documentation names the four cases where the count differs from the
law. YAML cases worked from reg 16(1) and (1A) and Hypothesis properties
cover the bounds, payment, differential, monotonicity, whole weeks, full
year, zero rate and the disable_simulated_benefits path.

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

Copy link
Copy Markdown
Collaborator Author

AXIOM_ISSUE.md

Title: ssi/2023/302 reg 14A: Scottish Carer Supplement for each award week in which Carer Support Payment is payable

Labels: pe-parity

## Module and corpus

- Module: `uk/regulations/ssi/2023/302/14A.yaml` (new), reading `uk/regulations/ssi/2023/302/16.yaml` for the weekly rates (`carer_support_payment_weekly_rate`, `scottish_carer_supplement_weekly_rate`). rulespec-uk encodes reg 16(1) and (1A) and reg 5; it doesn't encode reg 14A or reg 2's award week.
- Corpus: SSI 2023/302 reg 14A (`uk/regulation/ssi/2023/302/14A`, https://www.legislation.gov.uk/ssi/2023/302/regulation/14A), reg 2(2) (`uk/regulation/ssi/2023/302/2`, https://www.legislation.gov.uk/ssi/2023/302/regulation/2) and reg 16 (`uk/regulation/ssi/2023/302/16`, https://www.legislation.gov.uk/ssi/2023/302/regulation/16).
- PolicyEngine: PolicyEngine/policyengine-uk#2791, fixed by PolicyEngine/policyengine-uk#2857 (`scottish_carer_supplement`).

## The law

SSI 2023/302 reg 14A:

> An individual is entitled to Scottish Carer Supplement for each award week in which Carer Support Payment is payable to the individual.

Reg 2(2):

> “award week” means a period of 7 days beginning on a Sunday and ending on a Saturday, …

Reg 16:

> (1) The weekly rate of payment of Carer Support Payment is £86.45.
> (1A) The weekly rate of payment of Scottish Carer Supplement is £11.70.
> …
> (2) For any award week where an individual is entitled to one or more overlapping benefit, the amount of Carer Support Payment that is to be given to the individual is to be reduced—
> (a) by the amount of the overlapping benefit paid, or
> (b) where the amount of the overlapping benefit is equal to or greater than the amount of Carer Support Payment, the value of Carer Support Payment that is to be given to the individual is £0.

## Required outputs

For each award week (Sunday to Saturday, reg 2(2)):

- `scottish_carer_supplement_entitled`: true where Carer Support Payment is payable to the individual in that award week, that is, where the Carer Support Payment left after reg 16(2) exceeds £0; false otherwise, including a week in which an overlapping benefit takes it to £0 under reg 16(2)(b).
- `scottish_carer_supplement`: the reg 16(1A) weekly rate (`uk:regulations/ssi/2023/302/16#scottish_carer_supplement_weekly_rate`) in each award week of entitlement, and £0 in any other week. Over a period of whole award weeks, the weekly rate times the number of award weeks of entitlement.

## Companion cases

Worked by hand from the law above, at the rates in force from 5 April 2026 (£86.45 and £11.70 a week). 5 April 2026 is a Sunday.

| Case | Period | Facts | `scottish_carer_supplement_entitled` | `scottish_carer_supplement` | Why |
|---|---|---|---|---|---|
| 14A-A | 13 award weeks, 5 April to 4 July 2026 | Carer Support Payment of £86.45 payable in each week, with no overlapping benefit | true in each week | £152.10 | 13 weeks of entitlement × £11.70 |
| 14A-B | 1 award week, 5 to 11 April 2026 | Entitled to Carer Support Payment of £86.45 and to an overlapping benefit of £86.45 in that week | false | £0 | Reg 16(2)(b): the overlapping benefit equals the payment, so the payment given is £0 and isn't payable |
| 14A-C | 1 award week, 5 to 11 April 2026 | Entitled to Carer Support Payment of £86.45 and to an overlapping benefit of £40.00 in that week | true | £11.70 | Under reg 16(2)(a), the overlapping benefit reduces the payment to £46.45, which stays payable, so the week counts under reg 14A |

### review_finding (paste as-is)

```yaml
review_finding:
  source: PolicyEngine/policyengine-uk#2791
  fix: PolicyEngine/policyengine-uk#2857
  provision: ssi/2023/302/regulation/14A
  related_provisions:
    - ssi/2023/302/regulation/2/2
    - ssi/2023/302/regulation/16/1A
    - ssi/2023/302/regulation/16/2
  question: For how many award weeks does Social Security Scotland pay the Scottish Carer Supplement under reg 14A?
  finding: >-
    One weekly rate for each award week in which Carer Support Payment is
    payable to the individual, and none for an award week in which an
    overlapping benefit takes Carer Support Payment to £0 under reg
    16(2)(b). A payment that an overlapping benefit reduces without taking
    it to £0 keeps that week's supplement.
  policyengine_before: >-
    scottish_carer_supplement paid 52 weekly rates for any positive annual
    carer_support_payment, so 13 weeks of Carer Support Payment brought
    52 weeks of supplement.
  policyengine_after: >-
    scottish_carer_supplement pays the weekly rate for
    min(52, max(carer_support_payment_pre_overlap, carer_support_payment)
    / weekly Carer Support Payment rate) award weeks where
    carer_support_payment is positive, and nothing where it is £0.
  cases:
    - id: 14A-A
      award_weeks_entitled: 13
      scottish_carer_supplement: 152.10
    - id: 14A-B
      award_weeks_entitled: 0
      scottish_carer_supplement: 0
    - id: 14A-C
      award_weeks_entitled: 1
      scottish_carer_supplement: 11.70
```

## Completion boundary

An approved follow-up must:

- Ingest: SSI 2023/302 reg 14A and reg 2(2)'s definition of "award week" from the corpus, beside the reg 16 already ingested.
- Encode: `scottish_carer_supplement_entitled` for each award week from reg 14A, reading whether Carer Support Payment is payable after reg 16(2), and `scottish_carer_supplement` as reg 16(1A)'s weekly rate in each award week of entitlement, in `uk/regulations/ssi/2023/302/14A.yaml`, reading the rate from `16.yaml`.
- Prove: cases 14A-A to 14A-C pass with the outputs above; `16.test.yaml` still passes; and PolicyEngine's `scottish_carer_supplement` agrees with the encoding on case 14A-A (£152.10, the YAML case `Carer in England with 13 weeks of Carer Support Payment gets 13 weeks of supplement`) and, over 52 award weeks, on 14A-B (£0, Case 2 of `carer_support_payment_overlapping_benefits.yaml`) and 14A-C (52 × £11.70 = £608.40, the YAML case `Carer whose State Pension reduces Carer Support Payment and leaves some keeps 52 weeks of supplement`).

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 1d4d020aa1 against head 6cdfdf6297, 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 1d4d020aa1 uk 2.172.1 (files 27900fb6fb5f), core 3.34.1, py 3.13.18 aarch64 f421d4d66ebc 7cb61324a46b 2129.19s
head #2857 merged into main 6cdfdf6297 uk 2.172.1 (files c440512b2432), core 3.34.1, py 3.13.18 aarch64 f421d4d66ebc 7cb61324a46b 2160.11s

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

Head: aad18681987c92d42adf6e6e207a0500b326cd4d on claude/scottish-carer-supplement-weeks-iwr4se, one commit on main at 52b30809ff5681ebfede4d559e72a44f4c893cd2. Draft PR #2857.

Before starting I checked #2791: no comments, no PR, and no claude/scottish-carer* branch on origin. main's last push was the 01:21 UTC version bump, more than 6 hours earlier, and main hadn't moved from the brief's SHA, so I branched from it. I posted the pickup line on #2791 (comment 6601750830) before the first push; nobody replied. main has since moved to 1d4d020a (#2776, the Housing Benefit WTC disregard). It touches none of these files, git merge-tree against it is clean, and I didn't merge it.

Changes

  • policyengine_uk/variables/gov/social_security_scotland/scottish_carer_supplement.py
    • Formula, lines 64-79: amount = max_(pre_overlap, payable) (line 70); full_year holds 52 weekly rates in the amount's dtype (line 74); a guarded share of the year (lines 75-76); 52 × weekly supplement × min_(share, 1) where payable > 0 (lines 78-79). Both rates come from gov.social_security_scotland.carer_support_payment.
    • Documentation, lines 8-48: how the formula counts the weeks (9-25), the four cases where the count differs from the law (25-43), and the kept income-treatment sentences (43-47).
    • References: reg 2 (line 52) and reg 42 (line 55) added; the existing ones kept.
  • scottish_carer_supplement.yaml: header at lines 60-72; 9 new cases at lines 74-198.
  • policyengine_uk/tests/test_scottish_carer_supplement_award_weeks_properties.py (new): 7 tests.
  • changelog.d/2791.fixed.md: one sentence.
  • I left line 166 of docs/book/assumptions/carer-support-payment-earnings.md ("follows CSP actually payable") as it is. The formula still pays only where Carer Support Payment is payable, so the line stays true.

Findings and resolutions

I found F1 myself. F2 to F12 came from an independent three-part review (correctness, tests, writing) of the diff before I opened the PR. I verified each one before changing anything.

  • F1, float32 (found while testing). Dividing the stored float32 amount by the rate gave 51.999999 weeks and £608.39996, where main gives £608.40002, for every carer whose payment the model computes. compare.py marks any nonzero total delta as a change, so the Aggregate impact report would have shown one. Resolved: the formula holds 52 weekly rates in the amount's dtype, as carer_support_payment_pre_couple_limit does for the earnings limit (scottish_carer_supplement.py:74). The model's full-year entitlement then gives a share of exactly 1 and main's value bit for bit, in every year from 2025 to 2035. Mutation M5 shows the test catches a float64 full year.
  • F2, medium: documentation implied the list of differences was complete. "Three cases" left out an overlapping benefit or earnings that vary within the year. There the formula counts 52 weeks or none from annual amounts, as main does. Resolved: the documentation names four cases (lines 25-29).
  • F3: the reform doesn't uprate the report. A full-year report counts fewer weeks in later years under disable_simulated_benefits. Resolved: lines 35-43 say so, and say that a carer the model finds eligible keeps 52 weeks even for a part-year report.
  • F4: "Where the model computes the payment, the amount before the reduction comes to 52 weekly rates or nothing" was wrong for a supplied pre-overlap amount. Resolved: it now reads "Where the model computes the amount before the overlapping-benefit reduction" (lines 17-21).
  • F5, medium: no test pinned the reform path, where the amount changes. Resolved: test_disable_simulated_benefits_pays_the_weeks_the_report_implies (line 404). Two Scottish carers each report £4,000 in 2025. The one who would claim gets £608.40 in 2026 and £629.20 in 2027. The one who wouldn't gets 4,000 / 86.45 × 11.70 = £541.35 and 4,000 / 89.50 × 12.10 = £540.78.
  • F6: no fixed case supplied the pre-overlap amount, and computed batches never supplied it. Resolved:
    • a YAML case at line 174;
    • an @example with both amounts supplied (line 272);
    • computed batches that supply it a third of the time (line 119).
    • Invariant 6 now reads "with neither carer_support_payment nor carer_support_payment_pre_overlap supplied", and the test checks it only for such batches (line 366). With a supplied part-year amount before the reduction, the formula rightly counts fewer than 52 weeks.
  • F7: the YAML header left out the zero-payment condition. Resolved at YAML lines 71-72.
  • F8: the test docstring claimed 2024 to 2030 but skipped 2029, and called people aged 14 and 15 adults. Resolved: YEARS and SUPPLEMENT_YEARS include 2029 (lines 68-70), and the docstring says "single people aged 14 to 90".
  • F9: regulations and a document acted in the YAML and test text. Resolved:
    • the text quotes regulations 14A and 2(2);
    • "The Scottish Ministers set the weekly rates in reg 16(1) and (1A)";
    • the reg 16(2)(b) comment now names the payment given.
  • F10: the changelog paraphrased reg 14A loosely. Resolved: it now reads "for each award week in which Carer Support Payment is payable" and "the larger of".
  • F11: documentation sentences had the wrong subject. "A reduction … keeps", "A user … gets 52 weeks" and "It is a component" after a clause about the model all made the wrong thing the subject. Resolved by rewriting them; the income sentence now opens "The supplement is a component", with its content kept.
  • F12: two case names made the wrong thing the subject. Resolved: "Carer whose State Pension reduces Carer Support Payment and leaves some keeps 52 weeks of supplement" and "Carer in England whose cared-for person dies in week 13 after the move gets 25 weeks of supplement".

Tests run

  • CI on aad18681: every check passes. That covers Test / Python 1/7 to 7/7, Test / YAML, Test / Result (strict outcomes), Aggregate impact, Lint, Fix evidence (3 runs, one per body save), Changelog fragments, Changes, Documentation build, Install + smoke-import on Python 3.11 to 3.14, and Release build records the commit.
  • scottish_carer_supplement.yaml: 13 of 13 pass (4 existing and 9 new). carer_support_payment_overlapping_benefits.yaml: 10 of 10.
  • The new property file: 7 of 7 pass in 62 seconds with -n 4.
  • Every test file that names either variable (git grep -l), each run on its own with -n 4. All pass, with no skip, xfail or XPASS:
    • 19 Python files, 229 tests, including the new one. test_disable_simulated_benefits.py gives 3 warnings, all core's notices about setting a neutralised variable.
    • 14 YAML files, 279 cases.
  • policyengine_uk/tests/code_health: 3,091 pass.
  • test_disable_simulated_benefits_carers.py: 18 of 18 pass, and no carer's supplement changes. In a scratch copy whose formula logged each call, the formula ran 485 times over 1,294 person-years, 456 of them with a positive payment. Every value equalled main's float32 value bit for bit. Each Scottish carer there who reports Carer's Allowance would claim, so the model finds them eligible through the report and they keep 52 weeks.
  • Invariant 5 of test_carer_overlapping_benefits_properties.py ("at its full rate") still holds: 4 of 4 pass.
  • Checks: uvx ruff@0.17.2 format --check ., ruff check . and ruff check --select F811,F821 policyengine_uk are clean, as is git diff --check on the staged commit.
  • The repository's .github/check_fix_pr.py, run locally on this body and commit, gives PASS ("Changed executable tests: 2"). .github/check_changelog_fragments.py gives "Changelog fragments OK".
  • Coverage of the drawn examples, counted with a scratch logging plugin, in person-years in the supplement years:
    • supplied batches: 40 eligible Scottish carers with part-year payments; 25 with a supplied pre-overlap amount above the payment; 40 with payments of 52 weeks or more; 92 under one week; 40 aged under 16;
    • computed batches: 40 payments computed from a supplied pre-overlap amount, and State Pension equal to a year of the payment (10), leaving some (20), taking it to £0 (5) and absent (30);
    • monotonicity: 109 pairs.

Revert check

In a scratch worktree of main with the final tests copied in:

  • YAML: 5 of the 9 new cases fail. They are both 13-week cases in England (2026 and 2027), the 25-week case, the one-week case and the 13-week case in Scotland with no caring inputs; each gets £608.40, or £629.20 in 2027. The other 4 pass on main, which pays 52 weeks there as the law does: 60 weeks, the eligible Scottish carer with a supplied part-year payment, and the two State Pension cases. The 4 existing cases pass.
  • Properties: 5 of 7 fail:
    • supplied bounds and reference (the pinned example with both amounts supplied gives £608.40 for one week paid with no entitlement, where the rule gives £11.70);
    • computed bounds and reference (a supplied part-year pre-overlap amount gives 52 weeks on main);
    • whole weeks (51 of 58 wrong in 2026);
    • the reform test (£608.40 for the carer who wouldn't claim);
    • zero rate with a supplied payment (£608.40 at a zero rate).
      Monotonicity and zero rate with a computed payment pass on main, whose 52-week step never falls as the payment rises and pays nothing when the model pays nothing.

Mutations

I ran each mutation of the formula against both YAML files (23 cases) and the 7 property tests, and restored the mutation copy's formula afterwards.

Mutation YAML Property tests that fail
M1: divide by the full year without the guard all pass both zero-rate tests (FloatingPointError: divide by zero; invalid value)
M2: no cap at 52 weeks 1 fails (60 weeks) supplied reference, whole weeks
M3: weeks from the payment alone 5 fail (the eligible Scottish carer, both State Pension cases here, overlap Cases 1 and 5) supplied reference, computed reference, reform
M4: weeks from the amount before the reduction alone 6 fail (every supplied-payment case with no entitlement) supplied reference, whole weeks, reform
M5: the full year in float64 all pass computed reference (invariant 6, bit for bit)
M6: whole weeks, rounded up all pass supplied reference, computed reference, whole weeks, reform

Aggregate impact

CI's report has finished: run 41630694642, comment 6604442305. Its headline is "Aggregate impact on certified data: pass", comparing base 1d4d020aa1 with head 2ed36111a1 (GitHub's merge commit), both on enhanced_frs_2024_25.h5 (policyengine-uk-data 1.58.1), 2025-26 to 2031-32.

  • "Checks: 0 broken by this change, 1 failing on both sides, 0 fixed. Moves flagged for review: 0".
  • "No household's net income changes in any year".
  • "No change in any year" in receipts by tax head, the government balance, model totals, household income totals, population, poverty rates, people in poverty, inequality, and mean household net income by decile.

The only rows it lists are figures that privacy rules suppress on both sides: Disabled Students' Allowance spending and caseload in every year, and two standard reform costings in 2030-31 and 2031-32 (£0 in the other years). The fiscal partition reports scottish_carer_supplement as "Carer's Allowance Supplement (Scotland)" (policyengine_uk/data/fiscal_partition.yaml:1040-1042). It appears in no change table, at £0.04bn and 71k people in 2026-27 on the head side. That matches the expectation in the body: the model computes every survey carer's payment and pre-overlap amount, each carer it pays keeps 52 weeks, and invariant 6 gives main's value bit for bit. The partition's label still names the Carer's Allowance Supplement, which the Scottish Carer Supplement replaced. I left it alone, as it's outside this job.

Skipped

  • Survey-dataset tests: none of the files that name these variables needs a dataset, and none skipped. Only the Aggregate impact report reads the certified dataset, in CI.
  • The full suite: CI is the evidence; I ran only the files above.
  • make documentation: no page under docs/ changed.
  • policyengine-uk-data: this session's GitHub access covers only policyengine-uk, so I didn't read it. The body's statement that its main (1676eab2, 2 November) uses neither variable comes from the brief, unchecked.

Judgment calls

  1. Formula form. The formula pays 52 × weekly supplement × min(1, amount / (52 × rate in the amount's dtype)) where the payment is positive. That equals the brief's weekly supplement × min(52, amount / rate), without rounding the weeks, and matches main bit for bit where the model computes both amounts (F1). The guard tests full_year > 0, so a zero or negative rate gives no supplement and no division by zero.
  2. Invariant 6. I narrowed it from "with no supplied payment" to "with neither the payment nor the amount before the reduction supplied" (F6).
  3. Four documented differences. I added the within-year variation to the brief's three (F2), and the uprating note under the reform (F3).
  4. Beyond the brief's list: a ninth YAML case (supplied pre-overlap amount); the reform test; ages 14 and 15, to exercise the minimum age; 2029.
  5. Reform test. It uses would_claim_carers_allowance false to make the model find the carer ineligible. That's the simplest input; earnings above the limit would do the same.
  6. 2027 values. The 2027 YAML case uses the file's projected rates (£89.50 and £12.10, from September CPI and 5p rounding), not enacted law. The Axiom packet uses the 2026 rates from reg 16 only.
  7. Tolerances. The differential and whole-week checks allow £0.001. I emulated the formula's float32 arithmetic over every penny from £0 to £7,000 in each year from 2026 to 2030. Its largest gap is £0.000085 from the test's reference, which rounds inputs to float32 as the engine does, and £0.000114 from the rule on the unrounded amount. Whole weeks come within £0.000073. The other invariants hold exactly.
  8. Monotonic test. It puts the drawn people and the same people paid more in one simulation, which halves its run time.
  9. Commits and the body's last line. The commit ends with the Co-Authored-By line alone, as the brief says. I ended the PR body with the brief's 🤖 Generated with [Claude Code](https://claude.com/claude-code) line, but GitHub's proxy for this environment replaces that line with its own footer, _Generated by [Claude Code](https://claude.ai/code)_. On creation the footer also linked the session, so I re-saved the body, which removed the link; the line itself I couldn't keep. Only Fix evidence reruns on a body edit, and it passed again.
  10. Hub document. I posted AXIOM_ISSUE.md above. Its companion cases, 14A-A (13 weeks, £152.10), 14A-B (an overlapping benefit equal to the payment, £0) and 14A-C (an overlapping benefit of £40 a week, £11.70), come from regs 14A, 2(2) and 16 as the brief quotes them, worked by hand.

Generated by Claude Code

SSI 2023/302 defines "award week" in regulation 2, which has no numbered paragraphs.

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

Copy link
Copy Markdown
Collaborator Author

Ready for hub review

Verdict: REQUEST_CHANGES at c79f7e6092102043b8fd3838cc3bd5f7ac57d3ab

The formula is right. It computes the body's expression, matches main bit for bit wherever the model computes both amounts, and guards the division. Every test and CI check passes, and every mutation I rebuilt is killed. The changes I ask for are to the text. The documentation, the body and the YAML header say the count departs from the law "in four cases". I found two more, and both show up when I run the head. The 13- and 25-week limits after a move also count 7-day periods from the move, not award weeks. Both are claims a user would rely on to know when the supplement is wrong, so I rank them P2 and ask for the text to change before merge.

Findings

P2-1. The count departs from the law in more than four cases

policyengine_uk/variables/gov/social_security_scotland/scottish_carer_supplement.py:25-26 ("The count differs from the law in four cases"), the body's "Where the count differs from the law" ("In four cases …") and its line "The formula doesn't round the weeks …", which presents part weeks as part of the rule, not as a departure.

I ran the head (scratch worktree at c79f7e609, single person, 2026):

A part-year pre_overlap 13wk + SP 2000: {'carer_support_payment_pre_overlap': 1123.85, 'carer_support_payment': 0.0, 'scottish_carer_supplement': 0.0}
B supplied 13.5 weeks:                  {'carer_support_payment_pre_overlap': 0.0, 'carer_support_payment': 1167.075, 'scottish_carer_supplement': 157.95}
  • A: a part-year amount before the reduction, reduced by an overlapping benefit paid all year. Take a carer aged 70 in Scotland with £1,123.85 supplied as carer_support_payment_pre_overlap (13 weeks) and £2,000 a year of State Pension. carer_support_payment nets the annual amounts to max(0, 1,123.85 − 2,000) = £0, so the supplement is £0. Reg 16(2) works week by week ("for any award week"). In each of the 13 weeks the State Pension is £38.46, which falls short of £86.45, so £47.99 of Carer Support Payment stays payable. Reg 14A then gives 13 × £11.70 = £152.10. None of the four named cases covers this. The first names an overlapping benefit or earnings that vary within the year, and here the State Pension is constant and the award is part-year. The third names a supplied reduced payment, and here the model computes the payment. main also gives £0, so this isn't a regression. The computed batches in test_computed_payment_bounds_and_reference that supply a pre-overlap amount encode this result: the reference at test_…_properties.py:207 nets annual amounts in the same way.
  • B: part weeks. Reg 14A gives the supplement "for each award week in which Carer Support Payment is payable", and reg 16(1A) sets one weekly rate. Under the law, then, the supplement comes in whole weekly rates. The formula pays 13.5 weekly rates for a payment of 13.5 weekly rates. Such a payment arises for a reduced supplied payment (already named), for an award that starts or ends during an award week, and for an award that spans an April uprating (the model holds one rate a year). Whether Carer Support Payment "is payable" in an award week it covers only in part depends on payment rules nobody quoted. Either way, the law pays the supplement in whole weekly rates, and the formula's fractional count departs from that. Mutation M6, which rounds the weeks up, fails 4 property tests, so the tests pin the fractional count as a modelling choice. Naming it is enough.

Replace "The count differs from the law in four cases." with "The count differs from the law in these cases." Then add after the sentence that ends "a report of a full year counts fewer weeks in later years.":

Where a user supplies a part-year amount before the overlapping-benefit reduction and the model reduces it by an overlapping benefit paid all year, the formula nets the annual amounts and can count no weeks, while Social Security Scotland compares the weekly amounts in each award week of the award. The formula also counts part weeks where a payment falls between whole numbers of weekly rates, as for an award that starts or ends during an award week or spans an April uprating, while Social Security Scotland pays a whole weekly supplement for each award week in which Carer Support Payment is payable.

In the body, change "In four cases the formula counts weeks differently from the law" to "In six cases the formula counts weeks differently from the law", and add the two bullets in the same words.

P2-2. "At most 13 weeks, or up to 25 in all" counts 7-day periods from the move, not award weeks

The body's "The law" section ("So such a carer receives Carer Support for at most 13 weeks, or up to 25 in all after a death in that time"), scottish_carer_supplement.py:23-25 ("keeps Carer Support for up to 13 weeks, or up to 25 in all"), and scottish_carer_supplement.yaml:69 ("up to 25 weeks in all").

Reg 42(4) starts the 13-week period "on the date the individual ceases to be ordinarily resident in Scotland", which can be any day. Reg 42(1A) runs "12 award weeks after the first day of the award week following the award week in which the cared for person died". Take a move on a Monday (day 0, in the award week that starts on Sunday, day −1):

  • The 13-week period runs from day 0 to day 90, a Sunday, so it touches 14 award weeks.
  • After a death on day 90, the 12 award weeks run from day 97 to day 180. That makes 181 days (25 weeks and 6 days), touching 26 award weeks.

Reg 14A counts award weeks, and the supplement is a weekly rate for each. So the stated maxima hold for 7-day periods counted from a Sunday move, not for award weeks in general. The YAML cases still describe situations the law allows: a Sunday move gives exactly 13 and 25 award weeks.

Replacement for the body:

So such a carer keeps Carer Support for 13 weeks from the day they stop being ordinarily resident in Scotland (paragraph (4)), and, after a death in that time, until 12 award weeks after the start of the award week following the death: up to 25 weeks and 6 days in all. A move on any day but a Sunday spreads the 13 weeks over 14 award weeks.

For scottish_carer_supplement.py:24-25: "keeps Carer Support for 13 weeks after the move, or for up to 25 weeks and 6 days in all where the cared-for person dies in that time". For scottish_carer_supplement.yaml:69: "died, up to 25 weeks and 6 days in all.".

P3-1. The float32 quotient is 52.0, not 51.999999

The body says "If the formula divided the float32 amount by the rate instead, it would count 51.999999 weeks in 2026 and pay £608.39996". F1 in the hand-off says the same. I put that division into the formula (mutation M7, csp.supplement * min_(amount / csp.rate, WEEKS_IN_YEAR)) and probed it:

probe amount float32 4495.39990234375 weeks 52.0 weeks64 51.99999887037305 supplement 608.3999633789062

The £608.39996 reproduces. In the engine, though, the float32 amount over the Python float rate stays float32 and gives exactly 52.0. The 51.999999 is the float64 quotient. The penny gap comes from multiplying 52 by £11.70 in float32, where main multiplies in float64 (608.4 → stored £608.40002). Replacement:

If the formula divided the float32 amount by the rate instead, it would multiply the weeks by the supplement rate in float32 and pay £608.39996 in 2026, where main pays £608.40002.

P3-2. "The 2027 rate above" points to nothing

scottish_carer_supplement.yaml:194: "# 13 x 89.50 = 1,163.50, at the 2027 rate above." The header gives only the 2026 rates. Replacement:

13 x 89.50 = 1,163.50, at the model's projected 2027 rates: Carer Support Payment 89.50 and Scottish Carer Supplement 12.10.

P3-3. The hub's rulespec-uk#398 comment overstates what #2857 counts

AXIOM-398-6605323212.md says "#2857 counts one weekly rate for each award week 'in which Carer Support Payment is payable', following reg 14A". The PR counts weeks from annual amounts, with part weeks and the departures above. Replacement:

#2857 counts award weeks from the annual Carer Support Payment, up to 52, and pays one weekly rate for each, following reg 14A.

Its law quotes and cases W and X are correct (see below).

Checked and sound

Previous round (hand-off F1 to F12).

  • F1, the float32 fix, is closed. In my emulation over 2025 to 2035, the head's value equals main's float32 value bit for bit in every year. The numbers in it are partly off (P3-1).
  • F2 is closed as written, with four cases, but the list is still incomplete (P2-1).
  • F3 to F12 are closed. I read each change in the diff:
    • the reform note;
    • "Where the model computes the amount before …";
    • the reform test at test_…_properties.py:404;
    • the supplied pre-overlap YAML case and @example;
    • give_pre_overlap at line 119 and the invariant 6 skip at line 366;
    • the YAML header's zero-payment line;
    • YEARS including 2029, with ages 14 to 90;
    • the regulations cited in brackets;
    • the changelog wording;
    • the documentation and case-name subjects.
  • c79f7e609 changes only the citation at scottish_carer_supplement.yaml:63 from reg 2(2) to reg 2. The CLML text of reg 2 has no numbered paragraphs, and its "(2)" is the regulation number, so the change is right.

The law.

  • Whole-year carer. carer_support_payment_pre_couple_limit returns eligible * csp.rate * WEEKS_IN_YEAR, and limit_carer_benefit_to_one_partner keeps that amount or sets it to £0. The share is then exactly 1, and the formula pays 52 weekly rates, as reg 14A gives for a carer payable in every award week.

  • Move to England (reg 42(1), (5); reg 42(1A)). The supplied payment counts 13 or 25 weekly rates: £152.10 and £292.50. These match the law for a Sunday move (P2-2).

  • Reg 16(2)(a). The YAML case gives £2,495.40 of payment and £608.40 of supplement. That matches reg 14A, because £38.46 a week falls short of £86.45 in every award week.

  • Reg 16(2)(b). Mutation M8 (where(amount > 0, …)) fails 3 overlap YAML cases and 2 property tests. So the formula pays nothing where the payment is £0, and the tests hold it to that.

  • The rulespec-uk#398 deduction. I couldn't read regs 23(4)(a) or 23A(1)(b)(i): legislation.gov.uk returns CONNECT tunnel failed, response 403 from this session, and nobody quoted those paragraphs beyond the fragment "has been reduced to £0". On the text quoted, I agree with the deduction but can't confirm it:

    • reg 14A turns on "payable", not on "entitled";
    • reg 16(2)(b) sets "the value of Carer Support Payment that is to be given" at £0 "for any award week";
    • so the more natural reading is that £0 to be given is not payable.

    It remains a deduction, as Add Stamp Duty #398 says. main already paid nothing in that case, so this PR doesn't change the result.

  • Award weeks and part weeks. Counting part weeks departs from the law, and the body doesn't name it as a departure (P2-1).

Code.

  • scottish_carer_supplement.py:64-79 computes 52 × supplement × min(1, max(pre_overlap, payable) / (52 × rate)) where payable > 0. That equals supplement × min(52, max(…)/rate).

  • has_rate = full_year > 0 sends a zero or negative rate to a share of 0, and the inner where stops the division by zero. Mutation M1 raises FloatingPointError in both zero-rate tests.

  • A negative supplied payment gives £0 (probe C).

  • I emulated the float32 arithmetic over every penny from £0 to £7,000:

    2026 vs ref 0.000085 vs rule 0.000114 whole 0.000073
    2027 vs ref 0.000061 vs rule 0.000091 whole 0.000037
    2028 vs ref 0.000062 vs rule 0.000092 whole 0.000061
    2029 vs ref 0.000076 vs rule 0.000106 whole 0.000061
    2030 vs ref 0.000074 vs rule 0.000104 whole 0.000061
    

    These match judgment call 7 exactly, so the £0.001 tolerance leaves more than ten times the margin.

  • The comment above reported_care (disable_simulated_benefits.py:197-209) says what the body's fourth case says. The reform sets one unuprated reported_care array in each year (lines 210-227).

Cases.

  • I worked all 9 by hand at £86.45 and £11.70:
    • 13 × 11.70 = 152.10;
    • 25 × 11.70 = 292.50;
    • 1 × 11.70 = 11.70;
    • 60 weeks capped at 52 × 11.70 = 608.40;
    • Scotland with no caring inputs: 152.10;
    • the eligible Scottish carer: 608.40, a documented departure;
    • reg 16(2)(a) computed and supplied: 4,495.40 − 2,000 = 2,495.40, giving 608.40;
    • 2027: 13 × 12.10 = 157.30.
  • The 60-week case has no counterpart in law, but it only pins the cap.
  • The 2027 rates come from the parameter files: rate.yaml is 86.45 from 2026-04-05, uprated by CPI and rounded to 5p, and supplement.yaml is 11.70. The system returns 2027 89.5 12.100000000000001.

Invariants and mutations. The 7 tests match invariants 1 to 7 as the body states them. Each mutation ran against both YAML files and the property file in a scratch clone, and I restored the formula after each (git diff --quiet clean, HEAD still c79f7e609).

Mutation YAML Property tests that fail Result
M1, no guard 13/13, 10/10 both zero-rate killed, as in the body
M2, no cap 1 fails (scottish_carer_supplement) whole weeks, supplied reference killed, as in the body
M5, float64 full year all pass computed reference killed, as in the body
M6, round up all pass whole weeks, supplied, computed, reform killed, as in the body
M7 (mine), supplement × min(amount / rate, 52) all pass computed, supplied, both zero-rate killed
M8 (mine), where(amount > 0, …) 3 overlap cases fail computed, supplied killed

Text.

  • The body's quotes of regs 2, 14A, 16(1), (1A), (2) and 42(1), (1A) and (5) match the CLML texts.
  • The changelog fragment, the code comments and the test docstring match the code.
  • In the hub's rulespec-uk#398 comment, the reg 2 quote matches the CLML text. 5 April 2026 is a Sunday, and 4 July 2026 a Saturday (91 days). 5 to 11 April runs from Sunday to Saturday. Case W gives 13 × 11.70 = 152.10. Case X follows reg 16(2)(b) with the deduction above.
  • I ran .github/check_fix_pr.py on the live title, body and labels (body updated 13:44:52Z), with --head-sha c79f7e6092102043b8fd3838cc3bd5f7ac57d3ab and the merge-base change list, as pr_fix_evidence.yaml does. It gave Fix evidence: PASS … Changed executable tests: 2.

Tests (local).

  • scottish_carer_supplement.yaml: 13 passed.
  • carer_support_payment_overlapping_benefits.yaml: 10 passed.
  • The award-week properties, test_carer_overlapping_benefits_properties.py and test_disable_simulated_benefits_carers.py, run together with -n 4: 29 passed.
  • policyengine_uk/tests/code_health -n 4: 3,091 passed.

CI at the head. All 21 check runs from gh api …/commits/c79f7e60…/check-runs succeed:

  • Test / Python 1/7 to 7/7, Test / Result and Test / YAML;
  • Aggregate impact, Lint, Changes and Changelog fragments;
  • Fix evidence (twice), Documentation build and Release build records the commit;
  • Install + smoke-import on Python 3.11 to 3.14.

None fails. The Aggregate impact report (comment 6604442305, updated 14:53:06Z, run 41646429313 on head c79f7e60) compares base 1d4d020aa1 with merge 6cdfdf6297, whose parents are 1d4d020a and c79f7e60. It reads "Aggregate impact on certified data: pass", "0 broken by this change, 1 failing on both sides, 0 fixed. Moves flagged for review: 0" and "No household's net income changes in any year." The supplement's row is £0.04bn and 71k people in 2026-27, and appears in no change table.

Merges. git merge-tree --write-tree --name-only c79f7e609 <ref>:

What I couldn't check

  • Regs 23(4)(a) and 23A(1)(b)(i), and any rule on paying Carer Support Payment for part of an award week: legislation.gov.uk is blocked from this session.
  • That the certified enhanced_frs_2024_25.h5 stores neither carer_support_payment nor carer_support_payment_pre_overlap: I had no dataset. The Aggregate impact result is consistent with it.
  • rulespec-uk main 0497350d74 (scottish_carer_supplement_annual_amount × 52) and the axiom.org 404s in the hub comment: outside this session's repository access.
  • The hand-off's logging counts (485 calls, 1,294 person-years) and coverage counts: they rest on the author's scratch plugins.
  • The revert check on main, which I didn't rerun.

Generated by Claude Code

@juaristi22 juaristi22 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed c79f7e6092102043b8fd3838cc3bd5f7ac57d3ab. COMPLETE — no critical findings or material evidence gaps; two nonblocking documentation findings remain.

A1 — Make the annual-proxy limitation list non-exhaustive. The new “four cases” statement in scottish_carer_supplement.py:25 and the description omits a supplied part-year pre-overlap award with a constant overlapping benefit. For example, £1,123.85 pre-overlap CSP for 13 award weeks and £2,000 State Pension across the year makes the existing annual CSP formula net to £0. Weekly overlap would leave £623.85 CSP during those weeks and £152.10 supplement. This is an existing annual-netting limitation, not a new underpayment caused by this patch. Document it and qualify the broad annual-week description in the filed Axiom #398 follow-up; fractional inferred weeks are also a proxy.

A2 — State the award-week alignment for the 13/25-week examples. Regulation 42 starts the residence-continuation period on the actual move date, whereas regulation 2 defines Sunday–Saturday award weeks. A Sunday-aligned 13-week period spans 13 award weeks; a Monday-starting period touches 14. Qualify the variable prose, YAML examples/header and description with the complete-award-week/Sunday assumption, including the death-continuation example. This is a scope clarification, not an allegation of 14 or 26 cash payments.

The core weekly rule, rates, tax/benefit treatment and actual filed Axiom #398 contract/companions were independently checked against official sources. One focused invocation passed 153 checks, with three final-accounting cases also verified: the conditional 13-week England receipt gives £152.10 rather than £608.40, reduces final income/spending once by £456.30 in the zero-tax case, and reduces net income by £365.04 when the tax reduction is £91.26. The fully computed steady Scottish carer is unchanged. The England cases use a justified supplied continuing award and timing assumptions; annual inputs do not reconstruct migration or historical eligibility.

Current-head CI is green. Approval is withheld while these findings remain and the PR is a draft.

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.

Pay the Scottish Carer Supplement for each award week of Carer Support

3 participants