Repository navigation
UK CGT: impute BADR gains, bind the Table 3 gains-by-income joint, and condition gain carriers on wealth (post-#979 level and income-interaction findings) #1014
Description
Why
The #979 national candidate (c5f107ab…, staged 2026-09-23) fits 74 of its 77 CGT rows within 10% and 60 within 1%, yet the CGT it carries is unstable against the income targets and does not look like real households. Measured on that file, its spine, the #1006 control calibration (spine-assessment-v23-ctl, 1,062 targets on the same 33-stage spine plus the income-anchor stages) and the eFRS 1.57.3 file:
-
The engine cannot tax BADR gains, so the calibration is fitting a tax function it cannot match. HMRC 2024-25: 61,000 individuals claimed BADR or Investors' Relief on £18.4bn of gains, taxed £1.8bn at 10% (Table 4.1). Neither dataset carries a BADR column, so the engine charges those gains at the main rates (the 2024 fiscal-year blend, 21.7% higher). That is the whole of the
hmrc.cgt.liability_totalmiss: gains land at −1.3%, liability at +10.3% (£24.8bn on £117.7bn against HMRC's £22.5bn on £119.3bn), and the tax-by-age rows sit at +10.0% (45–54), +13.0% (55–64) and +14.6% (65–74) while the gains-by-age rows fit within 1%. The same rows sit at +12.8% and +18.8% in the UK income anchors at the calibration year and reserved top-tail income rows (income-anchor lane, PolicyEngine/chronicle#280) #1006 control run. At 2026-27 it is about £1.2bn of the dashboard's £30.0bn baseline (24% instead of 18% on ~£20bn).PolicyEngine/policyengine-uk#1861(merged, 2.99.x; microcosm-build already requires ≥2.100.0) added thecapital_gains_badrinput and schedule, so the engine side is done. -
Gains by taxable income is not a target, and the calibration moves it freely. HMRC Table 3 (2024-25) is the surface the amounts are drawn from, so the prior spine reproduces its all-gains margin: taxpayers 292k / 51k / 94k / 23k / 35k / 62k across the six bands against published 292k / 49k / 93k / 21k / 34k / 62k, gains within 3–22% per band. HMRC's own summary: 55% of gains come from the 17% of CGT-liable individuals with taxable income above £125,140. After the UK CGT: interpolate the sub-exempt remainder, anchor the clone incidence, and fence projected entrants (#970) #979 solve the £50,000–99,999 band holds £34.7bn of gains against £17.2bn published, the £200,000+ band £42.5bn against £55.1bn, the £125,140–199,999 band 23k taxpayers against 34k, and the share of gains above £125,140 of income is 41%. Under the UK income anchors at the calibration year and reserved top-tail income rows (income-anchor lane, PolicyEngine/chronicle#280) #1006 control's target set the same rows land elsewhere again (£0–37,699 band £32.1bn against £24.6bn; above-£125k share 47%). The 76 Table 3 band facts have stayed fenced since UK capital gains: imputed distribution has no top tail, missing 55% of CGT #552 (UK: banded CGT gains targets (by size of gain) to constrain the distribution, not just count + total #467, UK CGT top-tail age and geography joints inherit from incidence and look off — benchmark against HMRC marginals #725).
-
The gain carriers are drawn on income alone, and their wealth does not fit their gains.
cgt_incidence_cloneandcgt_band_donorsuse the Advani–Summerspercent_with_gainsby total-income band; the redraw ranks by prior amount within income band; the asset-type stage assigns a type afterwards. Among liable gainers on the UK CGT: interpolate the sub-exempt remainder, anchor the clone incidence, and fence projected entrants (#970) #979 file, the Spearman correlation of gains with gross financial wealth is 0.04, with corporate wealth 0.03, with property wealth 0.07. Of the 74 rows with £1m+ gains, 62% have zero corporate wealth and 66% under £100k of financial wealth (median £52k). The £1m–5m gainers' median financial wealth is £65k; the £5m+ gainers are 23% owner-occupiers. On main the SPI copies' and band donors' WAS columns are additionally the FRS parent's (UK spine: make SPI support households internally consistent (SPI-first order, housing shell) #1012). -
Why it is unstable. 1,003 person rows carry every liable gain; 15 carry half; one band-donor row (weight 100, a £172m gain, the Pareto top stratum of the £5m+ × £200k+ cell) carries 13% of the national total at prior and is halved by calibration; the effective sample size of weighted gains is 29 at prior and 23 after. Those rows also carry the income and region targets: each liable row has non-zero loadings on 21–97 targets (median 46); the 1,061 liable rows carry 52% of the private-pension £500k–1m amount row, 34% of the North East 200k+ total-income row and 23% of the SPI savings-interest 200k+ row. The 120 demoted (sub-exempt) band donors, blind to every CGT row, carry 23–35% of several 200k+ region and ITL rows, which is why the entrants fence reads 68.5k on the UK CGT: interpolate the sub-exempt remainder, anchor the clone incidence, and fence projected entrants (#970) #979 target set and 146.9k on UK income anchors at the calibration year and reserved top-tail income rows (income-anchor lane, PolicyEngine/chronicle#280) #1006's (see the diagnosis in UK income anchors at the calibration year and reserved top-tail income rows (income-anchor lane, PolicyEngine/chronicle#280) #1006 (comment)). With no income joint in the loss, the solver fits the size-band, age and region rows by re-weighting whichever heavy rows the income side leaves it.
The level and its projection profile (2024-25 is the forestalling year; our GDP-per-capita uprating carries the spike flat while the OBR path dips and then grows) are a separate question: PolicyEngine/uk-cgt-reform#2 and the #875 deliverable deferred to the next vintage. This issue is about the three structural fixes that hold the joints.
WP1: impute BADR-qualifying gains (main-based)
- Chronicle first. HMRC CGT Table 4 is not on the feed. Package Tables 4.1–4.4 (2021-22 to 2024-25; individuals by eight bands of BADR/IR-qualifying gain, trusts total, all total; taxpayers, qualifying gains, tax at the 10% rate). 2024-25 individuals: 61k / £18,443m / £1,821m. By band (lower limit, taxpayers k, gains £m): 0: 5 / 32; 10k: 8 / 129; 25k: 6 / 224; 50k: 8 / 575; 100k: 11 / 1,866; 250k: 8 / 2,901; 500k: 8 / 5,929; 1m+: 7 / 6,787. Gains are before losses and the exempt amount. Source:
Table_4_2026_Business_asset_disposal_and_investors_reliefs.odsin the 2026 release. - Spine. Write
capital_gains_badr(the engine's merged BADR/IR input) inhmrc_cgt_asset_type_spineor a sibling stage right after it: among liable gainers not flagged residential, with a main asset type in the business-asset and unlisted-share types, flag claimants and set the qualifying amount so the household-weighted count and gains by Table 4.1 band match, with the same solve pattern as the residential flag (declared propensity, weighted systematic walk, reported Bernoulli envelope). Qualifying gain ≤ min(net gain, the £1m lifetime limit); the 1m+ band's mean of £970k says the limit binds. Addperson.capital_gains_badrto the export allow-list (terminal_gates.pyandgates.json), the coverage manifest, the H2 parity fixture and the certification digests. - Calibration.
cgt_2024_taxthen carries the BADR schedule. Expecthmrc.cgt.liability_totalfrom +10.3% to within a few percent withgains_totalunchanged, and the tax-by-age rows inside tolerance. Whether the Table 4 totals become fitted rows or diagnostics is a ruling (below). - Dashboard.
capital_gains_badrflows throughuk-cgt-reformunchanged; the 2026-27 baseline should drop by about £1.2bn and the reckoner's BADR rows become runnable. - Acceptance. Table 4.1 bands within publication rounding on the spine; residential flags, targets and every non-CGT column byte-identical; liability within 3% at 2024 with gains within 1%; the age rows fit.
WP2: bind the Table 3 gains-by-income joint (stacked on #1006)
- Rows. The all-gains margin of Table 3: six taxable-income bands (£0–37,699; 37,700–49,999; 50,000–99,999; 100,000–125,139; 125,140–199,999; 200,000+) × taxpayers and gains, 12 rows, from
hmrc_cgt_conditioning_facts.json(dimensioncgt_taxable_income_band, record sethmrc.cgt_table3_2026.ty2024.all_gains). Familyhmrc_cgtor a newhmrc_cgt_incomefamily underfamily_equal(ruling). - Measurement. The shape of
hmrc.cgt.taxpayers_by_gain_band:parameter_gated_thresholdoncgt_2024_gains,groupby_variableplusband_filter_dimension, with a new dated measurecgt_2024_taxable_incomeinmeasure_simulation._CGT_CALIBRATION_VARIABLES(engineadjusted_net_incomeless allowances at 2024, HMRC's taxable-income concept). The redraw's component-sum proxy is the fallback; report both side by side once. - Why stacked on UK income anchors at the calibration year and reserved top-tail income rows (income-anchor lane, PolicyEngine/chronicle#280) #1006. The contract, registry pins and frozen scoring register are where UK income anchors at the calibration year and reserved top-tail income rows (income-anchor lane, PolicyEngine/chronicle#280) #1006 lives (1,124 references, uprating appliers, two new families), and the distortion is largest under its target set, so it has to be measured there. Stacked PRs get no CI: local funnel plus the targeted shard.
- Measurement plan. Twin calibration on the UK income anchors at the calibration year and reserved top-tail income rows (income-anchor lane, PolicyEngine/chronicle#280) #1006 spine with and without the 12 rows: the Table 3 joint, the fence entrants, the 15 heaviest rows' weight ratios, the effective sample size of weighted gains, and the income-tax and SPI 200k+ band fits. The conflict becomes explicit in the loss; some SPI or ITL rows may worsen, and that is the point. Independently of the rows, add a Table 3 drift check to the terminal battery so a solve that moves an income band's gains by more than a declared share is visible.
WP3: condition the gain carriers on wealth as well as income (stacked on #1012; investigate first)
- Why after UK spine: make SPI support households internally consistent (SPI-first order, housing shell) #1012. On main every SPI copy and band donor carries its FRS parent's WAS wealth. UK spine: make SPI support households internally consistent (SPI-first order, housing shell) #1012 runs the SPI block before
was_wealth, so the SPI half's wealth follows its income (investment income against financial wealth 0.14 → 0.63; band donors' median financial wealth £48k–67k → £209k–1.57m by band). Conditioning the CGT draw on wealth before that would bake the inheritance in. The CGT stages already run after WAS in every tree. - Candidate designs, decided after measuring. (a) Propensity = Advani–Summers(income band) × a wealth tilt in the household's gross financial, corporate and non-main-residence property wealth, normalised within income band so the Table 3 margins are untouched. (b) Asset type first: draw the Table 7 type, then require the matching stock (financial wealth for shares, other residential property for residential gains, corporate wealth for business assets and BADR), ranking within type by the stock. (c) Both.
- Anchors. No published joint of gains with wealth exists, so this is a declared modelling assumption checked against what does exist: Table 7 composition by gain band (already a diagnostic), Table 8's residential gainers against second-property ownership, WAS shares of unlisted-share and business-asset holders among top-income households, and CenTax's remuneration-including-gains profiles where usable.
- Measurement. Joint of gains with each stock; the share of £1m+ gainers with zero relevant stock; the Table 3, age and region margins unchanged; downstream, the SPI savings-interest and dividend band fits and any wealth-conditioned reform on the dashboard.
Stacking and order
- WP1 on main now, after the Chronicle Table 4 package; whichever of WP1 and UK income anchors at the calibration year and reserved top-tail income rows (income-anchor lane, PolicyEngine/chronicle#280) #1006 lands second re-pins the stage roster, coverage manifest, parity fixture and digests (mechanical).
- WP2 stacked on UK income anchors at the calibration year and reserved top-tail income rows (income-anchor lane, PolicyEngine/chronicle#280) #1006, measured on its spine before UK income anchors at the calibration year and reserved top-tail income rows (income-anchor lane, PolicyEngine/chronicle#280) #1006's own licensed rebuild so the two effects are not confounded.
- WP3 stacked on UK spine: make SPI support households internally consistent (SPI-first order, housing shell) #1012 once its measurement is in; an investigation memo before any implementation.
- None of it should predate UK income anchors at the calibration year and reserved top-tail income rows (income-anchor lane, PolicyEngine/chronicle#280) #1006 or UK spine: make SPI support households internally consistent (SPI-first order, housing shell) #1012: the derived surfaces would be regenerated twice and the measurement basis would move underneath.
Related, not in scope
- Demoted band donors and lighter rows (120 donors per band, more carriers in the top Table 3 cells): UK CGT: sub-exempt gains capped at exactly the annual exempt amount become 10.8m taxpayers under uprating; interpolate the remainder below the threshold and anchor incidence #970's open ruling.
- Level and projection profile:
PolicyEngine/uk-cgt-reform#2, UK CGT: translate the 2024-25 gains outturn to the 2025 calibration year (forestalling year; OBR CGT +44.2% signed on the stack register) #875. - UK CGT top-tail age and geography joints inherit from incidence and look off — benchmark against HMRC marginals #725 (age and region joints), Capital gains as primitives: asset-class positions + accrued gains + realization model, with dual-mode provenance #320 (gains as primitives, long-run).
Decisions needed
- WP2 family and grain: rows in
hmrc_cgtor a new family; the 12 margin rows or also the 6 × 10 cells. - WP2 grouping concept: engine taxable income at 2024 or the redraw's proxy.
- WP1: Table 4 totals as fitted rows or diagnostics; IR folded into BADR (the engine's input already merges them).
- WP3 design after the investigation.
🤖 Generated with Claude Code
Activity
Draw BADR and Investors' Relief claims inside the CGT asset-type stage (
Bind HMRC CGT Table 4.1 claimants and qualifying gains by band (#1014)
Bind Table 3's all-gains income margins on the engine's CGT taxable i…
Record the #1014 phase A receipts
juaristi22 commentedon Sep 28, 2026
PolicyEngine/chronicle#287 is in: PolicyEngine/chronicle#288 landed HMRC CGT statistics 2026 Table 4 (BADR and Investors' Relief claimants, qualifying gains and tax by band of qualifying gain, 2021-22 to 2024-25), and the UK feed re-pins to
505e0e7with no other row moving.Draft PR #1045 implements this issue in one PR, now rebased onto the merged #1012. Rulings recorded for the implementation (María, 2026-09-26):
hmrc_cgt_asset_type_spine, in the order residential flag, BADR claims, main asset type. A claimant's main type follows the claim: it is drawn only from unlisted shares, business land and buildings, and other non-financial assets.hmrc_cgt.One change from the issue text: the claimant pool is every liable gainer not flagged residential, not only people typed unlisted shares or business assets. Restricting to those types leaves 77 records and about 28,700 people against the 61,000 claimants Table 4.1 publishes, because the Table 7 type fit matches gains shares rather than counts. Drawing from the whole non-residential pool and then typing claimants into the eligible categories keeps both Table 4.1 and Table 7 reachable.
Measured on the licensed national role (diagnostics only: every run, the control included, stops at the terminal gate on the #970 entrants fence): CGT liability moves from +12.8 percent in the control to +3.8 percent, 15 of the 16 Table 4.1 rows land within 0.6 percent (the open band's count and gains cannot both hold, because every claim there is the lifetime limit), and the share of gains above GBP 125,140 of taxable income moves from 46.5 to 55.4 percent against HMRC's 55.4. The receipts are in
experiments/1014-cgt-badr-table3-wealth.mdon the PR.Wealth conditioning (WP3) is investigated but not yet on the PR: seven arms of the plan's three candidates were compared on a local tree of #1012 and the PR's commits, and the choice is pending.
Record the #1014 phase B receipts on the merged #1012
Draw BADR and Investors' Relief claims inside the CGT asset-type stage (
Bind HMRC CGT Table 4.1 claimants and qualifying gains by band (#1014)
Bind Table 3's all-gains income margins on the engine's CGT taxable i…
Record the #1014 phase A receipts
Record the #1014 phase B receipts on the merged #1012
Rank CGT gainers on a blend of prior gain and household investable we…
Lean CGT asset flags and types towards gainers who show the stock the…
Draw BADR and Investors' Relief claims inside the CGT asset-type stage (
Bind HMRC CGT Table 4.1 claimants and qualifying gains by band (#1014)
10 remaining items
juaristi22 commentedon Sep 30, 2026
Status on 30 September. Since the last note here, #1045 has taken the picks recorded above and one more design change that the licensed builds forced.
cgt_band_donorsand addscgt_support_split, and c8 gives the redraw placement receipts by row type. The reason is the projection-entrants fence: every arm of this line failed it at 98,600 to 129,300, and the excess was entirely demoted band donors mapped just under £3,000 (the redraw places by wealth rank and demoted three quarters of them; c5 raised that from 120 to 204 of 270). The redraw already reproduces Table 2.1a from clones and calibration binds its twelve bands, so the split supplies what the donors were meant to supply, row support at the top, from the households the redraw already places: the wealthiest of each Table 3 income column, split into copies of at most 60 before the clone (30 after), sized by 2 × 1.25 × the published count of gainers at or above £250,000 in the column, mass conserved exactly, no draw. Full account and the ruling on UK CGT: sub-exempt gains capped at exactly the annual exempt amount become 10.8m taxpayers under uprating; interpolate the remainder below the threshold and anchor incidence #970.experiments/1014-cgt-badr-table3-wealth.md.Still owed on this issue: the open-band count now undershoots (2,643 against 3,000, from the joint's suppressed cells) rather than overshooting; the £250,000 to £1m bands' heaviest placed rows are clones of the SPI income-band donors at 1,496, which #1063 will lighten; and the Table 7 drift and the +3.6 percent liability stand as reported.
Draw BADR and Investors' Relief claims inside the CGT asset-type stage (
Bind HMRC CGT Table 4.1 claimants and qualifying gains by band (#1014)
Bind Table 3's all-gains income margins on the engine's CGT taxable i…
Record the #1014 phase A receipts
Record the #1014 phase B receipts on the merged #1012
Rank CGT gainers on a blend of prior gain and household investable we…
Lean CGT asset flags and types towards gainers who show the stock the…
Replace the CGT band donors with a wealth-tier support split (#1014)
Report where the CGT redraw places support rows (#1014)
Raise the support split's copy cap to 80 so the certified weight-rati…
Revert "Raise the support split's copy cap to 80 so the certified wei…
Lower the support split's headroom to 1.25 so the certified weight-ra…
Merge pull request #1045 from PolicyEngine/uk-cgt-badr-table3-1014