Skip to content

Count Lifetime ISAs as means-tested capital of the holder's benefit unit - #1983

Merged
juaristi22 merged 3 commits into
mainfrom
lifetime-isa-capital-1981
Oct 1, 2026
Merged

juaristi22 merged 3 commits into
mainfrom
lifetime-isa-capital-1981

Conversation

@juaristi22

@juaristi22 juaristi22 commented Oct 1, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #1981

PolicyEngine/microcosm#1059 put three Lifetime ISA (LISA) cells into the UK datasets that microcosm builds. This PR declares them and counts the LISA at its surrender value as capital in the six means tests, in the holder's own benefit unit.

Changes

  • The cells.
    • lifetime_isa_balance is a person input (STOCK), uprated by per-capita GDP like savings.
    • has_lifetime_isa is lifetime_isa_balance > 0.
    • household_lifetime_isa_balance adds the person balances.
    • Both balances join the per-capita GDP list in uprating_indices.yaml and on the growth-factors page, so a dataset's stored household total keeps matching its person balances in later years.
    • The documentation states the accounting: the LISA is a component of gross_financial_wealth, and outside savings, corporate_wealth and total_wealth.
  • The charge. Two parameters, from the Schedule to the ISA Regulations 1998:
    • gov.hmrc.isa.lifetime.withdrawal_charge: 25% from 6 April 2017 (paragraph 5), and 20% from 6 March 2020 to 5 April 2021 (paragraph 5A, inserted by SI 2020/506);
    • gov.hmrc.isa.lifetime.charge_free_age: 60 (paragraph 4(1)).
  • The countable value. lifetime_isa_countable_capital is the balance less the charge under 60, and the whole balance from 60.
    • Every one of the six regulations values capital at its "current market or surrender value". DWP guidance counts a LISA at 75% of its value under 60 and in full from 60: ADM H1659 for Universal Credit, and DMG 29665, 52665 and 84751 for Income Support and JSA, ESA, and Pension Credit.
    • Charge-free withdrawals towards a first home or with a terminal illness are not modelled.
  • Attribution.
    • Universal Credit, Housing Benefit, Income Support, income-based JSA, income-related ESA and Pension Credit each get a person_sources list beside their household sources.
    • Person sources are summed over the benefit unit's claimant and partner (is_uc_claimant), outside the household proxies. A dependant's holding is not the claimant's capital (HB reg. 45; IS reg. 47 and JSA reg. 109 as made; ESA reg. 83; WRA 2012 s. 5; SPCA 2002 s. 5).
    • Each list is empty until 6 April 2017, when the LISA began.
    • Without that, the proxies would count an adult child's LISA against a parent's claim. Income Support, JSA and ESA would count all of it, since they give the household's capital to the claiming benefit unit. Pension Credit would count a grandchild's LISA against the grandparents.
    • Reported Universal Credit capital still overrides everything for the benefit units that report it.
  • A reform lever. Emptying one regime's list disregards the LISA there only. The Treasury Committee's proposal to disregard LISAs in Universal Credit is that one change, and a test covers it. On microcosm data it scores zero, for the reason under "Universal Credit: no change" below.

Effect on a microcosm dataset

