Repository navigation
UK: track the defects uk-data is fixing that microcosm still has #1095
Copy link
Copy link
Open
Description
This issue tracks defects that PolicyEngine/policyengine-uk-data PRs and issues fix or report and that microcosm still has. Each review records the last uk-data item it covered. The next review starts at the following number, updates this body, and posts a comment that lists what changed.
Audit record
- Updated and reviewed: 15 October 2026, after UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271 merged (main
c28b453).- The review covered uk-data#579 to uk-data#591, re-checked every uk-data and policyengine-uk item named below, and read policyengine-uk's releases from 2.131.0 to 2.132.6.
- Twelve items are ticked, three are added, and one moves up from the engine section. The engine-bump item is rewritten for the 2.130.1 lock. Every ticked item is now one entry, what fixed it and what is still open, so that the body stays inside GitHub's size limit.
- Last uk-data item covered: uk-data#591, an issue filed 2026-10-15. No later item existed at 10:45 UTC on 15 October. The next review starts at uk-data#592.
- Scope: the 13 items from uk-data#579 (14 October) to uk-data#591: 2 PRs and 11 issues. Earlier reviews covered uk-data#486 to uk-data#519 (2 October), uk-data#520 to uk-data#547 (8 October) and uk-data#548 to uk-data#578 (13 October).
- uk-data state: main is at
daad71c, release 1.58.1 (14 October). uk-data#576 released the second batch, with uk-data#518 (salary sacrifice within pay), uk-data#540, uk-data#541 and uk-data#555. - microcosm refs:
- main at
c28b453. Since the last review UK local release: nation-grain doctrine at K=15 and 2,000 epochs, a 100,000-household release path, line-scoped gate exclusions, and the QRF tail surface #1242, Draw SPI-channel incomes at the FRS twin's conditional rank (#840) #1256, Carry the compile's unresolved references to the UK compile-parity gates, and retire the 2023 gate #1257, UK: lcfs_consumption on LCFS 2024-25, with the energy, income-band and prepayment fixes (#1164) #1260 and UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271 merged on the UK side. - Open PRs named here: Measure Scotland's BRMA × council overlap; keep BRMA rents out of council targets #1092, UK: source the extended-hours usage draw from DfE additional-hours PTEs (#1126) #1127 (draft), UK spine: refuse malformed FRS claimant roles directly; check every supplied role reaches the engine #1205 (draft) and Spread each UK household's BRMA across its local clones #1273 (draft). Map FRS EMPSTATI 11 to OTHER_INACTIVE and refuse unknown adult codes (uk-data#526 parity) #1097 and UK clone stages can number identifiers past the 32-bit range policyengine-uk stores #1194 were closed on 15 October, as shipped by UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271.
- The last microcosm item at review was Bind local-authority energy and regional bus journeys before the Budget (#1207) #1286.
- main at
- Code locations: paths are relative to
packages/microcosm-build/src/microcosm/build/. Line numbers are at mainc28b453in items added or rewritten on 15 October, at48c0799in items from 13 October, at75167a6in items from 8 October, and at3598c38elsewhere. - Measurements: nothing new was measured for this review. New figures come from UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271's measurement arms (
experiments/1095-uk-data-ports-4-receipts.md) or from uk-data, cited as theirs. Weighted aggregates only. Cells under 10 records are suppressed. - Engine: microcosm locks policyengine-uk 2.130.1 and policyengine-core 3.33.3 on the UK side since UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271. PyPI is at 2.132.6 (15 October).
- Weight context: on 30 September the SPI channel held 47.6% of microcosm's calibrated household weight (13.8m of 29.0m households), against 27.7% for uk-data's SPI half. An SPI-row defect therefore weighs about 1.7 times as much here.
How to update this issue
- List uk-data items numbered above the last one covered:
gh api "repos/PolicyEngine/policyengine-uk-data/issues?state=all&sort=created&direction=desc&per_page=30". - Check each new item against microcosm main and the open microcosm PRs, and add it to the right section below.
- Re-check the merge state of the uk-data and policyengine-uk PRs named here.
- Tick an item once microcosm main has the fix, and name the PR.
- Move an engine item up once its policyengine-uk change is in the lock.
- Update the audit record (date, time, last item covered, refs) and post a comment summarising the changes.
- Keep the body under GitHub's 65,536-character limit: cut each ticked item to one entry, what fixed it and what is still open.
Fix in microcosm now: no policyengine-uk change needed
- FRS dividends are overwritten by an SPI draw. uk-data#498. Fixed by UK: port the unblocked uk-data fixes tracked in #1095 #1100: FRS respondents keep their reported dividends.
- 16–19-year-old dependants in SPI rows get taxpayer earnings. uk-data#504. Fixed by UK: port the unblocked uk-data fixes tracked in #1095 #1100.
-
council_taxis the bill after council tax reduction. uk-data#496. Fixed by UK: port the unblocked uk-data fixes tracked in #1095 #1100, with Scottish water and sewerage netted at the gross cells. Still open: María's signatures on UK: port the unblocked uk-data fixes tracked in #1095 #1100's two register texts; and UK: supply the engine's local_authority input from the ladder's local_authority_code, plus council tax follow-ups from policyengine-uk#1855/#1864 and uk-data#482/#484 #953 and WS-C deferred adjudications and the reconciliation layer #736's CT-C item, which still describe the FRS bill as gross of the reduction. - OBR table 4.9 benefit rows are measured over the UK. Follow-up to uk-data#490; uk-data#542, uk-data#583 and uk-data#588 are the counterparts. Fixed by UK: port the unblocked uk-data fixes tracked in #1095 #1100 (each row binds Great Britain or England and Wales, and
obr.pipbindspip + dlaover England and Wales) and UK: port the #1095 fixes that need no new policyengine-uk release #1200 (the two PIP daily-living caseload rows, held as diagnostics). uk-data#588's fix puts all eight rows on Great Britain, so it would differ from uk-data#542 and from main on the four England-and-Wales rows. Still open: the geography on the facts themselves, requested in UK facts for the microcosm#1095 ports: HMRC Stamp Tax Statistics and the corporate share of SDLT, DWP's Move to UC claim rates, the geography of OBR table 4.9's DWP lines, and HBAI with vintages chronicle#357. - Scottish ADP and CDP benefit codes are not mapped. uk-data#500. Fixed by UK: port the unblocked uk-data fixes tracked in #1095 #1100.
- SPI rows carry benefit claims nobody observed. Remainder of uk-data#514. Fixed by UK: port the unblocked uk-data fixes tracked in #1095 #1100: the
spi_benefit_coherencestage and its gate. Not ported, on purpose: the HB/CTR zeroing and the PC/CB rules, which UK pensions: resident State Pension, Pension Credit, contributions and salary-sacrifice relief (#1069) #1084 and UK spine follow-ups: SPI donors funded, WAS coherence, residential split, Child Benefit, release-cut blockers (#1063) #1089 supersede. - Local targets and predictors use the age-18 child. uk-data#486. Fixed by UK: port the unblocked uk-data fixes tracked in #1095 #1100 and UK: port the remaining uk-data fixes tracked in #1095, engine items included #1121. Still open: María's signature on the reworded
uc_unit_vs_household_grainadjudication and census fence. - Buy-to-let is missing from
other_residential_property_value. Part of uk-data#501. Fixed by UK: port the unblocked uk-data fixes tracked in #1095 #1100. - SPI benefit units' capital ignores their capital income. uk-data#495. Fixed by UK: port the unblocked uk-data fixes tracked in #1095 #1100.
- Property income. uk-data#503, uk-data#509. Fixed by UK FRS spine: stop counting lodgers' rent and property losses as property income; sub-letting rent for every tenure #1081 (lodgers' rent and losses), UK: port the remaining uk-data fixes tracked in #1095, engine items included #1121 (the rent boarders and lodgers pay) and UK: port the #1095 fixes that need no new policyengine-uk release #1200 (the CGT residential signal of loss-making landlords).
- BRMA weights. uk-data#515, uk-data#516. Fixed by Weight UK BRMA assignment by census private-rented households #1087. Still open: the next item.
- Private rent and BRMA at the assigned area. uk-data#521 and uk-data#579 (both drafts); tracked here as UK private rent at the assigned area (#1123 item 4, "PR B"): what is in place and the pieces still missing #1262.
- Where:
frs_brmais a spine stage that draws each private renter's BRMA within the region, before areas are assigned, so the copies of a household share one BRMA wherever they are placed. Nothing after the area assignment touchesrent. - uk-data#521 weights each private renter's BRMAs by the density of their rent on each BRMA's list for homes of their size, keyed on bedrooms. uk-data#579 splits each private renter into four records at spaced quantiles of its BRMA distribution, in LHA-rate order, and calibrates each group as one household.
- Here: UK private rent at the assigned area (#1123 item 4, "PR B"): what is in place and the pieces still missing #1262 sets out one direction: derive the BRMA from the assigned area, then redraw the rent from that area's list. Spread each UK household's BRMA across its local clones #1273 (draft, not measured) takes uk-data#579's spacing to the local clones. The national line keeps the spine draw, and
microcosm-calibratehas no clone weight tie, which Spread each UK household's BRMA across its local clones #1273 names as its follow-up. - Ruling needed, with Max: the direction (UK private rent at the assigned area (#1123 item 4, "PR B"): what is in place and the pieces still missing #1262 or Spread each UK household's BRMA across its local clones #1273), and whether the national line gets split records too. A comment on uk-data#521 of 13 October asks.
- Related: Scottish private-rent targets: PIPR is BRMA-grain, so council cells cannot bind by translation #1090 and Measure Scotland's BRMA × council overlap; keep BRMA rents out of council targets #1092 (Scottish private-rent targets at BRMA grain).
- Where:
- HBAI validation: fold into UK scorecard: populace_uk_2023 vs enhanced_frs_2024_25 vs admin benchmarks (2026) #731. uk-data#487.
- Correction: the BHC poverty on the calibrated UK national line measures 8.7 % against HBAI ~17 %: diagnose the gap #968
hbai_basiscompares engine year 2024 with HBAI FYE 2024. Period 2024 is FRS FY2024/25 (docs/uk-uc-paid-target-contract.md), which is HBAI FYE 2025. - Against FYE 2025: the v21c scorecard sits inside HBAI's 95% confidence intervals for relative poverty (14.63% before housing costs, 19.31% after). Its median is 6.7% above HBAI's.
- Fix (validation only, never bound): re-base to FYE 2025; report each statistic as inside or outside its interval; source the tables through a PolicyEngine/chronicle package that records vintages, since DWP revises FYE 2022–25 in March 2027. UK facts for the microcosm#1095 ports: HMRC Stamp Tax Statistics and the corporate share of SDLT, DWP's Move to UC claim rates, the geography of OBR table 4.9's DWP lines, and HBAI with vintages chronicle#357 (filed 14 October) asks for it.
- Re-measure at the next bump: policyengine-uk 2.131.2 takes
housing_service_chargesoff income after housing costs, and 2.132.4 resets negative income before housing costs to zero.
- Correction: the BHC poverty on the calibrated UK national line measures 8.7 % against HBAI ~17 %: diagnose the gap #968
- Access-fund period code. From Vahid's review of #1100. Fixed by UK: port the remaining uk-data fixes tracked in #1095, engine items included #1121.
- GB pension-age Housing Benefit spending row. Fixed by UK: port the remaining uk-data fixes tracked in #1095, engine items included #1121:
dwp.hb.amount_pension_agebinds the calendar-2025 window. -
is_blindis never set. uk-data#523. Fixed by UK: port the remaining uk-data fixes tracked in #1095, engine items included #1121 (SPCREG1). Watch: whether uk-data takes local-authority registration in place of the certificate. - UC start-up period. uk-data#527. Fixed by UK: port the remaining uk-data fixes tracked in #1095, engine items included #1121, porting uk-data#527 at
bd89131. Watch: uk-data#527 is still a draft; re-check the port if its rule changes. - Property in UC and Pension Credit capital. uk-data#495. Fixed by UK: port the #1095 fixes that need no new policyengine-uk release #1200, and complete for UC since UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271, whose engine projects a stored
uc_reported_capitalby GDP per head (pe-uk#2201). Still open: secured debt (see "Secured debt and the share/trust split"); a pension-age unit's property, where the household's reference person is of working age, reaches no Pension Credit assessment; María's signature on the redrafteduc-reported-capital-net-new-columntext. - The UC take-up population follows the old engine rule. The remainder of uk-data#486 and uk-data#524. Fixed by UK: port the #1095 fixes that need no new policyengine-uk release #1200. Not mirrored, and named in the engine lockstep test: claimants aged 16–17, mixed-age couples on the Pension Credit route, and, since UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271, a pension-age family moved onto Universal Credit at the legacy closure. Still open: Max's
uk-take-up-per-person-spabranch needs a rebase. - UC gainful self-employment. uk-data#525. Fixed by UK: port the #1095 fixes that need no new policyengine-uk release #1200 on FRS rows and by Draw SPI-channel incomes at the FRS twin's conditional rank (#840) #1256 (merged 14 October) on drawn SPI-channel rows, which now take the whole rule (
uk_runtime/spi_income.py,_refresh_uc_gainful_self_employment). - FRS EMPSTATI 11 is mapped to long-term disabled. uk-data#526. Fixed by UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271, which carries Max's commits from Map FRS EMPSTATI 11 to OTHER_INACTIVE and refuse unknown adult codes (uk-data#526 parity) #1097 (closed) with his authorship: code 11 is OTHER_INACTIVE, and a blank or unknown adult code refuses.
- SPI-channel incomes ignore the donor's employment status. uk-data#529, the adult half of uk-data#504. Fixed by Draw SPI-channel incomes at the FRS twin's conditional rank (#840) #1256 (merged 14 October), which closed UK spine: composition-faithful SPI income draw — bridge predictors and rank-preserving replacement (with-children UC residual) #840: the SPI forest conditions on main source of income, pay, trade and State Pension age, derived alike on the tape and the FRS twin, and draws each copy at its twin's rank; its residuals are in UK SPI channel after #840: residuals, post-merge measurements and stale pointers #1288. Ruled in Draw SPI-channel incomes at the FRS twin's conditional rank (#840) #1256: the main source is the largest of pay, pension and trade on both sides, and must agree with the tape's MAINSRCE on at least 95% of weighted records; uk-data#551 reads MAINSRCE and the FRS main job's status instead. Ruling still needed: uk-data#529 also binds LFS employee and self-employed levels (no Chronicle package yet) and stops binding the local HMRC employment-income counts, which count part-year earners. Here those counts bind at constituency and local-authority level.
- UC payment-band targets: penny awards and the top band. uk-data#530. Fixed by UK: port the #1095 fixes that need no new policyengine-uk release #1200; the "£2,500.01 or over" band stays unbound (ruling of 10 October). Still open: the next item.
- UC award bands: the awards below the top band, and a support floor for sparse bands. From UK: port the #1095 fixes that need no new policyengine-uk release #1200's measurement and Vahid's review of #1121.
- Awards below the top band are too low. With the top band unbound, the calibration holds 2.57 times DWP's count of lone parents in it and 1.99 times for couples with children, £13.1bn of UC, and reaches OBR's £76.1bn. So the model's awards below the top band are too low for DWP's band counts and OBR's total to fit together. This needs its own issue.
- Sparse bands: 19 sparse-band exclusions of the uk-data#452 class expire on 2026-11-26. Without a pooling or minimum-support rule, every engine or data change that moves a few households across a band edge needs another signed entry.
- Fix: the support floor that UK: port the #1095 fixes that need no new policyengine-uk release #1200's plan held, in its own PR, before the exclusions expire.
- UC households with five or more children: held out until 26 November. From UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271.
- Where:
uk/calibration_measure_exclusions.jsonholdsdwp.uc.households_children_5_or_moreout of the calibration until 2026-11-26, tracking this issue (María's ruling of 14 October). - Why: DWP counts about 21,000 more Universal Credit households with five or more children than its two-child-limit counts of families with five and with six or more. Since UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271 reads approved training right, the frame's two counts agree on every family, so the calibration cannot meet both. The two-child-limit rows stay bound.
- Ruling needed before expiry: retire the row, rebind it to a count that agrees with the two-child-limit rows, or renew it.
- Where:
- Salary-sacrifice relief by tax band. uk-data#533. Fixed by UK: port the #1095 fixes that need no new policyengine-uk release #1200. Since UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271 the allocation extends a Gift Aid donor's bands by the grossed-up gift, as the engine does from 2.128.0 (pe-uk#2271).
- Northern Ireland domestic rates. uk-data#520.
- Done by UK: port the #1095 fixes that need no new policyengine-uk release #1200, the council tax row:
obr.council_taxbinds OBR table 4.1 row 15, the England, Scotland and Wales receipts, over Great Britain's households. Row 19, bound before, adds Northern Ireland domestic rates and two adjustments no household carries. uk-data#584 reports the same mismatch in uk-data. - Still open, the level:
domestic_ratesis NIRATLIA, else RT2REBAM, × 365.25/7 (uk_runtime/frs_spine.py), uk-data's rule, whose build carries £0.54bn against Land & Property Services' £0.89bn paid in 2024-25. - Still open, the domestic rates row:
obr.domestic_ratescompiles no fact (held on its N92000002 pin), and the line it would bind looks like the district rate only. - Ruling needed: before activating
obr.domestic_rates, choose a whole-bill total and whether it is gross or net, then measure.
- Done by UK: port the #1095 fixes that need no new policyengine-uk release #1200, the council tax row:
- Children placed by a local authority. Fixed by UK: port the #1095 fixes that need no new policyengine-uk release #1200:
is_looked_after_by_local_authority. - Pension Credit take-up: Great Britain only, and newly entitled units. The remainder of uk-data#510. Fixed by UK: port the #1095 fixes that need no new policyengine-uk release #1200.
- OBR total NICs and the class rows disagree. uk-data#537. Fixed by UK: port the #1095 fixes that need no new policyengine-uk release #1200:
obr.niis a diagnostic beside the three class rows. - Savings interest follows a different index from the engine's. uk-data#532, uk-data#541. Fixed by UK: port the #1095 fixes that need no new policyengine-uk release #1200. Kept on purpose: the SPI donor rebase stays on household interest income.
- Calibrated weights read 0.72% high at 2025. The same mechanism as uk-data#538, with the opposite sign; WS-E spine deferrals: known bugs and signed inconsistencies awaiting their increment #796 A19. Fixed by UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271: the release divides
household_weightby the locked engine's own population factor, so the engine returns the solved weights at 2025. Dataset scores from UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271 on are not comparable with earlier ones. -
property_wealthis frozen at the survey year. uk-data#543. Fixed by UK landlords: bind the SPI net property amounts, leave property_wealth to the engine, add receipts and finance costs #1145. Still open: see "WAS property categories the engine does not sum". - Extended-hours usage draw. uk-data#546 (draft); tracked here as UK: extended-hours usage draw (mean ~15 of 30) leaves free early-years spending at £5.8bn vs DfE £9.9bn #1126, in draft as UK: source the extended-hours usage draw from DfE additional-hours PTEs (#1126) #1127.
- Where: the hours cap is Normal(15.019, 4.972), frozen by Port post-freeze UK childcare/TFC spine inputs and calibration contract #834's adjudication (
uk/take_up_contract.json). - Ruling needed between two anchors: uk-data#546 uses DfE registered hours for 9-month to 2-year-olds, Normal(36.026, 14.111); UK: extended-hours usage draw (mean ~15 of 30) leaves free early-years spending at £5.8bn vs DfE £9.9bn #1126 uses 3–4 additional-hours PTEs, Normal(31.141, 4.972). Then refit the extended take-up rate.
- Both drafts are untouched since 7 October.
- Where: the hours cap is Normal(15.019, 4.972), frozen by Port post-freeze UK childcare/TFC spine inputs and calibration contract #834's adjudication (
- Self-employment gross receipts. Split from the landlord item, which UK landlords: bind the SPI net property amounts, leave property_wealth to the engine, add receipts and finance costs #1145 fixed. Low priority.
- Where: microcosm writes no
self_employment_gross_receipts. Since policyengine-uk 2.108.0, in the lock, the trading allowance replaces expenses and does not stack on them. Without receipts the engine relieves a profit of £1,000 or less in full and gives a larger profit no allowance, so taxable profit jumps from nil to the whole profit just above £1,000. - Fix: find a receipts source for the self-employed (the FRS job record or the SPI tape), as UK landlords: bind the SPI net property amounts, leave property_wealth to the engine, add receipts and finance costs #1145 did for landlords, or sign the approximation.
- Where: microcosm writes no
- Director dividends and owner-managers. Moved here from the engine section.
- In the lock since UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271: pe-uk#1965 (2.130.0) models Universal Credit's regulation 77 for owner-managers of a company, with eleven owned-company inputs. The build writes none of them, so each defaults to no company.
- Data gap: neither repository reads adult DIVIDNET or job DIVIDEND (£12–20bn a year net).
- Fix: write the owner-manager inputs from the FRS job record, or sign their absence.
- Additional-dwelling and non-residential purchases are not drawn, so the engine charges the whole property stock. uk-data#556, fixed there by uk-data#573 (draft).
- Where:
uk_runtime/frs_household_draws.py:74-81draws onlyproperty_purchasedand the first-home flag. Nothing writesadditional_residential_property_purchasedornon_residential_property_purchased. - Why: the locked engine then takes the whole
other_residential_property_value(buy-to-let included since UK: port the unblocked uk-data fixes tracked in #1095 #1100) as an additional purchase at the higher rates, and the whole non-residential stock, for every household that drew a main-home purchase (pe-uk#2238). - Measured by UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271, on calibrated files at 2.130.1: household SDLT is £15.03bn, on OBR's line, and £9.70bn of it is on main-home purchases. At the spine's weights it is £6.4bn, so the calibration reaches OBR's line by raising it about 2.3 times through the weights.
- Engine side: pe-uk#2241 (open) makes both inputs nil unless the data supplies them, which took household SDLT on uk-data 1.58.0 from £16.3bn to £7.6bn in 2025 (uk-data's measurement). Without the purchases,
obr.sdltwould push main-home SDLT up to fill the gap. - Fix: port uk-data#573: at most one purchase of each type a year, a hazard proportional to the stock among owners of at least £40,000, and a price drawn from HMRC's price bands and capped at the stock. Land it no later than the bump that brings pe-uk#2241. uk-data sets the level inside the stage; here HMRC's Stamp Tax tables would be bound, and UK facts for the microcosm#1095 ports: HMRC Stamp Tax Statistics and the corporate share of SDLT, DWP's Move to UC claim rates, the geography of OBR table 4.9's DWP lines, and HBAI with vintages chronicle#357 asks for them.
- Where:
-
obr.sdltfits households to the SDLT that all buyers pay. uk-data#564, fixed there by uk-data#569 (draft).- Where:
uk/uk_population_targets.json:2112bindsstamp_duty_land_taxto OBR's SDLT line (£15.0bn at the calendar-2025 window), which covers companies too. The locked engine addscorporate_sdlton top (£3.1bn on UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271's files). uk-data#564 puts non-natural persons at 32.3% of 2024-25 receipts, from HMRC's statistics. - Fix: bind households to the OBR line less corporate SDLT. uk-data subtracts the engine's own statistic. Here target values compile from Chronicle facts, and UK facts for the microcosm#1095 ports: HMRC Stamp Tax Statistics and the corporate share of SDLT, DWP's Move to UC claim rates, the geography of OBR table 4.9's DWP lines, and HBAI with vintages chronicle#357 asks for HMRC's buyer-type tables and the corporate share in OBR's forecast years. Or measure
stamp_duty_land_tax + corporate_sdltagainst the whole line. - For the right level: pe-uk#2322 (draft, stacked on the draft pe-uk#2235) updates the corporate statistic to £4.8bn in 2025-26. pe-uk#2235 also stops
gov_taxcounting corporate SDLT twice. - Ruling needed: fix now on the old statistic, or at that bump. Land it with the purchases item above; uk-data keeps the two in one batch.
- Where:
- The ETB VAT rate can be negative or above one. uk-data#565, uk-data#572 (draft). Fixed by UK: lcfs_consumption on LCFS 2024-25, with the energy, income-band and prepayment fixes (#1164) #1260, which closes UK ETB VAT: the full-rate VAT expenditure rate leaves [0, 1] (uk-data#572's ETB half) #1225: the rate is held in [0, 1] and drawn on disposable income on the ETB's own concept.
- Clone stages number identifiers past the 32-bit range policyengine-uk stores. uk-data#558; UK clone stages can number identifiers past the 32-bit range policyengine-uk stores #1194. Fixed by UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271: the release numbers each entity's identifiers from 1 and keeps the build's as
person_build_id,benunit_build_idandhousehold_build_id, and the calibration measures the engine on the release's identifiers. UK clone stages can number identifiers past the 32-bit range policyengine-uk stores #1194 is closed. Watch: pe-uk#2273 (draft) warns on such identifiers and may later raise. - Approved training is read from the wrong FRS field. uk-data#560, uk-data#561 (open). Fixed by UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271: TRAINEE on child-table records, and the TRAIN2 reading is dropped. Watch: re-check the port if uk-data#561's rule changes before it merges.
- Nothing targets the age mix inside 15 to 19. uk-data#563. Fixed by UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271: the national 15–19 bands split into 15, 16–17 and 18–19 by sex. Ruling still needed: whether to target 16- to 19-year-olds in education or approved training, and from which source.
- Salary sacrifice above pay. The final rule of uk-data#518, released in uk-data 1.58.1. Fixed by UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271: every amount is limited to its pay, the forest trains on respondents with pay, and the conversion moves at most half the pay.
- Statutory paternity pay is never set. uk-data#575. Fixed by UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271: SPPADJ, annualised like sick and maternity pay. Ruling still needed: × 365.25/7 treats a payment of at most two weeks as a year's; decide it with "Weekly amounts". Watch: pe-uk#2368 (draft) charges income tax on it.
- Alcohol duty, tobacco duty and vehicle excise duty are zero for every household. uk-data#566 (closed as not planned). Low priority.
- Where: the locked engine charges all three from quantity inputs (pe-uk#1876, since 2.102.0): litres and strength by drink, tobacco by quantity, and each car's details. No stage writes any of them, so each defaults to zero. microcosm carries only
alcohol_and_tobacco_consumption, a spending total. - Fix: a new imputation, not a port: quantities from the LCFS diary, and car details from another source. pe-uk#1872, pe-uk#1873 and pe-uk#1874 stay open for it upstream, and UK consumption-tax levels: open items after #1167 #1207 lists it as deferred, with no issue.
- Ruling needed: open an issue now, or wait for a Budget measure on these duties.
- Where: the locked engine charges all three from quantity inputs (pe-uk#1876, since 2.102.0): litres and strength by drink, tobacco by quantity, and each car's details. No stage writes any of them, so each defaults to zero. microcosm carries only
-
obr.esabinds ESA alone, but OBR's line also counts Severe Disablement Allowance, Incapacity Benefit and Income Support's incapacity part. uk-data#582.- Where:
obr.esa(uk/uk_population_targets.json:2508) measuresesa_income + esa_contribover Great Britain against table 4.9's incapacity benefits line, whose footnote, as uk-data#582 reads it, also takes in those three. - Why: the spine writes
sda_reported(FRS benefit code 10), and the locked engine pays each reporter the maximum SDA rate, but the row leavessdaout, so the calibration fits ESA to a line that also holds SDA.incapacity_benefitwould add nothing, because the release dropsincapacity_benefit_reported(uk_runtime/national_frame.py:485-487). Income Support's incapacity part has no engine variable. - Fix: measure
esa_income + esa_contrib + sda, after sizing SDA on the spine. - Ruling needed: take Income Support's incapacity part off the target with a DWP fact, or record it as a residual.
- Where:
- The incumbent parity fixture keeps uk-data's Scottish row placement. Found through uk-data#589. Low priority: no bound target moves.
- Where:
tools/extract_uk_local_registry_fixture.py:205-217maps the incumbent's constituency age, income and devolved-housing rows with uk-data's 2010-to-2024 matrix, then labels them by position on the 2024 roster. At the fixture's pin (12a1e028) the matrix's rows hold five unchanged Scottish seats under their 2010 codes, so all 57 Scottish rows carry another seat's values. uk-data#589 reorders them by code in uk-data. - Why: the fixture feeds the incumbent-surface evaluation and the local compile-parity register, which signs those Scottish rows as vintage-and-scaling or scaling-and-operation differences. Adopt the UK local-geography and firms contracts and compile the local target surface (#708, #759) #795 fix-and-signed the same kind of error for UC only.
- Fix: extend Adopt the UK local-geography and firms contracts and compile the local target surface (#708, #759) #795's fix-and-sign to the mapped rows, reordered by the matrix's own codes, and re-sign the moved rows; or re-extract at a uk-data release that carries uk-data#589.
- Where:
Depends on policyengine-uk model updates
microcosm locks policyengine-uk 2.130.1 on the UK side since #1271, and since #1143 each country has its own policyengine-core pin, so any policyengine-uk release can be locked. Each item names the policyengine-uk change it needs and that change's state on 15 October 2026.
- Legacy-benefit reporters never move to UC. uk-data#492; the data half is uk-data#534 (draft).
- In the lock since UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271: pe-uk#2119 (2.128.0). A family whose legacy benefit DWP has closed, tax credits from 2025-26, loses its other legacy benefits and claims UC unless
would_claim_uc_at_legacy_closuresays otherwise. The build leaves the flag at the engine's default, true, so every such family claims, and the 2025 Universal Credit rows rest on that default. - Needs: DWP's Move to UC claim rates by legacy-benefit combination as Chronicle facts, which UK facts for the microcosm#1095 ports: HMRC Stamp Tax Statistics and the corporate share of SDLT, DWP's Move to UC claim rates, the geography of OBR table 4.9's DWP lines, and HBAI with vintages chronicle#357 asks for; pe-uk#1914 (issue, no PR) for income-related ESA; pe-uk#1910 (open), working-age HB abolition, waiting on uk-data#534. pe-uk#2395 (issue) would apply the closure to the claimant and partner only.
- Then: draw the flag for legacy reporters without a UC report, after
spi_benefit_coherence, on its own identity-keyed stream, in uk-data#534's form: units already claiming are set to true and the rest drawn at (r − p) / (1 − p), where r is DWP's rate and p the share of the combination that already claims. The rates are also the new evidence WS-E spine deferrals: known bugs and signed inconsistencies awaiting their increment #796 asks for before the frozen 0.55 take-up rate changes.
- In the lock since UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271: pe-uk#2119 (2.128.0). A family whose legacy benefit DWP has closed, tax credits from 2025-26, loses its other legacy benefits and claims UC unless
- Rent liability for sharers, boarders and lodgers. uk-data#511, uk-data#512, uk-data#506. Fixed by UK: port the remaining uk-data fixes tracked in #1095, engine items included #1121 on policyengine-uk 2.122.2. Still open: the householder's receipt from boarders and lodgers; see "Sub-letting and rent-a-room".
- Sub-letting and rent-a-room. uk-data#508, split from the rent-liability item.
- Needs: pe-uk#1995 and pe-uk#2002, both drafts (pe-uk#2002 is stacked on pe-uk#1995).
- Where: SUBRENT sits in
property_income(UK FRS spine: stop counting lodgers' rent and property losses as property income; sub-letting rent for every tenure #1081 counts it for every tenure, as uk-data#509 does). microcosm's own householdsubrentcolumn is redrawn for SPI copies and read by nothing. - Ruling needed: does SPI INCPROP already include rent-a-room receipts?
- Pension Credit reported capital. uk-data#513. Fixed by UK: port the remaining uk-data fixes tracked in #1095, engine items included #1121; UK: port the #1095 fixes that need no new policyengine-uk release #1200 added the household's countable property.
- Severe disability flag. uk-data#494. Fixed by UK: port the remaining uk-data fixes tracked in #1095, engine items included #1121.
- Secured debt and the share/trust split. uk-data#501; Max set out the unported parts in a comment here on 12 October.
- Needs: pe-uk#1969 (open) for the secured-debt inputs; pe-uk#1974 (open), which adds
directly_held_shares,unit_and_investment_trustsandshare_like_capital; and pe-uk#2131 (open, stacked on pe-uk#1969), which exempts unit trusts and ISAs from the 10% sale-expense deduction, an open methodology decision of Max's. - Share split, at the bump: the WAS stage draws
corporate_wealth_excl_isaas one target (uk_runtime/was_wealth.py). uk-data#501 exportsdirectly_held_shares(DVFShUKVR8_aggr+DVFESHARESR8_aggr) andunit_and_investment_trusts(DVFCollVR8_aggr), withcorporate_wealththeir sum plusstocks_and_shares_isaon every row. - Secured debt on other property, at the bump: three inputs, each drawn after its asset and 0 where the asset is 0:
other_residential_property_secured_debt(DVHseDebtR8_sum+DVBLtDebtR8_sum),non_residential_property_secured_debt(DVBldDebtR8_sum) andowned_land_secured_debt(DVLUKDebtR8_sum). Each is part ofHMortGR8, so ofmortgage_debt: never add it tomortgage_debt. - Vehicle: the WAS property-draw PR that UK: port the #1095 fixes that need no new policyengine-uk release #1200 left for later (María's ruling of 12 October). On the WAS donor file, mortgages on other property are 26% of its value. Until then UK: port the #1095 fixes that need no new policyengine-uk release #1200's recorded capital counts property at 90% of its value with no debt taken off, and these inputs reach UC and Pension Credit only through that recorded figure.
- Check on the donor: uk-data found that one shared quantile per household inflated the sparse debt targets many times over, until each target drew on its own seed. microcosm's forest advances its stream target by target, so it should not arise; confirm it from secured-debt incidence among asset holders.
- Reconcile with UK spine follow-ups after #1045: SPI band donors as a mass-conserving support channel, WAS tenure coherence, the residential draw's bound and Table 7 composition, then a national build #1063's mortgage rule:
mortgage_debtisHMortGR8, which includes £234bn secured on other property. Choose between all secured debt and main residence only (TotMortR8, £1,014bn), so the debt is not counted twice.
- Needs: pe-uk#1969 (open) for the secured-debt inputs; pe-uk#1974 (open), which adds
- Person-type variables. uk-data#486, uk-data#524. Fixed by UK: port the remaining uk-data fixes tracked in #1095, engine items included #1121.
- Mixed-age couple Pension Credit saving. uk-data#519. Fixed by UK: port the remaining uk-data fixes tracked in #1095, engine items included #1121, stored at survey-year facts.
- Marriage Allowance. uk-data#502.
- Needs: pe-uk#1963 (draft).
- Current state: microcosm reads neither MAIND nor PAS; its take-up flag is a Bernoulli(0.5) draw.
- At the bump: re-measure recipients against HMRC's 2.35m.
- For UK spine: composition-faithful SPI income draw — bridge predictors and rank-preserving replacement (with-children UC residual) #840: the proposed
MAIND ↔ is_marriedbridge is wrong-sided, because MAIND flags recipients only.
- Published LHA rates (pe-uk#2022) and pension-age Housing Benefit new claims (pe-uk#1901). In the lock since UK: port the remaining uk-data fixes tracked in #1095, engine items included #1121.
- Landlord receipts and finance costs. pe-uk#2172. Fixed by UK landlords: bind the SPI net property amounts, leave property_wealth to the engine, add receipts and finance costs #1145. Still open: Max's ruling on the FRS add-back of finance costs (pe-uk#2390, open, asks that HBAI and market income read property income after finance costs);
property_finance_costs_brought_forwardis unset; SUBRENT keeps receipts equal to profit until rent-a-room is modelled; finance costs run 16% under HMRC's statistics at the calibrated weights. The self-employed have the same gap: see "Self-employment gross receipts". - Self-employment losses. uk-data#528 (draft).
- Needs: a bump to 2.131.0 or later. pe-uk#2085, merged on 14 October, makes
trading_lossthe year's loss as an input and relieves it by each programme's rule. It also addsloss_relief, losses brought forward, which only income tax reads. Until the bump the data change is neutral. - Where:
self_employment_incomeis max(0, SEINCAM2) (uk_runtime/frs_spine.py:542), so the FRS's recorded losses are dropped, and SPI rows net LOSSBF into profit (uk_runtime/spi_income.py:1723-1726). - At the bump: split SEINCAM2 into profit and
trading_loss, carrytrading_losson SPI-channel rows, and decide whether SPI's LOSSBF moves toloss_relief.
- Needs: a bump to 2.131.0 or later. pe-uk#2085, merged on 14 October, makes
- Which joint occupier a non-dependant lives with. uk-data#522 (draft). Low priority.
- Needs: pe-uk#2035 (draft), which adds
non_dependant_normally_resides_with. pe-uk#2055 (draft) addsjoint_tenant_in_household_head_household. - Have: the FRS relationship grid (
uk_runtime/frs_relationships.py:95-101) and UK: port the remaining uk-data fixes tracked in #1095, engine items included #1121's shared-household rule. - Size: fewer than 10 FRS 2024-25 survey households in uk-data#522's runs, with no HB, CTR or UC amount moving.
- Needs: pe-uk#2035 (draft), which adds
- Weekly amounts: 365.25/7 in, 52 out. uk-data#531.
- Where: the FRS spine annualises weekly amounts with 365.25/7 (
uk_runtime/frs_spine.py:64; alsofrs_council_tax.py,frs_hmrc_source.py,lcfs_consumption.py), while policyengine-uk's weekly rules convert back with policyengine-core's 52. Weekly-tested amounts reach HB, CTR, Pension Credit and non-dependant tests 0.34% high. - Ruling needed: one contract with uk-data. Annualising with 52 in the data fixes the weekly tests but understates every annual rule by the same 0.34%. The clean fix is the engine converting with 365.25/7 where a rule is weekly; no policyengine-uk issue exists yet. Statutory paternity pay's annual amount (UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271) and
hours_worked(see the bump item) belong to the same decision.
- Where: the FRS spine annualises weekly amounts with 365.25/7 (
- The HMRC income bands leave out other investment income. pe-uk#2174, fixed by pe-uk#2184 (open).
- Where: the HMRC regional, national and ITL income-band targets slice on policyengine-uk's
total_income, which leaves outother_investment_incomealthoughincome_taxcharges it. microcosm fills that column from SPI OTHERINV (uk_runtime/spi_income.py:224). - Effect, now contained: the West Midlands £12,570–15,000 cell sat at +28.9% on a calibration of UK: port the remaining uk-data fixes tracked in #1095, engine items included #1121's head, and UK: port the remaining uk-data fixes tracked in #1095, engine items included #1121 deferred it. UK landlords: bind the SPI net property amounts, leave property_wealth to the engine, add receipts and finance costs #1145 retired the deferral once the cell came inside the 25% bound, and One consistent UK target surface: enforced cross-grain reconciliation, declared uprating holds, nation household controls and the 942a1fa re-pin (#1123 PR A) #1198 reconciles the cell, which is at +0.2% on UK: port the #1095 fixes that need no new policyengine-uk release #1200's head. The target-fit register is empty.
- At the bump that brings pe-uk#2184: re-measure every band target.
- Where: the HMRC regional, national and ITL income-band targets slice on policyengine-uk's
- The policyengine-uk 2.130.1 bump. Done by UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271, from 2.123.0. It re-derived the pins, the concept coverage and the lock, followed the engine's Gift Aid band extension in the salary-sacrifice relief and the CGT taxable-income measure, and measured the engine on its own arm: all seven calibrated-seam gates pass on it.
- The next policyengine-uk bump. The lock is at 2.130.1. PyPI is at 2.132.6, and policyengine-uk's main holds nothing unreleased.
- Nothing microcosm writes is renamed, removed, re-typed, moved between entities or turned into a formula up to 2.132.6. One input is new:
loss_relief(2.131.0, trade losses brought forward, default 0). - Fails at the bump unless fixed in the same PR:
- from 2.131.0, the HBAI lockstep test (
packages/microcosm-build/tests/engine/uk/test_uk_hbai_gross_income_engine.py): the engine's HBAI deductions gaintrading_loss, soUK_HBAI_GROSS_INCOME_DEDUCTIONS(uk_runtime/household_income.py:32) and the stage predictor lists inuk/spec/sources.yamlneed it too (zero today); - from 2.132.4, nothing fails, but
hbai_gross_income(uk_runtime/household_income.py:79) goes wrong silently. HBAI net income before housing costs is now reset to zero when negative (pe-uk#2402), so net income plus the deductions no longer gives gross income for those households. It feeds the NEED energy band, the ETB VAT disposable income and the NTS income band. Readhbai_household_net_income_before_reset_to_zerothere, and decide which of the two figures the LCFS and ETB predictors read; - the usual re-derivations: the concept coverage (299 to 300 inputs), the version stamps in the uprating pins (values unchanged), the lock and its hash, the texts that cite 2.130.1, and the H2 fixture.
- from 2.131.0, the HBAI lockstep test (
- Re-measure: with
trading_lossandloss_reliefunset, 2.131.0's trade-loss rules move no bound target. The HBAI changes of 2.131.2 and 2.132.4 move the HBAI validation (UK scorecard: populace_uk_2023 vs enhanced_frs_2024_25 vs admin benchmarks (2026) #731) and the stages that band households on HBAI income. - Still open from the 2.130.1 bump:
benunit_reported_capital(pe-uk#2201) is not written, because microcosm records a different figure for each programme. Ruling needed: also store it, so that years past the dataset projection do not fall back to the household proxy.- Inputs left at the engine's default:
would_claim_uc_at_legacy_closure(see the legacy-benefit item),uc_receives_new_claimant_health_element(2.126.8; the engine draws it itself for 2026 to 2029),esa_includes_support_component(2.129.0; assumed for anyone with an ESA award of their own), and the owned-company inputs (see "Director dividends and owner-managers"). - Weekly hours:
hours_workedis annualised with 365.25/7, and the engine divides by 52. It gates Income Support, and from 2.129.1 ESA and JSA, so hours just under 16 or 24 a week cross the line. See "Weekly amounts".
- Watch:
- pe-uk#2187 (open) grosses VAT by a survey-consumption coverage of 0.67, derived on the certified Microcosm UK 2024-25 release. UK: lcfs_consumption on LCFS 2024-25, with the energy, income-band and prepayment fixes (#1164) #1260 moved consumption to LCFS 2024-25, so the coverage needs re-deriving; UK: lcfs_consumption on LCFS 2024-25, with the energy, income-band and prepayment fixes (#1164) #1260 lists those inputs as still to come.
obr.vatis held out of the fit until 2027-01-08 (UK consumption-tax levels: open items after #1167 #1207). - pe-uk#2383 (issue) would refresh the ONS population growth that the release's weight-year division reads (UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271), and the per-head indices in the uprating pins.
- pe-uk#2393 (issue) would evaluate
claims_all_entitled_benefitsper benefit unit and accept an optionalwould_claim_council_tax_reductioninput.
- pe-uk#2187 (open) grosses VAT by a survey-consumption coverage of 0.67, derived on the certified Microcosm UK 2024-25 release. UK: lcfs_consumption on LCFS 2024-25, with the energy, income-band and prepayment fixes (#1164) #1260 moved consumption to LCFS 2024-25, so the coverage needs re-deriving; UK: lcfs_consumption on LCFS 2024-25, with the energy, income-band and prepayment fixes (#1164) #1260 lists those inputs as still to come.
- Nothing microcosm writes is renamed, removed, re-typed, moved between entities or turned into a formula up to 2.132.6. One input is new:
- Universal and targeted hours for working-parent families. uk-data#545 (draft); pe-uk#2177, in the lock since UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271. Fixed by UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271:
dfe.funded_childcare.universal_only_childrenstays DfE's universal count less working-parent 3–4 registrations, and counts children on the universal hours who are not on the extended entitlement, as that difference does. uk-data#545 binds the whole universal count instead. Re-measure: the universal and extended take-up rates inuk/take_up_contract.jsonwere fitted on the engine before pe-uk#2177. - No child aged 9–11 months reaches the working-parent entitlement. uk-data#547 (draft). Moved here from "Fix in microcosm now".
- Ruling of 9 October (María): the fix belongs in policyengine-uk, whose childcare test should read age in months. microcosm keeps whole-year ages (
uk_runtime/frs_spine.py), and UK: port the #1095 fixes that need no new policyengine-uk release #1200 does not cover this item. - Needs: a policyengine-uk change that tests the 9-month minimum age against age in months. No issue or PR exists for it yet. pe-uk#2079 (2.114.2) set the minimum age at 0.75, and the test still reads whole-year
age. - Since UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271 the spine stores
months_since_last_birthday, drawn the engine's way, so such a test would find months for every child recorded as aged 0. uk-data#547 adds a drawn month to the age itself instead. - Still to settle with the engine change: the extended take-up rate is all-age, and
working_parent_children_2_to_4starts at age 2, so 9–11-month-olds would claim well above DfE's registration rate with nothing to constrain them.
- Ruling of 9 October (María): the fix belongs in policyengine-uk, whose childcare test should read age in months. microcosm keeps whole-year ages (
- Prepayment-meter input. uk-data#539; Populate the UK prepayment-meter input from LCFS #1110. Fixed by UK: lcfs_consumption on LCFS 2024-25, with the energy, income-band and prepayment fixes (#1164) #1260, which draws
uses_energy_prepayment_meterfrom the LCF's key and meter payments; the locked engine reads it since UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271 (pe-uk#2098, 2.123.3). It reaches nothing from 2025: the prepayment discount ran from July 2023 to March 2024. - WAS property categories the engine does not sum. uk-data#543 (draft, revised 13 October).
- Where: since UK landlords: bind the SPI net property amounts, leave property_wealth to the engine, add receipts and finance costs #1145 the engine derives
property_wealth. In the locked engine that ismain_residence_value+other_residential_property_value+non_residential_property_value.owned_landis outside it, so outsidetotal_wealthtoo, and reaches onlyhousehold_land_value. microcosm maps neither WAS overseas property (DVLOSValR8_sum) nor other real estate (DVOprValR8_sum), and folds buy-to-let intoother_residential_property_value(UK: port the unblocked uk-data fixes tracked in #1095 #1100). - Needs: the engine change that uk-data#543 now specifies, with no policyengine-uk PR yet: seven WAS categories, with buy-to-let, overseas property and other real estate as new inputs, and
property_wealthas the worldwide gross total. Then export the missing categories, and decide whether buy-to-let stays folded. - Ruling needed: worldwide or domestic
property_wealth, which uk-data#543 also asks its reviewers.
- Where: since UK landlords: bind the SPI net property amounts, leave property_wealth to the engine, add receipts and finance costs #1145 the engine derives
- War Widow's Pension is inside
bsp_reported: tracked as Split War Widow's Pension (FRS code 9) out of bsp_reported #1222. uk-data#578.- Needs: pe-uk#2382 (open), which adds
war_widows_pension_reported, uprated by CPI. Until it is in the lock the engine would ignore the new column and lose the income. - Where:
bsp_reportedsums FRS benefit codes 6 and 9 (uk_runtime/frs_spine.py:881-884). Code 9 is War Widow's or Widower's Pension. Bereavement Support Payment rates are frozen, while War Widow's Pension rises with CPI. - At the bump: write code 9 to the new column and carry it wherever
bsp_reportedgoes (the spine, the graph, SPI support andspi_benefit_coherence). Land it in step with uk-data, before policyengine-uk stops upratingbsp_reported. - Ruling needed: whether to take Widowed Parent's Allowance out of code 6 too.
- Needs: pe-uk#2382 (open), which adds
- Some qualifying young persons sit in a benefit unit of their own. uk-data#562. Low priority until uk-data chooses a design.
- Needs: pe-uk#2279 (open), which counts 16-year-olds outside education as qualifying young persons until the 1 September after their 16th birthday; and uk-data's choice between re-forming the units and exporting a link to the responsible adult's unit, which policyengine-uk would then have to read.
- Where: microcosm keeps the FRS's own benefit units (
uk_runtime/frs_spine.py). The FRS puts a 16- to 19-year-old in a parent's unit only as a dependent child, so a 16-year-old outside education and training heads a one-person unit. - Have: each person's relationship to the household reference person. UK spine: refuse malformed FRS claimant roles directly; check every supplied role reaches the engine #1205 (draft) refuses a unit with three adult records, so a re-formed unit must also change the young person's role.
- Size: uk-data's benefit estimates rest on fewer than 10 FRS households.
- OBR's VAT line includes VAT on private school fees. uk-data#567.
- Needs: pe-uk#2319 (draft, stacked on pe-uk#2235), which charges the fees from 1 January 2025. In the locked engine the fee rate is a reform parameter at zero, so
private_school_vatis £0 and nothing overlaps yet. - Where:
obr.vatbindsvatto total VAT receipts (uk/uk_population_targets.json:2008). The row is held out of the fit until 2027-01-08, so nothing fits to it today. - At the bump: when
obr.vatis rebound (UK consumption-tax levels: open items after #1167 #1207), measurevat + private_school_vatagainst the line, or take HMRC's costing of the measure off the target (£1.5bn in 2025-26). - Watch: pe-uk#2187's survey coverage is derived against the same OBR totals.
- Needs: pe-uk#2319 (draft, stacked on pe-uk#2235), which charges the fees from 1 January 2025. In the locked engine the fee rate is a reform parameter at zero, so
- Private school attendance is drawn again in every simulation. uk-data#568.
- Needs: pe-uk#2319 for it to matter at current law, and an engine change, with no PR yet, to impute over school ages. Today the pool is everyone under 18.
- Where:
uk_runtime/frs_person_draws.py:96-98stores only the random draw. The engine ranks households by net income to decide who attends, so a tax or benefit reform moves pupils between households. - Measured by UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271: read by the engine, a release differs from its own solve on
isc.private_school_studentsby 3.4 points, because attendance is decided at the file's own weights.ons.land.land_valueandons.land.corporate_land_valuealso depend on the weights, by 0.3 points or less. - Already different here: the pupil target is the Independent Schools Council census count for January 2025 (
isc.private_school_students), not uk-data's flat 557,000. - At the bump: compute
attends_private_schoolat export, at the final weights, and store it. - Ruling needed: which pupil series to target: ISC member schools, or DfE's count of all independent schools.
Already handled in microcosm
These need no new work and are listed so later reviews skip them.
- Take-up after the SPI chain, uk-data#491: UC through the OR refresh, Pension Credit in UK pensions: resident State Pension, Pension Credit, contributions and salary-sacrifice relief (#1069) #1084, Child Benefit in UK spine follow-ups: SPI donors funded, WAS coherence, residential split, Child Benefit, release-cut blockers (#1063) #1089.
- SPI rows' CTR, uk-data#497: one household draw on the reference person since UK spine: make SPI support households internally consistent (SPI-first order, housing shell) #1012.
- No UC flag on all-pension-age units, the take-up half of uk-data#490: excluded from the UC draw since UK #882 repairs: the A16 legacy rows, the carer and childcare elements, the benefit-cap bands #937.
- State Pension level, uk-data#493: UK pensions: resident State Pension, Pension Credit, contributions and salary-sacrifice relief (#1069) #1084's final run gives £142.5bn against a £142.3bn target.
- Pension Credit take-up over entitled units, uk-data#510: UK pensions: resident State Pension, Pension Credit, contributions and salary-sacrifice relief (#1069) #1084 solves it by component, and UK: port the #1095 fixes that need no new policyengine-uk release #1200 ported its two remaining tweaks.
- One OBR UC total over Great Britain, the target half of uk-data#530:
obr.universal_creditsums table 4.9's two cells over Great Britain, and the split rows are excluded until 2026-11-26. Their bindings split onbenefit_cap_reduction, but OBR's split is the welfare cap, so retire the two rows at expiry rather than renew them. - uk-data's release batches, uk-data#544 (1.58.0) and uk-data#576 (1.58.1): their members are judged under their own numbers. uk-data#544's own commit, the pension-age exclusion in the SPI donor UC redraw, is already how microcosm draws.
- Pension wealth and ISA split, uk-data#501: done by UK WAS stage: split private pension wealth out of corporate_wealth (uk-data#452 M2) #750, WAS wealth imputation with the ISA split, plus regional property uprating #681 and UK: surface cash ISA and stocks & shares ISA holdings in the wealth imputation #180.
- Scottish water zeroing, uk-data#467: fixed by Whole-spine parity for the UK: re-pinned incumbent, comparison instruments, signed register, and the E10 evidence (#686) #747, and the netting rate by UK: port the unblocked uk-data fixes tracked in #1095 #1100.
- Area draws within the household's region, uk-data#517: region-constrained by default in
uk_runtime/rowwise_geography.py, and no caller turns it off. - Salary sacrifice for people without pay, uk-data#518: UK spine follow-ups: SPI donors funded, WAS coherence, residential split, Child Benefit, release-cut blockers (#1063) #1089 restricts the prediction to paid people, and UK: policyengine-uk 2.130.1 and the fourth batch of #1095 ports, with the release's weight year, identifiers and birth months fixed #1271 ported the rest of the final rule.
- Accounts dividends keyed on
person_id, the keying half of uk-data#498: already correct. - Capital gains on HMRC's 2024-25 size-of-gain table, uk-data#570, uk-data#571 (draft): bound since Align UK CGT calibration with FY2024-25 individual observations #889 and UK CGT distribution: age/region conditioning, banded and residential targets, asset types (#725, #467) #939. The totals are HMRC's individuals-only 2024-25 outturn at disposal year 2024, and the twelve size bands from £3,000 match uk-data#571's table row for row. The over-start among copies is handled by the incidence anchor (UK CGT: interpolate the sub-exempt remainder, anchor the clone incidence, and fence projected entrants (#970) #979), and the band donors by the support split (UK CGT: BADR-qualifying gains, the Table 3 income joint and wealth-conditioned gain carriers (#1014) #1045). One difference: microcosm keeps losses and gains under the exempt amount, and uk-data#571 drops them.
- WAS missing-value codes in the vehicle count, uk-data#574: recoded before training since Port the WAS wealth imputation and regional property uprating as declarative source stages #714 (
uk_runtime/was_wealth.py:230-231), and the drawn count is clipped at zero and gated. Still open on Port UK compact source stages and 2024-25 refresh from uk-data #145:num_bedroomsis a predictor although WAS leaves it unanswered for most donor households. - UC reads recorded benefit-unit capital, uk-data#552 (draft): every benefit unit already records it, with property added by UK: port the #1095 fixes that need no new policyengine-uk release #1200. uk-data#552 leaves SPI copies on the household proxy. Its engine input,
benunit_reported_capital, is in "The next policyengine-uk bump". - SPI income bands at projected values, uk-data#557 (draft): every SPI band reference declares an uprating index and moves from the fact's opening year, 2023 for SPI 2023-24, to the calibration year (
uk_runtime/hmrc_uprating.py). - SPI incomes at the donor's FRS rank, uk-data#551 (draft): Draw SPI-channel incomes at the FRS twin's conditional rank (#840) #1256 draws each SPI copy at its FRS twin's rank, within cells of main source, pay, trade and State Pension age.
- The engine a release is calibrated with, uk-data#581: a UK release pins
compatible_model_packagesto the exact policyengine-uk its calibration ran under (Assemble the certified UK national candidate into a publishable release (#806) #812), and microcosm-data's loader refuses any other installed engine. - NHS usage above age 80, uk-data#586:
age_tailspreads the FRS age-80 top code over ONS's 80+ bands first, and since UK spine: run age_tail first so age-conditioned imputations derive from the disaggregated surface; retire the NHS 85+ fold-in (#785) #842 the NHS allocation uses the donor table's own 85–89, 90–94 and 95+ bands, with no roll-up. - Local UC targets by area code, uk-data#589: UC area targets are Chronicle facts keyed by GSS code and checked against the roster by code, and Adopt the UK local-geography and firms contracts and compile the local target surface (#708, #759) #795 corrected uk-data#468 in the incumbent parity fixture. The fixture's other rows are the item "The incumbent parity fixture keeps uk-data's Scottish row placement".
- The survey household on every copy, uk-data#591: the SPI support channel and the CGT clones offset only
household_id, so each copy keeps its FRS household's id insource_household_id(uk_runtime/spi_support.py:720-721,uk_runtime/cgt_structure.py:275). The export surface allows the column as a reviewed extra, and the local support gate counts distinct source households.
Not applicable
- uk-data#505 and its fix uk-data#540: microcosm never simulates the SPI tape, and region UNKNOWN exists only on the donor table.
- uk-data#507 (reproducibility): microcosm's national dense solve draws nothing random. It fixes
l0_lambdaat 0, builds no gates, and seeds torch before solving. - uk-data#535: a uk-data test on reduced builds. microcosm runs neither.
- uk-data#536: microcosm reads OBR facts from the hash-pinned PolicyEngine/chronicle feed, never from obr.uk.
- uk-data#541: microcosm measures calibration targets through policyengine-uk itself, so it fits what the engine runs on. Its savings-interest point was fixed by UK: port the #1095 fixes that need no new policyengine-uk release #1200.
- uk-data#548 and its fix uk-data#549: microcosm's UK release manifests record policyengine-uk by name and version only, so no model commit can be wrong.
- uk-data#550, uk-data#553, uk-data#554, uk-data#555, uk-data#559 and uk-data#577: CI and release-workflow changes. microcosm's one workflow already cancels superseded PR runs and sets job timeouts, and no workflow builds or publishes a release.
- uk-data#580: microcosm places Northern Ireland households in NISRA's Data Zones, across all 18 seats and 11 districts (UK geography step 2: identity-keyed atomic-area assignment on rebuilt supports (#931) #932), the local export writes the output-area codes (Make the dense role run on a current spine: identity branch, scratch aliases, per-block national problem, compiled-row axis, holdout shape, engine blocks that represent the pool #1115), and the release-blocking
uk_local_area_supportgate needs support in every seat and authority. - uk-data#585: no microcosm stage fits a gain share. The incidence clone splits mass 0.5/0.5, the anchor (UK CGT: interpolate the sub-exempt remainder, anchor the clone incidence, and fence projected entrants (#970) #979) moves clone mass back from the weights it read, and the calibration measures the CGT targets on the weights it writes.
- uk-data#587: microcosm builds its area supports from the publishers (UK geography step 2: identity-keyed atomic-area assignment on rebuilt supports (#931) #932). Scottish output areas carry NRS 2022 populations, and authorities use April 2023 codes, with the four 2023 unitary authorities in and their predecessor districts out.
- uk-data#590: no Northern Ireland UC area target is bound here, and the authority roster lists all 11 districts, Ards and North Down included. The parity deferrals for the incumbent's NI UC rows still cite UK local, bus fare, and CGT source-fact gaps chronicle#200, which is closed; refresh them at their next renewal.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels
Activity
Bind the DWP benefit rows over the households the publisher counts (#…
Bind OBR's DLA and PIP line to the engine's pip plus dla (#1095)
Map Scotland's Adult and Child Disability Payment codes on the FRS sp…
Keep FRS-reported dividends on the UK spine (#1095)
Draw SPI incomes only for FRS claimants and partners (#1095)
Put council tax on the UK spine before council tax reduction (#1095)
Charge Scottish households the water and sewerage they pay (#1095)
Make SPI-channel benefit reports and UC take-up coherent (#1095)
Redraw SPI benefit-unit capital conditioned on investment income (#1095)
Measure the WAS wealth predictors alike on donor and recipient (#1095)
Count buy-to-let property as other residential property (#1095)
Count ETB recipients' adults and children by FRS family role (#1095)
Band constituency UC units by the national UC child composition (#1095)
UK target-fit register: retire the SE 12,570-15,000 deferral the port…
Record the microcosm#1095 port receipts (#1095)
179 remaining items
Limit salary sacrifice to the pay it comes out of (#1095)
Split the national 15-19 age bands into 15, 16-17 and 18-19 (#1095)
Write UK release weights at the dataset year (#1095)
Keep UK release identifiers inside the engine's 32-bit range (#1095)
Name only the column in the identifier refusals (#1095)
Measure the calibration on the release's identifiers (#1095)
Test that the calibration and the release deal the same birth months (#…
Lock policyengine-uk 2.130.1 (#1095)
Store each person's months since their last birthday in the spine (#1095
Hold the five-or-more children UC row out of the calibration (#1095)
Regenerate the derived surfaces on main after #1256 (#1095)
Record the fourth ports PR's receipts (#1095)
Record the fourth ports PR's receipts (#1095)
Merge pull request #1271 from PolicyEngine/uk-data-ports-1095-4
juaristi22 commentedon Oct 15, 2026
Reviewed on 15 October after #1271 merged (main
c28b453). The review covers uk-data#579 to uk-data#591 and policyengine-uk 2.131.0 to 2.132.6, and the body is updated. The next review starts at uk-data#592.Ticked (12)
Added
obr.esabinds ESA alone, but OBR's incapacity benefits line also counts SDA, Incapacity Benefit and Income Support's incapacity part (uk-data#582). SDA can be added to the measure now.Changed
trading_lossjoins the engine's HBAI deductions. From 2.132.4,hbai_gross_incomegoes wrong without failing for households with negative income, because the engine now resets that income to zero. It feeds the NEED, ETB VAT and NTS income bands.Already handled or not applicable: uk-data#581, uk-data#583, uk-data#584, uk-data#586, uk-data#588, uk-data#589 (the UC rows) and uk-data#591 are already handled here. uk-data#580, uk-data#585, uk-data#587 and uk-data#590 do not apply.
Closed today: #1194, fixed by #1271, and #1097, whose commits shipped in #1271. Each has a closing comment that names the commits.
🤖 Generated with Claude Code