Skip to content

Apply the Pension Credit earnings disregards (SPC Regs 2002 Sch VI) - #2019

Merged
MaxGhenis merged 19 commits into
mainfrom
pc-earnings-disregard
Oct 21, 2026
Merged

MaxGhenis merged 19 commits into
mainfrom
pc-earnings-disregard

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 1, 2026 •

Copy link
Copy Markdown
Collaborator

Part of #1954. Applies SPC Regs 2002 Schedule VI earnings disregards to Pension Credit and the corresponding Housing Benefit savings-credit-only adjustment. Max's d1424 ruling remains option (a): tax on earnings is the extra tax those earnings cause, including savings-band and partner interactions.

Round 2 fixes

  • Remove all ten remaining pre-netted earnings overrides in tax_credits_pension_credit_passport.yaml, including masked passing fixtures. Person-level wages are gross; Schedule VI is applied once. Re-derived every existing expected output from the law and current parameters and kept all assertions/tolerances unchanged. The complete repository fixture audit found no further stale inputs; .job/FIXTURES_R2.md records the searches, classifications and all eleven hand calculations.
  • Hold personal_allowance, blind_persons_allowance, marriage_allowance and married_couples_allowance_deduction consistently in both trading-loss comparisons. Pin CI's complete five-family counterexample as @example. Its partner's £1,260 Marriage Allowance transfer explains the £252 uncontrolled notional-tax difference. The original test body reproduces the failure; the repaired invariant passes without overriding notional deductions or PC income. No assertion, tolerance, strategy or property setting was weakened.
  • Keep Python test collection/upload available after a policy YAML failure. CI's Result job had no collected.txt because the failed YAML step skipped those later steps. Preserve the upstream failure gate, setup/cancellation guards and exactly-once shard audit. This was an artifact diagnostic failure; dataset credentials were present.
  • Qualify the flatness metadata with the pension-contribution floor. Correct existing Axiom #478 CER13(8)/(11) quotations with official amendment/extent-preserving CLML. No new issue or encoder run.
  • Merge captured current main ea7c98b5320d5ce984f88e2d100cc853667c4a2e cleanly on top of the existing branch. Original author/history retained; no rebase or force push.

Invariants and scope

Schedule VI remains £5/week single, £10 couple, or £20 for a qualifying lone parent/carer/disability/blindness condition, capped at net earnings. Each employment's loss floors at zero. Employed earnings deduct attributed tax, primary NI and half pension contributions; self-employment uses CER13–14 notional tax/NI in place of actual deductions. Dependants' benefits/caring do not qualify a claimant/partner. Dated ESA/PIP/AFIP limbs, Scottish basic-rate notional tax and historical Class 2 remain covered.

Round 1 fixes remain: preserve late explicit inputs using core's drop_computed_arrays(); compute historical Class 2 from CER chargeable income independently of actual trading allowance/loss relief; share two counterfactuals across PC and UC housing. At £13,000 profit in 2023, deductions are £86 tax + £38.70 Class 4 + £179.40 Class 2 = £304.10. Sources: dated CER14, dated SSCBA11, SI2024/377 r8(7).

Ordinary covered earnings leave PC income flat subject to the pension-contribution floor and existing PSA cliff. Special occupations/transitions, carer continuation, unrepresented Scottish replacement benefits/war mobility and the long-term incapacity-benefit proxy remain documented exclusions.

Validation at 54b409db47fd543792a0f2ce5c9e2c43010ddb7e

  • All 247 Python tests across 36 modules passed, foreground -n 3 --dist worksteal -o xfail_strict=true; no failures, errors, skips or xfails. Exact JUnit node coverage matches fresh unsharded collection. This includes all 30 review modules, three R1 regression modules and three current-main interaction modules. Four existing employer-NI divide warnings.

  • Restoration/isolation 14/14 and branch/late-input probes 14/14 pass.

  • Requested YAML scope plus passport: 773 passed on the merged tree.

  • Existing CI shard-check module: 46 passed, foreground -n 1.

  • Exact original CI trading-loss replay: fails by £252; repaired focused property: passes. Complete CI example retained.

  • uvx ruff format --check .: 1841 files already formatted; Ruff lint and Git whitespace checks pass.

  • No self review or merge into main. The hub dispatches independent review.

Cost on certified data

Fresh serial processes use certified uk-data 1.58.1, 128,409,762 bytes, SHA256 checked before every load: 056e80fd8e9151d78f432a25cde863340baee81304c6216a37fb575ce8563784. Both sources use the same frozen Python 3.13.9/core 3.33.2 environment. Current main is ea7c98b53; initial/reverse measurements use head e3b9330de and the final pair uses final head. Model, parameter, lock and Python sources are identical across those head revisions (the last commit changes only workflow conditions). CPU covers target calculation, excluding import/load/weights; RSS is cumulative process peak at the end of the target, decimal GB. Maximum guarded compressor 9.942 GB, below 28 GB. Numerical/compression caps ≤4; native pool introspection returned no pools, so those are configured caps.

2026 target Main CPU s / RSS GB Head CPU s / RSS GB CPU change
Pension Credit 1.409 / 2.738 1.840 / 2.763 +30.54%
Full income, initial 2.861 / 2.947 3.640 / 3.136 +27.25%
Full income, reverse repeat 3.575 / 2.771 3.697 / 2.889 +3.40%
Full income, after Python suite 3.194 / 2.771 3.577 / 2.893 +12.00%

Residual cost remains for hub assessment. A further complete-household subset prototype selected 72,710 of 113,589 people and replayed/verified all 1,455 recorded input-periods. It cost 0.369 CPU seconds versus 0.302 for the existing wages helper (+22.24%) and failed equality for 214 person tax amounts (maximum £6,280.05), so it was discarded. Its mismatch cause was not isolated; preserved inputs alone did not preserve reconstructed simulation context. This attempt does not justify changing any output. Production retains the validated full-vector branch API and two distinct top-slice tax evaluations. Restricting only to currently PC-eligible units would also alter public intermediate outputs and needs to preserve protected couples and the UC non-dependant calculation. Initial/reverse pairs overlapped separate small-situation Python tests; the final pair ran after that suite completed. These are individual timing observations, not a stable performance estimate. Details: .job/PERFORMANCE_ATTEMPT_R2.md and aggregate-only measurement records.

Impact against the same current main

Annual nominal £million. GC/SC paid apply outer PC eligibility and take-up. Historical Class 2 does not affect these post-abolition years. Shared certified cache read directly; no H5 copy retained.

Annual £m 2026 main → head Δ 2030 main → head Δ
PC paid 7,035.875 → 7,036.435 +0.559 7,341.804 → 7,342.541 +0.737
PC entitlement 8,969.723 → 8,971.915 +2.192 9,281.116 → 9,283.212 +2.096
Guarantee Credit paid 6,655.683 → 6,656.631 +0.948 6,937.504 → 6,938.304 +0.800
Savings Credit paid 380.193 → 379.804 -0.389 404.300 → 404.237 -0.063
Housing Benefit 8,929.662 → 8,929.662 +0.000 9,883.234 → 9,883.234 +0.000
Council Tax Reduction 2,034.026 → 2,034.026 +0.000 2,236.168 → 2,236.168 +0.000
Winter Fuel Allowance 1,679.283 → 1,679.289 +0.006 1,547.501 → 1,547.501 +0.000
Household net income 1,706,812.051 → 1,706,812.616 +0.565 1,850,818.257 → 1,850,818.994 +0.737

2026 PC paid +£559,416.56, HNI +£565,478.50; 2030 PC paid +£736,736.97. Remaining benefits in the table are unchanged apart from Winter Fuel Allowance +£6,062.74 in 2026. Aggregate/provenance/guard records and all test logs are in the adoption job's .job/ hand-off.

axiom: TheAxiomFoundation/rulespec-uk#414 queued (SPC Regs 2002 Sch VI; Roman-numeral schedule corpus blocker), TheAxiomFoundation/rulespec-uk#478 queued (SPC regs 17(9)-(11), 17A(4A) and 17B; CER 1996 regs 13-14; amendment/extent-aware quotations corrected)

Reproducer: policyengine_uk/tests/policy/baseline/gov/dwp/tax_credits_pension_credit_passport.yaml, policyengine_uk/tests/test_trading_loss_properties.py::test_means_tests_see_the_loss_only_through_tax, policyengine_uk/tests/test_pension_credit_late_inputs.py::test_explicit_allowances_keep_couple_award_flat, policyengine_uk/tests/test_pension_credit_notional_class2.py::test_notional_class2_ignores_actual_trading_allowance, policyengine_uk/tests/test_pension_credit_tax_branch_reuse.py::test_full_calculation_reuses_two_earnings_tax_counterfactuals

Stacked PR: #2509 needs main merged after this lands. Do not merge this PR in this job; hand back for hub-dispatched independent review.

@juaristi22

Copy link
Copy Markdown
Collaborator

Codex review — changes required

Reviewed commit 2c87ceebfb0dccddb0aa8d9cc73881cf14634b2e. COMPLETE; 1 confirmed blocking finding(s). Independent code/test and policy/source reviews were consolidated for the changed behavior and affected dependencies.

code-1 — [P1] Cap the disregard against earnings after statutory deductions