The dataset.

  • It is a national dataset built locally from microcosm main 3598c38de (the merge of UK was_lisa: Lifetime ISA holdings from the WAS round-8 person tab (#1003) microcosm#1059), with the recipe of the 30 September national build. Nothing was uploaded.
  • It passes the same seven gates at the same calibration loss. Every column other than the three LISA cells is identical to the 30 September build's.
  • It has about 785,000 weighted LISA holders in 2025-26. They hold £5.6bn, or £4.2bn after the charge.
  • The baseline is this branch with the six person_sources lists emptied, which reproduces main's capital.

Results.

  • Universal Credit: no change.
    • microcosm sets uc_reported_capital on every benefit unit to FRS-reported benefit-unit savings and investments (TOTCAPB4), and reported capital overrides the modelled capital. So neither the household proxy nor the LISA reaches Universal Credit on microcosm data.
    • About 56,000 Universal Credit recipient benefit units (142 records) include a holder.
    • Whether the FRS total counts a LISA was not checked here.
  • Universal Credit with modelled capital (the dataset's reported capital dropped, as in the household calculator):
    • counting LISAs cuts Universal Credit spending by £22m in 2025-26 and again in 2026-27;
    • about 32,000 recipient benefit units (36 records) get less, and none loses Universal Credit, so the caseload is unchanged;
    • about 25,000 to 28,000 benefit units that were eligible but not receiving it (30 to 40 records) become ineligible.
  • Legacy benefits and Pension Credit.
    • Housing Benefit, Income Support, income-based JSA and Pension Credit are unchanged.
    • Income-related ESA changes for fewer than 10 records, so the figures are suppressed.

total_wealth

Left unchanged, as the issue asks for a recorded decision. Adding the LISA would not double count. total_wealth also omits cash ISAs (exported as cash_isa, with no engine variable), and adding one ISA type alone would leave the wealth aggregates covering ISAs unevenly. The proposal is to bind cash_isa and decide both together.

Not in this PR

  • Cash ISAs. They are countable capital in every means test, are missing from every sources list, and are exported per household. Binding them would raise capital for many more claimants, so it needs its own measurement.
  • Council tax reduction. It compares household savings with the scheme's capital limit, or uses uc_assessable_capital for Universal Credit recipients in the local schemes. It therefore sees a LISA only through Universal Credit capital.
  • Charge-free withdrawals. Those towards a first home or with a terminal illness are not modelled.

Review round 1

  • 1, a dependant's LISA counted against the parent's claim: fixed in 0028ec5b. Only the claimant's and partner's holdings count, through is_uc_claimant.
  • 2, counting before April 2017: fixed in 0028ec5b. The lists are empty until 2017-04-06.
  • 3, a stored household total not following an edited person balance: documented in b340cf53.

Checks

  • ruff format --check . and ruff check .: clean repo-wide (ruff via uv tool run).
  • policyengine-core test policyengine_uk/tests/policy -c policyengine_uk: 1,308 passed, including 21 new cases in tests/policy/baseline/gov/dwp/lifetime_isa_capital.yaml.
  • pytest on tests/test_lifetime_isa_capital.py (dataset uprating, the reform lever, no monthly proration), tests/code_health, and the stock-capital, uprating and pension-age Housing Benefit tests: 18 passed.
  • Full pytest policyengine_uk/tests/ at b340cf53: 323 passed, 45 skipped, none failed. The skipped tests are the microsimulation tests that need HUGGING_FACE_TOKEN or a default dataset; CI's Test job runs them.

🤖 Generated with Claude Code

microcosm datasets now carry three Lifetime ISA cells imputed from the
WAS round-8 person file (PolicyEngine/microcosm#1059). Declare them:
lifetime_isa_balance (a person input, uprated by per-capita GDP like
savings), has_lifetime_isa and household_lifetime_isa_balance. The
balance is a component of gross_financial_wealth and stays out of
savings, corporate_wealth and total_wealth.

Every means test values capital at its current market or surrender
value, and DWP guidance counts a Lifetime ISA at 75% of its value under
60 and in full from 60 (ADM H1659; DMG 29665, 52665 and 84751). Add the
withdrawal charge (25%, 20% from 6 March 2020 to 5 April 2021) and the
charge-free age (60) under gov.hmrc.isa.lifetime, and
lifetime_isa_countable_capital at that surrender value.

Household stocks reach benunits through per-regime proxies because the
data only knows them per household. A Lifetime ISA is one person's, and
most holders are young adults living with parents, so the proxies would
count an adult child's Lifetime ISA against a parent's JSA claim or a
grandchild's against a grandparent's Pension Credit. Each of the six
means tests gets a person_sources list beside its household sources,
summed over the benunit's own members.

Fixes #1981

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

Copy link
Copy Markdown
Collaborator

Automated review pass (Claude Code, high effort) — round 1 at c8428904

Verdict: nothing blocking. The valuation, the charge parameters and the household-proxy bypass are right, and the tests pass. One should-fix on attribution inside the benefit unit; the rest are nits.

What I checked

  • Legal facts.

    • SI 2020/506 inserts paragraph 5A: 20% "in respect of the period beginning on 6th March 2020 and ending on 5th April 2021".
    • Paragraph 4(1): "the specified age is 60".
    • ADM H1659 (read from the PDF): a LISA "should be treated as capital from the outset" at 75% of the surrender value under 60 and 100% over 60.
    • I didn't open the DMG chapters.
  • Period mapping. lifetime_isa_countable_capital on £10,000 at age 30 gives £8,000 in 2020 and £7,500 in 2019, 2021, 2022 and 2025, so FY2020-21 gets the 20% rate. Age 59 gives £7,500 and age 60 gives £10,000.

  • Attribution across benefit units. A pensioner and an adult child aged 25 in separate benefit units of one household, with £20,000 in the child's LISA:

    • Each of the six assessable-capital variables gives the parent's benefit unit £0, and the child's £15,000 under all five working-age tests.
    • Pension Credit gives £0 to both, which is right, since neither benefit unit is pension-age with the LISA.
    • Reported UC capital still overrides, and a monthly uc_assessable_capital call returns the annual stock (£7,500).
  • Wealth accounting. In microcosm's was_wealth:

    • savings is DVSaValR8_aggr;
    • the ISA column inside corporate_wealth is DVIISAVR8_aggr;
    • cash_isa is DVCISAVR8_aggr;
    • the LISA comes from DVFLISAvR8 in was_lisa.

    These are separate WAS items, so counting lifetime_isa_countable_capital beside the household sources doesn't double count. The gross_financial_wealth statement is documentation only; no formula changes, which is right.

  • Microcosm cells. person.lifetime_isa_balance, person.has_lifetime_isa and household.household_lifetime_isa_balance match microcosm main's export names and entities. lifetime_isa_balance declares its uprating the same way savings does.

  • Tests, run locally on a fresh venv:

    • lifetime_isa_capital.yaml: 17 passed.
    • test_lifetime_isa_capital.py: 3 passed.
    • The existing capital YAMLs: 132 passed. These are the Housing Benefit, ESA, JSA, Income Support, UC, Pension Credit income and deemed-income, and council tax reduction cases.
    • test_housing_benefit_pension_age_properties.py and test_stock_capital_periods.py: 6 passed.
  • CI: lint, docs and the four smoke-imports are green; Test is still running.


1. Should-fix: a dependent young person's LISA counts against the parent's claim. person_capital sums person_sources over every member of the benefit unit (uc_assessable_capital.py:24, and the same in the other five). FRS benefit units carry dependants aged 18 and 19 in non-advanced education, and those are exactly the ages that can hold a LISA. The regulations count only the claimant's (and partner's) capital:

  • Income Support reg. 47: "The capital of a child or young person who is a member of the claimant's family shall not be treated as capital of the claimant."
  • JSA, ESA and Housing Benefit have parallel rules.
  • For UC, s.5 WRA 2012 / reg. 18 counts the claimant's or joint claimants' capital only.

Probe: a parent aged 45 and a person aged 18 in non-advanced education (is_qualifying_young_person_for_universal_credit true, is_uc_claimant false) with a £10,000 LISA. All five working-age variables return £7,500 for the parent's benefit unit; it should be £0.

The population is small, but this PR exists to get attribution right. The fix is to sum over claimant and partner only, for example by weighting with is_uc_claimant (or a regime-neutral adult-non-dependant flag) before benunit.sum. A YAML case with an 18-year-old dependant would pin it.

2. Nit: the six person_sources lists and the charge parameter start on 2017-04-06, but earlier years still count the LISA. Parameter lookups before the first date return the first value, so 2015 and 2016 both give £7,500 for a £10,000 balance. That's harmless on real data, since no dataset before 2017 carries a LISA. If you want the lists to mean "from April 2017", add an earlier empty value (for example 2000-01-01: []).

3. Nit: the stored household_lifetime_isa_balance doesn't follow a changed person balance. A dataset that stores the household column keeps it when a reform or situation edits lifetime_isa_balance. Nothing in the means tests reads the household column, so this only affects outputs. A line in its documentation saying "recomputed only when not stored" would be enough.

Note, not a finding: the "Effect on a microcosm dataset" section is still pending. I'd keep the PR in draft until the UC and legacy caseload and spending deltas, with and without the six lists, are in the body, since that's the number the Treasury Committee lever will be read against.

@juaristi22
juaristi22 marked this pull request as ready for review October 1, 2026 11:25
juaristi22 and others added 2 commits October 1, 2026 12:32
Review round 1, items 1 and 2.

The six person_sources sums ran over every benefit-unit member, so a
dependant aged 18 or 19 in non-advanced education, the ages that can
hold a Lifetime ISA, had theirs counted against the parent's claim. Only
the claimant's and partner's capital counts (HB reg. 45; IS reg. 47 and
JSA reg. 109 as made; ESA reg. 83; WRA 2012 s. 5; SPCA 2002 s. 5), so
weight the sums by is_uc_claimant, the claimant-or-partner flag datasets
set from recorded relationships.

Parameter lookups before the first date return the first value, so the
lists also counted the Lifetime ISA in 2015 and 2016. Each list is now
empty from its regime's start until 6 April 2017.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review round 1, item 3: a dataset that stores has_lifetime_isa or
household_lifetime_isa_balance keeps the stored value when a reform or
situation edits lifetime_isa_balance.

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

Copy link
Copy Markdown
Collaborator Author

Posting on María's call. Thanks for the round. The fixes are pushed in two commits, and the head is now b340cf53. The body carries the same map under "Review round 1".

  • 1, a dependant's LISA counted against the parent's claim (0028ec5b): confirmed, and fixed as you suggest.
    • The six sums now weight each member by is_uc_claimant, the claimant-or-partner flag. Datasets set it from recorded relationships; microcosm sets it from the FRS roles.
    • Each list's description cites its regime's rule: HB reg. 45; IS reg. 47 and JSA reg. 109 as made (children have been outside those assessments since the move to child tax credit); ESA reg. 83; WRA 2012 s. 5; SPCA 2002 s. 5.
    • Three YAML cases pin it:
      • your probe: a parent and an 18-year-old in non-advanced education with a £10,000 LISA, which now gives £0 in all five working-age tests;
      • the same with the dependant recorded by the dataset (is_uc_claimant: false);
      • a pensioner with a dependent young person, under Pension Credit.
    • On the microcosm dataset, the fix removes the LISA from about 17,000 weighted benefit units (18 records) whose holder is a dependant.
  • 2, counting before April 2017 (0028ec5b): each list is now empty from its regime's start until 2017-04-06, and a 2016 case checks that none of the six counts a balance. The charge parameter still answers 25% for earlier years; only a direct call of lifetime_isa_countable_capital reads it.
  • 3, the stored household total (b340cf53): household_lifetime_isa_balance and has_lifetime_isa now say that a stored value is kept and recomputed only when not stored.
  • The effect section is in the body, measured again on the new head.
    • Universal Credit doesn't move on microcosm data. microcosm sets uc_reported_capital on every benefit unit from FRS-reported savings and investments, and reported capital overrides the modelled capital.
    • So the Treasury Committee lever also scores zero on microcosm data. Scoring it there would need the reported capital split by type, or the modelled path.
    • With the dataset's reported capital dropped (the household calculator's path), counting LISAs cuts Universal Credit by £22m in 2025-26 and again in 2026-27. About 32,000 recipient benefit units (36 records) get less, and none loses it.
    • The legacy benefits and Pension Credit don't move, apart from income-related ESA for fewer than 10 records, whose figures are suppressed.
    • Whether the FRS savings and investments total counts a LISA wasn't checked.

Tests at b340cf53: the YAML suite passes 1,308 cases (21 new). The full pytest suite has 323 passed and 45 skipped, the microsimulation tests that need a token; none failed.

@vahid-ahmadi vahid-ahmadi left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Automated review pass (Claude Code, high effort) — round 2 (final pass) at b340cf53

Verdict: approve. All three round-1 items are closed. There's one small nit about the calculator fallback, and one follow-up question about the data, which you already flagged. Neither blocks.

Round-1 items

Item Status Evidence
1 dependant's LISA counted against the parent Closed 0028ec5b weights each of the six person sums by is_uc_claimant. I reran the round-1 probe: a parent (is_parent: true) and an 18-year-old in non-advanced education with £10,000 give £0 in all six. is_uc_claimant has no age or eligibility term (head, parent, or adult not a qualifying young person with a parent in the unit), so pensioners count. A pensioner couple aged 67 and 66 with £10,000 each gives £20,000 under Pension Credit. A single 30-year-old gives £7,500 under Housing Benefit and the other working-age tests.
2 counted before April 2017 Closed Each list is [] until 2017-04-06. Year 2016 gives £0 in all six, and year 2017 counts. That's consistent with the engine reading a year as its fiscal year: the lookup at the 2017 instant already returns the April-2017 list.
3 stored household total not recomputed Closed b340cf53 documents it on both variables. Nothing in the means tests reads the household total, so documenting it is enough.

I spot-checked the citations in the new list descriptions on legislation.gov.uk. IS reg. 47 and HB reg. 45 both read "The capital of a child or young person who is a member of the claimant's family shall not be treated as capital of the claimant". SPCA 2002 s. 5 aggregates the claimant's and partner's capital.

New

1. Nit: the calculator fallback only recognises a dependant when the parent is flagged. is_parent has no formula (default False). Without it, is_uc_claimant falls back to is_adult, so the 18-year-old reads as a claimant. Leaving is_parent unset in the same probe gives £7,500 in the five working-age tests, even with a 10-year-old sibling in the unit. Datasets are fine here: the enhanced FRS sets is_parent from the FRS (policyengine_uk_data/datasets/frs.py), and microcosm sets is_uc_claimant from FRS roles. So this only affects household-calculator users who don't set it, and the variable's docstring already says relationships need explicit input when ambiguous. No change needed in this PR; I'd mention it in the changelog or the list descriptions if that's easy.

2. Follow-up question (your open item): does the FRS savings figure already include LISAs? I confirmed that uc_assessable_capital returns uc_reported_capital whenever it is ≥ 0, ignoring person_capital. So on microcosm data the UC effect is zero by construction, as your effect section says. On the modelled path (the £22m), the question is whether the household sources (savings and the ISA/investment items) already capture a LISA through the FRS accounts. If they do, the LISA from the WAS donor (microcosm#1059) is counted twice there. That's not answerable without the FRS account-type codes, so I'd file it as a follow-up issue rather than hold this PR.

Checks run at b340cf53

  • lifetime_isa_capital.yaml: 21 passed. test_lifetime_isa_capital.py: 3 passed.
  • The existing capital and relationship YAML files (HB capital and pension-age claims, ESA, JSA, IS capital, Pension Credit income and deemed income, the UC relationship, child-element, unearned-income and eligibility files, and council tax reduction): all 13 pass.
  • CI: lint, docs and smoke-imports on 3.11–3.14 are green; the main Test job was still running.

@juaristi22
juaristi22 merged commit 74082b2 into main Oct 1, 2026
7 checks passed
@juaristi22
juaristi22 deleted the lifetime-isa-capital-1981 branch October 1, 2026 12:22
MaxGhenis added a commit that referenced this pull request Oct 2, 2026
Conflicts resolved: ESA/IS/JSA/HB/UC assessable capital keep the
claimant-and-partner household share and add main's person-level capital
(Lifetime ISA, #1983) for the claimant or partner; CTR applicable income keeps
member-based deductions and adds main's guarantee-credit and savings-credit-only
rules (#1909); progression.py keeps both imports.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bind the Lifetime ISA holdings that microcosm datasets now carry, and count them as means-tested capital

2 participants