Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
4092df0
Make the national target references regenerate from the pinned feed (…
juaristi22 Oct 6, 2026
a083579
Read an implausible calendar-month access-fund award as annual (#1095)
juaristi22 Oct 6, 2026
04fdc3c
Name the LCFS household counts for what they are; quote the stage not…
juaristi22 Oct 6, 2026
53c112f
Bind Great Britain pension-age Housing Benefit spending at the calend…
juaristi22 Oct 6, 2026
7a67b50
Set is_blind from the FRS blind registration question (#1095)
juaristi22 Oct 6, 2026
c9d9954
Set the UC start-up period from the FRS claim and trade start dates (…
juaristi22 Oct 6, 2026
c5cdf2d
Lock policyengine-uk 2.122.2 and policyengine-core 3.32.19 on the UK …
juaristi22 Oct 7, 2026
d7b42f9
Store the severe disability flag as the tax credit condition (#1095)
juaristi22 Oct 6, 2026
6900190
Supply the person types from the FRS adult and child tables (#1095)
juaristi22 Oct 6, 2026
37775c2
Give Pension Credit the benefit unit's recorded capital (#1095)
juaristi22 Oct 6, 2026
e985033
Mark shared rent liability and the rent boarders and lodgers pay (#1095)
juaristi22 Oct 6, 2026
3a90d8d
Store the mixed-age couple Pension Credit saving at survey-year facts…
juaristi22 Oct 6, 2026
57a0ccf
Defer the West Midlands low-band income-tax cell: the regional bands …
juaristi22 Oct 6, 2026
caae8de
Exclude the two UC payment bands policyengine-uk 2.122.2 empties (#1095)
juaristi22 Oct 7, 2026
a97df8f
Record the access-fund repair in the stage evidence; refuse a tab wit…
juaristi22 Oct 7, 2026
b5c73d1
Link the West Midlands deferral to its upstream fix, pe-uk#2174 (#1095)
juaristi22 Oct 7, 2026
05b8f07
Add the receipts for the second #1095 ports PR
juaristi22 Oct 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/1095-access-fund-period.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The UK spine reads an implausible calendar-month access-fund award as the annual award it almost certainly is (microcosm#1095, from the review of #1100). The FRS weeklyises `ACCSSAMT` from the reported amount and its period code `ACCSSPD`, and on the 2024-25 tab the calendar-month amounts run up to the size of a whole annual award, so an award read as monthly could annualise far above every award the survey records as annual; #1089 had to sign an input-mass exclusion for it when calibration took its household to the weight bound, and #1100 retired that exclusion once the household moved off the bound, leaving the record itself unchanged. A calendar-month award (code 5) that annualises to more than twice the largest annual-coded award (code 52) on the same tab is now read as its per-period amount, `ACCSSAMT` × 52/12, which repairs fewer than 10 awards on the 2024-25 tab and leaves large but plausible monthly payments as reported; every other award stays as the FRS weeklyised it, including the few with no period code. The threshold moves with the tab's largest annual-coded award, so a tab with calendar-month awards but no annual-coded award now refuses rather than repairing nothing, and the stage's checkpoint evidence records the paid awards by period code, the threshold and how many awards were repaired (from the review of microcosm#1121).
21 changes: 21 additions & 0 deletions changelog.d/1095-is-blind-registration.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
The UK spine now sets `is_blind` from the FRS blind registration question (uk-data#523, microcosm#1095). Before, the column was never written, so it was False for everyone and took policyengine-uk's default.

A person is blind when `SPCREG1` is 1, meaning registered blind or severely sight impaired with the local authority or social services. Registration follows the consultant ophthalmologist's certificate that the engine's `is_blind` names. The adult and child tabs ask the same question, so children are read too.

Partial-sight registration (`SPCREG2`) does not meet the severely-sight-impaired test, so it is not read. A person who was not asked the question (blank `SPCREG1`) is not blind.

In FRS 2024-25, 29 adult records (57.3k at the `gross4` design weights) are registered blind. Fewer than 10 child records are, so that count is suppressed.

On the locked policyengine-uk 2.100.0, `is_blind` is read by:

- the TV licence concession;
- the Disabled Students' Allowance qualifying condition;
- the Council Tax Reduction non-dependant exemption;
- the Tax-Free Childcare age limit and higher amount for a disabled child.

`person.is_blind` is a net-new export column. It joins the `uk_export_surface` allow-list (`gates.json` and `UK_ALLOWED_EXTRA_EXPORT_COLUMNS`) and the spine graph's root person booleans. The following are regenerated:

- `source_stages.json`;
- the H2 spine fixture, whose synthetic adult and child tabs now carry `SPCREG1`;
- the coverage manifest;
- the mirrored gate digests.
1 change: 1 addition & 0 deletions changelog.d/1095-lcfs-household-counts.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The UK spine's LCFS consumption stage names its household adult and child counts for what they are, and its stage notes load in full (microcosm#1095, the rest of uk-data#486). The LCFS G018 and G019 counts were renamed to the engine's person flags `is_adult` and `is_child`, and the recipient summed those engine flags per household; policyengine-uk#1896 deprecates them. The predictors are now `household_adult_count` and `household_child_count`, and the recipient counts its members from `age` with the survey's age-18 split, so the values and the imputation are unchanged. The stage's `notes` were a plain YAML scalar containing " #890", which YAML reads as the start of a comment, so the 642 characters after it were dropped at load; they are now quoted.
11 changes: 11 additions & 0 deletions changelog.d/1095-mixed-age-pension-credit-saving.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
The Pension Credit stage stores the SI 2019/37 mixed-age couple saving (`has_mixed_age_couple_pension_credit_saving`, pe-uk#1940, uk-data#519, microcosm#1095). The value is the engine's own default, evaluated once at the survey-year period on the post-SPI receipts.

The default reads a birth year computed from age and the model year. microcosm holds ages fixed, so the default would drop one more protected cohort each later model year.

The flag holds for a mixed-age couple that meets all of these:

- the older member was born by 5 February 1954;
- the couple reports Pension Credit, or pension-age Housing Benefit without an income-related legacy benefit;
- the couple reports no Universal Credit.

The entitlement the stage redraws take-up on reads the same value.
11 changes: 11 additions & 0 deletions changelog.d/1095-pension-age-housing-benefit-spending.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
The UK national calibration binds Great Britain pension-age Housing Benefit spending (`dwp.hb.amount_pension_age`, microcosm#1095). The row reads the DWP benefit expenditure and caseload tables, Spring Forecast 2026 (PolicyEngine/chronicle#280 / #282), on the line "Housing Benefit over Pension Credit qualifying age". It binds the calendar-2025 window: three twelfths of the FY2024-25 outturn (£6,851.0m) plus nine twelfths of the FY2025-26 forecast (£7,114.7m), which gives £7,048.8m. The model column sums `housing_benefit` over benefit units whose eldest adult is 66 or over, in Great Britain households, the same age rule as the pension-age caseload rows. The row has its own `dwp_benefit_expenditure` family, which allows source projections.

DWP gives each fiscal year its own measure (`expenditure_2024`, `expenditure_2025`). The series identity of `calendar_year_window` includes the measure, so it read the two years as two one-year series and refused the window, which is why #1100 dropped this row. A window selector can now declare `source_measure_id_by_opening_year`, a map from each overlapping year's opening year to its measure:

- A fact matches only the measure that its own year declares.
- The declared measures form the window's single series.
- The map must name exactly the window's two years.
- It cannot be combined with `source_measure_id` or with a list-valued series key, and it is refused under any other value operation.
- The weights, the two-year requirement and the refusal of a partial window are unchanged.

The national target references, the membership report and the compile-parity signed differences are regenerated. The new row is the only change.
1 change: 1 addition & 0 deletions changelog.d/1095-pension-credit-reported-capital.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Pension Credit reads the benefit unit's recorded capital (`pension_credit_reported_capital`, pe-uk#2018 and #2070, uk-data#513, microcosm#1095). It takes the same value as Universal Credit's `uc_reported_capital`: FRS `TOTCAPB4`, with SPI-channel units taking their capital redraw. Zero or more replaces every capital source in Pension Credit's assessable capital. The unavailable sentinel −1 is the engine's own default, so the household proxy applies there.
6 changes: 6 additions & 0 deletions changelog.d/1095-person-types.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
The UK spine supplies policyengine-uk's person types (pe-uk#1896, uk-data#524/#486, microcosm#1095). Every FRS person is on the adult table or the child table:

- `is_claimant_or_partner` is adult-table membership, the benefit unit's head and any partner.
- `is_hbai_dependent_child` is child-table membership.

The engine stops inferring both from ages. The existing claimant derivation already refuses a benefit unit without one or two adult records.
23 changes: 23 additions & 0 deletions changelog.d/1095-policyengine-uk-2-122.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
The UK side of the lock now resolves policyengine-uk 2.122.2 and policyengine-core 3.32.19 (microcosm#1095). Before, it resolved policyengine-uk 2.100.0 and core 3.32.5. The UK extras of microcosm-build, microcosm-data and microcosm-frame now require `policyengine-uk>=2.122.2`. The release lines policyengine-uk added since 2.100.0 are what the remaining #1095 items need, among them:

- pe-uk#1896's person types;
- #1946's severe disability flag;
- #2018 and #2070's Pension Credit reported capital;
- #2006's shared rent and boarders' and lodgers' rent;
- #1940 and #1904's mixed-age saving;
- #2140's Child Benefit opt-outs, which #1107's registered-claims export reads.

Under #1086's per-country pins (option 2) the US side does not move: the extras that install policyengine-us keep policyengine-core 3.32.5 in their own fork of the lock, so the certified US default still loads and the US lane runs on the engine it was built with.

Re-derived on the new lock, with no data change:

- the uprating pin stamp (`hmrc_uprating_engine_pins.json`): only the version moves, and the seven parameters are unchanged at every instant;
- the policyengine-uk concept coverage: 285 inputs (233 before), with the same 40 covered;
- the concept mapping, reviewed against 2.122.2. Its 40 targets keep their entity, type, unit and input status. The Child Benefit notes now quote 2.122.2's documentation, which says datasets export registered claims, opt-outs included. The liquid financial assets reason now names 2.122.2's other person-level money stocks, `car_list_price` and `lifetime_isa_balance`. It also says that Universal Credit splits household capital by claimant and partner count and counts a Lifetime ISA as person-level capital;
- the H2 spine fixture's numerical dependency;
- `APPROVED_UV_LOCK_SHA256`;
- the CGT stages' declared dependency.

policyengine-uk 2.112.0 replaced `gov.dwp.state_pension.age.male` and `female` with the statutory timetable by date of birth. So the UC take-up population now reads its one State Pension age from that timetable: the whole-year age at which everyone born in a single calendar year reaches it, for the cohort reaching it in the build year. That is 66 for 2024 and 2025, as before. From 2026 the cohort's age is no longer whole years, so the stage refuses rather than approximate.

Forward years: policyengine-uk 2.122.2 models the April 2029 salary-sacrifice cap by adding sacrifice above £2,000 (`salary_sacrifice_returned_to_income`) to `employment_income`, so it also raises adjusted net income from 2029-30. The government's change applies to National Insurance only, so for 2029-30 and later the rules that read adjusted net income (the personal allowance taper, the High Income Child Benefit Charge, Tax-Free Childcare eligibility) see higher incomes for people sacrificing more than £2,000. The 2024-25 build is unaffected. The upstream fix is tracked as pe-uk#2173.
8 changes: 8 additions & 0 deletions changelog.d/1095-severe-disability-flag.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
The UK spine stores `is_severely_disabled_for_benefits` as the tax credit severe disability condition (uk-data#494, policyengine-uk#1946, microcosm#1095). That condition is in CTC Regs 2002 reg 8 and WTC Regs 2002 reg 17: the DLA care component at the highest rate, the PIP daily living component at the enhanced rate, or higher-rate Attendance Allowance. The flag is read from the categories the stage derives, so it agrees with them by construction.

On the locked policyengine-uk the engine's formula is the same definition, and an engine-lane test checks them against each other category by category. The old rule did not match that formula in two ways:

- it counted lower-rate Attendance Allowance;
- it counted any Armed Forces Compensation Scheme payment. FRS code 8 cannot be told apart from Armed Forces Independence Payment, so it no longer counts, a known under-count the uk-data change shares.

The incumbent's coverage manifest marks the flag as required, so the spine keeps storing it rather than leaving the formula to compute it. Dataset runs use the stored value.
17 changes: 17 additions & 0 deletions changelog.d/1095-shared-rent-and-lodgers.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
The UK spine marks the benefit units that share their household's rent, and records the rent boarders and lodgers pay the householder (pe-uk#2006, uk-data#511/#512/#506, microcosm#1095).

`liable_for_share_of_household_rent` holds for a later benefit unit in a shared household (`HHSTAT` 2) with any of:

- a rent share on its adults' records (`SRENTAMT`);
- Housing Benefit (`HBOTHAMT`);
- a linked UC record carrying a housing element (`UCHOUSEL`).

Conventional households are left out, because the survey does not say whether their later units owe the landlord or pay the householder.

`CVPAY`, the rent a boarder or lodger pays the householder, is recorded on the payer. It no longer counts as the payer's property income, the same line microcosm#1081 removes. It now feeds `rent_paid_as_boarder` (`CONVBL` 1, board and lodging) or `rent_paid_as_lodger` (anything else).

In FRS 2024-25 at `gross4` design weights:

- 103 shared households (319.9k weighted) hold 178 liable later benefit units (615.9k).
- 43 adult records (138.4k) pay the householder, fewer than 10 of them as boarders.
- £806.7m a year of `CVPAY` leaves property income.
1 change: 1 addition & 0 deletions changelog.d/1095-target-references-regenerate.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The national target references regenerate from the pinned Chronicle feed again (microcosm#1095). #1089 moved the SPI Table 3.6 employment, self-employment and private-pension amounts by total-income band to HMRC's band growth (`hmrc.itl_2026.total_income_growth_by_total_income_band`), but it did so by editing the generated `uk/target_references.json`. The population contract still declared the flat OBR average-earnings, per-capita mixed-income and private-pension indices, so regenerating restored them, and the feed-gated regeneration test failed on main. The contract now declares the band-growth index for the three targets, and both generated resources are regenerated; the membership report had still recorded the flat-index uprating for the 39 references. The compiled target values are unchanged: the three lowest employment-income bands stay at £17.7bn, £47.5bn and £172.5bn.
39 changes: 39 additions & 0 deletions changelog.d/1095-uc-start-up-period.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
The UK spine now sets policyengine-uk's `uc_is_in_startup_period` (uk-data#527, microcosm#1095). Nothing set it before, so the engine's default of False applied to everyone, and the Universal Credit minimum income floor applied from the first assessment period of every self-employed claim. policyengine-uk 2.100.0 already reads the input in `uc_mif_applies`.

The rule follows UC Regs 2013 reg 63(1) as substituted from 23 September 2020 (SI 2019/1152). DWP starts a 12-month start-up period when it finds a claimant in gainful self-employment, and the period is no longer limited to new trades.

A person is in the period when they are self-employed and either of these began less than 12 calendar months before interview (`INTDATE`):

- their benefit unit's UC claim (BENEFIT 95, `UCSTART`, written month/day/year);
- their first self-employed job (`SEJBLONG`, main job first).

Self-employed means any of these:

- `EMPSTATI` 3 or 4;
- a held self-employed `JOB` row (`ETYPE` 2-7, no `SEEND`);
- nonzero `SEINCAM2`.

One self-employed-job answer does not date the trade. When someone was self-employed all year (`SAMESIT` 2, or every `SDEMP` month 3 or 4) and does not describe a business (`JOBBUS` 2), a job under a year old is a new engagement in the same trade (ADM H4102 example 4).

The FRS cannot see two things, both inherited from uk-data's rule:

- **Earlier awards.** A re-claim after the floor applied, or a second period within five years, reads as a start-up period.
- **A move into the all-work-related-requirements group on an old claim.** This starts a period the flag misses.

**UC records with no claim date.** In FRS 2024-25, 2,114 of 2,402 UC benefit units (88%) carry `UCSTART`. The other 288 have no linked administrative record. For these, the claim recency is drawn, keyed on the benefit unit (`stable_identity_uniforms`, seed 0, salt `uc_is_in_startup_period`). The draw rate is the `GROSS4`-weighted share of self-employed people with a linked claim whose claim began inside the window, 0.324 (uk-data measured 0.320).

The draw is declared on the `frs_spine` stage as `assign_binary_from_rate`. Its notes now name it as the one identity-keyed draw at the root, because only this stage reads the raw claim, interview and job dates.

**Measured on the raw FRS 2024-25 spine at design weights.** 222 person records (488.2k) are in a start-up period, and no child is. Of these:

- 96 records (208.3k) are in benefit units reporting UC, including 17 records (39.6k) in units without a linked claim date;
- the rest are self-employed people outside UC whose trade is under a year old. The flag matters to them only if they claim.

**SPI-redrawn rows.** These keep their donor's flag only where their employment status or their imputed self-employment income still shows self-employment (`spi_income._refresh_uc_start_up_period`, beside the carer flag refresh). The graph declares the column as a root boolean and as a hidden SPI rewrite.

`person.uc_is_in_startup_period` joins the export-surface allow-list. The following are regenerated:

- `source_stages.json`;
- the H2 spine fixture, whose synthetic tabs now carry `INTDATE`, `UCSTART`, the self-employment job columns, `SAMESIT` and `SDEMP`, plus linked-recent, linked-old and unlinked UC rows;
- the coverage manifest's source-manifest pins;
- the mirrored gate digests.
Loading
Loading