Skip to content

Keep Tax-Free Childcare over a smaller UC award, and take no deductions from awards only a reform creates - #2754

Merged
juaristi22 merged 5 commits into
mainfrom
uc-taper-tfc-choice-2753
Oct 30, 2026
Merged

juaristi22 merged 5 commits into
mainfrom
uc-taper-tfc-choice-2753

Conversation

@juaristi22

@juaristi22 juaristi22 commented Oct 29, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #2753
Fixes #2689

Cutting the Universal Credit taper from 55% to 50% left some families worse off. The lower taper gave them a first, small award, and two things then went wrong:

  1. The award ended their Tax-Free Childcare (A small Universal Credit award ends Tax-Free Childcare worth more, so removing the two-child limit leaves some families worse off #2689). Any award before the benefit cap disqualifies a family from Tax-Free Childcare. Since claims_universal_credit takes any award, the family lost a top-up worth more than the award. UC is paid only on a claim, so a real family would not claim.
  2. A deduction took much of the award. The deduction attributes describe the existing caseload's debts, but they came out of awards the reform had just created. This happened whether the dataset supplies those attributes (Microcosm UK does, for every benefit unit) or the model draws them.

#2753 has the trace: the £630 that Vahid's guide couldn't find is Tax-Free Childcare.

What changes

A family takes Tax-Free Childcare instead of a smaller award. forgoes_universal_credit_for_tax_free_childcare compares what a claim brings with the top-up the family would get without one (tax_free_childcare_without_universal_credit). Where the top-up is worth more, universal_credit_pre_benefit_cap is nil, so Tax-Free Childcare stays.

  • What is compared. The award is taken before the benefit cap and deductions. Deductions repay debts the family owes either way. The cap spares the earnings that the Tax-Free Childcare work condition needs.
  • Scottish Child Payment. In Scotland any award qualifies the children for Scottish Child Payment, which has no earnings limit, so the comparison adds the payment the claim brings to the award. A family that could forgo has no other qualifying benefit: the rest are legacy awards, which keep the claim, or Pension Credit, which rules UC out. So the claim brings the family's whole payment. It's built from is_scp_eligible_child, the country, would_claim_scp and the weekly rate, since scottish_child_payment reads universal_credit.
  • Not weighed. Scottish Child Payment is now weighed (above). The comparison still leaves out other help that comes with a UC award: free school meals, Healthy Start, the two-year-old free hours, and council tax reduction where a scheme keys on UC (council_tax_reduction/_legacy.py). That last one has the same shape as Scottish Child Payment but is smaller. The others have earnings limits near or below the Tax-Free Childcare work condition's floor, and an award worth less than the top-up comes only near the top of the UC taper.
  • Legacy awards. A family receiving a legacy award that a claim would end (tax credits, Housing Benefit, Income Support, income-based JSA, income-related ESA) keeps its claim until DWP closes that award. The comparison doesn't weigh those awards.
  • Where it applies. The choice zeroes the award, not claims_universal_credit. Putting it in the claim would make a cycle, because uc_non_dependants_counted reads every family's claim to build the housing element. So rules that read the claim still see the family as claiming. With legacy awards excluded, that leaves only the household's non-dependant ordering, and only when a forgoing family shares a household with another claim.
  • Tax credits in the comparison. tax_free_childcare_eligible_without_universal_credit treats a tax credit award as in force while it's reported and DWP hasn't closed it, as is_CTC_eligible and is_WTC_eligible do. It doesn't read the amount: tax credit income counts Pension Credit, and Pension Credit eligibility reads is_uc_entitled, which is another cycle.
  • Shared code. tax_free_childcare and tax_free_childcare_eligible move their conditions and top-up into _top_up.py unchanged, so the comparison uses the same code.

No deduction comes out of an award only a reform creates. uc_award_carries_deductions is false where a simulation has an award and its baseline doesn't.

  • Where it applies. uc_deductions and uc_benefit_cap_reduction_after_floor gate the deduction demand, so supplied rates are covered and the two still agree. uc_has_deduction reads the gate too.
  • Which simulations. A simulation is compared with its baseline where it may differ from it; Simulation now records changed_from_baseline.
    • Built with a reform: its baseline is the current-law simulation.
    • Changed after it was built, by apply_reform or by a step that ends with drop_computed_arrays: its baseline is the copy made at construction, which a parameter change after the build doesn't reach. policyengine.py's _apply_step ends every modifier step with drop_computed_arrays, so a policy that has only a simulation modifier is compared too, with no policyengine.py change.
    • Anything else keeps every deduction, so a plain current-law run doesn't work out UC twice. A bare set_input doesn't count as a change.
  • An assumption. That a family a reform brings onto UC repays none of the caseload's debts from its new award is an assumption, and it holds in every year compared. For an advance it's a fair first-year view, since the advance is a loan paid out first. But third-party deductions (SI 2013/380 Sch 6: housing cost arrears, fuel and water among others) and overpayment recovery apply to any claimant with those debts. So the assumption slightly raises the cost of reforms that widen UC. In the aggregate-impact run at 2f05622, the standard cut of the taper to 20% costs £0.39bn to £0.53bn a year more on the certified Enhanced FRS, about 2% of its cost.
  • Cost. The baseline award is worked out only for the households holding an award, in a household_subset branch of the baseline (Compare property allowance routes on only the households with a choice #2732).

Docs. The deductions validation page gets an "Awards a reform creates" section. The Tax-Free Childcare page says how the UC choice works.

Evidence

Reproducer: policyengine_uk/tests/test_uc_tax_free_childcare_choice.py::test_taper_cut_leaves_tax_free_childcare_families_no_worse_off

Synthetic households (test_uc_tax_free_childcare_choice.py). Take a London couple renting privately for £24,000 a year, with two children in £6,000 of childcare each, under the taper cut in 2027-28:

Each earns Deduction Main This PR
£58,000 none +£753 +£753
£58,000 15% latent rate −£500 +£753
£60,000 none −£407 £0 (keeps Tax-Free Childcare)
£60,000 15% latent rate −£1,660 £0

The same file also checks that:

  • an award worth less than the top-up is forgone, one worth more is claimed, and a small award under current law is forgone;
  • in Scotland, at £45,000 each, the £1,571 award and the £3,037 of Scottish Child Payment it brings are claimed over £2,400 of Tax-Free Childcare, and the award is forgone where the payment isn't claimed;
  • an existing award keeps its deduction under the reform;
  • the engine's own draw is gated as well as a supplied rate;
  • the taper cut applied as a modifier after the build (+£752.66) or by apply_reform is compared with the baseline;
  • a current-law simulation isn't compared, even after a bare set_input, and doesn't compute UC in its baseline copy;
  • a three-household case goes through the subset branch.

National file (at 2af61e7). Microcosm UK 2024-25 national (microcosm-uk-2024-25-national-20261025T091414Z-a6299504), 2027-28, taper cut from 2027. Main is at 64cf582. On the certified Enhanced FRS too, no household loses.

  • Taper-cut losers: 17 sample households (about 10,100 weighted) on main, none with this PR.
  • Cost of the cut: £1.81bn instead of £1.77bn. New awards no longer lose deductions, and some families keep Tax-Free Childcare.
  • Current law: fewer than 10 sample benefit units forgo a UC award for Tax-Free Childcare in each of 2025-26, 2027-28, 2029-30 and 2031-32, so the change to current-law UC and Tax-Free Childcare totals isn't quoted here. On the certified Enhanced FRS, 12 forgo in 2025-26, and fewer than 10 of them report UC in the survey. The aggregate-impact report has the certified file's totals.
  • Run time on that file:
    • Current-law run: household net income takes 9.6 to 10.9 s across runs, against 9.0 s on main.
    • Reform run: it takes 24.0 to 25.0 s, against 21.0 s, the cost of working out the baseline award. The machine was shared, so read a second either way as noise.
    • Builds: about 17 s and 35 s, unchanged.
    • Small household simulations, as the property tests build them, take about 5% longer under current law and 8% longer with a reform.

Commands run

  • uv run pytest policyengine_uk/tests/test_uc_tax_free_childcare_choice.py: 20 passed.
  • uv run policyengine-core test on policy/baseline/gov/hmrc/tax_free_childcare, policy/baseline/finance/benefit/family/universal_credit and policy/baseline/gov/social_security_scotland: 780 passed, including the new YAML files.
  • At this head, uv run pytest -n 4 on the reform-route files (modifiers, construction wrappers, reform representations, the drop_computed_arrays callers, deductions, household subsets, labour supply baselines): 404 passed, 1 skipped (the same data test).
  • At 2f05622, uv run pytest -n 4 on 26 related files and code_health/: 3,589 passed, 1 skipped (a data test that needs dataset credentials). The files cover deductions, the benefit cap, household subsets, the Childcare Grant, legacy closure, the Housing Benefit UC passport, reform and modifier construction, labour supply baselines, code sharing, module release, units, determinism and the program registry.
  • ruff format and ruff check on the changed files.
  • Not run locally: the full YAML suite, the full Python suite, and microsimulation/test_uc_deductions_aggregates.py (needs the certified dataset). CI runs them.

Related

axiom: n/a: a claim choice and debt-deduction modelling; the Tax-Free Childcare disqualification and Universal Credit rules themselves are unchanged

🤖 Generated with Claude Code

juaristi22 and others added 3 commits October 29, 2026 22:48
Any Universal Credit award before the benefit cap disqualifies a family
from Tax-Free Childcare, and a family the data marks as a claimant took
any award, however small. Universal Credit is paid only on a claim, so a
family better off with the top-up does not claim (#2689).

forgoes_universal_credit_for_tax_free_childcare compares the award before
the cap and deductions with tax_free_childcare_without_universal_credit;
where the top-up is worth more, universal_credit_pre_benefit_cap is nil.
A family receiving a legacy award that a claim would end keeps its claim.
The choice zeroes the award rather than claims_universal_credit, which
the non-dependant rules read for the housing element. Tax credits count
while in force rather than by amount, which reads Pension Credit and so
Universal Credit. The Tax-Free Childcare conditions and top-up move to
_top_up.py unchanged, so both awards share them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The deduction incidence, rates and types describe the existing
caseload's debts, but they came out of any award, including one a reform
had just created, whether the dataset supplied them or the model drew
them. A taper cut gave some families a first award that a deduction then
mostly took away (#2753).

uc_award_carries_deductions is false where a simulation built with a
reform has an award and its baseline does not. uc_deductions and
uc_benefit_cap_reduction_after_floor gate the demand, so supplied rates
are covered and the two still agree; uc_has_deduction reads it too. The
baseline award is worked out only for households holding an award, in a
household_subset branch of the baseline. Simulation records
built_with_reform: one built without a reform keeps every deduction,
since its baseline is its own copy.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Synthetic London couples with two children in childcare, across the
earnings where the cut gave a first award worth less than Tax-Free
Childcare or a deduction took it below, with and without a supplied
deduction rate; plus the forgone and claimed awards, the engine's own
draw, an existing award's deduction, a simulation built without a
reform, and a three-household case through the subset branch.

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

Copy link
Copy Markdown
Collaborator

Review of 2f05622. I traced the policyengine.py routes into the gate, checked the new variables for cycles and for the claim-readers left unguarded, and ran the new tests locally.

Verdict: the fix is right for a reform passed at construction. One finding (1) means the same taper cut still leaves the #2753 household worse off when it reaches policyengine-uk as a simulation modifier.

What I ran

  • uv run pytest policyengine_uk/tests/test_uc_tax_free_childcare_choice.py -p no:xdist: 16 passed (74 s).
  • uv run policyengine-core test on forgoes_universal_credit_for_tax_free_childcare.yaml and tax_free_childcare_eligible_without_universal_credit.yaml: 12 passed.
  • I also ran a script on the PR's own synthetic household (couple_with_childcare(58_000, **DEDUCTION), 2027). It applies the same taper cut in two ways: as a reform dict at construction, and as a parameter change made after the simulation is built.

Findings

  1. Medium: the deduction gate depends on how the reform arrives, and policyengine.py's main run path can arrive the "wrong" way. policyengine_uk/simulation.py:456, uc_award_carries_deductions.py:33.

    • built_with_reform is true only when a scenario or reform= is passed at construction.

    • policyengine.py 6.11.1 passes Microsimulation(dataset=..., reform=reform_dict) (policyengine/tax_benefit_models/uk/model.py:244). build_reform_dict returns None for a Policy with no parameter values (utils/parametric_reforms.py:121-125). A modifier-only policy is then built with reform=None and applied afterwards by _apply_step, so the gate never fires.

    • Same household, same taper cut, 2027-28:

      Route built_with_reform UC before cap Deductions UC paid Change in net income
      Reform dict at construction True £3,152.66 £0 £3,152.66 +£752.66
      Same change after build False £3,152.66 £1,252.28 £1,900.38 −£499.62
    • The docs page ("Awards a reform creates") says the comparison is skipped because it "could only miss changes made after it was built, such as a simulation modifier". That is the case policyengine.py's modifier route produces. The baseline clone is taken at construction, before any modifier runs, so it is already the current-law comparison the gate needs. Comparing would be correct there; it just costs the second UC calculation.

    • Fix: let a post-build change mark the simulation, either a public setter that policyengine.py's _apply_step calls, or pe-uk setting the flag when a scenario's after_data_load modifier or apply_reform runs on a built simulation. Add a test that applies the taper cut as a modifier and expects +£752.66.

    • The Tax-Free Childcare choice doesn't depend on the flag, so only the deduction half is route-dependent.

  2. Low: the current-law baseline moves, and the thread doesn't yet show by how much on the certified file.

    • universal_credit_pre_benefit_cap now drops small current-law awards that are worth less than the top-up. The body says "fewer than 10 sample benefit units" on the Microcosm national file, with no figure for the Enhanced FRS 2024-25 that CI certifies.
    • Aggregate impact is still pending on this head. Before this leaves draft, quote its UC and Tax-Free Childcare caseload and spending moves for 2025-26 to 2031-32. Also say whether any of the families that forgo report UC receipt in the survey, since the model now contradicts reported receipt for them.
  3. Low: there is no test for the route in finding 1. tests/test_uc_tax_free_childcare_choice.py:142 checks only that a simulation built without a reform has built_with_reform false. Add the modifier case from finding 1, so the documented limitation shows as an expected value rather than only as prose.

Checked, no finding

  • No cycle through the comparison. forgoes_universal_credit_for_tax_free_childcare reads tax_free_childcare_without_universal_credit and ..._eligible_without_universal_credit. Those read the family conditions, reported tax credits, legacy_benefits_closed and the UK connection, but no UC amount. disqualifying_benefits holds only WTC, CTC and universal_credit_pre_benefit_cap, so others is empty under current law.
  • Claim-readers. claims_universal_credit is read by esa_income_report_closed, is_CTC_eligible, housing_benefit_eligible and housing_benefit_on_passporting_benefit. All are legacy-award paths, and the forgo excludes families with an open legacy award, so the only reader left exposed is uc_non_dependants_counted, as the body says.
  • Top-up period. tax_free_childcare_eligible_declaration_periods is always eligible × 4, so comparing a whole-year top-up matches the award the family would get.
  • Benefit cap. Comparing before the cap is safe: a family meeting the Tax-Free Childcare work condition (each parent at 16 hours at NLW) also meets the cap's earnings exemption.

@vahid-ahmadi

Copy link
Copy Markdown
Collaborator

Review of 2f056226e (first round from me). Thanks for tracing #2753 so fast.

The diagnosis is right and the legal basis holds. Childcare Payments Act 2014 s.11(1) excludes a family only where UC is payable or a claim subsists, and s.11(3) counts an award reduced to nil, so not claiming is the route out and the pre-cap award is the right thing to test. The reproducer fails on main and passes here. One must before this leaves draft.

  1. must: the forgo test ignores Scottish Child Payment, so it makes some Scottish families worse off under current law. forgoes_universal_credit_for_tax_free_childcare.py:45-58 weighs the top-up against the UC award alone. But is_scp_eligible.py:33 pays SCP on any UC award (universal_credit > 0), with no earnings limit of its own. The body's "Not weighed" list leaves SCP out, and its argument that those schemes' earnings limits sit near or below the TFC floor cannot cover a payment with no limit. Your couple in Scotland (same rent and childcare, 2027, current law):

    Each earns Forgoes UC SCP TFC Net income Net income if they claim
    £43,500 no £2,434 £3,037 £0 £77,203
    £45,000 yes £0 £0 £2,400 £75,701 £77,909 (UC £1,571 + SCP £3,037)
    £46,500 yes £0 £0 £2,400 £77,201 £78,584 (UC £746 + SCP £3,037)

    So the family forgoes £1,571 of UC to gain £2,400 of TFC and loses £3,037 of SCP: £2,208 worse off than claiming, and worse off than at £1,500 less pay. "Net income if they claim" sets the forgo input to false; main (64cf5828e) gives the same £77,909 for the £45,000 case. A real family would claim. Suggest adding the SCP the claim would bring to award before the comparison; to avoid the cycle through universal_credit, build it from is_scp_eligible_child, the region and the SCP rate rather than from scottish_child_payment. A Scottish case in test_uc_tax_free_childcare_choice.py would pin it. Council Tax Reduction where a scheme keys on UC (council_tax_reduction/_legacy.py:17,100,183) is the same shape but smaller; disclosing that is fine.

  2. should: say plainly that no deduction on reform-created awards is an assumption, and that it holds in every year. uc_award_carries_deductions.py:9-23 and the new section in docs/book/validation/uc-deductions.md say a family brought onto UC "has none of [those debts] to repay". For advances that is a fair year-one approximation, as you say. But third-party deductions (SI 2013/380 Sch 6: housing cost arrears, fuel and water among others) apply to any claimant with those debts, and the gate compares the same period every year (:26-50), so a family brought on by a 2027 reform still carries none in 2030. Your UC taper cut from 55% to 50%: about 12,000 households lose despite higher Universal Credit #2753 trace puts it at £36m of £134m of new awards in 2027-28. I would keep the method but reword it as an assumption that slightly raises the cost of reforms that widen UC, so readers of a multi-year score know.

  3. nit: once 1 is fixed, the body's "Not weighed" bullet could say SCP is now weighed, so the list stays complete.

Verdict: not ready: 1 is a must. It is a draft, so no approval either way. 2 is wording only.

What I ran (fresh worktree and uv venv at 2f056226e, Python from the lock, one process, no microsimulation):

  • test_uc_tax_free_childcare_choice.py: 16 passed. The two new YAML files: 12 passed.
  • The reproducer test_taper_cut_leaves_tax_free_childcare_families_no_worse_off on main's code (64cf5828e): 7 of 8 cases fail, as expected.
  • The Scottish table above: household simulations of your couple with region SCOTLAND, earnings from £30,000 to £51,000 each, plus the £45,000 case on main.
  • CI at this head: lint, docs, changelog and smoke imports pass; the Python and YAML shards and Aggregate impact were still running when I looked.

Not checked: the national-file numbers, the run-time figures, and how the gate behaves inside labour-supply branches. I read the diff in full but not every caller of claims_universal_credit.

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

Aggregate impact on certified data: pass

Base 64cf5828ee against head 2f5ced427a, 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: 18 (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
Tax-Free Childcare 2025-26 1,014k 1,043k +29.0k
Tax-Free Childcare 2030-31 1,005k 1,026k +20.8k
Tax-Free Childcare 2029-30 1,008k 1,029k +20.8k
Tax-Free Childcare 2031-32 991k 1,011k +20.4k
Reduce Universal Credit taper rate to 20%: change in universal_credit 2031-32 £22.41bn £22.96bn +£556.9m
Reduce Universal Credit taper rate to 20%: change in universal_credit 2030-31 £22.20bn £22.74bn +£542.0m
Reduce Universal Credit taper rate to 20%: change in universal_credit 2029-30 £21.81bn £22.34bn +£524.4m
Reduce Universal Credit taper rate to 20% 2031-32 £-22.42bn £-22.96bn -£534.1m
Reduce Universal Credit taper rate to 20% 2030-31 £-22.25bn £-22.77bn -£518.8m
Reduce Universal Credit taper rate to 20%: change in universal_credit 2028-29 £21.52bn £22.02bn +£499.6m
Reduce Universal Credit taper rate to 20% 2028-29 £-21.52bn £-22.02bn -£497.4m
Reduce Universal Credit taper rate to 20% 2029-30 £-21.86bn £-22.36bn -£501.7m
Reduce Universal Credit taper rate to 20%: change in universal_credit 2027-28 £21.30bn £21.77bn +£465.9m
Reduce Universal Credit taper rate to 20% 2027-28 £-21.32bn £-21.78bn -£466.1m
Reduce Universal Credit taper rate to 20%: change in universal_credit 2026-27 £20.87bn £21.31bn +£436.5m
Reduce Universal Credit taper rate to 20% 2026-27 £-20.88bn £-21.32bn -£435.2m
Reduce Universal Credit taper rate to 20%: change in universal_credit 2025-26 £20.34bn £20.74bn +£402.1m
Reduce Universal Credit taper rate to 20% 2025-26 £-20.37bn £-20.77bn -£393.6m

Spending by benefit and service

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Universal Credit -£1.0m -£0.1m -£0.1m -£0.2m -£1.6m -£2.0m -£0.4m
Tax-Free Childcare +£8.4m +£1.3m +£0.4m +£2.2m +£22.8m +£23.3m +£22.9m
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
Universal Credit -14.4k -1.8k -333 -1.8k -8.3k -8.3k -7.9k
Tax-Free Childcare +29.0k +2.6k +333 +2.3k +20.8k +20.8k +20.4k
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.4m † +£1.2m † +£0.3m † +£2.0m † +£21.2m † +£21.2m † +£22.5m †
Government balance, each receipt once -£7.4m † -£1.2m † -£0.3m † -£2.0m † -£21.2m † -£21.2m † -£22.5m †

Model totals

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
gov_spending +£7.4m † +£1.2m † +£0.3m † +£2.0m † +£21.2m † +£21.2m † +£22.5m †
household_benefits +£7.4m † +£1.2m † +£0.3m † +£2.0m † +£21.2m † +£21.2m † +£22.5m †
gov_balance -£7.4m † -£1.2m † -£0.3m † -£2.0m † -£21.2m † -£21.2m † -£22.5m †

Household income totals

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Household net income +£7.4m † +£1.2m † +£0.3m † +£2.0m † +£21.2m † +£21.2m † +£22.5m †
Household net income (HBAI definition) +£7.3m +£1.0m +£0.3m +£1.7m +£20.8m +£20.9m +£22.5m

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 2: mean household_net_income per household 0 † +£0.02 † 0 † 0 † 0 † 0 † 0 †
Decile 4: mean household_net_income per household 0 † +£0.02 † 0 † 0 † 0 † 0 † 0 †
Decile 5: mean household_net_income per household -£0.38 † -£0.42 † +£0.00 † +£0.59 † +£0.61 † +£0.61 † +£0.64 †
Decile 6: mean household_net_income per household +£27 † +£0.61 † +£0.34 † +£0.36 † +£0.38 † -£0.39 † -£7.12 †
Decile 7: mean household_net_income per household -£21 † -£0.55 † -£0.58 † -£0.59 † -£0.64 † -£0.03 † +£8.78 †
Decile 8: mean household_net_income per household 0 † 0 † 0 † 0 † +£6.75 † +£6.55 † +£6.93 †

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 -£0.4m -£0.1m -£0.8m -£18.7m +£1.4m +£1.6m +£2.3m
Raise higher rate by 1pp -£0 +£0 -£0 -£19.2m +£1.3m +£1.6m +£1.5m
Raise personal allowance by ~800GBP/year -£0.2m +£40,165 -£0.1m +£1.1m -£1.2m -£1.2m +£20.1m
Raise child benefit by 25GBP/week per additional child -£0 -£0 -£0 +£0 -£1 -£13 -£0
Reduce Universal Credit taper rate to 20% -£393.6m -£435.2m -£466.1m -£497.4m -£501.7m -£518.8m -£534.1m
Raise Class 1 main employee NICs rate to 10% -£0.2m -£0.2m -£20.9m -£16.4m +£3.7m +£4.0m +£3.4m
Raise VAT standard rate by 2pp 0 0 -£0 0 0 -£12 -£23
Raise additional rate by 3pp 0 -£0 -£0 +£0 -£0 suppressed suppressed
Raise the Universal Credit standard allowance by 10% -£1.5m -£4.2m -£25.2m -£18.6m +£1.7m +£2.2m +£1.4m
Raise the State Pension by 10% 0 +£0 -£0 +£0 -£0 -£0 -£0

Standard reforms: change in each reform's target

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Reduce Universal Credit taper rate to 20%: change in universal_credit +£402.1m +£436.5m +£465.9m +£499.6m +£524.4m +£542.0m +£556.9m
Raise additional rate by 3pp: change in income_tax 0 0 0 0 0 suppressed suppressed
Raise the Universal Credit standard allowance by 10%: change in universal_credit +£6.9m +£3.3m +£4.0m -£1.2m -£1.6m -£2.7m -£1.9m

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 fewer than 10 households change 0 0 0 0 0
Decile 3 0 0 0 0 0 0 0
Decile 4 0 fewer than 10 households change 0 0 0 0 0
Decile 5 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 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 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 0 0
Decile 8 0 0 0 0 fewer than 10 households change fewer than 10 households change fewer than 10 households change
Decile 9 0 0 0 0 0 0 0
Decile 10 0 0 0 0 0 0 0
all 0 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
Year People gaining over £1 People losing over £1
2025-26 0.1% 0.0%
2026-27 0.0% 0.0%
2027-28 fewer than 10 households change fewer than 10 households change
2028-29 fewer than 10 households change fewer than 10 households change
2029-30 fewer than 10 households change fewer than 10 households change
2030-31 fewer than 10 households change fewer than 10 households change
2031-32 fewer than 10 households change fewer than 10 households change

No change in any year: receipts by tax head; population; poverty rates; people in poverty.

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,774,885 in total; 2027-28: 76 units below zero, a weighted £-57,687,092 in total
Counted-once check

Each of 91 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 64cf5828ee uk 2.165.0 (files 8c1197397e80), core 3.33.12, py 3.13.18 aarch64 26f24baae8a9 22e0ebaf0971 1861.31s
head #2754 merged into main 2f5ced427a uk 2.165.0 (files b1e23f085205), core 3.33.12, py 3.13.18 aarch64 26f24baae8a9 22e0ebaf0971 1949.94s

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 £334.00bn £349.45bn £365.10bn £383.16bn £397.71bn
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.88bn £266.66bn £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.21bn £2.27bn £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.59bn £26.54bn £26.58bn £26.26bn £25.53bn £24.40bn
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.73bn £129.50bn £132.99bn £136.66bn £140.43bn
Pension Credit £6.66bn £7.03bn £7.30bn £7.51bn £7.65bn £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 £83.04bn £85.11bn £86.31bn £87.90bn £88.58bn
Housing Benefit £8.56bn £8.89bn £9.24bn £9.48bn £9.72bn £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.23bn £5.35bn
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.56bn £0.57bn £0.57bn £0.57bn
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.58bn £0.59bn £0.61bn £0.62bn £0.59bn
Extended childcare entitlement £2.99bn £3.50bn £3.62bn £3.75bn £3.83bn £3.92bn £4.01bn
Universal childcare entitlement £2.06bn £2.22bn £2.29bn £2.38bn £2.44bn £2.51bn £2.56bn
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
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,474k 1,455k 1,453k 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,350k 6,316k 6,298k 6,291k 6,246k
Housing Benefit 1,249k 1,245k 1,246k 1,229k 1,229k 1,229k 1,232k
Council Tax Reduction 3,176k 3,195k 3,200k 3,215k 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,044k 1,046k
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 355k 353k 351k 340k
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,021k 1,024k 1,029k 1,026k 1,011k
Extended childcare entitlement 795k 800k 804k 806k 809k 814k 814k
Universal childcare entitlement 1,071k 1,072k 1,074k 1,076k 1,079k 1,089k 1,090k
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
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 £935.14bn £979.55bn £1,013.85bn £1,052.14bn £1,089.13bn £1,122.37bn
Government spending £529.38bn † £543.55bn † £550.93bn † £559.77bn † £567.54bn † £576.30bn † £584.05bn †
Government balance, each receipt once £362.62bn † £391.59bn † £428.62bn † £454.08bn † £484.59bn † £512.83bn † £538.32bn †
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 £935.14bn £979.55bn £1,013.85bn £1,052.14bn £1,089.13bn £1,122.37bn
household_tax £491.97bn £520.87bn £549.93bn £573.92bn £598.90bn £624.26bn £645.90bn
pre_budget_change_household_tax £484.15bn £512.74bn £541.54bn £564.86bn £589.61bn £614.72bn £636.09bn
gov_spending £529.38bn † £543.55bn † £550.93bn † £559.77bn † £567.54bn † £576.30bn † £584.05bn †
household_benefits £529.38bn † £543.55bn † £550.93bn † £559.77bn † £567.54bn † £576.30bn † £584.05bn †
gov_balance £362.62bn † £391.59bn † £428.62bn † £454.08bn † £484.59bn † £512.83bn † £538.32bn †
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,685.25bn † £1,716.89bn † £1,749.83bn † £1,781.14bn † £1,819.80bn † £1,862.66bn †
Household net income (HBAI definition) £1,449.57bn £1,497.73bn £1,532.81bn £1,567.22bn £1,600.03bn £1,638.06bn £1,679.23bn
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.6% 16.4% 16.3% 16.5% 16.5% 16.6%
Absolute poverty, before housing costs: children 24.7% 22.3% 23.3% 22.9% 23.1% 23.2% 23.4%
Absolute poverty, before housing costs: working-age adults 14.1% 13.9% 14.7% 14.7% 14.8% 14.8% 14.9%
Absolute poverty, before housing costs: pensioners 13.7% 13.5% 14.0% 13.9% 14.0% 13.9% 13.9%
Absolute poverty, after housing costs: everyone 21.6% 21.1% 22.0% 22.5% 22.7% 23.0% 23.3%
Absolute poverty, after housing costs: children 33.3% 31.3% 32.2% 32.4% 32.5% 33.0% 33.9%
Absolute poverty, after housing costs: working-age adults 19.9% 19.9% 20.8% 21.5% 21.8% 22.0% 22.2%
Absolute poverty, after housing costs: pensioners 12.7% 12.6% 13.1% 13.2% 13.3% 13.4% 13.5%
Relative poverty, before housing costs: everyone 17.0% 16.3% 16.4% 16.3% 16.3% 16.3% 16.7%
Relative poverty, before housing costs: children 25.9% 23.4% 23.3% 22.9% 22.8% 22.9% 23.7%
Relative poverty, before housing costs: working-age adults 14.5% 14.3% 14.6% 14.7% 14.7% 14.7% 15.0%
Relative poverty, before housing costs: pensioners 14.5% 14.7% 13.9% 13.9% 13.8% 13.9% 14.0%
Relative poverty, after housing costs: everyone 21.4% 21.0% 21.2% 21.3% 21.3% 21.5% 21.7%
Relative poverty, after housing costs: children 33.1% 31.1% 31.1% 31.0% 31.1% 31.2% 31.7%
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,837k 11,403k 11,358k 11,478k 11,506k 11,643k
Absolute poverty, before housing costs: children 3,688k 3,332k 3,496k 3,437k 3,477k 3,499k 3,545k
Absolute poverty, before housing costs: working-age adults 5,965k 5,921k 6,308k 6,354k 6,417k 6,426k 6,517k
Absolute poverty, before housing costs: pensioners 1,624k 1,584k 1,599k 1,568k 1,583k 1,580k 1,581k
Absolute poverty, after housing costs: everyone 14,944k 14,662k 15,296k 15,679k 15,862k 16,047k 16,331k
Absolute poverty, after housing costs: children 4,975k 4,689k 4,832k 4,863k 4,898k 4,986k 5,125k
Absolute poverty, after housing costs: working-age adults 8,463k 8,491k 8,965k 9,325k 9,464k 9,549k 9,669k
Absolute poverty, after housing costs: pensioners 1,506k 1,482k 1,500k 1,491k 1,500k 1,513k 1,537k
Relative poverty, before housing costs: everyone 11,750k 11,332k 11,389k 11,348k 11,358k 11,410k 11,702k
Relative poverty, before housing costs: children 3,872k 3,504k 3,496k 3,434k 3,431k 3,451k 3,577k
Relative poverty, before housing costs: working-age adults 6,159k 6,103k 6,301k 6,349k 6,363k 6,388k 6,540k
Relative poverty, before housing costs: pensioners 1,720k 1,724k 1,592k 1,565k 1,563k 1,571k 1,585k
Relative poverty, after housing costs: everyone 14,849k 14,583k 14,728k 14,809k 14,885k 15,005k 15,219k
Relative poverty, after housing costs: children 4,942k 4,664k 4,660k 4,663k 4,681k 4,702k 4,798k
Relative poverty, after housing costs: working-age adults 8,426k 8,460k 8,679k 8,821k 8,877k 8,964k 9,056k
Relative poverty, after housing costs: pensioners 1,482k 1,459k 1,389k 1,325k 1,327k 1,340k 1,366k
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.3057 0.3063 0.3062 0.3068 0.3073 0.3089
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,895 † £17,904 † £18,146 † £18,308 † £18,581 † £18,739 †
Decile 2: mean household_net_income per household £27,939 † £28,874 † £28,683 † £29,083 † £29,354 † £29,679 † £30,165 †
Decile 3: mean household_net_income per household £34,320 † £35,455 † £36,108 † £36,626 † £37,218 † £37,722 † £38,220 †
Decile 4: mean household_net_income per household £38,933 † £40,603 † £41,873 † £42,783 † £43,423 † £43,928 † £44,548 †
Decile 5: mean household_net_income per household £43,239 † £45,442 † £45,787 † £46,995 † £47,729 † £48,921 † £50,229 †
Decile 6: mean household_net_income per household £47,927 † £49,126 † £50,887 † £51,728 † £52,601 † £54,202 † £55,188 †
Decile 7: mean household_net_income per household £55,662 † £56,509 † £57,442 † £57,965 † £59,083 † £59,211 † £60,675 †
Decile 8: mean household_net_income per household £68,789 † £70,704 † £71,779 † £73,356 † £73,952 † £75,362 † £77,248 †
Decile 9: mean household_net_income per household £78,890 † £80,992 † £82,907 † £84,246 † £85,584 † £87,169 † £89,597 †
Decile 10: mean household_net_income per household £117,005 † £120,262 † £122,221 † £124,681 † £126,775 † £129,108 † £131,486 †
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.64bn £6.86bn £7.04bn £7.26bn £7.48bn
Raise higher rate by 1pp £3.61bn £3.87bn £4.00bn £4.21bn £4.43bn £4.71bn £4.83bn
Raise personal allowance by ~800GBP/year £-3.80bn £-3.92bn £-3.98bn £-4.09bn £-4.17bn £-4.21bn £-1.94bn
Raise child benefit by 25GBP/week per additional child £-1.99bn £-1.75bn £-1.55bn £-1.39bn £-1.30bn £-1.17bn £-1.06bn
Reduce Universal Credit taper rate to 20% £-20.77bn £-21.32bn £-21.78bn £-22.02bn £-22.36bn £-22.77bn £-22.96bn
Raise Class 1 main employee NICs rate to 10% £10.89bn £11.30bn £11.71bn £12.01bn £12.31bn £12.62bn £13.01bn
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.42bn £3.61bn suppressed suppressed
Raise the Universal Credit standard allowance by 10% £-3.06bn £-3.18bn £-3.27bn £-3.35bn £-3.44bn £-3.48bn £-3.50bn
Raise the State Pension by 10% £-7.78bn £-8.01bn £-7.99bn £-8.14bn £-8.42bn £-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.80bn £7.01bn £7.21bn £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.16bn £-4.25bn £-4.32bn £-4.38bn £-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.77bn £22.02bn £22.34bn £22.74bn £22.96bn
Raise Class 1 main employee NICs rate to 10%: change in national_insurance £11.15bn £11.63bn £12.00bn £12.29bn £12.61bn £12.94bn £13.31bn
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.29bn £3.37bn £3.44bn £3.50bn £3.53bn
Raise the State Pension by 10%: change in state_pension £10.68bn £11.17bn £11.28bn £11.60bn £12.04bn £12.47bn £12.97bn

juaristi22 and others added 2 commits October 30, 2026 11:25
…dcare

In Scotland any Universal Credit award qualifies the children for
Scottish Child Payment, which has no earnings limit. The comparison
weighed the award alone, so a Scottish family could forgo a small award
for Tax-Free Childcare and lose more in the payment (review on #2754).

The payment a claim brings is now added to the award. A family that
could forgo has no other qualifying benefit: the others are legacy
awards, which keep the claim, or Pension Credit, which rules Universal
Credit out. It is built from is_scp_eligible_child, the country,
would_claim_scp and the weekly rate, since scottish_child_payment reads
universal_credit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The deduction gate compared only simulations built with a reform, so the
same taper cut applied as a simulation modifier, as policyengine.py does
for a policy with no parameter values, still took deductions from the
new awards (review on #2754).

Simulation.changed_from_baseline replaces built_with_reform. It is true
for a simulation built with a reform and is set when apply_reform or
drop_computed_arrays runs on a built simulation; policyengine.py's
_apply_step ends every step with drop_computed_arrays. The baseline is
then the copy made at construction, which a later parameter change does
not reach. A bare set_input still does not count, so a current-law run
does not work out Universal Credit twice.

The gate's documentation and the docs page now state the rule as an
assumption that holds in every year and slightly raises the cost of
reforms that widen Universal Credit. Tests cover the modifier and
apply_reform routes and the Scottish Child Payment comparison.

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

Copy link
Copy Markdown
Collaborator Author

Thanks, Vahid. Both reviews are addressed in eda8136 (Scottish Child Payment) and 2af61e7 (the modifier route, the wording and the tests).

Must 1: Scottish Child Payment. Done as you suggested. The comparison now adds the Scottish Child Payment a claim brings to the award. It's built from is_scp_eligible_child, the country, would_claim_scp and the weekly rate, so it doesn't go through universal_credit.

  • Why the whole payment counts. A family that could forgo has no other qualifying benefit: the others are legacy awards, which keep the claim, or Pension Credit, which rules UC out. So the claim brings the family's whole payment.
  • Your £45,000 case. The couple now claims: £1,571 of UC and £3,037 of the payment, against £2,400 of Tax-Free Childcare. A test pins it, along with the same family forgoing the award when the payment isn't claimed.
  • Council Tax Reduction. Where a scheme keys on UC, it's now named in the body's "Not weighed" list.

Should 2: an assumption. Reworded in the variable's documentation and in the docs page section:

  • it holds in every year compared;
  • third-party deductions (SI 2013/380 Sch 6) and overpayment recovery apply to any claimant with those debts;
  • so it slightly raises the cost of reforms that widen UC.

The aggregate-impact run at 2f05622 puts that at £0.39bn to £0.53bn a year more for the standard cut of the taper to 20%, about 2%.

Nit 3. The "Not weighed" list now says Scottish Child Payment is weighed.

Finding 1: the modifier route. built_with_reform is now changed_from_baseline. It's true for a simulation built with a reform, and it's set when apply_reform or drop_computed_arrays runs on a built simulation.

  • policyengine.py needs no change. Its _apply_step ends every modifier step with drop_computed_arrays, so a policy with only a simulation modifier is compared with the copy made at construction, which the modifier's parameter change doesn't reach.
  • A bare set_input still doesn't count. The docs say so and a test pins it, so a plain current-law run doesn't work out UC twice.

Finding 3: tests. Your modifier case is a test now: the taper cut applied after the build, then drop_computed_arrays, gives +£752.66. There's also an apply_reform case.

Finding 2: current-law moves. On the certified Enhanced FRS, the aggregate-impact run at 2f05622 shows the current-law change for 2025-26 to 2031-32:

  • Tax-Free Childcare: caseload up by 0.3k to 29.0k, spending up by £0.4m to £23.9m a year.
  • UC: caseload down by 0.3k to 14.4k, spending down by £0.1m to £2.1m.
  • Scottish Child Payment: down by up to £1.2m a year from 2029-30. That was this SCP gap, so it should go at the new head, whose run will replace these figures.

Still running. Two checks are queued behind another job on the shared machine; I'll post them here when they finish:

  • whether any family that forgoes reports UC receipt in the survey, on the certified Enhanced FRS and the Microcosm file;
  • the national-file rerun at this head (taper-cut losers, cost and run time).

@vahid-ahmadi

Copy link
Copy Markdown
Collaborator

Round 1 went up twice by mistake; this round covers both.

Review of 2af61e727, round 2

Thanks, María. Every round-1 point is addressed, and I checked each fix by running it. One new should, on the new design itself.

Status of round-1 findings

  • Must 1 (SCP): fixed. forgoes_universal_credit_for_tax_free_childcare.py:64-81. The Scottish couple at 2027:

    Each earns Forgoes UC SCP TFC Net income
    £43,500 no £2,434 £3,037 £0 £77,203
    £45,000 no £1,571 £3,037 £0 £77,909
    £46,500 no £746 £3,037 £0 £78,584

    Net income now rises at every step from £30,000 to £51,000 (steps of £1,500). The SCP built inside the comparison matches scottish_child_payment exactly for children aged 3 and 6 (£3,036.80), 15 and 16 (£1,518.40) and 0 and 17 (£1,518.40): same rate (£29.20 a week × WEEKS_IN_YEAR), same max_age through is_scp_eligible_child, same would_claim_scp, same yearly period. Leaving out scp_available doesn't matter, since a nil rate gives nil. No cycle: it reads age, country and would_claim_scp, not universal_credit.

  • Medium 1 (modifier route): fixed. I read policyengine.py 6.11.1, the latest release, from its wheel: _apply_step (tax_benefit_models/uk/model.py:319-339) runs each step in try and calls microsim.drop_computed_arrays() in finally, for the policy modifier, the late dynamic values and the dynamic modifier. Its modifier (utils/parametric_reforms.py:90-102) only calls Parameter.update, and the baseline copy has its own tax-benefit system and parameter tree (I checked: not the same objects), so the change doesn't reach it. Doing exactly that on your £58,000 household: changed_from_baseline true, deductions £0, UC £3,152.66, +£752.66. One note: policyengine.py 6.11.1 pins policyengine-uk==2.151.0, so it gets this only once its pin moves.

  • Low 2 (baseline moves): answered, with the run at 2f056226e. The run at this head is still pending and should clear the SCP lines. The survey-receipt check is still running on your side.

  • Low 3 (test): fixed. test_uc_tax_free_childcare_choice.py:159 (modifier) and :175 (apply_reform).

  • Should 2 (assumption): fixed. The wording in uc_award_carries_deductions.py:9-28 and docs/book/validation/uc-deductions.md:54-64 says what I asked: an assumption, in every year, Sch 6 and overpayments.

  • Nit 3: fixed in the body.

New

  1. should: drop_computed_arrays after a set_input on a current-law simulation now drops deductions, against a stale baseline. simulation.py:556-564. The flag is set by any drop on a built simulation, not only by one that follows a policy change. But the baseline is the copy made at construction, with the old inputs. Your £58,000 couple with the 15% deduction, current law, earnings then set to £40,000 each:

    changed_from_baseline UC before cap Deductions UC paid
    set_input only false £12,063.67 £1,252.28 £10,811.39
    set_input, then drop_computed_arrays() true £12,063.67 £0 £12,063.67
    Built at £40,000 false £12,063.67 £1,252.28 £10,811.39

    So the same current-law household gets £1,252 more depending on whether the caller cleared the cache. That isn't a route the main runs take: in pe-uk the only other caller is the pension credit branch (pension_credit_earnings_income_tax.py:28), which sets the flag on a branch it then deletes (the parent stays false; I checked), and policyengine.py drops only in _apply_step. But drop_computed_arrays is a public core method, and core recommends it after any parameter edit and uses it itself in derivative(). Two options: (a) set the flag only when the parameters or the system differ from the baseline's, or (b) keep the design and say it in the docs, next to "A set_input alone does not count" (uc-deductions.md:75): "a set_input followed by drop_computed_arrays counts, and the baseline keeps the old inputs". Either way, a test of the case above would pin it. I'd take (b) for this PR.

  2. nit: give the number for the assumption, and attribute it carefully. uc-deductions.md:63 and uc_award_carries_deductions.py:20 say the assumption "slightly" raises the cost. The body's £0.39bn to £0.53bn a year matches the bot's costing row for the 20% taper (−£393.6m in 2025-26 to −£534.3m in 2031-32), which is 1.9% to 2.4% of the base cost, so "about 2%" is fair. But that row is base against head for the whole PR, so it is the Tax-Free Childcare choice and the no-deduction assumption together, not the assumption alone. I'd quote it as that, e.g. "about £0.4bn to £0.5bn a year (about 2%) for the standard cut of the taper to 20%, with both changes in this PR", and refresh it from this head's run. £0.5bn a year is worth stating rather than calling "slight".

Verdict: ready from my side once the checks at this head are green; neither point above blocks. It's still a draft, so no approval either way.

What I ran (fresh clone and uv venv at 2af61e727, one process, household simulations only):

  • test_uc_tax_free_childcare_choice.py -p no:xdist: 20 passed (58 s).
  • policyengine-core test on the two new YAML files: 12 passed.
  • A script for the Scottish table (£30,000 to £51,000), the SCP match at three pairs of child ages, the modifier route as _apply_step runs it, the pension credit branch, and the set_input plus drop case.
  • CI at this head: lint, docs, changelog, fix evidence and smoke imports pass; the Python and YAML shards and Aggregate impact were pending when I looked.

Not checked: the national-file and survey-receipt checks you're running, and the run-time cost of the second UC calculation on modifier routes.

🤖 Generated with Claude Code

@juaristi22

Copy link
Copy Markdown
Collaborator Author

Follow-up on the two checks above, at 2af61e7.

Reform-route tests. All passed locally: 404 passed, 1 skipped (the data test that needs credentials). The files cover modifiers, construction wrappers, reform representations, the drop_computed_arrays callers, deductions, household subsets and labour supply baselines.

The taper cut at this head. No household loses in 2027-28, on either the certified Enhanced FRS or the Microcosm national file.

  • Cost: on the Microcosm file the cut still costs £1.81bn (£1.77bn on main).
  • Run time: current-law household net income takes 10.9 s (9.0 s on main), and a reform run 24.0 s (21.0 s on main). The machine was shared with another build, so read a second either way as noise.

Reported receipt. Yes, a few families that forgo report UC receipt in the survey.

  • Certified Enhanced FRS: 12 sample benefit units forgo in 2025-26, and fewer than 10 of them report UC. In 2027-28, 2029-30 and 2031-32, fewer than 10 forgo.
  • Microcosm file: fewer than 10 forgo in each of those years.

So for a handful of families the model now prefers Tax-Free Childcare where the survey records a claim. I've left that as it is. Making a family that reports UC keep its claim would bring the #2753 cliff back for one with no modelled award at baseline: it would lose Tax-Free Childcare as soon as a reform gave it an award.

The aggregate-impact run at this head will replace the current-law figures in my reply when it posts.

@juaristi22
juaristi22 marked this pull request as ready for review October 30, 2026 12:04
@juaristi22
juaristi22 enabled auto-merge October 30, 2026 12:04
@juaristi22
juaristi22 added this pull request to the merge queue Oct 30, 2026
Merged via the queue into main with commit ab4f8ec Oct 30, 2026
23 checks passed
@juaristi22
juaristi22 deleted the uc-taper-tfc-choice-2753 branch October 30, 2026 13:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants