Skip to content

Model the ISA subscription limits, with per-person ISA subscriptions and balances - #2712

Merged
juaristi22 merged 11 commits into
mainfrom
isa-subscription-limits-2710
Oct 28, 2026
Merged

juaristi22 merged 11 commits into
mainfrom
isa-subscription-limits-2710

Conversation

@juaristi22

@juaristi22 juaristi22 commented Oct 28, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #2710

What and why

policyengine-uk had no ISA subscription limits and no subscription inputs, so a change to an ISA limit left every household unchanged. This PR adds:

  • the limits;
  • per-person subscription inputs, and the amounts a limit leaves out;
  • per-person cash and stocks-and-shares ISA balances;
  • the 20% Lifetime ISA charge for home purchases above the price cap.

It follows the Budget 2026 update on the issue. Current law keeps the £20,000 cash limit, and the model reports the amount above each limit and no more (option (b)).

There are eleven commits:

  • the first four are the PR as opened;
  • the next three apply the Budget 2026 update, and the opt-in response added in d29cc81 is removed again in 677d767;
  • 18aa2a4 adds guidance from Vahid's review of microcosm#1415;
  • 1915a91, 52b09bc and 04895b0 address Pavel's review.

Subscription limits (5aaf6da, 677d767)

  • gov.hmrc.isa.annual_subscription_limit: £20,000 from 6 April 2017 (ISA Regulations 1998 reg 4ZA(1), sum substituted by SI 2017/186 reg 5).
  • gov.hmrc.isa.cash.subscription_limit: no limit of its own (.inf). Cash has had none since SI 2014/1450 omitted reg 4ZA(1)(a) and (b) on 1 July 2014.
    • SI 2026/1018 reg 6 sets £12,000 from 6 April 2027 for people "64 or under at the end of that year".
    • Budget 2026 will "retain the cash ISA limit at £20,000 for all savers over 18 years old from April 2027", by legislation in November 2026 (OOTLAR para 2.5).
    • So the £12,000 is a reform setting, not a baseline step.
  • gov.hmrc.isa.cash.full_limit_age: 65. cash_isa_subscription_limit reads the age at the end of the year (5 April) from the date of birth (birth_day). So a person aged 64 on 6 October whose 65th birthday falls by 5 April has the annual limit. The age matters only when a reform sets a cash limit.
  • New Person inputs cash_isa_subscriptions and stocks_and_shares_isa_subscriptions: new money paid in during the tax year.
    • They exclude transfers between ISAs, interest and growth, and flexible-ISA replacements (HMRC guidance).
    • They are not uprated, since the limits are fixed in cash terms.
  • isa_subscriptions adds them to lifetime_isa_payments. That input includes transfers into a Lifetime ISA, which count towards the £4,000 limit but not the annual one, so the total is too high where it includes them. The variable's documentation says so.
  • cash_isa_subscriptions_above_limit and isa_subscriptions_above_limit: how far the inputs exceed the limits in force.
    • Cash above both limits counts in both, so the two must not be added.
    • They change no tax. The model is static by year and the data has no ISA history, so it holds no balances moved out of ISAs in earlier years.
    • A population run gives the first year's amount above a limit. The tax on money moved out of ISAs over several years rests on the official costing.
  • New isa_subscription_limits entry in programs.yaml.