The new cap at pension_credit_earnings_disregard.py:54–55 uses gross pension_credit_earnings, whereas pension_credit_income.py:19–25 separately subtracts tax, National Insurance and half pension contributions before this disregard. Therefore the cap still allows the disregard to consume pension income. For a single person aged 70 in 2024, £400 employment earnings, £400 reported employee pension contributions, £9,000 State Pension and no savings, the current head produces £260 disregard, £8,940 assessable income and £2,403.80 final Pension Credit. Half the contribution leaves only £200 earnings before the Schedule VI disregard; capping to £200 leaves £9,000 assessable income and £2,343.80 Pension Credit, a £60 annual overpayment in the PR. This follows the independently checked regulation 17A(4A) earnings calculation and regulation 17(9)/Schedule VI ordering.

Cap using the nonnegative net earnings available at this stage and add a low-earnings/pension-contribution regression that asserts the final award. The property tests currently construct gross-only earnings and so do not challenge this deduction ordering. Confidence: high; current-head code, source rule and final award reproduction agree.

Policy/source review independently confirms the ordering in regulation 17A(4A), regulation 17(9) and Schedule VI. The code and policy reports describe the same defect, counted once.

The standard/higher disregard amounts and category conditions were corroborated. The required correction is the cap's placement after statutory deductions.

Validation: 43 focused tests passed. A separate executed household diagnostic reproduced the £60 final Pension Credit overpayment described above. Three official source originals were inspected and their cached bytes verified. Existing passing tests do not cover the failing net-earnings ordering. No material review gaps remain within this scope.

Focused tests used an existing cached Python 3.13 environment (Core 3.32.9, NumPy 2.1.3, pandas 2.3.1, microdf-python 1.2.1, Hypothesis 6.168.2, pytest 8.4.2) with this PR’s isolated source snapshot. No dependencies were installed; this was not a freshly synced lock environment or a full-suite/population run. This is a review comment, not a formal GitHub review vote.

Live check before posting (2026-10-02T10:35:18.903311+00:00): same commit, CLEAN; all reported CI checks pass.

@vahid-ahmadi

Copy link
Copy Markdown
Collaborator

Review pass (Claude Code, on Vahid's behalf) at 2c87ceeb

Short version: the Schedule VI amounts, categories and dating are right, but the cap needs to move. I agree with the Codex review's blocking finding and reproduced it independently. Everything else is small.

1. Blocking: cap the disregard at net earnings, not gross. pension_credit_earnings_disregard.py:54-55 caps at pension_credit_earnings. But pension_credit_income.py:22-25 subtracts tax, NI and half the pension contributions before the disregard. Reg 17(9) applies Schedule VI to earnings as calculated under reg 17A, and reg 17A(4A) takes net earnings after income tax, Class 1 NI and half of any pension contribution. So the disregard can currently eat into non-earned income.

  • Reproduced at this head (2024): single person aged 70, £400 earnings, £400 employee pension contributions, £9,000 State Pension. The disregard is £260, Pension Credit income £8,940 and Pension Credit £2,403.80. Capped at the £200 of net earnings, Pension Credit income is £9,000 and Pension Credit £2,343.80, so this head overpays by £60.
  • Fix: cap at max(0, earnings − NI − 0.5 × pension contributions − income tax on earnings). pension_credit_income deducts income tax on all income (State Pension included), so for the cap you need only the share that falls on earnings. Apportioning by earnings' share of taxable income is a reasonable approximation; say so in the docstring.
  • Test: add a YAML case that asserts the final award for the case above. The property tests only generate gross earnings with no deductions, so they can't catch this. A strategy with pension contributions, or taxable earnings, would.

2. Nit: Sch VI para 6 isn't mentioned. Earnings from an employment that ended before the claimant first became entitled to Pension Credit are disregarded in full (other than reg 17(9)(b) amounts). The model can't see when an employment ended, so listing para 6 under "Not modelled" next to paras 2-2B would be enough.

3. Nit: coordination with #1896. The claimant-or-partner test reads is_uc_claimant (line 32). #1896 introduces is_claimant_or_partner for exactly this, and #1946 uses it. Whichever lands second should switch, so a Pension Credit rule doesn't depend on a UC-named flag.

Checked and correct:

  • Read against the current Sch VI text:
    • £20 for a lone parent (para 1), a carer (para 3, via the Sch I para 4 addition), or a claimant or partner on a listed benefit or blind (para 4(1)).
    • £5 single and £10 where the claimant has a partner (para 5).
    • £20 at most however many conditions apply (para 4A).
  • The dated lists add ESA from 27 October 2008, and PIP and AFIP from 8 April 2013. Treating incapacity_benefit as long-term IB is documented.
  • Probes on this head behave as expected otherwise:
    • single with £200 earnings: £200 disregarded, the earnings cap;
    • couple with £200 earnings: £200, under the £520 couple amount;
    • self-employment of £3,000 with AA: £1,040, the £20 rate, and AA stays outside Pension Credit income.
  • Tests: the Pension Credit YAML directory (63) and the property file pass locally; CI 6/6 green.

MaxGhenis and others added 2 commits October 2, 2026 09:54
20 pounds a week for a lone parent (para 1), a carer satisfying Sch I para 4
(para 3), or a claimant or partner on a listed disability benefit or
certified blind (para 4(1)); otherwise 5 pounds single and 10 pounds couple
(para 5); at most 20 pounds (para 4A), never more than the earnings.

Refs #1954.

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

Reg 17(9) disregards the Sch VI sums in calculating the claimant's earnings,
which are net of income tax and NI (reg 17(10)) and of half of pension
contributions (reg 17A(4A)). Capping at gross earnings let a taxpayer's
first pounds of earnings raise Pension Credit. Income tax on earnings is the
lesser of the person's income tax and the basic rate on their earnings.

Also: the carer condition reads the claimant's or partner's
is_carer_for_benefits (Sch I para 4), not the carer addition, which counts
dependants; is_claimant_or_partner after #1896; property tests compute net
earnings independently, include dependants' DLA and caring, and add that
earning more never raises Pension Credit; parameter description and test
comment fixes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis force-pushed the pc-earnings-disregard branch from 2c87cee to 3d4f12b Compare October 2, 2026 14:08
MaxGhenis and others added 2 commits October 3, 2026 18:47
…ment (review of #2019)

- Income tax on earnings is now the tax on them as the top slice of taxable
  non-savings income on the person's own Scottish or rest-of-UK schedule,
  capped at their income tax. The 20% cap let earnings crossing Scottish
  bands raise Pension Credit (reviewer's couple: +2.89).
- The para 3 carer condition reads is_entitled_to_carer_benefit, the carer
  addition's own Sch I para 4 test; caring hours alone no longer qualify
  (reviewer's case overpaid 780 a year).
- Tests: Scottish couple pair (income flat with and without earnings),
  hours-only vs entitled carer cases; the property test adds Scottish
  households, carer entitlement, care hours and pension contributions, and
  measures tax on earnings independently by rerunning without them.

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

Copy link
Copy Markdown
Collaborator Author

Composition note from #2259 (Pension Credit: a loss on one source counts as nil), found by its GPT-6.1 Sol review.

#2259 makes pension_credit_earnings floor each person's employment_income and self_employment_income at zero before adding them: Computation of Earnings Regulations 1996 reg. 13(12), applied by SPC Regulations 2002 reg. 17B(5)(b), bars setting a loss in one employment against earnings in another.

Here, pension_credit_earnings_disregard.py recomputes gross earnings as max_(0, add(person, period, pc.guarantee_credit.earnings_sources)), which nets the sources before flooring. With £10,000 of wages and a £10,000 self-employment loss, #2259 counts £10,000 of earnings but this formula gives gross earnings of £0, so the disregard ceiling is £0 instead of £260 (£5 a week). That happens in whichever order the two PRs merge.

Suggested fix, whichever lands second: sum the individually floored person-level sources, for example sum(max_(0, person(source, period)) for source in pc.guarantee_credit.earnings_sources), or read pension_credit_earnings once #2259 is on main, and add a combined case (wages £10,000, self-employment −£10,000: disregard £260).

🤖 Generated with Claude Code

@MaxGhenis

Copy link
Copy Markdown
Collaborator Author

Independent review (GPT-6.1 Sol, UK hub sweep, 2026-10-12): REQUEST_CHANGES at the head below. The hub is routing it to this PR's owner session. Methodology readings the source leaves open go to Max as a decision before they're picked.

VERDICT: REQUEST_CHANGES
Head reviewed: 816a4e1

  1. [blocker] The tax cap violates the stated invariants. At pension_credit_earnings_disregard.py:87, tax attribution excludes savings interactions. Reproduced in England, 2024: age 70, £12,000 State Pension, £12,000 savings interest and £3,000 Attendance Allowance. Adding £1,040 wages raises Pension Credit from £4,653.26 to £4,767.26, an increase of £114. A second reproduced case—£15,000 pension income, £400 wages and £300 pension contributions—produces a £170 disregard versus £230 under the property test’s counterfactual oracle. Fix: reconcile tax attribution with the income deduction and agreed methodology; add deterministic regressions and generate savings income and earnings-dependent relief cases.

  2. [blocker] Caring hours still establish purported entitlement. pension_credit_earnings_disregard.py:61 calls a helper whose Carer’s Allowance calculation checks caring hours and a claim flag, without the earnings limit or qualifying care recipient. Thus £12,000 annual wages and 40 caring hours can qualify for the higher disregard despite exceeding the earnings limit. The new YAML test bypasses this inference by supplying entitlement as false. Fix: use a predicate satisfying the actual entitlement conditions, preserving underlying entitlement after overlapping-benefit adjustments; test ordinary inputs without overriding that predicate. Official eligibility requirements.

  3. [blocker] Self-employed earnings use the wrong tax calculation. pension_credit_earnings_disregard.py:72 combines wages and self-employment profits before applying the full marginal tax schedule. Pension Credit instead applies a notional self-employment calculation; CER regulation 14 specifies basic-rate tax and prescribed personal reliefs. Fix: calculate employed and self-employed net earnings separately before aggregation and the disregard cap, with mixed pension/self-employment tests. DWP guidance, regulation 14 amendment.

  4. [blocker] Employed-tax allocation requires Max’s methodology decision. pension_credit_earnings_disregard.py:22 attributes pension-first, marginal-tax allocation to DMG 86038–86039. Those paragraphs specify employer-deducted tax, without establishing that approximation. HMRC says employers usually collect pension tax through wages; pension providers can also collect it. Fix: obtain Max’s decision, document the chosen annual approximation accurately, and test its consequences before merging. DMG 86038–86039, HMRC collection guidance.

  5. [blocker] Current main introduces a semantic conflict despite a clean merge. pension_credit_earnings_disregard.py:72 floors earnings after summing. Main’s Count a loss on one source as nil in Pension Credit income and earnings #2259 floors each source separately because losses cannot offset another employment’s earnings. After merging, £400 wages plus an £8,000 self-employment loss would count £400 earnings but receive zero disregard instead of £260. Fix: floor each source separately, add this regression, and update main’s affected income-test expectations when integrating it.

  6. [should-fix] Carer continuation is an undocumented omission. pension_credit_earnings_disregard.py:61 tests current entitlement only, whereas Schedule VI incorporates Schedule I’s continued carer qualification. Fix: cover the continuation conditions, or explicitly document and agree their deferral. DWP continuation guidance.

  7. [should-fix] The WTC omission rationale is inaccurate. disability_benefits.yaml:12 assumes WTC disability elements necessarily follow positive DLA/PIP receipt. The model’s disability flag is independently supplied in calculator situations. Fix: support qualifying WTC element receipt for historical years, or correct the claimed equivalence and explicitly document the historical coverage gap. Official qualifying-benefit list.

Verification: 35 targeted YAML tests passed serially; changed Python files passed lint and formatting checks. Property-test execution was blocked by missing Hypothesis/pytest-xdist and sandbox temporary-file restrictions. Invariants are stated; no existing tests were removed, skipped, xfailed or weakened.

The required merge-tree check found no textual conflicts against local origin/main 3f174d0, but finding 5 remains. No protected files or workflows changed.

Both requested gh commands failed to connect. PR-body mechanism claims and enhanced-FRS impact provenance remain unverified; I cannot establish whether impact is missing. ESA/PIP amendment dates were corroborated through official consolidated annotations, but their direct amendment pages could not be fetched.

MaxGhenis and others added 2 commits October 11, 2026 21:25
- Employed earnings (SPC Regs 2002 regs 17(10), 17A): less the income tax
  they add for the claimant and partner, measured on a branch with nobody's
  employment income (marginal attribution; methodology ruling d1424), and
  primary Class 1.
- Self-employed earnings (regs 17(11), 17B; CER 1996 regs 13(4), 14): less
  notional basic-rate tax on profit over personal reliefs, main-rate Class 4
  and (before April 2024) Class 2. Pension Credit income replaces the tax and
  contributions actually payable on the profit with these.
- Each source floored at nil (CER reg 13(12)).
- Sch VI para 4(1)(a)(vi): working tax credit with a disability element.
- HB savings-credit-only route (HB(SPC) Regs reg 27(4)): deduct only the
  higher HB disregards, since Pension Credit income is now after Sch VI.
- Regression cases for savings interactions, pension relief, losses,
  notional deductions; property tests for statute, flatness under the
  disregard and monotonicity in either partner's earnings.

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

Copy link
Copy Markdown
Collaborator Author

The last description update dropped this PR's Reproducer: line, so the Fix evidence check failed. I've added it back. Please keep it in the description file you edit from, or narrow it to the test that reproduces the bug:

Reproducer: `policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/housing_benefit_savings_credit_only.yaml`, `policyengine_uk/tests/policy/baseline/gov/dwp/pension_credit/claimant_partner_income_and_carers.yaml::Pension Credit counts both partners' income deductions and carer additions`, `policyengine_uk/tests/policy/baseline/gov/dwp/pension_credit/pension_credit_earnings_disregard.yaml`, `policyengine_uk/tests/policy/baseline/gov/dwp/pension_credit/pension_credit_income.yaml::All income sources are included.`, `policyengine_uk/tests/policy/baseline/gov/dwp/pension_credit/pension_credit_income.yaml::A self-employment loss does not reduce Pension Credit income from wages.`, `policyengine_uk/tests/test_pension_credit_earnings_disregard_properties.py::test_statute_bounds_differential_and_monotonicity`

🤖 Generated with Claude Code

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

Fine once the d1424 tax-attribution ruling is recorded. The code matches Schedule VI and the earlier blocking findings are fixed.

@MaxGhenis this is a delta review since my comment at 2c87cee (2 Oct). It also covers the 12 Oct review at 816a4e1 and the #2259 composition note.

Earlier findings, re-checked on the current head merged locally with main 714b143:

  • Cap at net earnings (2 Oct, blocking): fixed. £400 of wages, £400 of pension contributions and a £9,000 State Pension (2024): disregard £200, Pension Credit income £9,000, Pension Credit £2,343.80, as hand-computed (£218.15 × 52 − £9,000).
  • Earnings raising Pension Credit through savings tax (12 Oct, finding 1): fixed. £12,000 State Pension, £12,000 interest and Attendance Allowance: Pension Credit is £4,667.80 with or without £1,040 of wages. The £832 disregard exactly offsets the wages net of the tax they add.
  • Carer by caring hours alone (finding 2): fixed now that #2312 is on main. With £12,000 of wages and 40 caring hours, the disregard is the £5 standard amount, not £20.
  • Self-employed notional tax (finding 3): fixed. CER reg 14 is applied as written: basic or Scottish basic rate, Chapter 2, 3 and 3A reliefs only, and main-rate Class 4 between the limits. Class 2 is included only while ni_class_2 is non-zero; it is £0 from 2024-25, which matches the omission of reg 14(2)(a).
  • Loss netting (#2259 note, finding 5): fixed. £400 of wages and an £8,000 self-employment loss give the £260 disregard.
  • WTC (finding 7): fixed. Para 4(1)(a)(vi) is read from the elements and WTC in payment.
  • is_uc_claimant (my nit 3): fixed. The formula now uses is_claimant_or_partner.
  1. should, pension_credit_earnings_income_tax.py:3-8: the top-slice attribution is still marked provisional, pending the d1424 ruling, and the PR body says it waits on that. Nothing in the code needs to change if option (a) stands. Once the ruling is made, please replace the "provisional" wording in DECISION with the decision and its date, so the docs don't describe a choice that is still open.

  2. nit (carried over from my 2 Oct comment), pension_credit_earnings_disregard.py documentation: Sch VI para 6 (earnings from an employment that ended before first entitlement are disregarded in full) is still not in the "Not modelled" list. One clause would do.

  3. nit, pension_credit_earnings_income_tax.py: the file holds four variables, and none is named after the file. The repo keeps one variable per file, named for it. Splitting it, with the shared helper in utils, would make pension_credit_employment_income_tax easier to find.

  4. nit, PR body: the "Dependency" paragraph says carers above the earnings limit keep the £20 "until #2312 lands". #2312 merged on 12 Oct, so after the next merge from main that sentence is out of date.

  5. nit, overlaps: draft #2066 (winter fuel charge) conflicts with this PR in pension_credit_income.py. #2092, #1913 and #1969 merge cleanly with it. None of Vahid's own open PRs touch these files.

What I checked

  • Read the full diff, the PR body and all the earlier review threads. Read SPC Regs 2002 Sch VI (paras 1 to 7, including 4A(2)'s couple limit) and CER 1996 reg 14 on legislation.gov.uk.
    • The amounts (£20, £5, £10, unchanged since 6 October 2003), the para 4(1)(a) list and its dated additions, and the para 3 link to Sch I para 4 all match.
    • The disregard sits at benefit-unit level with one weekly amount, which is right for para 4A(2).
  • On the head (d91b322):
    • the Pension Credit YAML directory and housing_benefit_savings_credit_only.yaml: 251 passed;
    • test_pension_credit_earnings_disregard_properties.py and test_pension_credit_income_losses.py: 9 passed.
  • On a local merge with main (not pushed):
    • the Pension Credit and Housing Benefit YAML directories: 485 passed;
    • the Carer's Allowance earnings-limit, overlapping-benefits and pension-age HB means-test files: 47 passed;
    • the property and loss tests: 9 passed;
    • the probes above.
  • ruff check and ruff format --check on the changed Python files: pass.
  • CI was green at d91b322.
  • Not run: the national impact table. It needs the Enhanced FRS build, which I did not download. I did not time the branch simulations either.

🤖 Generated with Claude Code

MaxGhenis added a commit that referenced this pull request Oct 19, 2026
#2019 now measures net employed earnings from employment_income alone,
and takes the income tax payable on them as the top-slice tax without
anyone's employment income. Statutory sick, maternity and paternity pay
are earnings of an employed earner (SPC Regs 2002 reg. 17A(2)(h) and
(i)), so list them once, in
gov.dwp.pension_credit.guarantee_credit.statutory_payments, and read the
list in all three places that need employed earnings:
pension_credit_earnings, the Sch VI disregard's net earnings, and the
top-slice tax (whose branch now zeroes the statutory payments with
employment income). earnings_sources is back to employment and
self-employment income.

Property tests:
- drop the temporary point-count prints;
- the Housing Benefit differential draws only SSP and SMP until #2368
  counts statutory paternity pay in HB, and excludes savings-credit-only
  awards, whose HB income is the Pension Credit assessment plus the
  savings credit (HB (SPC) Regs 2006 reg 27);
- the move-between-wages-and-pay property checks Pension Credit
  quantities only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 20, 2026
From the independent review of #2509:
- Cases 8 to 11 pin how statutory pay runs through #2019's top-slice tax
  on earnings: tax wholly on the pay (8), only the tax the pay causes (9),
  self-employed profit taxed beneath the pay (10), and a couple whose
  partner's pay costs the claimant the marriage allowance (11). With the
  tax module as #2019 has it, Cases 8 to 10 fail.
- Case 12: statutory sick pay is Savings Credit qualifying income (reg 9
  does not exclude it).
- The disregard and the top-slice tax read one helper,
  policyengine_uk/utils/pension_credit.employed_earnings_sources, so the
  list of employed earnings cannot drift between them.
- Labels and documentation in pension_credit_earnings_income_tax now say
  employed earnings, not employment income; the parameter reference cites
  reg 15(1)(o) to (q), matching its description.

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

Copy link
Copy Markdown
Collaborator Author

Adopted and fixed at d157482c7ce2f41bba844b17396e76a146e3c706 for hub-dispatched independent review, after merging captured main 9186a6e83 without rewriting branch history.

  • Fixed gross-earnings fixtures and held-input comparisons, preserved late explicit reliefs with core's drop_computed_arrays(), and corrected historical notional Class 2. Before/after controls fail/pass as requested; protected-couple PC stays £7,023.90.
  • Foreground validation: 727 YAML, 232 Python across all 30 review modules +3 new regression modules (-n 4), plus 5/5 corrected masked-fixture tests; Ruff format/check pass. Restoration 14/14, branch 14/14, independent tax 25/25 pass.
  • Certified 1.58.1 impact: PC paid +£0.559m (2026) and +£0.737m (2030); PC entitlement +£2.192m/+£2.096m. Full GC/SC/HB/CTR/Winter Fuel/HNI table is in the PR body.
  • Tax counterfactual calls cut 4→2. Final PC CPU +38.9% versus main; the two remaining full-vector tax evaluations total 0.512 CPU s, explaining the residual. Full-income CPU 3.257s versus 4.072s before fixes (same-production repeat 3.000s); peak RSS 2.890GB versus 3.112GB before. Configured thread caps 4, sampled compressor≤11.500GB.
  • Axiom Remove allowance variables that are only parameters #414 retained. Dispatch-ready .job/AXIOM_ISSUE.md covers remaining SPC 17/17A/17B and CER13–14; hub must file it and add its issue number to the axiom line. No encoder run, self review or merge.

Hub artifacts in this assigned worktree: .job/HANDOFF.md, .job/MEASUREMENTS.md, .job/ADOPT_2019.bundle, test logs and .job/AXIOM_ISSUE.md. Git metadata is isolated under .job/git because caller metadata is read-only; source .job/env.sh or import the verified bundle.

#2509 is stacked on this branch and needs main merged after #2019 lands.

@github-actions

github-actions Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Aggregate impact on certified data: pass

Base ea7c98b532 against head a544bfd4ef, 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: 4 (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

Measure Year Base Head Change
Decile 1: mean household_net_income per household 2028-29 £18,018 £17,992 -£26
Relative poverty, after housing costs: pensioners 2031-32 1,422k 1,429k +7.6k
Absolute poverty, after housing costs: pensioners 2031-32 1,424k 1,431k +7.6k
Absolute poverty, after housing costs: pensioners 2030-31 1,412k 1,419k +7.1k

Spending by benefit and service

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Pension Credit +£0.6m +£0.6m +£0.6m +£0.7m +£0.7m +£0.7m +£0.7m
Winter Fuel Payment 0 +£6,063 0 0 0 0 0
Housing Benefit -£6.0m -£7.0m -£9.7m -£11.4m -£15.8m -£17.3m -£17.7m
Council Tax Reduction -£1.7m -£2.5m -£3.1m -£3.7m -£5.0m -£6.2m -£7.7m
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
Pension Credit 0 +32 0 +2 +2 +2 0
Winter Fuel Payment 0 +30 0 0 0 0 0
Housing Benefit 0 -249 -269 -270 -271 -272 -273
Council Tax Reduction -2.7k -2.3k -2.6k -3.5k -1.4k -2.2k -3.3k
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed

Government balance, each component counted once

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Government spending -£7.2m † -£8.9m † -£12.2m † -£14.4m † -£20.1m † -£22.8m † -£24.6m †
Government balance, each receipt once +£7.2m † +£8.9m † +£12.2m † +£14.4m † +£20.1m † +£22.8m † +£24.6m †

Model totals

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
gov_spending -£7.2m † -£8.9m † -£12.2m † -£14.4m † -£20.1m † -£22.8m † -£24.6m †
household_benefits -£7.2m † -£8.9m † -£12.2m † -£14.4m † -£20.1m † -£22.8m † -£24.6m †
gov_balance +£7.2m † +£8.9m † +£12.2m † +£14.4m † +£20.1m † +£22.8m † +£24.6m †

Household income totals

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Household net income -£7.2m † -£8.9m † -£12.2m † -£14.4m † -£20.1m † -£22.8m † -£24.6m †
Household net income (HBAI definition) -£7.2m -£8.9m -£12.2m -£14.4m -£20.1m -£22.8m -£24.6m

Poverty rates

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Absolute poverty, before housing costs: everyone +0.00pp 0 0 0 +0.00pp +0.00pp +0.00pp
Absolute poverty, before housing costs: pensioners +0.00pp 0 0 0 +0.00pp +0.00pp +0.00pp
Absolute poverty, after housing costs: everyone +0.00pp +0.00pp +0.01pp +0.01pp +0.01pp +0.01pp +0.01pp
Absolute poverty, after housing costs: working-age adults 0 0 0 0 +0.00pp +0.00pp 0
Absolute poverty, after housing costs: pensioners +0.01pp +0.03pp +0.03pp +0.03pp +0.05pp +0.06pp +0.07pp
Relative poverty, before housing costs: everyone +0.00pp 0 +0.00pp +0.00pp +0.00pp +0.00pp +0.00pp
Relative poverty, before housing costs: working-age adults +0.00pp 0 0 0 0 0 0
Relative poverty, before housing costs: pensioners +0.00pp 0 +0.00pp +0.00pp +0.00pp +0.00pp +0.00pp
Relative poverty, after housing costs: everyone +0.00pp +0.00pp +0.01pp +0.00pp +0.01pp +0.01pp +0.01pp
Relative poverty, after housing costs: children 0 0 0 -0.00pp 0 0 0
Relative poverty, after housing costs: working-age adults 0 0 0 -0.00pp +0.00pp +0.00pp 0
Relative poverty, after housing costs: pensioners +0.03pp +0.02pp +0.04pp +0.03pp +0.06pp +0.06pp +0.07pp

People in poverty

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Absolute poverty, before housing costs: everyone +67 0 0 0 +476 +472 +474
Absolute poverty, before housing costs: pensioners +67 0 0 0 +476 +472 +474
Absolute poverty, after housing costs: everyone +1.1k +3.4k +3.9k +4.0k +6.3k +7.1k +7.6k
Absolute poverty, after housing costs: working-age adults 0 0 0 0 +7 +7 0
Absolute poverty, after housing costs: pensioners +1.1k +3.4k +3.9k +4.0k +6.3k +7.1k +7.6k
Relative poverty, before housing costs: everyone +1.1k 0 +551 +86 +68 +69 +69
Relative poverty, before housing costs: working-age adults +522 0 0 0 0 0 0
Relative poverty, before housing costs: pensioners +594 0 +551 +86 +68 +69 +69
Relative poverty, after housing costs: everyone +3.4k +2.2k +4.8k +3.4k +6.6k +6.5k +7.6k
Relative poverty, after housing costs: children 0 0 0 -395 0 0 0
Relative poverty, after housing costs: working-age adults 0 0 0 -198 +7 +7 0
Relative poverty, after housing costs: pensioners +3.4k +2.2k +4.8k +4.0k +6.6k +6.5k +7.6k

Inequality

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Gini coefficient, equivalised HBAI income before housing costs +0.0000 +0.0000 +0.0000 +0.0000 +0.0000 +0.0000 +0.0000

Mean household net income in each side's own deciles

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Decile 1: mean household_net_income per household +£0.05 † +£0.05 † +£0.06 † -£26 † +£0.11 † +£0.11 † +£0.36 †
Decile 2: mean household_net_income per household -£2.37 † -£0.44 † -£8.51 † +£12 † -£7.23 † -£1.78 † -£3.05 †
Decile 3: mean household_net_income per household -£0.50 † +£3.89 † +£8.12 † +£6.08 † -£12 † -£5.60 † -£5.33 †
Decile 4: mean household_net_income per household +£3.13 † +£3.86 † +£9.97 † +£15 † +£19 † +£10 † +£19 †
Decile 5: mean household_net_income per household -£0.10 † -£2.15 † +£0.63 † -£0.79 † -£0.83 † -£1.22 † +£0.36 †
Decile 6: mean household_net_income per household -£0.09 † -£3.62 † +£0.11 † +£0.11 † +£0.58 † -£2.46 † -£2.64 †
Decile 7: mean household_net_income per household 0 † +£5.28 † +£0.37 † +£0.37 † -£1.11 † +£3.82 † +£3.78 †
Decile 8: mean household_net_income per household -£0.02 † -£0.04 † -£0.07 † -£0.07 † -£0.09 † -£0.12 † -£0.15 †
Decile 9: mean household_net_income per household +£0.00 † 0 † 0 † +£0.00 † +£0.00 † +£0.00 † -£0.01 †
Decile 10: mean household_net_income per household 0 † +£0.00 † +£0.00 † +£0.00 † +£0.00 † +£0.00 † +£0.00 †

Standard reform costings (change in gov_balance)

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise basic rate by 1pp +£23,712 +£10,936 -£61,133 -£0.1m -£0.2m -£0.2m -£0.2m
Raise higher rate by 1pp -£7,852 +£4,543 +£0 +£0 0 -£0 -£0
Raise personal allowance by ~800GBP/year -£40,516 +£0.2m +£1.4m +£1.6m +£1.7m +£1.8m +£0.7m
Raise child benefit by 25GBP/week per additional child 0 +£1 -£1 0 +£0 +£0 -£0
Reduce Universal Credit taper rate to 20% -£42,999 -£44,720 -£45,918 -£47,023 -£48,175 -£49,359 -£50,562
Raise Class 1 main employee NICs rate to 10% -£0 +£0 +£0 +£2 +£1 +£2 -£0
Raise VAT standard rate by 2pp +£2 -£4 -£4 -£2 +£3 +£2 +£1
Raise additional rate by 3pp -£0 0 +£0 -£0 0 +£0 0
Raise the Universal Credit standard allowance by 10% -£1 -£4 -£2 -£0 -£1 +£1 -£83,661
Raise the State Pension by 10% +£9.0m +£11.6m +£12.2m +£13.9m +£15.3m +£16.2m +£17.2m

Household net income by decile

Mean change in household net income per household, and as a share of the decile's base income; households stay in the base run's deciles.

Base decile 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Decile 1 0 0 0 0 0 0 0
Decile 2 0 0 0 0 -£1 (-0.0%) -£1 (-0.0%) -£1 (-0.0%)
Decile 3 -£1 (-0.0%) -£2 (-0.0%) -£2 (-0.0%) -£2 (-0.0%) -£3 (-0.0%) -£4 (-0.0%) -£4 (-0.0%)
Decile 4 -£1 (-0.0%) 0 -£1 (-0.0%) -£1 (-0.0%) -£1 (-0.0%) -£1 (-0.0%) -£2 (-0.0%)
Decile 5 0 -£1 (-0.0%) -£1 (-0.0%) -£1 (-0.0%) -£1 (-0.0%) -£1 (-0.0%) -£1 (-0.0%)
Decile 6 fewer than 10 households change fewer than 10 households change fewer than 10 households change fewer than 10 households change fewer than 10 households change fewer than 10 households change fewer than 10 households change
Decile 7 0 fewer than 10 households change fewer than 10 households change fewer than 10 households change 0 0 0
Decile 8 fewer than 10 households change fewer than 10 households change fewer than 10 households change fewer than 10 households change fewer than 10 households change fewer than 10 households change fewer than 10 households change
Decile 9 fewer than 10 households change 0 0 fewer than 10 households change fewer than 10 households change fewer than 10 households change fewer than 10 households change
Decile 10 0 fewer than 10 households change fewer than 10 households change fewer than 10 households change fewer than 10 households change fewer than 10 households change fewer than 10 households change
all 0 0 0 0 -£1 (-0.0%) -£1 (-0.0%) -£1 (-0.0%)
Year People gaining over £1 People losing over £1
2025-26 0.0% 0.1%
2026-27 0.0% 0.1%
2027-28 0.0% 0.1%
2028-29 0.0% 0.1%
2029-30 0.0% 0.1%
2030-31 0.0% 0.1%
2031-32 0.0% 0.1%

No change in any year: receipts by tax head; components the model counts twice; population; standard reforms: change in each reform's target.

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

Each of 84 components was raised by £1 per unit in 2026-27, and every head of its totals was read household by household: its own head must rise by exactly £1, no other tax head may move, no other benefit may rise, and the model's own total must move by what its heads moved. A head that breaks a rule is measured again twice: with every other head held at its baseline value, and with every other head held at its value after the first £1 while the component rises again. It fails where either still shows the response. 0 failed; 0 were skipped.

Provenance
Side Commit Runtime Environment hash Partition hash Time
base main ea7c98b532 uk 2.141.0 (files 40e359b2c4d0), core 3.33.2, py 3.13.16 aarch64 59ece927c1e4 0d0426ee9e38 912.33s
head #2019 merged into main a544bfd4ef uk 2.141.2 (files d011c9e3c8cb), core 3.33.2, py 3.13.16 aarch64 e4bd31f5fe63 0d0426ee9e38 1056.58s

Dataset: hf://policyengine/policyengine-uk-data-private/enhanced_frs_2024_25.h5@2526edbbb687a3b54dbb11272e5389e4b62d2ac2, sha256 056e80fd8e9151d78f432a25cde863340baee81304c6216a37fb575ce8563784 (verified on both sides), policyengine-uk-data 1.58.1.

Receipts by tax head: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Income tax £299.29bn £318.98bn £336.45bn £351.55bn £367.04bn £385.12bn £403.42bn
National Insurance (employee and self-employed) £52.58bn £54.94bn £56.75bn £58.48bn £60.51bn £62.45bn £64.90bn
National Insurance (employer) £152.64bn £159.18bn £164.14bn £168.73bn £175.57bn £181.08bn £188.22bn
Employer NI change borne by capital £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Employer NI change borne by consumers £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Capital gains tax £12.62bn £13.06bn £13.55bn £14.04bn £14.54bn £15.09bn £15.65bn
Student loan repayments £7.83bn £8.12bn £8.35bn £8.56bn £8.79bn £9.04bn £9.38bn
VAT £253.71bn £260.53bn £266.72bn £273.14bn £279.83bn £286.71bn £293.71bn
Change in VAT from its baseline £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
VAT on private school fees £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Fuel duties £24.53bn £24.64bn £26.64bn £26.69bn £26.42bn £25.76bn £26.35bn
Alcohol duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Tobacco duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Vehicle excise duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
TV licence fee £4.28bn £4.43bn £4.44bn £4.46bn £4.49bn £4.51bn £4.53bn
Council tax £49.56bn £52.45bn £55.78bn £59.39bn £62.98bn £66.74bn £70.70bn
High value council tax surcharge £0.00bn £0.00bn £0.00bn £0.48bn £0.49bn £0.51bn £0.52bn
Northern Ireland domestic rates £0.55bn £0.58bn £0.61bn £0.63bn £0.67bn £0.70bn £0.73bn
Business rates £31.73bn £31.73bn £31.73bn £31.73bn £31.73bn £31.73bn £31.73bn
Stamp duty land tax (own purchases, and corporate until the £10.06bn £10.56bn £10.98bn £11.40bn £11.81bn £12.23bn £12.64bn
Land transaction tax (Wales) £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Land and buildings transaction tax (Scotland) £0.01bn £0.01bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn
Unspecified tax change borne by capital £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Unspecified tax change borne by consumers £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Wealth tax £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Wealth tax excluding the main residence £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Land value tax £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Carbon tax £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Spending by benefit and service: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
State Pension £122.50bn £127.12bn £128.28bn £130.21bn £134.05bn £138.02bn £142.08bn
Pension Credit £6.66bn £7.04bn £7.02bn £7.09bn £7.21bn £7.34bn £7.44bn
Winter Fuel Payment £1.70bn £1.68bn £1.59bn £1.57bn £1.57bn £1.55bn £1.52bn
Pension Age Winter Heating Payment (Scotland) £0.19bn £0.20bn £0.20bn £0.21bn £0.21bn £0.22bn £0.22bn
Universal Credit £78.78bn £83.09bn £84.89bn £86.65bn £87.58bn £89.00bn £90.33bn
Housing Benefit £8.59bn £8.92bn £9.19bn £9.33bn £9.61bn £9.87bn £10.15bn
Council Tax Reduction £1.99bn £2.03bn £2.08bn £2.13bn £2.18bn £2.23bn £2.28bn
Employment and Support Allowance (income-related) £2.12bn £2.18bn £2.23bn £2.28bn £2.33bn £2.39bn £2.45bn
Employment and Support Allowance (contribution-based) £5.22bn £5.36bn £5.49bn £5.62bn £5.76bn £5.90bn £6.04bn
Jobseeker's Allowance (income-based) £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Jobseeker's Allowance (contribution-based) £0.29bn £0.30bn £0.30bn £0.31bn £0.32bn £0.33bn £0.33bn
Income Support £0.12bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Working Tax Credit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Child Tax Credit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Incapacity Benefit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Personal Independence Payment £27.05bn £28.19bn £28.94bn £29.64bn £30.37bn £31.11bn £31.87bn
Disability Living Allowance £7.52bn £7.83bn £8.04bn £8.24bn £8.44bn £8.65bn £8.86bn
Attendance Allowance £8.71bn £9.08bn £9.32bn £9.55bn £9.78bn £10.02bn £10.26bn
Carer's Allowance £4.50bn £4.69bn £4.81bn £4.93bn £5.05bn £5.17bn £5.29bn
Carer Support Payment (Scotland) £0.35bn £0.37bn £0.38bn £0.39bn £0.40bn £0.41bn £0.41bn
Carer's Allowance Supplement (Scotland) £0.00bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn
Severe Disablement Allowance £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn
Industrial Injuries Disablement Benefit £0.51bn £0.52bn £0.53bn £0.54bn £0.56bn £0.57bn £0.59bn
Armed Forces Compensation Scheme £0.61bn £0.62bn £0.64bn £0.65bn £0.67bn £0.69bn £0.70bn
War Widow's or Widower's Pension £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Child Benefit £16.23bn £16.91bn £17.32bn £17.73bn £18.16bn £18.60bn £19.04bn
Scottish Child Payment £0.50bn £0.52bn £0.53bn £0.55bn £0.56bn £0.57bn £0.58bn
Two Child Limit Payment (Scotland, counterfactual) £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Healthy Start vouchers £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn
Maternity Allowance £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Statutory Maternity Pay £3.32bn £3.41bn £3.49bn £3.57bn £3.66bn £3.75bn £3.84bn
Statutory Paternity Pay £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Statutory Sick Pay £1.13bn £1.16bn £1.19bn £1.22bn £1.25bn £1.28bn £1.31bn
Sure Start Maternity Grant £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn
Bereavement Support Payment £0.67bn £0.69bn £0.70bn £0.72bn £0.74bn £0.76bn £0.78bn
Tax-Free Childcare £0.55bn £0.56bn £0.57bn £0.58bn £0.60bn £0.61bn £0.59bn
Extended childcare entitlement £2.66bn £3.14bn £3.23bn £3.30bn £3.38bn £3.47bn £3.55bn
Universal childcare entitlement £3.32bn £3.59bn £3.69bn £3.78bn £3.88bn £3.99bn £4.08bn
Targeted childcare entitlement £0.57bn £0.60bn £0.62bn £0.63bn £0.65bn £0.66bn £0.67bn
Care to Learn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Childcare Grant £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Parents' Learning Allowance £0.20bn £0.20bn £0.20bn £0.20bn £0.20bn £0.20bn £0.20bn
Adult Dependants' Grant £0.06bn £0.06bn £0.04bn £0.04bn £0.04bn £0.04bn £0.04bn
Travel Grant £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed
16 to 19 Bursary Fund £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
NHS spending £204.68bn £205.46bn £206.22bn £207.04bn £207.96bn £208.89bn £209.79bn
State education spending £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn
Transport subsidy spending £25.15bn £25.25bn £25.34bn £25.44bn £25.55bn £25.67bn £25.78bn
Cost-of-living support payment £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Energy Bills Rebate £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Energy Price Guarantee subsidy £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Basic income £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Disability basic income £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Other public spending budget change £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Caseloads: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
State Pension 11,308k 11,208k 10,906k 10,812k 10,860k 10,908k 10,955k
Pension Credit 1,490k 1,489k 1,477k 1,455k 1,457k 1,454k 1,450k
Winter Fuel Payment 7,091k 7,008k 6,593k 6,509k 6,491k 6,377k 6,242k
Pension Age Winter Heating Payment (Scotland) 806k 807k 807k 805k 809k 812k 816k
Universal Credit 6,371k 6,379k 6,409k 6,419k 6,395k 6,387k 6,371k
Housing Benefit 1,254k 1,252k 1,254k 1,240k 1,244k 1,247k 1,249k
Council Tax Reduction 3,185k 3,210k 3,223k 3,244k 3,262k 3,280k 3,293k
Employment and Support Allowance (income-related) 187k 188k 188k 189k 190k 190k 191k
Employment and Support Allowance (contribution-based) 722k 724k 727k 730k 733k 737k 740k
Jobseeker's Allowance (income-based) 0k 0k 0k 0k 0k 0k 0k
Jobseeker's Allowance (contribution-based) 67k 67k 68k 68k 68k 69k 69k
Income Support 25k 0k 0k 0k 0k 0k 0k
Working Tax Credit 0k 0k 0k 0k 0k 0k 0k
Child Tax Credit 0k 0k 0k 0k 0k 0k 0k
Incapacity Benefit 0k 0k 0k 0k 0k 0k 0k
Personal Independence Payment 3,581k 3,595k 3,608k 3,623k 3,639k 3,655k 3,671k
Disability Living Allowance 1,296k 1,301k 1,306k 1,311k 1,317k 1,323k 1,329k
Attendance Allowance 1,701k 1,708k 1,714k 1,721k 1,729k 1,736k 1,744k
Carer's Allowance 1,038k 1,042k 1,046k 1,050k 1,055k 1,059k 1,064k
Carer Support Payment (Scotland) 81k 82k 82k 82k 83k 83k 83k
Carer's Allowance Supplement (Scotland) 0k 82k 82k 82k 83k 83k 83k
Severe Disablement Allowance 4k 4k 4k 4k 4k 4k 4k
Industrial Injuries Disablement Benefit 137k 138k 139k 139k 140k 140k 141k
Armed Forces Compensation Scheme 94k 94k 94k 95k 95k 95k 96k
War Widow's or Widower's Pension 0k 0k 0k 0k 0k 0k 0k
Child Benefit 8,136k 8,165k 8,185k 8,215k 8,249k 8,282k 8,314k
Scottish Child Payment 352k 354k 355k 356k 357k 358k 357k
Two Child Limit Payment (Scotland, counterfactual) 0k 0k 0k 0k 0k 0k 0k
Healthy Start vouchers 200k 201k 202k 203k 204k 204k 205k
Maternity Allowance 0k 0k 0k 0k 0k 0k 0k
Statutory Maternity Pay 334k 335k 336k 338k 339k 341k 342k
Statutory Paternity Pay 0k 0k 0k 0k 0k 0k 0k
Statutory Sick Pay 182k 183k 183k 184k 185k 186k 186k
Sure Start Maternity Grant 26k 26k 26k 27k 27k 27k 27k
Bereavement Support Payment 98k 98k 99k 99k 100k 100k 101k
Tax-Free Childcare 1,017k 1,028k 1,028k 1,033k 1,034k 1,038k 1,023k
Extended childcare entitlement 665k 671k 675k 677k 682k 686k 687k
Universal childcare entitlement 986k 989k 992k 997k 1,002k 1,013k 1,015k
Targeted childcare entitlement 119k 120k 120k 121k 121k 122k 121k
Care to Learn 0k 0k 0k 0k 0k 0k 0k
Childcare Grant 0k 0k 0k 0k 0k 0k 0k
Parents' Learning Allowance 98k 99k 99k 100k 100k 100k 101k
Adult Dependants' Grant 18k 18k 12k 13k 13k 13k 13k
Travel Grant 0k 0k 0k 0k 0k 0k 0k
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed
16 to 19 Bursary Fund 0k 0k 0k 0k 0k 0k 0k
Cost-of-living support payment 0k 0k 0k 0k 0k 0k 0k
Energy Bills Rebate 0k 0k 0k 0k 0k 0k 0k
Energy Price Guarantee subsidy 0k 0k 0k 0k 0k 0k 0k
Basic income 0k 0k 0k 0k 0k 0k 0k
Disability basic income 0k 0k 0k 0k 0k 0k 0k
Government balance, each component counted once: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Government receipts, each component once £899.39bn £939.21bn £976.17bn £1,009.31bn £1,044.89bn £1,081.66bn £1,122.50bn
Government spending £536.58bn † £550.92bn † £557.25bn † £564.32bn † £572.87bn † £582.12bn † £591.28bn †
Government balance, each receipt once £362.81bn † £388.29bn † £418.91bn † £445.00bn † £472.02bn † £499.54bn † £531.22bn †
Benefits in household_benefits but not in gov_spending £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Model totals: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
gov_tax £902.52bn £942.34bn £979.30bn £1,012.44bn £1,048.02bn £1,084.79bn £1,125.63bn
household_tax £496.17bn £522.63bn £548.43bn £570.57bn £592.62bn £617.00bn £643.70bn
pre_budget_change_household_tax £488.34bn £514.51bn £540.08bn £561.53bn £583.34bn £607.46bn £633.81bn
gov_spending £536.58bn † £550.92bn † £557.25bn † £564.32bn † £572.87bn † £582.12bn † £591.28bn †
household_benefits £536.58bn † £550.92bn † £557.25bn † £564.32bn † £572.87bn † £582.12bn † £591.28bn †
gov_balance £365.94bn † £391.42bn † £422.04bn † £448.13bn † £475.15bn † £502.67bn † £534.35bn †
Components the model counts twice: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
corporate_sdlt, counted again inside expected_sdlt £3.13bn £3.13bn £3.13bn £3.13bn £3.13bn £3.13bn £3.13bn
Household income totals: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Household market income £1,657.06bn £1,719.25bn £1,771.68bn £1,821.99bn £1,887.41bn £1,945.59bn £2,017.37bn
Household net income £1,658.19bn † £1,706.78bn † £1,738.62bn † £1,772.80bn † £1,809.05bn † £1,850.77bn † £1,902.51bn †
Household net income (HBAI definition) £1,466.75bn £1,513.56bn £1,545.81bn £1,578.86bn £1,613.04bn £1,652.17bn £1,702.61bn
Population: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
People 69,514k 69,778k 70,036k 70,316k 70,626k 70,944k 71,249k
Benefit units 35,247k 35,381k 35,512k 35,654k 35,811k 35,972k 36,127k
Households 31,167k 31,285k 31,401k 31,526k 31,665k 31,808k 31,944k
Poverty rates: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Absolute poverty, before housing costs: everyone 15.9% 14.9% 15.5% 15.6% 15.7% 15.8% 15.7%
Absolute poverty, before housing costs: children 23.7% 20.9% 21.6% 21.4% 21.6% 21.8% 21.7%
Absolute poverty, before housing costs: working-age adults 13.8% 13.4% 14.0% 14.1% 14.2% 14.3% 14.3%
Absolute poverty, before housing costs: pensioners 13.7% 13.1% 13.2% 13.4% 13.5% 13.6% 13.6%
Absolute poverty, after housing costs: everyone 20.9% 20.4% 21.0% 21.2% 21.5% 21.7% 21.8%
Absolute poverty, after housing costs: children 31.8% 30.0% 30.7% 31.0% 31.2% 31.6% 31.8%
Absolute poverty, after housing costs: working-age adults 19.4% 19.2% 20.0% 20.2% 20.5% 20.7% 20.8%
Absolute poverty, after housing costs: pensioners 12.6% 12.3% 12.0% 12.2% 12.3% 12.3% 12.4%
Relative poverty, before housing costs: everyone 16.9% 16.4% 16.4% 16.5% 16.6% 16.7% 16.7%
Relative poverty, before housing costs: children 25.6% 23.5% 23.2% 23.2% 23.3% 23.4% 23.4%
Relative poverty, before housing costs: working-age adults 14.4% 14.4% 14.7% 14.8% 14.9% 15.1% 15.0%
Relative poverty, before housing costs: pensioners 14.8% 14.9% 14.1% 14.3% 14.2% 14.2% 14.4%
Relative poverty, after housing costs: everyone 21.5% 21.1% 21.3% 21.3% 21.6% 21.5% 21.8%
Relative poverty, after housing costs: children 32.6% 31.3% 31.1% 31.1% 31.4% 31.3% 31.8%
Relative poverty, after housing costs: working-age adults 19.8% 19.8% 20.2% 20.3% 20.5% 20.6% 20.7%
Relative poverty, after housing costs: pensioners 13.4% 12.8% 12.6% 12.4% 12.4% 12.3% 12.4%
People in poverty: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Absolute poverty, before housing costs: everyone 11,051k 10,427k 10,848k 10,947k 11,079k 11,209k 11,218k
Absolute poverty, before housing costs: children 3,560k 3,141k 3,261k 3,253k 3,298k 3,334k 3,334k
Absolute poverty, before housing costs: working-age adults 5,864k 5,737k 6,070k 6,165k 6,237k 6,315k 6,319k
Absolute poverty, before housing costs: pensioners 1,627k 1,549k 1,517k 1,529k 1,544k 1,561k 1,565k
Absolute poverty, after housing costs: everyone 14,541k 14,217k 14,696k 14,937k 15,157k 15,396k 15,530k
Absolute poverty, after housing costs: children 4,767k 4,515k 4,643k 4,699k 4,756k 4,835k 4,896k
Absolute poverty, after housing costs: working-age adults 8,277k 8,253k 8,666k 8,844k 8,994k 9,142k 9,203k
Absolute poverty, after housing costs: pensioners 1,497k 1,449k 1,386k 1,394k 1,408k 1,419k 1,431k
Relative poverty, before housing costs: everyone 11,760k 11,456k 11,504k 11,625k 11,706k 11,868k 11,914k
Relative poverty, before housing costs: children 3,840k 3,538k 3,514k 3,525k 3,546k 3,582k 3,602k
Relative poverty, before housing costs: working-age adults 6,154k 6,160k 6,365k 6,465k 6,537k 6,651k 6,651k
Relative poverty, before housing costs: pensioners 1,766k 1,758k 1,625k 1,634k 1,623k 1,634k 1,661k
Relative poverty, after housing costs: everyone 14,916k 14,721k 14,905k 15,007k 15,225k 15,288k 15,517k
Relative poverty, after housing costs: children 4,889k 4,715k 4,697k 4,719k 4,791k 4,799k 4,891k
Relative poverty, after housing costs: working-age adults 8,435k 8,497k 8,758k 8,878k 9,019k 9,074k 9,197k
Relative poverty, after housing costs: pensioners 1,591k 1,508k 1,451k 1,410k 1,415k 1,415k 1,429k
Inequality: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Gini coefficient, equivalised HBAI income before housing costs 0.3074 0.3052 0.3065 0.3072 0.3078 0.3084 0.3094
Mean household net income in each side's own deciles: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Decile 1: mean household_net_income per household £17,707 † £17,997 † £17,941 † £17,992 † £18,326 † £18,523 † £18,686 †
Decile 2: mean household_net_income per household £28,362 † £29,040 † £28,672 † £29,013 † £29,374 † £29,780 † £30,330 †
Decile 3: mean household_net_income per household £34,607 † £35,902 † £36,507 † £37,008 † £37,263 † £37,949 † £38,656 †
Decile 4: mean household_net_income per household £39,329 † £40,908 † £41,942 † £42,838 † £43,195 † £43,846 † £44,955 †
Decile 5: mean household_net_income per household £44,874 † £46,151 † £46,931 † £47,446 † £48,380 † £49,253 † £50,077 †
Decile 6: mean household_net_income per household £47,931 † £49,321 † £50,272 † £51,051 † £52,161 † £52,926 † £54,242 †
Decile 7: mean household_net_income per household £56,322 † £57,584 † £58,472 † £59,449 † £60,165 † £61,636 † £62,887 †
Decile 8: mean household_net_income per household £69,252 † £70,364 † £71,639 † £72,874 † £74,337 † £75,704 † £77,574 †
Decile 9: mean household_net_income per household £79,674 † £82,009 † £83,247 † £84,449 † £86,137 † £87,749 † £89,958 †
Decile 10: mean household_net_income per household £117,666 † £120,533 † £122,448 † £124,609 † £126,968 † £129,679 † £132,877 †
Standard reform costings (change in gov_balance): head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise basic rate by 1pp £6.22bn £6.50bn £6.71bn £6.90bn £7.11bn £7.35bn £7.62bn
Raise higher rate by 1pp £3.54bn £3.82bn £4.05bn £4.27bn £4.49bn £4.76bn £4.96bn
Raise personal allowance by ~800GBP/year £-3.83bn £-3.96bn £-4.03bn £-4.10bn £-4.20bn £-4.30bn £-2.02bn
Raise child benefit by 25GBP/week per additional child £-2.00bn £-1.76bn £-1.64bn £-1.54bn £-1.44bn £-1.34bn £-1.24bn
Reduce Universal Credit taper rate to 20% £-20.54bn £-21.10bn £-21.45bn £-21.88bn £-21.96bn £-22.33bn £-22.81bn
Raise Class 1 main employee NICs rate to 10% £11.06bn £11.51bn £11.83bn £12.14bn £12.46bn £12.80bn £13.28bn
Raise VAT standard rate by 2pp £25.01bn £25.68bn £26.29bn £26.92bn £27.58bn £28.26bn £28.95bn
Raise additional rate by 3pp £2.83bn £3.07bn £3.26bn £3.46bn £3.66bn £3.89bn £4.21bn
Raise the Universal Credit standard allowance by 10% £-3.04bn £-3.17bn £-3.24bn £-3.32bn £-3.37bn £-3.43bn £-3.47bn
Raise the State Pension by 10% £-8.92bn £-9.13bn £-9.03bn £-9.06bn £-9.26bn £-9.51bn £-9.78bn
Standard reforms: change in each reform's target: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise basic rate by 1pp: change in income_tax £6.36bn £6.65bn £6.87bn £7.07bn £7.29bn £7.53bn £7.81bn
Raise higher rate by 1pp: change in income_tax £3.54bn £3.83bn £4.06bn £4.28bn £4.50bn £4.77bn £4.97bn
Raise personal allowance by ~800GBP/year: change in income_tax £-3.96bn £-4.11bn £-4.19bn £-4.27bn £-4.36bn £-4.47bn £-1.77bn
Raise child benefit by 25GBP/week per additional child: change in child_benefit £2.34bn £2.15bn £2.03bn £1.92bn £1.82bn £1.71bn £1.59bn
Reduce Universal Credit taper rate to 20%: change in universal_credit £20.53bn £21.09bn £21.44bn £21.87bn £21.95bn £22.32bn £22.80bn
Raise Class 1 main employee NICs rate to 10%: change in national_insurance £11.33bn £11.79bn £12.13bn £12.44bn £12.77bn £13.12bn £13.61bn
Raise VAT standard rate by 2pp: change in vat £25.01bn £25.68bn £26.29bn £26.92bn £27.58bn £28.26bn £28.95bn
Raise additional rate by 3pp: change in income_tax £2.83bn £3.07bn £3.26bn £3.46bn £3.66bn £3.89bn £4.21bn
Raise the Universal Credit standard allowance by 10%: change in universal_credit £3.04bn £3.17bn £3.25bn £3.32bn £3.38bn £3.43bn £3.48bn
Raise the State Pension by 10%: change in state_pension £12.25bn £12.71bn £12.83bn £13.02bn £13.41bn £13.80bn £14.21bn

@MaxGhenis

Copy link
Copy Markdown
Collaborator Author

Round 2 fixes pushed at 54b409db47fd543792a0f2ce5c9e2c43010ddb7e, on top of d157482c7, with captured main ea7c98b53 merged cleanly. Original author and history retained.

  • Removed all ten remaining pre-netted passport earnings overrides, including masked cases; unchanged law-derived assertions. Complete fixture audit/eleven hand derivations: .job/FIXTURES_R2.md.
  • Held the four personal-relief inputs consistently and pinned CI's complete five-family @example. Original body reproduces the £252 failure; repaired property passes. Assertions, tolerances and settings retained.
  • Fixed CI Result's missing collected.txt diagnostic by retaining collection/upload after YAML failures; preserved the upstream failure gate. Qualified flatness metadata and corrected Axiom Document domestic/foreign consumption/production handling #478's amendment/territorial quotations; Remove allowance variables that are only parameters #414/Document domestic/foreign consumption/production handling #478 remain queued.
  • Foreground validation: 773 YAML, 247 Python / 36 modules (-n 3, exact coverage against fresh collection, zero errors/failures/skips/xfails), 46 CI shard-audit tests, 14 restoration + 14 branch probes. Ruff format/lint and Git whitespace checks pass. Four existing employer-NI divide warnings.
  • Certified 1.58.1, SHA256 verified before every load: PC paid +£559,416.56 (2026) / +£736,736.97 (2030); HNI +£565,478.50 / +£736,737.16. Full requested leaf table is in the body.
  • P2 cost remains for hub assessment. Post-suite serial full-income pair: 3.194 → 3.577 CPU seconds (+12.00%), target cumulative peak RSS 2.771 → 2.893 GB. Initial/reverse observations were +27.25%/+3.40%; no stable gain is claimed. The subset prototype was slower and failed result equality, so it was discarded. Production retains the validated two full-vector tax evaluations. Details and aggregate-only evidence are in .job/.

New CI results are pending. Please dispatch the hub's independent Sol review at this head. No self review or PR merge was run. #2509, stacked on this branch, needs main merged after this lands. .job/HANDOFF.md, one handoffs.jsonl line and a verified branch bundle are left for the hub. No certified H5 copy, UV cache, Hypothesis cache or background process is retained.

@MaxGhenis
MaxGhenis added this pull request to the merge queue Oct 21, 2026
Merged via the queue into main with commit 1fac3a5 Oct 21, 2026
31 checks passed
@MaxGhenis
MaxGhenis deleted the pc-earnings-disregard branch October 21, 2026 08:10
@MaxGhenis

Copy link
Copy Markdown
Collaborator Author

Merged by the UK hub (session local_8e19f9d5, Opus 5.5) on its merge gates. The hub adopted this PR under d1280. One merge-queue enqueue, pinned to head 54b409db47fd543792a0f2ce5c9e2c43010ddb7e.

  • Reviews: independent GPT-6.1 Sol reviews.
    • r1 and r2: REQUEST_CHANGES, fixed in the adoption rounds.
    • r3 (Subfleet 20261020-110417-uk2019-review-r3): provisional, with no new blocking defect. It hit the 6-hour wall before its last executed checks.
    • Finalizer (20261020-174751-uk2019-review-r3-final2): APPROVE at 54b409db4. It confirmed that all 30 modules of r3's remaining Python partition passed exactly once, in both the source and wheel CI runs (CI's per-test outcome records), and re-ran them locally at the head. It also ran the CI health module and captured exact-head gh pr checks (exit 0; 30 pass, Publish skipped), with the head verified before and after.
    • r3's two non-blocking findings stand: a performance measurement that's inconclusive, and a suggestion to split the CI diagnostic fix.
  • Tests: the source CI run recorded 7,429 passed, 61 skipped and 1 xfailed; the wheel run 7,134 passed. The merge queue re-tests against current main.
  • Impact: the hub's clean probe on certified 1.58.1 (run 39502506790, main 76cfc9e79 merged with this head):
    • Pension Credit +£0.6m to +£0.7m a year;
    • Winter Fuel Payment +£6,063 in 2026-27;
    • Housing Benefit −£11,029 in 2031-32;
    • no flags, nothing broken.
  • axiom: line: Encode SPC Regs 2002 Sch VI (Pension Credit earnings disregards) via reg 17(9) (PE parity: policyengine-uk#2019) TheAxiomFoundation/rulespec-uk#414 and Document domestic/foreign consumption/production handling #478 queued.

🤖 Generated with Claude Code

MaxGhenis added a commit that referenced this pull request Oct 21, 2026
…egards)

council_tax_reduction_applicable_income keeps main's applicant-and-partner
benefits block and its documentation, followed by this PR's capital, tariff
and home-letting text.

pension_credit_income keeps #2019's formula. Its tax on earnings is the
extra tax the earnings cause, including on savings and dividends (Max's
d1424 ruling, option (a)), and self-employed profit carries notional tax.
This PR then subtracts what reg 17(10)(a) and Sch IV para 18 leave out: the
tax on uncounted income, and the Step 7 charges, that the claimant and
partner would pay without earnings. The new Person variable
pension_credit_uncounted_income_tax_without_earnings is income tax less
legacy_means_test_income_tax, on #2019's no-earnings counterfactual.
- With no capital income or charges it is nil, and #2019's results stand.
- With no earnings the formula reduces to this PR's.
- It does not depend on earnings, so the disregard invariance holds.

Subtracting #2019's self-employment tax from legacy_means_test_income_tax
directly would remove induced dividend tax twice.

#2019's two branches still serve income_tax. A generic helper,
person_variable_with_inputs_zeroed, computes the counted tax on a third,
and the UC non-dependant check precomputes it on the parent.

Main's savings-band pair now gives 12,000: the tax on the interest due
without earnings (1,086) is not deducted. #2019's property reference
subtracts the same quantity, from its own simulation. A new case covers wages
that push dividends into the higher band.

Not run locally (disk pause #11); verification follows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 21, 2026
…now deducted

test_income_from_capital_changes_no_legacy_means_test: with earnings, #2019's
tax on earnings (Max's d1424 ruling) includes the extra tax earnings cause on
savings and dividends. Scaling income from capital can therefore move Pension
Credit income. Hypothesis found such a case: a couple whose wages of 6,707
sit under the personal allowance, so at three times the dividends 279.77 of
dividend tax is induced and deducted. The property now asserts:
- invariance wherever pension_credit_employment_income_tax does not move;
- otherwise, that Pension Credit income moves by exactly minus that change
  and the disregard's.
The awards that follow Pension Credit are compared wherever the tax on
earnings is steady. The docstring labels this an intended exception.

test_means_tests_see_the_loss_only_through_tax: the legacy means tests deduct
legacy_means_test_income_tax, and Pension Credit's new uncounted-tax term
comes off too. Both are recomputed from the tax components, so with
income_tax held a loss that moves interest between bands moved them, and
Housing Benefit income with them (1,047 in the failing family). Both are now
held, as the tax the tests deduct.

Both pass single-process, with derandomized examples.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 22, 2026
Brings in #2019's final rounds (merged at 1fac3a5) and later main.
No conflicts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 22, 2026
SPC Regs 2002 reg. 17A(2)(h) and (i) make statutory sick, maternity and
paternity pay earnings of an employed earner, and reg. 17(10) deducts the
tax payable on them as it is (not the notional tax reg. 17(11) gives
self-employed earners). Under #2019's top-slice split (d1424), both
counterfactual branches therefore zero the pay with employment income.
Update #2019's branch-reuse expectation, in both parametrizations, to the
employed-earnings keys this PR introduces, and give one non-dependant
pensioner statutory sick pay so the shared-branch and calculation-order
tests run with it present.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.

3 participants