Per-person cash and stocks-and-shares ISA balances (3d5e7cc)

  • New Person inputs cash_isa_balance and stocks_and_shares_isa_balance, uprated with savings and corporate_wealth.
  • Household cash_isa and stocks_and_shares_isa now sum them, as household_lifetime_isa_balance sums lifetime_isa_balance.
    • They stay in uprating_indices.yaml, so a dataset that stores only the household totals (all of Microcosm's today) keeps them, projected as before.
    • The person inputs stay at zero until Microcosm exports them.
  • Behaviour change: Core does not allow a sum and an uprating on one variable. So a household total given in a situation for one year no longer carries into later years; the person balances carry the uprating instead. test_wealth_components.py now checks the uprating on the summed inputs.
  • The means tests still read the household totals, so a person's balance is pooled with the household's other capital, as before. Attributing it to the holder's benefit unit, as Count Lifetime ISAs as means-tested capital of the holder's benefit unit #1983 did for the Lifetime ISA, is left for later.

Lifetime ISA charge for homes above the price cap (da16986)

  • SI 2026/1130 was made on 27 October, laid on 28 October and is in force from 29 October 2026. It substitutes Schedule paragraph 5 and inserts paragraph 6A.
    • A withdrawal that would be a first-time residential purchase "but for the fact that the requirement in paragraph 6(3) is not met" (the £450,000 cap) pays 20%.
    • Other withdrawals that aren't exempt pay 25% (OOTLAR para 2.4).
  • New gov.hmrc.isa.lifetime.above_cap_purchase.in_effect (from 29 October 2026) and .withdrawal_charge (0.2). lifetime_isa_withdrawal_charge charges the home payment of such a purchase at 20% and the rest of the withdrawal at withdrawal_charge.
  • Timing: parameters are read on 30 April, so the model applies 20% from fiscal 2027-28. A withdrawal from 29 October 2026 to 5 April 2027 pays 25% in the model. The parameter documentation says so. Review kept this as the repo's convention. The withdrawal charge's docstring and the assumptions page's annual resolution section record the caveat (04895b0).
  • Paragraph 10A restores the charge when such a purchase fails and the money is returned, so a returned withdrawal is left out of the inputs.
  • lifetime_isa_withdrawals_towards_first_home now says to include a purchase above the cap.

Review fixes (1915a91, 52b09bc, 04895b0)

  • The annual limit carries its earlier sums: £15,000 from 1 July 2014 (SI 2014/1450 reg 6(a)(i)) and £15,240 from 6 April 2015 (SI 2015/608 reg 3(1)). 2015-16 and 2016-17 now read £15,240.
    • The fiscal-year conversion writes annual values from 2015, so 2014-15 and earlier are not read. verified_start_year is 2015.
  • The cash limit's .inf starts on 1 July 2014, citing SI 2014/1450 reg 6(a)(ii). A comment links Update the ISA cash limit and the non-cash ISA charge when the November 2026 ISA instrument is laid #2728, which tracks the November instrument.
  • The subscription inputs:
    • give the real reason they are held flat in projection: growing them would put people who pay in exactly the limit above it;
    • say this understates a lowered limit's excess in later years;
    • count subscriptions net of current-year flexible-ISA withdrawals, and exclude what regulation 5D disregards.
  • lifetime_isa_payments excludes paragraph 10A charge repayments.
  • SI 2026/1130 reg 5 is now the first reference for the above-cap charge.
  • The duplicate ISA entries in the uprating map are removed.

Documentation (020f230, 00adbd1, 18aa2a4)

  • docs/book/assumptions/isa-inputs-and-capital-flows.md:
    • a subscription limits section;
    • the per-person balances, under capital stocks;
    • the above-cap charge, under Lifetime ISA withdrawals.
  • docs/engineering/skills/dataset-sources.md: how producers should export the balances and subscriptions, pointing to UK: impute ISA subscriptions per adult by type, calibrated to HMRC's ISA tables microcosm#1415.
    • It asks for the three subscription inputs to be drawn jointly, so no one is above the shared £20,000 limit in the baseline (Vahid's finding 5).
    • The subscription inputs say they sum over all of a person's accounts of a type.
  • docs/book/assumptions/growthfactors.md lists the new balances.

Not in this PR

Downstream

Apps that list input variables will show cash_isa_balance and stocks_and_shares_isa_balance as person inputs. The household cash_isa and stocks_and_shares_isa are now computed, but still accept a direct input.

Test plan

  • isa_subscription_limits.yaml (10 cases):
    • the £15,240 annual limit in 2015-16 and 2016-17, for cash too;
    • no cash limit of its own in 2026-27 or 2027-28, at and £1 above the annual limit;
    • cash, stocks and shares and Lifetime ISA payments sharing the annual limit;
    • under a £12,000 cash limit as a reform:
      • exactly at and £1 above it;
      • ages 64 and 65 at the end of the year;
      • 65th birthdays on 5 and 6 April 2028;
      • cash above both limits;
    • a £15,000 annual limit.
  • lifetime_isa_withdrawal_charge.yaml, 4 new cases:
    • £450,000, £450,001 and £600,000 in 2027-28, plus age 60 exempt;
    • 2026-27 still at 25%;
    • a purchase above the cap failing another condition;
    • a withdrawal only part of which, or none, is paid towards the home.
  • household/wealth/isa_balances.yaml, a cash_isa_capital.yaml case, and test_isa_balances.py:
    • household totals sum the balances, and a direct household input takes precedence;
    • a person's balance reaches Universal Credit and Housing Benefit capital;
    • a dataset storing only the totals keeps them, projected with savings;
    • balances sum to the totals in 2025 and 2027.
  • Run locally on this PR's files, rebased onto main a7f6bbe, all passing:
    • the ISA YAML folder (30; 32 at 1915a91 with the earlier-limit cases);
    • the balance and cash ISA capital YAML (10);
    • test_isa_balances.py, test_wealth_components.py and code_health/test_uprating_declarations.py (13);
    • test_isa_accounting.py with the parameter, registry, variable and changelog checks (247);
    • ruff format --check and ruff check on the whole repository.
  • Run before the Budget update, with no code they cover changed since: the income tax YAML folder (398), code_health/ with test_build_metadata.py and test_parameter_cache_apis.py (3,070 passed, 1 skipped), and the ISA income and capital share tests.
  • Not run locally: the full Python suite and the microsimulation tests, which CI runs. No population run, since subscriptions are zero in current data.
  • Changelog fragments: changelog.d/2710.added.md, changelog.d/2710.changed.md and changelog.d/2710-lisa-above-cap.added.md.

axiom: TheAxiomFoundation/rulespec-uk#487 queued (extension: ISA Regulations 1998 reg 4ZA(1) and (1ZA); follow-up: (1ZA) held for the November instrument, and SI 2026/1130 Schedule paragraphs 5, 6A and 10A; addendum: reg 4ZA(1)'s earlier sums). The reporting variables carry no law of their own.

🤖 Generated with Claude Code

juaristi22 and others added 4 commits October 28, 2026 13:56
Add gov.hmrc.isa.annual_subscription_limit (£20,000, reg 4ZA(1)),
gov.hmrc.isa.cash.subscription_limit (no limit of its own until 6 April
2027, then £12,000 under reg 4ZA(1ZA)) and gov.hmrc.isa.cash.full_limit_age
(65 at the end of the tax year, from the date of birth).

Add per-person cash_isa_subscriptions and stocks_and_shares_isa_subscriptions
inputs, isa_subscriptions (with lifetime_isa_payments), the person's
cash_isa_subscription_limit, and cash_isa_subscriptions_above_limit and
isa_subscriptions_above_limit. Inputs are not capped, so data collected
under a higher limit shows what a lower one leaves out.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
gov.contrib.behavioral_responses.cash_isa_excess splits cash ISA
subscriptions above the person's cash limit between stocks-and-shares ISAs
(within the room the annual limit leaves), taxable savings and other uses,
with an interest rate for the taxable part (default: Bank of England
effective rate on individuals' outstanding time deposits, June 2026).
Both shares default to zero, so no result moves until a reform sets them.

cash_isa_excess_savings_interest enters taxable_savings_interest_income
and not income: the interest is earned either way, so a cash limit changes
tax, not gross income. Shares that are negative or sum above one raise.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add person inputs cash_isa_balance and stocks_and_shares_isa_balance, uprated
with savings and corporate_wealth, and make the household cash_isa and
stocks_and_shares_isa their sums, as household_lifetime_isa_balance sums
lifetime_isa_balance. The household totals stay in uprating_indices.yaml, so
datasets that store only the totals keep them, projected as before, until
Microcosm exports the person balances.

Core does not combine a sum with uprating, so a household total given in a
situation for one year no longer carries into later years; the person
balances carry the uprating instead. test_wealth_components now checks the
class uprating on the summed inputs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The ISA assumptions page gains a subscription limits section (inputs, the
age test, the two excesses and how a reform scores, the opt-in response and
its static-model limits) and describes the per-person balances under
capital stocks. The dataset-sources guide tells producers how to export the
balances and subscriptions; the growth factor list names the new balances.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
juaristi22 and others added 3 commits October 28, 2026 14:53
Budget 2026 retains the £20,000 cash ISA limit from April 2027 (OOTLAR
para 2.5, legislation in November 2026), so
gov.hmrc.isa.cash.subscription_limit no longer steps to £12,000. SI
2026/1018 reg 6's limit for people 64 or under becomes a reform setting,
kept as a lever with the full-limit age; the limit tests run it as one.

Section 4 of #2710 is decided as option (b): the model reports the amounts
above each limit and no more. Remove the opt-in
gov.contrib.behavioral_responses.cash_isa_excess block, its three
variables and tests, and its term in taxable_savings_interest_income.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SI 2026/1130 substitutes Schedule paragraph 5 and inserts paragraph 6A:
from 29 October 2026, a withdrawal that would be a first-time residential
purchase but for the £450,000 price cap in paragraph 6(3) pays 20%, and
other withdrawals that are not exempt still pay 25%.

Add gov.hmrc.isa.lifetime.above_cap_purchase (in_effect from 29 October
2026, withdrawal_charge 0.2). lifetime_isa_withdrawal_charge charges the
home payment of such a purchase at that rate and the rest at
withdrawal_charge. Parameters are read on 30 April, so the model applies
the rate from fiscal 2027-28; the parameter documentation says so.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The subscription limits section now says cash has no limit of its own,
with £12,000 as a reform setting, and that the model reports the amounts
above each limit and no more, without the opt-in response. The Lifetime
ISA section describes the 20% charge above the price cap and its
fiscal-year timing, the coverage note names the First Time Buyer ISA, and
the dataset-sources guide points producers to microcosm#1415.

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

github-actions Bot commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

Aggregate impact on certified data: pass

Base b090ec6277 against head c323276dcf, both on enhanced_frs_2024_25.h5 (policyengine-uk-data 1.58.1, sha256 056e80fd8e91), fiscal years 2025-26 to 2031-32. Each year is a full microsimulation run on each side.

Checks: 0 broken by this change, 1 failing on both sides, 0 fixed. Moves flagged for review: 0 (thresholds in report_spec.yaml; a flag does not fail the job).

Workflow run and full report

Notes

  • In the years a figure from fewer than 10 records is suppressed (spending.disabled_students_allowance), every total containing it, and the decile incomes, are rebuilt from their other components, so no published total includes it. Those totals are marked †. A change is withheld where the two sides leave out different figures and can't be lined up.

Moves flagged for review

None.

Spending by benefit and service

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed

Caseloads

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed

Standard reform costings (change in gov_balance)

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise additional rate by 3pp 0 0 0 0 0 suppressed suppressed

Standard reforms: change in each reform's target

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise additional rate by 3pp: change in income_tax 0 0 0 0 0 suppressed suppressed

Household net income by decile

No household's net income changes in any year.

No change in any year: receipts by tax head; government balance, each component counted once; model totals; household income totals; population; poverty rates; people in poverty; inequality; mean household net income in each side's own deciles.

Checks failing on both base and head (1)
  • VAT excluding private school fees is never negative (sign:vat): 2025-26: 76 units below zero, a weighted £-53,889,156 in total; 2026-27: 76 units below zero, a weighted £-55,420,387 in total; 2027-28: 76 units below zero, a weighted £-56,618,038 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 b090ec6277 uk 2.163.2 (files 361d4f9ceaf6), core 3.33.12, py 3.13.18 aarch64 b0a4790c3b8d 1eac2ca06b91 1874.19s
head #2712 merged into main c323276dcf uk 2.163.2 (files 6e91d97dc6a2), core 3.33.12, py 3.13.18 aarch64 b0a4790c3b8d 1eac2ca06b91 1873.5s

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 £298.70bn £318.31bn £335.60bn £350.52bn £365.79bn £383.53bn £401.03bn
National Insurance (employee and self-employed) £52.37bn £54.71bn £56.48bn £58.15bn £60.22bn £62.11bn £64.44bn
National Insurance (employer) £150.59bn £156.99bn £161.74bn £166.13bn £173.24bn £178.59bn £185.29bn
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.61bn £13.05bn £13.53bn £14.02bn £14.52bn £15.05bn £15.58bn
Student loan repayments £7.91bn £8.21bn £8.43bn £8.63bn £8.85bn £9.10bn £9.42bn
VAT excluding private school fees £249.37bn £255.28bn £261.81bn £267.87bn £274.12bn £280.56bn £286.81bn
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.00bn £2.05bn £2.10bn £2.21bn £2.21bn £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.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
Betting and gaming duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
TV licence fee £4.26bn £4.41bn £4.42bn £4.44bn £4.45bn £4.47bn £4.48bn
Council tax £49.21bn £51.88bn £54.97bn £58.29bn £61.55bn £64.92bn £68.49bn
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 £38.04bn £38.88bn £39.76bn £43.07bn £43.13bn £44.57bn
Stamp duty land tax on the household's own purchases £6.90bn £7.39bn £7.81bn £8.21bn £8.62bn £9.02bn £9.42bn
Stamp duty land tax paid by companies £4.81bn £5.98bn £6.73bn £7.46bn £8.21bn £8.87bn £9.16bn
Land transaction tax (Wales) £0.07bn £0.08bn £0.09bn £0.09bn £0.10bn £0.10bn £0.11bn
Land and buildings transaction tax (Scotland) £0.31bn £0.32bn £0.34bn £0.35bn £0.37bn £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.64bn £126.07bn £127.08bn £128.87bn £132.52bn £136.31bn £140.08bn
Pension Credit £6.66bn £7.04bn £7.32bn £7.46bn £7.60bn £7.77bn £7.94bn
Winter Fuel Payment £1.86bn £1.86bn £1.80bn £1.78bn £1.79bn £1.79bn £1.80bn
Pension Age Winter Heating Payment (Scotland) £0.19bn £0.20bn £0.20bn £0.21bn £0.21bn £0.22bn £0.22bn
Universal Credit £75.21bn £80.38bn £82.93bn £84.23bn £85.58bn £86.87bn £87.97bn
Housing Benefit £8.55bn £8.89bn £9.17bn £9.31bn £9.58bn £9.84bn £10.10bn
Council Tax Reduction £2.07bn £2.18bn £2.32bn £2.46bn £2.60bn £2.74bn £2.89bn
Employment and Support Allowance (income-related) £0.79bn £0.81bn £0.83bn £0.85bn £0.86bn £0.89bn £0.90bn
Employment and Support Allowance (contribution-based) £5.20bn £5.34bn £5.46bn £5.59bn £5.72bn £5.85bn £5.99bn
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.32bn £0.33bn
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.94bn £28.06bn £29.13bn £29.83bn £30.54bn £31.26bn £31.96bn
Disability Living Allowance £7.49bn £7.80bn £8.10bn £8.29bn £8.49bn £8.69bn £8.88bn
Attendance Allowance £8.68bn £9.04bn £9.38bn £9.61bn £9.83bn £10.07bn £10.29bn
Carer's Allowance £4.48bn £4.67bn £4.84bn £4.96bn £5.08bn £5.19bn £5.31bn
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.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.50bn £0.52bn £0.53bn £0.54bn £0.55bn £0.57bn £0.58bn
Armed Forces Compensation Scheme £0.61bn £0.62bn £0.64bn £0.65bn £0.67bn £0.68bn £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.16bn £16.83bn £17.43bn £17.85bn £18.26bn £18.69bn £19.10bn
Scottish Child Payment £0.49bn £0.52bn £0.54bn £0.55bn £0.56bn £0.57bn £0.56bn
Two Child Limit Payment (Scotland, counterfactual) £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Healthy Start vouchers £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn
Maternity Allowance £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Statutory Maternity Pay £3.30bn £3.39bn £3.47bn £3.55bn £3.63bn £3.72bn £3.80bn
Statutory Paternity Pay £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Statutory Sick Pay £1.12bn £1.15bn £1.18bn £1.21bn £1.24bn £1.27bn £1.29bn
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.73bn £0.75bn £0.77bn
Widowed Parent's Allowance £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Tax-Free Childcare £0.55bn £0.56bn £0.57bn £0.58bn £0.59bn £0.61bn £0.59bn
Extended childcare entitlement £2.99bn £3.50bn £3.60bn £3.67bn £3.77bn £3.85bn £3.94bn
Universal childcare entitlement £2.05bn £2.23bn £2.28bn £2.34bn £2.40bn £2.47bn £2.52bn
Targeted childcare entitlement £0.50bn £0.51bn £0.52bn £0.53bn £0.54bn £0.56bn £0.52bn
Childcare Offer for Wales £0.26bn £0.28bn £0.28bn £0.29bn £0.30bn £0.30bn £0.31bn
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.83bn £204.54bn £205.13bn £205.79bn £206.49bn £207.23bn £207.73bn
State education spending £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn
Transport subsidy spending £25.05bn £25.13bn £25.21bn £25.29bn £25.37bn £25.46bn £25.53bn
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,261k 11,158k 10,849k 10,746k 10,783k 10,822k 10,848k
Pension Credit 1,485k 1,483k 1,480k 1,461k 1,462k 1,464k 1,460k
Winter Fuel Payment 7,842k 7,793k 7,494k 7,407k 7,432k 7,459k 7,477k
Pension Age Winter Heating Payment (Scotland) 803k 803k 803k 800k 803k 806k 808k
Universal Credit 6,334k 6,341k 6,366k 6,347k 6,345k 6,333k 6,298k
Housing Benefit 1,249k 1,247k 1,250k 1,234k 1,238k 1,240k 1,239k
Council Tax Reduction 3,175k 3,198k 3,209k 3,229k 3,244k 3,257k 3,264k
Employment and Support Allowance (income-related) 71k 71k 71k 71k 71k 72k 72k
Employment and Support Allowance (contribution-based) 719k 721k 723k 726k 728k 731k 732k
Jobseeker's Allowance (income-based) 0k 0k 0k 0k 0k 0k 0k
Jobseeker's Allowance (contribution-based) 67k 67k 67k 68k 68k 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,566k 3,579k 3,589k 3,601k 3,613k 3,626k 3,635k
Disability Living Allowance 1,291k 1,295k 1,299k 1,303k 1,308k 1,312k 1,316k
Attendance Allowance 1,694k 1,700k 1,705k 1,711k 1,716k 1,723k 1,727k
Carer's Allowance 1,034k 1,038k 1,041k 1,044k 1,048k 1,051k 1,053k
Carer Support Payment (Scotland) 71k 71k 72k 72k 72k 72k 73k
Carer's Allowance Supplement (Scotland) 0k 71k 72k 72k 72k 72k 73k
Severe Disablement Allowance 4k 4k 4k 4k 4k 4k 4k
Industrial Injuries Disablement Benefit 137k 137k 138k 138k 139k 139k 140k
Armed Forces Compensation Scheme 93k 93k 94k 94k 94k 95k 95k
War Widow's or Widower's Pension 0k 0k 0k 0k 0k 0k 0k
Child Benefit 8,102k 8,128k 8,142k 8,165k 8,191k 8,216k 8,232k
Scottish Child Payment 350k 352k 353k 357k 354k 355k 342k
Two Child Limit Payment (Scotland, counterfactual) 0k 0k 0k 0k 0k 0k 0k
Healthy Start vouchers 199k 200k 201k 201k 202k 203k 203k
Maternity Allowance 0k 0k 0k 0k 0k 0k 0k
Statutory Maternity Pay 332k 334k 335k 336k 337k 338k 339k
Statutory Paternity Pay 0k 0k 0k 0k 0k 0k 0k
Statutory Sick Pay 181k 182k 182k 183k 183k 184k 185k
Sure Start Maternity Grant 26k 26k 26k 26k 26k 27k 27k
Bereavement Support Payment 98k 98k 98k 99k 99k 99k 100k
Widowed Parent's Allowance 0k 0k 0k 0k 0k 0k 0k
Tax-Free Childcare 1,014k 1,024k 1,024k 1,027k 1,027k 1,031k 1,013k
Extended childcare entitlement 796k 801k 806k 809k 815k 819k 820k
Universal childcare entitlement 1,071k 1,074k 1,077k 1,080k 1,086k 1,096k 1,097k
Targeted childcare entitlement 165k 156k 154k 155k 155k 156k 144k
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 99k 99k 99k 100k 100k
Adult Dependants' Grant 18k 18k 12k 12k 12k 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 £898.82bn £941.86bn £980.11bn £1,013.84bn £1,052.89bn £1,089.01bn £1,129.10bn
Government spending £528.95bn † £543.83bn † £551.68bn † £558.06bn † £566.57bn † £575.31bn † £583.38bn †
Government balance, each receipt once £369.87bn † £398.03bn † £428.43bn † £455.77bn † £486.32bn † £513.70bn † £545.72bn †
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 £898.82bn £941.86bn £980.11bn £1,013.84bn £1,052.89bn £1,089.01bn £1,129.10bn
household_tax £496.91bn £527.60bn £554.51bn £577.74bn £603.32bn £627.65bn £654.69bn
pre_budget_change_household_tax £489.00bn £519.39bn £546.08bn £568.63bn £593.98bn £618.05bn £644.75bn
gov_spending £528.95bn † £543.83bn † £551.68bn † £558.06bn † £566.57bn † £575.31bn † £583.38bn †
household_benefits £528.95bn † £543.83bn † £551.68bn † £558.06bn † £566.57bn † £575.31bn † £583.38bn †
gov_balance £369.87bn † £398.03bn † £428.43bn † £455.77bn † £486.32bn † £513.70bn † £545.72bn †
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,651.49bn £1,713.03bn £1,764.05bn £1,812.97bn £1,862.19bn £1,918.39bn £1,985.28bn
Household net income £1,644.42bn † £1,688.69bn † £1,719.55bn † £1,750.62bn † £1,781.68bn † £1,821.07bn † £1,867.39bn †
Household net income (HBAI definition) £1,457.29bn £1,504.48bn £1,537.58bn £1,569.36bn £1,602.67bn £1,640.49bn £1,687.04bn
Population: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
People 69,224k 69,466k 69,668k 69,891k 70,128k 70,381k 70,550k
Benefit units 35,100k 35,223k 35,325k 35,438k 35,558k 35,686k 35,772k
Households 31,037k 31,145k 31,236k 31,336k 31,442k 31,555k 31,631k
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.0% 15.1% 15.4% 15.5% 15.6% 15.7% 15.7%
Absolute poverty, before housing costs: children 24.0% 21.1% 21.3% 21.3% 21.5% 21.8% 21.8%
Absolute poverty, before housing costs: working-age adults 13.8% 13.5% 13.9% 14.1% 14.1% 14.2% 14.2%
Absolute poverty, before housing costs: pensioners 13.7% 13.2% 13.1% 13.4% 13.5% 13.5% 13.5%
Absolute poverty, after housing costs: everyone 21.4% 20.8% 21.3% 21.5% 21.7% 21.9% 22.2%
Absolute poverty, after housing costs: children 33.0% 30.7% 31.1% 31.1% 31.4% 31.7% 32.3%
Absolute poverty, after housing costs: working-age adults 19.8% 19.6% 20.2% 20.5% 20.7% 20.8% 21.1%
Absolute poverty, after housing costs: pensioners 12.7% 12.4% 12.3% 12.5% 12.8% 12.9% 13.0%
Relative poverty, before housing costs: everyone 17.2% 16.4% 16.5% 16.4% 16.2% 16.3% 16.5%
Relative poverty, before housing costs: children 26.2% 23.5% 23.4% 23.1% 22.6% 22.8% 23.1%
Relative poverty, before housing costs: working-age adults 14.6% 14.4% 14.7% 14.7% 14.6% 14.7% 14.8%
Relative poverty, before housing costs: pensioners 15.0% 14.8% 14.1% 14.1% 14.0% 14.0% 14.2%
Relative poverty, after housing costs: everyone 21.6% 21.0% 21.1% 21.2% 21.3% 21.4% 21.8%
Relative poverty, after housing costs: children 33.3% 31.2% 30.8% 30.7% 31.0% 31.0% 31.5%
Relative poverty, after housing costs: working-age adults 19.9% 19.8% 20.1% 20.3% 20.4% 20.5% 20.7%
Relative poverty, after housing costs: pensioners 12.9% 12.5% 12.1% 11.9% 11.8% 11.9% 12.8%
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,057k 10,466k 10,734k 10,860k 10,960k 11,054k 11,081k
Absolute poverty, before housing costs: children 3,580k 3,171k 3,210k 3,220k 3,261k 3,305k 3,317k
Absolute poverty, before housing costs: working-age adults 5,853k 5,746k 6,021k 6,123k 6,169k 6,209k 6,219k
Absolute poverty, before housing costs: pensioners 1,625k 1,550k 1,504k 1,517k 1,530k 1,539k 1,545k
Absolute poverty, after housing costs: everyone 14,847k 14,422k 14,808k 14,994k 15,242k 15,402k 15,638k
Absolute poverty, after housing costs: children 4,937k 4,609k 4,671k 4,685k 4,757k 4,814k 4,912k
Absolute poverty, after housing costs: working-age adults 8,406k 8,359k 8,732k 8,898k 9,024k 9,114k 9,240k
Absolute poverty, after housing costs: pensioners 1,504k 1,454k 1,404k 1,411k 1,460k 1,475k 1,486k
Relative poverty, before housing costs: everyone 11,896k 11,403k 11,468k 11,487k 11,373k 11,468k 11,652k
Relative poverty, before housing costs: children 3,918k 3,523k 3,519k 3,491k 3,419k 3,458k 3,516k
Relative poverty, before housing costs: working-age adults 6,202k 6,136k 6,338k 6,400k 6,366k 6,415k 6,515k
Relative poverty, before housing costs: pensioners 1,776k 1,744k 1,611k 1,597k 1,588k 1,595k 1,621k
Relative poverty, after housing costs: everyone 14,957k 14,597k 14,698k 14,825k 14,951k 15,042k 15,351k
Relative poverty, after housing costs: children 4,976k 4,677k 4,630k 4,634k 4,690k 4,712k 4,794k
Relative poverty, after housing costs: working-age adults 8,443k 8,455k 8,680k 8,847k 8,916k 8,977k 9,092k
Relative poverty, after housing costs: pensioners 1,537k 1,465k 1,388k 1,344k 1,346k 1,354k 1,464k
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.3085 0.3059 0.3065 0.3071 0.3075 0.3081 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,781 † £17,906 † £17,832 † £17,905 † £18,142 † £18,339 † £18,483 †
Decile 2: mean household_net_income per household £27,962 † £28,917 † £28,654 † £28,906 † £29,096 † £29,646 † £30,235 †
Decile 3: mean household_net_income per household £34,380 † £35,463 † £36,065 † £36,509 † £36,850 † £37,338 † £38,043 †
Decile 4: mean household_net_income per household £38,785 † £40,713 † £41,873 † £42,413 † £43,145 † £43,906 † £44,167 †
Decile 5: mean household_net_income per household £43,788 † £44,626 † £45,606 † £46,289 † £47,328 † £48,286 † £49,711 †
Decile 6: mean household_net_income per household £48,210 † £49,525 † £50,736 † £51,914 † £52,203 † £53,174 † £54,203 †
Decile 7: mean household_net_income per household £56,218 † £57,224 † £57,764 † £58,010 † £59,040 † £60,061 † £61,765 †
Decile 8: mean household_net_income per household £69,150 † £70,533 † £71,800 † £73,075 † £74,092 † £75,540 † £77,427 †
Decile 9: mean household_net_income per household £79,490 † £81,421 † £82,828 † £84,135 † £85,539 † £87,053 † £89,944 †
Decile 10: mean household_net_income per household £117,581 † £120,296 † £121,933 † £124,163 † £126,045 † £128,342 † £131,110 †
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.47bn £6.76bn £6.67bn £6.86bn £7.06bn £7.35bn £7.55bn
Raise higher rate by 1pp £3.69bn £3.98bn £4.03bn £4.29bn £4.46bn £4.78bn £4.91bn
Raise personal allowance by ~800GBP/year £-3.82bn £-3.94bn £-4.01bn £-4.09bn £-4.18bn £-4.18bn £-2.00bn
Raise child benefit by 25GBP/week per additional child £-1.99bn £-1.75bn £-1.56bn £-1.46bn £-1.35bn £-1.23bn £-1.12bn
Reduce Universal Credit taper rate to 20% £-20.39bn £-20.96bn £-21.38bn £-21.61bn £-21.87bn £-22.17bn £-22.60bn
Raise Class 1 main employee NICs rate to 10% £11.02bn £11.42bn £11.77bn £12.07bn £12.37bn £12.75bn £13.07bn
Raise VAT standard rate by 2pp £24.89bn £25.55bn £26.14bn £26.75bn £27.39bn £28.03bn £28.66bn
Raise additional rate by 3pp £2.96bn £3.21bn £3.26bn £3.46bn £3.65bn suppressed suppressed
Raise the Universal Credit standard allowance by 10% £-3.05bn £-3.18bn £-3.30bn £-3.34bn £-3.38bn £-3.42bn £-3.48bn
Raise the State Pension by 10% £-7.79bn £-8.02bn £-8.01bn £-8.12bn £-8.43bn £-8.54bn £-8.87bn
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.61bn £6.91bn £6.83bn £7.03bn £7.24bn £7.47bn £7.73bn
Raise higher rate by 1pp: change in income_tax £3.69bn £3.99bn £4.04bn £4.25bn £4.47bn £4.74bn £4.93bn
Raise personal allowance by ~800GBP/year: change in income_tax £-3.95bn £-4.08bn £-4.17bn £-4.24bn £-4.34bn £-4.41bn £-1.76bn
Raise child benefit by 25GBP/week per additional child: change in child_benefit £2.33bn £2.14bn £1.95bn £1.84bn £1.73bn £1.62bn £1.50bn
Reduce Universal Credit taper rate to 20%: change in universal_credit £20.39bn £20.95bn £21.37bn £21.62bn £21.87bn £22.22bn £22.61bn
Raise Class 1 main employee NICs rate to 10%: change in national_insurance £11.28bn £11.74bn £12.06bn £12.37bn £12.69bn £13.03bn £13.49bn
Raise VAT standard rate by 2pp: change in vat £24.69bn £25.35bn £25.94bn £26.54bn £27.17bn £27.81bn £28.43bn
Raise additional rate by 3pp: change in income_tax £2.96bn £3.21bn £3.26bn £3.46bn £3.66bn suppressed suppressed
Raise the Universal Credit standard allowance by 10%: change in universal_credit £3.05bn £3.18bn £3.29bn £3.36bn £3.43bn £3.48bn £3.52bn
Raise the State Pension by 10%: change in state_pension £10.68bn £11.18bn £11.31bn £11.55bn £12.00bn £12.44bn £12.94bn

Vahid's review of microcosm#1415 (finding 5): cash, stocks-and-shares and
Lifetime ISA subscriptions share the £20,000 annual limit, and HMRC's Table
9.7 leaves Lifetime ISAs out. The dataset-sources guide now asks for a joint
draw, so no one is above the limit in the baseline. The subscription inputs
say they sum over all of a person's accounts of a type, since a person can
pay into more than one in a year (his finding 3).

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

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

Review of #2712 at 18aa2a4. I checked each parameter against legislation.gov.uk and the Budget 2026 OOTLAR, read the formulas, hand-checked every new YAML expected value, checked the household-total change against the means tests, and ran the touched tests locally.

Must fix

None found.

Should fix

  1. Track the November instrument for the baseline cash limit. SI 2026/1018 reg 6 is made law. It inserts reg 4ZA(1ZA), "£12,000" for a person "64 or under at the end of that year", in force 6 April 2027 (reg 1). The .inf baseline from 2027 rests only on OOTLAR para 2.5 ("retain the cash ISA limit at £20,000 for all savers over 18 years old from April 2027"), with legislation "to be laid before parliament in November 2026". Putting an announced Budget measure in the baseline matches #2719. But nothing ties the parameter to the instrument that will make it law.

    • Fix: open a tracking issue and link it from cash/subscription_limit.yaml. When the November SI is laid, replace the OOTLAR reference with it, and check that it revokes (1ZA) rather than changing it. The same check covers the reg 15 cash-interest charge, as the PR body says.
  2. Holding subscriptions flat in projection biases later-year reform scores. cash_isa_subscriptions, stocks_and_shares_isa_subscriptions and dataset-sources.md say amounts are not uprated "as the limits are fixed in cash terms". That is why the limit stays flat, not the inputs. Nominal subscriptions grow: Vahid's review of microcosm#1415 reports cash subscriptions of £41.6bn in 2022-23 and £69.5bn in 2023-24 (HMRC ISA Table 9.4). So on a 2023-24 base, flat inputs understate the amount above a lowered limit in 2027-28 and later years. The real reason for flat inputs looks like a different one: growing them would push people at exactly £20,000 above the annual limit in the baseline.

    • Fix: give that reason in the docstrings and the dataset guide, and say that flat inputs understate the amount above a lowered limit in later years. Another option is for the producer to grow the amounts and cap them at the limit in force, as microcosm#1415 now plans ("capped at £20,000").

Nice to have

  1. The annual limit before 2017-18. Core returns the first value for earlier years, so annual_subscription_limit gives £20,000 for 2014-15 to 2016-17. The law gave £15,000 from 1 July 2014 (SI 2014/1450 reg 6(a)(i)) and £15,240 before 6 April 2017 (the sum that SI 2017/186 reg 5 replaced). The PR keeps this out of scope, and no dataset year is that early. Two dated values would remove the trap for back-dated household runs.

  2. Reference for the .inf cash limit. The description says that cash has had no limit of its own since 1 July 2014. No reference cites the instrument that did it: SI 2014/1450 reg 6(a)(ii) omitted reg 4ZA(1)(a) and (b) (legislation.gov.uk footnote F3 on reg 4ZA). Add it.

  3. The consolidated Schedule link shows the old rate. above_cap_purchase/withdrawal_charge.yaml cites uksi/1998/1870/schedule first. That page still shows paragraph 5 as "25%" and has no paragraph 6A, so it does not support 0.2 yet. Put SI 2026/1130 reg 5 first, or title the first link "as amended by SI 2026/1130".

  4. The 20% rate in 2026-27, the current tax year. Today a household-calculator run for 2026 charges 25% on a purchase above the cap that completes from November 2026 to March 2027. About 159 of the 365 days in 2026-27 fall on or after 29 October. The 30 April convention is the repo's rule, and the PR documents the result, so this is a choice for the reviewers. One option is to accept it and also name it in the programs.yaml note (done). Another is a per-year override for the current year.

  5. Restored charges under paragraph 10A. SI 2026/1130 regs 3 and 4 say that a charge restored under paragraph 10A is not a subscription for reg 4ZA(1) and not a Lifetime ISA payment. isa_subscriptions now feeds lifetime_isa_payments into the annual limit. Add "repayments of a withdrawal charge under paragraph 10A" to the exclusions in the lifetime_isa_payments docstring.

  6. Other subscriptions that do not count. The subscription docstrings exclude transfers between ISAs, interest and growth, and flexible-ISA replacements. HMRC's guidance also excludes transfers from a matured Child Trust Fund and some defaulted-account subscriptions. It also says that a withdrawal of current-year subscriptions from a flexible ISA "automatically reduces the net subscription". A phrase such as "net of current-year withdrawals from flexible ISAs, and excluding other subscriptions that reg 5D disregards" would cover these cases.

  7. Duplicate index entries. cash_isa and stocks_and_shares_isa are already in the obr.per_capita.gdp list twice on main (new lines 147 and 152). The PR adds a comment on the first cash_isa. Remove the second copies at the same time. Also note that #2638 and #2723 both edit the lines next to the new stocks_and_shares_isa_balance entry, so expect a small merge conflict.

  8. Follow-up issue for capital attribution. Now that the balances are per person, a follow-up can attribute them to the holder's benefit unit, as #1983 did for the Lifetime ISA. For example, a lodger's cash ISA would then no longer be pooled with the main family's capital. The PR already says this is left for later. An issue would make sure that it is not lost.

Verified as correct

  • Annual limit. Reg 4ZA(1) says £20,000 for "the aggregate of the qualifying individual's subscriptions to all accounts that are not junior ISA accounts". SI 2017/186 reg 5 substituted "£20,000" for "£15,240" from 6 April 2017. The Lifetime ISA's £4,000 is reg 4ZA(1A) and counts within the £20,000, as HMRC's guidance confirms.
  • Cash limit history. Reg 4ZA(1)(a) and (b) were omitted on 1 July 2014 by SI 2014/1450, so no cash sub-limit applies from 2017.
  • SI 2026/1018. The quoted text of reg 6 and the 6 April 2027 commencement (reg 1) are correct. full_limit_age 65 with "reached by 5 April" is the same test as "64 or under at the end of that year".
  • Age test. born_before = (Y + 1 - 65) * 10000 + 406 puts a 5 April 1963 birth at 65 on 5 April 2028, and a 6 April 1963 birth under 65. That matches Family Law Reform Act 1969 s 9, which grid_months_to_yyyymmdd uses. With no date_of_birth, the default months_since_last_birthday of 6 puts the birthday on 6 April. So a person aged 64 on 6 October is limited, and a person aged 65 is not. Leap-day births cannot meet the 5/6 April boundary. The formula is vectorised.
  • Read date. convert_to_fiscal_year_parameters in utils/parameters.py says ordinary leaves "take their 30 April value". So in_effect is false for 2026 and true for 2027, as the docs say. A reform that sets a cash limit for 2026 reads full_limit_age as 65 (Core uses the first value). I checked this locally.
  • SI 2026/1130. It is in force on 29 October 2026, with effect for withdrawals "made on or after 29th October 2026" (reg 1(2) and (3)). New para 5 sets "(a) 20% in relation to a withdrawal to which paragraph 6A applies; (b) 25% in relation to any other withdrawal". Para 6A applies where a withdrawal "would fall within paragraph 6 but for the fact that the requirement in paragraph 6(3) is not met". Para 6(3) is "The purchase price must not exceed £450,000". The formula drops only the price test from first_home, charges the home payment at 20% and the rest at withdrawal_charge, and keeps the age 60 and terminal-illness exemptions. OOTLAR para 2.4 agrees.
  • Household totals. The UC, HB, Pension Credit, IS, JSA and ESA capital sources.yaml lists and share_like_capital read the household totals, so a person's balance reaches each means test, as the new cash_isa_capital.yaml case shows. test_isa_balances.py shows that a stored total, with no person balances, is projected by the savings growth factor. The index on the person balances equals the index on the stored totals, so nothing is uprated twice.
  • Aggregate impact. The bot ran at 00adbd1e7. The only later commit (18aa2a46c) changes docstrings and dataset-sources.md. The bot reports no change in any year on enhanced FRS 2024-25.
  • YAML arithmetic. I checked every new expected value. For example: 12,000 + 4,001 + 4,000 = 20,001, so £1 above the limit. 25,000 is £13,000 above £12,000 and £5,000 above £20,000. Under a £15,000 annual limit, 12,000 + 8,000 is £5,000 above it. Above the cap, 10,000 × 20% + 2,000 × 25% = 2,500. The 2026 cases are 10,000 × 25% = 2,500.
  • References. Every href returns 200: reg 4ZA, SI 2017/186 reg 5, SI 2026/1018 reg 6, SI 2026/1130 regs 1 and 5, the Schedule, OOTLAR, and the HMRC guidance.
  • Scope. Leaving the savings rates out is fine. #2719 (open) raises gov.hmrc.income_tax.rates.savings to 24/44/49% from 2027-28, and isa_cash_interest_flat_rate_charge follows it through savings.basic. You could link #2719 in the "Not in this PR" section. No open PR touches the ISA limits or the Lifetime ISA charge.

Tests run locally

In a uv venv on the PR head (uv venv && uv pip install -e ".[dev]", Python 3.13):

  • policyengine-core test policyengine_uk/tests/policy/baseline/gov/hmrc/isa -c policyengine_uk: 30 passed.
  • policyengine-core test policyengine_uk/tests/policy/baseline/household/wealth/isa_balances.yaml policyengine_uk/tests/policy/baseline/gov/dwp/cash_isa_capital.yaml -c policyengine_uk: 10 passed.
  • pytest policyengine_uk/tests/test_isa_balances.py policyengine_uk/tests/test_wealth_components.py policyengine_uk/tests/code_health/test_uprating_declarations.py: 13 passed.
  • An ad hoc check of parameter reads for 2016, 2020, 2026 and 2027, and of a £12,000 cash-limit reform for 2025 to 2030 (ages 64 and 66). The results were as expected.

The CI YAML and Python suites had not finished at 18aa2a4 when I checked.

🤖 Generated with Claude Code

2026, so cash keeps no limit of its own here. Set this to 12,000 to model the
lower limit.
values:
2017-04-06: .inf

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.

Should fix 1. SI 2026/1018 reg 6 is made law from 6 April 2027. Only OOTLAR para 2.5 supports .inf from that date. Please link a tracking issue here, so the reference changes to the November instrument when it is laid. At that time, check that the instrument revokes (1ZA) rather than changes it.

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.

Still open at 1915a91. The reference list is unchanged, and I found no tracking issue for the November instrument. A one-line issue linked from this file is enough.

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.

Fixed in 52b09bc. The file links #2728, which tracks the November instrument, the reg 15 charge and the (1ZA) cases.

period: year
unit: currency-GBP
reference:
- title: Individual Savings Account Regulations 1998 regulation 4ZA

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.

Nice to have 4. The description relies on 'no limit of its own since 1 July 2014'. Add SI 2014/1450 reg 6(a)(ii) as a reference: https://www.legislation.gov.uk/uksi/2014/1450/regulation/6/made. It omitted reg 4ZA(1)(a) and (b) (footnote F3 on reg 4ZA).

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.

Fixed in 1915a91. The value now starts on 1 July 2014, and SI 2014/1450 reg 6(a)(ii) is cited.

Junior ISAs: cash, stocks-and-shares, innovative finance and new Lifetime ISA
payments together.
values:
2017-04-06: 20000

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.

Nice to have 3. Core gives this value for every earlier year, so 2014-15 to 2016-17 read £20,000. Consider 2014-07-01: 15000 (SI 2014/1450 reg 6(a)(i)) and 2015-04-06: 15240. SI 2017/186 reg 5 replaced the sum £15,240.

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.

Fixed in 1915a91. I checked SI 2015/608 reg 3(1): it substitutes £15,240 for £15,000 in reg 4ZA(1). The two new 2015 and 2016 cases pass locally.

period: year
unit: /1
reference:
- title: Individual Savings Account Regulations 1998, Schedule paragraphs 5 and 6A

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.

Nice to have 5. The consolidated Schedule page still shows paragraph 5 as 25% and has no paragraph 6A, so this link does not support 0.2 yet. Put SI 2026/1130 reg 5 first, or title this link 'as amended by SI 2026/1130 reg 5'.

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.

Fixed in 1915a91. SI 2026/1130 reg 5 is now first, and the consolidated link is titled 'as amended'.

October 2026 to 5 April 2027 pays the withdrawal charge.
values:
2000-01-01: false
2026-10-29: true

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.

Nice to have 6. The 30 April read is correct (convert_to_fiscal_year_parameters). But 2026-27 is the current year, and about 159 of its 365 days fall from 29 October. A household-calculator run for 2026 shows 25% for a purchase above the cap in the rest of this tax year. Should we accept this as documented, or add a per-year override?

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.

No change at 1915a91. This is a choice for the human reviewers, so I leave it open for them.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Decided: we keep the 30 April convention.

  • A 2026-27 run charges 25% on an above-cap purchase withdrawn from 29 October 2026 to 5 April 2027, and the 20% applies from 2027-28.
  • This is the same treatment as paragraph 5A's 20% from March 2020, which the model picks up from 2020-21.
  • Population runs aren't affected: the data has no Lifetime ISA withdrawals towards a home.

The caveat is recorded in 04895b0:

  • lifetime_isa_withdrawal_charge's docstring now gives the 2026-27 consequence;
  • the assumptions page's "Annual resolution and coverage" section gives it next to the March 2020 case.

It was already in this parameter's description, the Lifetime ISA section of that page, programs.yaml and the changelog fragment.

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.

Thanks. Keeping the 30 April convention is consistent with the paragraph 5A case in 2020. 04895b0 states the 2026-27 effect in the variable's docstring and on the assumptions page. I have nothing more on this item.

"not count towards the limits. The model compares this amount with the limits in force "
"and does not cap it: under a lower limit, such as a reform that "
"brings in a £12,000 cash limit, cash_isa_subscriptions_above_limit "
"reports the part that cannot be paid in. Amounts are not uprated, as "

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.

Should fix 2. A fixed limit is the reason the limit stays flat, not the subscriptions. Nominal subscriptions grow (HMRC Table 9.4: cash £41.6bn in 2022-23 and £69.5bn in 2023-24), so flat inputs understate the amount above a lowered limit in later years. If the real reason is to keep people at £20,000 within the limit in the baseline, give that reason and the bias here, in stocks_and_shares_isa_subscriptions and in dataset-sources.md. Nice to have 8: also say 'net of current-year withdrawals from flexible ISAs' and exclude the other subscriptions that reg 5D disregards, for example matured Child Trust Fund transfers.

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.

Fixed in 1915a91. The docstrings, the assumptions page and dataset-sources.md now give the real reason and the bias. Nice to have 8 is also fixed (net of flexible-ISA withdrawals, reg 5D disregards).

adds = [
"cash_isa_subscriptions",
"stocks_and_shares_isa_subscriptions",
"lifetime_isa_payments",

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.

Nice to have 7. SI 2026/1130 regs 3 and 4: a withdrawal charge restored under Schedule paragraph 10A is not a subscription for reg 4ZA(1) and not a Lifetime ISA payment. Add it to the exclusions in the lifetime_isa_payments docstring, because this total now uses that input for the annual limit.

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.

Fixed in 1915a91. The lifetime_isa_payments docstring now excludes paragraph 10A repayments.

- capital_gains_carried_interest
gov.economic_assumptions.yoy_growth.obr.per_capita.gdp:
- benunit_reported_capital
# cash_isa and stocks_and_shares_isa sum the person balances listed with

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.

Nice to have 9. cash_isa and stocks_and_shares_isa are also at lines 147 and 152 of this same list (this duplication is on main already). Remove the duplicates while you are here. Note that #2638 and #2723 edit the lines next to the new stocks_and_shares_isa_balance entry.

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.

Fixed in 1915a91. The second copies are removed.

- Give the real reason the subscription inputs are held flat in projection
  (growing them would put people who pay in exactly the limit above it),
  and say that this understates a lowered limit's excess in later years.
- Count subscriptions net of current-year flexible-ISA withdrawals and
  exclude what regulation 5D disregards; exclude paragraph 10A charge
  repayments from lifetime_isa_payments (SI 2026/1130 regs 3 and 4).
- Date the annual limit's earlier sums: £15,000 from 1 July 2014 (SI
  2014/1450 reg 6(a)(i)) and £15,240 from 6 April 2015 (SI 2015/608
  reg 3(1)), so 2015-16 and 2016-17 no longer read £20,000. The fiscal-year
  conversion writes annual values from 2015, so earlier years are not read.
- Start the cash limit's infinity on 1 July 2014 and cite SI 2014/1450
  reg 6(a)(ii), which omitted the cash sub-limits.
- Put SI 2026/1130 reg 5 first for the above-cap charge.
- Remove the duplicate cash_isa and stocks_and_shares_isa entries from the
  uprating map.

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

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

Follow-up review of #2712 at 1915a91bc (new since 18aa2a46c: one commit, "Address Pavel's review of the ISA limits").

Must fix

None.

Should fix

  1. Still open: track the November instrument for the baseline cash limit. The .inf from 6 April 2027 still rests only on OOTLAR para 2.5, and I found no tracking issue. Please open one and link it from cash/subscription_limit.yaml.
  2. Fixed: the reason that subscriptions are held flat, and the bias that it causes, are now stated in both docstrings, the assumptions page and dataset-sources.md.

Nice to have

  • Still open: 6 (the 20% rate in the rest of 2026-27) is a choice for the human reviewers. 10 (a follow-up issue for per-person capital attribution) has no issue yet.
  • Fixed in 1915a91: 3, 4, 5, 7, 8 and 9.

Verified as correct

  • Earlier limits. SI 2015/608 reg 3(1) substitutes "£15,240" for "£15,000" in reg 4ZA(1). SI 2014/1450 reg 6(a)(i) gives £15,000 from 1 July 2014. The new cases check 15,240 and 15,241 in 2015-16, and cash at the annual limit in 2016-17, which is correct because cash has no limit of its own.
  • Cash limit. It now starts as .inf on 1 July 2014, the date that SI 2014/1450 reg 6(a)(ii) took effect.
  • Docs and changelog. They match the code. verified_start_year: 2015 matches the first year that the model reads.
  • Uprating map. The duplicate cash_isa and stocks_and_shares_isa lines are removed, and each variable is listed once.

Tests run locally

At 1915a91bc, uv venv with .[dev]:

  • policyengine-core test on the ISA folder, isa_balances.yaml and cash_isa_capital.yaml: 42 passed.
  • pytest on test_isa_balances.py, test_wealth_components.py and code_health/test_uprating_declarations.py: 13 passed.

🤖 Generated with Claude Code

Pavel's should fix 1: from 6 April 2027 the cash limit rests on Budget
2026 until the November 2026 instrument is laid, which policyengine-uk#2728
tracks.

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

Copy link
Copy Markdown
Collaborator Author

Thanks, Pavel, for both rounds. Your follow-up confirms 2, 3, 4, 5, 7, 8 and 9 at 1915a91. On what's still open:

Also:

Pavel's nice to have 6, decided with María: keep the 30 April convention.
SI 2026/1130's 20% has effect for withdrawals from 29 October 2026, but
fiscal 2026 samples 30 April 2026, so a 2026-27 run charges 25% on such a
withdrawal made from 29 October 2026 to 5 April 2027. The withdrawal
charge's docstring and the assumptions page's annual resolution section
now say so, alongside the parameter description, the Lifetime ISA
section, programs.yaml and the changelog.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@juaristi22
juaristi22 marked this pull request as ready for review October 28, 2026 21:02
@juaristi22
juaristi22 enabled auto-merge October 28, 2026 21:02

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

Follow-up review of #2712 at 04895b0ac (two commits since 1915a91bc: 52b09bc and 04895b0).

Must fix

None.

Should fix

None. Should fix 1 is fixed: #2728 tracks the November instrument, and cash/subscription_limit.yaml links it (52b09bc).

Nice to have

None open.

  • 6: closed by decision. The model keeps the 30 April convention, and 04895b0 records the 2026-27 effect (25% from 29 October 2026 to 5 April 2027, 20% from 2027-28).
  • 10: #2729 tracks the per-person capital attribution.

Verified as correct

  • The two commits change only a YAML comment, a docstring and the assumptions page. No values or formulas change.
  • The 159-of-365-days figure on the assumptions page is correct for 29 October 2026 to 5 April 2027.

I have no open findings on this PR. I did not re-run tests, because the two commits change no code or values. The last run (at 1915a91bc) passed: 42 YAML and 13 pytest.

🤖 Generated with Claude Code

@juaristi22
juaristi22 added this pull request to the merge queue Oct 28, 2026

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

Approving at 04895b0ac. All findings from my reviews are closed. CI passes at this head. The November instrument is tracked in #2728 and the per-person capital attribution in #2729.

🤖 Generated with Claude Code

Merged via the queue into main with commit 2c5e297 Oct 28, 2026
21 of 22 checks passed
@juaristi22
juaristi22 deleted the isa-subscription-limits-2710 branch October 28, 2026 22:58
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.

Model ISA subscription limits and per-person cash and stocks-and-shares ISA subscriptions

2 participants