diff --git a/changelog.d/uk-chronicle-feed-repin-825406f.changed.md b/changelog.d/uk-chronicle-feed-repin-825406f.changed.md new file mode 100644 index 000000000..f2d838e0d --- /dev/null +++ b/changelog.d/uk-chronicle-feed-repin-825406f.changed.md @@ -0,0 +1 @@ +Re-pin the UK Chronicle feed to 825406f (PolicyEngine/chronicle#302 via #305). The feed now carries the UK pension facts: State Pension and Pension Credit caseloads and amounts for Great Britain and Northern Ireland, the DWP Spring 2026 pensioner forecast lines, Winter Fuel Payment, Attendance Allowance, workplace pension savings and ASHE contribution bands, HMRC pension contribution and salary sacrifice relief, and the OBR salary-sacrifice costing (344,402 rows). No compiled target value moved on either surface. The vendored resources and the membership reports restate the feed identity, and the five salary-sacrifice relief targets now also see the 2023-24 rows while still resolving to 2024-25. Because of those rows, the 2023 production compile-parity receipt gains five ledger-only rows (microcosm#1069). diff --git a/changelog.d/uk-contribution-rows-unbound-1069.changed.md b/changelog.d/uk-contribution-rows-unbound-1069.changed.md new file mode 100644 index 000000000..7870b943d --- /dev/null +++ b/changelog.d/uk-contribution-rows-unbound-1069.changed.md @@ -0,0 +1 @@ +Take the UK SPI Table 3.8 contribution rows and the DWP gross employee contribution row out of the national fit (#1069). The c9 measurement arm showed both definitionally mismatched with the engine's columns. Table 3.8 splits contributions by relief mechanism (net pay against relief at source), while `employee_pension_contributions` holds every workplace deduction and `personal_pension_contributions` only the FRS personal and stakeholder pensions; workplace group personal pensions and many master trusts take relief at source. At prior weights net pay sat 67% above SPI and the relief-at-source contributors 82% below (about 2.0m against 10.9m), out of reach of reweighting; binding them cut the effective sample size from 5,004 to 4,060 and roughly doubled the loss. DWP's gross employee contributions (£66.2bn) pulled against SPI's net pay and the engine's pay deductions. The DWP employer row, the employer contribution draw, the salary-sacrifice conversion fix and the clip removal stay. Active national references go from 1,283 to 1,230. diff --git a/changelog.d/uk-employer-contributions-gb-measurement-1069.fixed.md b/changelog.d/uk-employer-contributions-gb-measurement-1069.fixed.md new file mode 100644 index 000000000..ad0651856 --- /dev/null +++ b/changelog.d/uk-employer-contributions-gb-measurement-1069.fixed.md @@ -0,0 +1 @@ +Declare Great Britain on the measurement of DWP's employer pension contributions target (#1069). DWP's figure covers England, Scotland and Wales; the engine binding already measured GB households only, and the contract's measurement block now says so too. diff --git a/changelog.d/uk-employer-pension-contributions-1069.added.md b/changelog.d/uk-employer-pension-contributions-1069.added.md new file mode 100644 index 000000000..39bc6df2d --- /dev/null +++ b/changelog.d/uk-employer-pension-contributions-1069.added.md @@ -0,0 +1,3 @@ +Draw UK employer pension contributions from ASHE rate bands and bind workplace pension contributions (#1069 c9; PolicyEngine/chronicle#302 via #305). The FRS HMRC spine leaves no longer set employer contributions to three times the employee contribution. Each member of an employer scheme (FRS `PENPROV.STEMPPEN` 1 to 4; occupational first when a person reports several) draws a contribution rate within an ASHE 2024 Table P10 rate band for their scheme type and job sector (`JOB.JOBSECT`), and the rate applies to their pay. The bands are vendored as `ashe_employer_pension_contribution_rates.json` (81 rows); all-sector rows are the public and private bands weighted by Table P2 jobs. Converted salary-sacrifice records now also lose the sacrificed amount from `employment_income`. + +Three targets: DWP's employer contributions into workplace pensions in calendar 2025 (£104.2bn, Great Britain, all savers, 2025 earnings terms) against the engine's employer contributions plus salary sacrifice, which ASHE and DWP count as an employer contribution; DWP's gross employee contributions (£66.2bn: the employee part net of tax, £45.5bn, plus its tax relief, £20.7bn) against the engine's employee contributions; and the 2024-25 salary-sacrifice amount, HMRC Table 6.2's employer National Insurance relief divided by the 13.8% employer rate (about £24.6bn, a declared conversion until the relief rows bind directly). The salary-sacrifice users total (7.7m) leaves the fit; the two headcounts either side of £2,000 stay bound. diff --git a/changelog.d/uk-pension-age-benefits-1069.added.md b/changelog.d/uk-pension-age-benefits-1069.added.md new file mode 100644 index 000000000..f0928ba33 --- /dev/null +++ b/changelog.d/uk-pension-age-benefits-1069.added.md @@ -0,0 +1,3 @@ +Bind the UK pension-age benefit caseloads (#1069 c10; PolicyEngine/chronicle#302 via #305, #259/#260). Attendance Allowance cases with entitlement in England (1.60m) and Wales (124k), each the mean of the four quarterly Stat-Xplore points inside calendar 2025, in a new `dwp_attendance_allowance` family that declares its source months. Scotland is not bound: its caseload moves to Social Security Scotland's Pension Age Disability Payment through 2025 (171k in February, 25k in November), which the engine does not model. Pension-age Housing Benefit benefit units in Great Britain, all tenures (1.11m) and the social (891k) and private (217k) rented sectors, on the twelve 2025 months of the existing Housing Benefit rows; the engine reads the eldest adult's age against 66. + +DWP's winter 2025/26 Winter Fuel Payment recipients in England and Wales (11.0m) sit beside the bound OBR line as a required diagnostic, never fitted: DWP pays everyone and HMRC recovers the payment above £35,000, while the engine withholds it (PolicyEngine/policyengine-uk#1760). diff --git a/changelog.d/uk-pension-credit-1069.added.md b/changelog.d/uk-pension-credit-1069.added.md new file mode 100644 index 000000000..cca036d67 --- /dev/null +++ b/changelog.d/uk-pension-credit-1069.added.md @@ -0,0 +1,3 @@ +Bind the UK Pension Credit caseload and draw Pension Credit take-up by component (#1069 c7; PolicyEngine/chronicle#302 via #305). Fourteen caseload targets in the new `dwp_pension_credit` family, each the mean of the four quarterly Stat-Xplore points inside calendar 2025: the Great Britain total (1.39m benefit units), its six type-by-partner cells (Guarantee Credit only, Savings Credit only, both; with and without a partner), six age bands of the eldest adult, and the Northern Ireland total from DfC. `obr.pension_credit` stays bound. + +A new spine stage, `pension_credit_take_up`, redraws `would_claim_pc` after the SPI income chain. One temporary engine materialization gives each benefit unit's pre-take-up Guarantee Credit and Savings Credit; within each DWP take-up component (Guarantee Credit, Savings Credit only) a reporter claims and the other entitled units claim at r = (t·E − R)/(E − R), with t DWP's financial year ending 2024 caseload take-up (69% and 37%, replacing the flat 70% from FYE 2020), E the entitled units and R the reporters, weighted. A stage gate checks each component's realised take-up; the terminal take-up signal gate no longer measures `would_claim_pc`. The roster moves from 35 to 36 stages. diff --git a/changelog.d/uk-pension-window-consumers-1069.added.md b/changelog.d/uk-pension-window-consumers-1069.added.md new file mode 100644 index 000000000..cdc831d2a --- /dev/null +++ b/changelog.d/uk-pension-window-consumers-1069.added.md @@ -0,0 +1 @@ +Add the consumer operations the UK pension targets need (microcosm#1069 c2). The new `monthly_window_count_x_mean` value operation averages a published count times its published mean over declared months. Two operands name the count and mean concepts, since DWP names its measures `recipients` and `mean_weekly_amount`, not `*_count` and `*_mean`, and the mean operand's `period_factor` annualises a weekly mean (52). Each month's count and mean must come from the same published cell and publication, even though Stat-Xplore files them in sibling record sets. The engine-index uprating applier restates each window month's mean at the rate the engine pays in the calibration year: April onward at that year's rate, January to March at the previous year's. Only a February point moves, per ruling R1. The UK State Pension level compiles from the Stat-Xplore cube to £138.6bn for Great Britain and £3.7bn for Northern Ireland in calendar 2025 at 2025 rates. The amount-band parser reads DWP's half-open labels ("£20.00 to under £40.00", "Under £20.00") with their own published upper edges. `dwp_state_pension` and `dwp_pension_credit` join the source-month families. The generator pins `dfc_ni.*` targets to Northern Ireland and `dwp.winter_fuel_payment.*` to England and Wales (`K04000001`, now a labelled geography). diff --git a/changelog.d/uk-salary-sacrifice-relief-1069.added.md b/changelog.d/uk-salary-sacrifice-relief-1069.added.md new file mode 100644 index 000000000..4b449e24f --- /dev/null +++ b/changelog.d/uk-salary-sacrifice-relief-1069.added.md @@ -0,0 +1,3 @@ +Resolve UK counterfactual target measures through the engine and bind the salary-sacrifice relief rows (#1069 c11; PolicyEngine/chronicle#302 via #305). The measure resolution loop no longer refuses `input_substitution_counterfactual` bindings: a provider with `counterfactual_delta(binding, period)` resolves each binding's per-row delta into a slash-free measure-input column (`counterfactual_delta__`), which the frame adapter reads. `UKMeasureResolver` builds one extra engine simulation per substitution from the same source at the calibration year, zeroing the sacrifice and adding it to `employment_income` (uk-data's recipe), and returns the output's delta against its baseline. Banded counterfactual measures are refused. + +Rows (HMRC Table 6.2, 2024-25): the employee (£1.0bn) and employer National Insurance relief rows, already declared, now bind, the employer row restated from the 13.8% HMRC's £3.4bn was charged at to the 15% the engine charges in 2025 (£3.70bn, through a new engine index parameter, the employer Class 1 rate); a new all-rates income-tax relief total (£8.8bn) binds. The employer row anchors the sacrificed amount directly, so c9's interim amount row (employer relief ÷ 13.8%) retires. The three income-tax rate-band rows stay excluded until their band test reads after-allowance thresholds and the Scottish bands. `income_tax` carries the High Income Child Benefit charge and the annual-allowance charge, so the income-tax delta includes their response to the returned pay. diff --git a/changelog.d/uk-spi-channel-pension-age-1069.fixed.md b/changelog.d/uk-spi-channel-pension-age-1069.fixed.md new file mode 100644 index 000000000..cf65729b6 --- /dev/null +++ b/changelog.d/uk-spi-channel-pension-age-1069.fixed.md @@ -0,0 +1 @@ +Allocate the UK SPI support channel's prior mass by region × State Pension age status (#1069). The channel's 10,000 households are drawn unweighted and every adult in them carries a taxpayer's SPI income, and a region-only allocation gave each of them the region's average weight, so the channel held more pension-age mass than the FRS design gives pension-age households (5.67m against 4.44m pension-age households in the FRS channel, 13.9m people aged 66 and over against about 12.1m at design weights). Within each region the allocation now splits households with a member at or over the engine's State Pension age from the rest; the channel takes 50% of the stratum mass of households without one and the declared pension-age share of those with one. The receipt records both shares and the pension-age masses, and the stage gate checks both. diff --git a/changelog.d/uk-spi-channel-pension-age-share-1069.changed.md b/changelog.d/uk-spi-channel-pension-age-share-1069.changed.md new file mode 100644 index 000000000..dfd6a2b62 --- /dev/null +++ b/changelog.d/uk-spi-channel-pension-age-share-1069.changed.md @@ -0,0 +1 @@ +Lower the UK SPI channel's share of pension-age prior mass from 0.5 to 0.2 (#1069). Measured at the final state, 0.2 keeps more low-income pensioners in the prior: before calibration the Pension Credit caseload sits 24% short instead of 36%, and pension-age Housing Benefit 28% short instead of 41%. The effective sample size rises from 4,900 to 4,994, and non-taxpayer State Pension from £35.5bn to £37.5bn. The coverage manifest's required allocation reason, the charter-H2 fixture and the gate digests move with the stage parameter. diff --git a/changelog.d/uk-spi-pension-contributions-1069.added.md b/changelog.d/uk-spi-pension-contributions-1069.added.md new file mode 100644 index 000000000..755c5137c --- /dev/null +++ b/changelog.d/uk-spi-pension-contributions-1069.added.md @@ -0,0 +1,3 @@ +Bind UK pension contributions by range of total income from SPI Table 3.8 and stop clipping reported personal pension contributions (#1069 c8; PolicyEngine/chronicle#302 via #305). Four targets in the `hmrc_spi` family, each fanned over the table's total-income bands for tax year 2023-24: net-pay-arrangement contributions (the engine's `employee_pension_contributions`) and relief-at-source contributions (`personal_pension_contributions`), amount and count. Amounts move to calendar 2025 by the engine's average-earnings index, counts by HMRC's projected taxpayer growth for the band, as the other SPI counts do. Active national references go from 1,224 to 1,276. + +The FRS spine no longer clips personal and stakeholder pension contributions at the 95th percentile of every PENPROV amount. The clip removed 28% of the reported amount (1.8% of rows) against the relief-at-source total the new rows bind; the engine caps the relief itself at the annual allowance. diff --git a/changelog.d/uk-spi-state-pension-age-1069.fixed.md b/changelog.d/uk-spi-state-pension-age-1069.fixed.md new file mode 100644 index 000000000..15ee3b69b --- /dev/null +++ b/changelog.d/uk-spi-state-pension-age-1069.fixed.md @@ -0,0 +1 @@ +Make the UK SPI income stage respect State Pension age (#1069). SPI donor ages are now drawn within each AGERANGE band by the ONS mid-2023 single-year populations of the donor's sex, vendored from the pinned Chronicle feed as `uk/ons_single_year_age_populations.json` and declared as a stage artifact. Donors receiving State Pension (`SRP > 0`) are drawn at or above the engine's State Pension age, and a band's below-SPA population share is drawn from its non-recipients, with any shortfall receipted. The 65–74 band edge is corrected so that 74-year-olds fall in band 6. The stage-1 forest is queried at the middle of each person's year of age (whole-year age plus half a year), because donors carry a fractional age: at the whole year a 66-year-old sat on the forest's split at State Pension age and drew a 65-year-old donor's zero State Pension leaf about half the time. Band carriers draw only donors on their own side of State Pension age, then from their own SPI age band when that pool holds 20 records (composites never age-match), then narrow by region as before. A deterministic guard zeroes State Pension, Pension Credit and Winter Fuel reports below State Pension age: the SPI State Pension leaf before the stage-2 receipt bridge, the base channel's State Pension reports before stage 2 trains on them, and the SPI channel's three reports after stage 2. A receipt records the rows, weighted people and pounds removed at each step. diff --git a/changelog.d/uk-spi-state-pension-amount-uprating-1069.fixed.md b/changelog.d/uk-spi-state-pension-amount-uprating-1069.fixed.md new file mode 100644 index 000000000..5d663d816 --- /dev/null +++ b/changelog.d/uk-spi-state-pension-amount-uprating-1069.fixed.md @@ -0,0 +1 @@ +Uprate the UK SPI State Pension amount rows by total-income band as recipients times the amount per recipient (#1069). Each amount row now moves by the growth its count row already declares (HMRC's projected Income Tax payers in the Table 2.5 band containing it, calendar-2025 window over 2023-24) times the new State Pension rate the engine pays (230.25 against 203.85 a week, 1.1295). Before, the amount rows moved by the rate alone, so each band's amount held the 2023-24 number of recipients while its count row grew them: in the £50,000 to £70,000 band the count row grew by 1.217 and the amount row by 1.130, which left that band 24.5% above its amount target at the final arm even with its count fitted. The new factors run from 1.106 (£15,000 to £20,000, where taxpayer numbers fall) to 1.405 (£100,000 to £150,000); the thirteen rows sum to £100.9bn instead of £96.3bn. Both component factors are receipted on every row, and a row compiled at its own year (the production-2023 parity surface) stays as published. diff --git a/changelog.d/uk-spi-support-reason-readers-1069.fixed.md b/changelog.d/uk-spi-support-reason-readers-1069.fixed.md new file mode 100644 index 000000000..1b9da4f4e --- /dev/null +++ b/changelog.d/uk-spi-support-reason-readers-1069.fixed.md @@ -0,0 +1 @@ +Read the UK SPI support allocation's mass-change reason from its declared shares everywhere (#1069). Since the allocation separates households with a member at or over State Pension age (c6), its MassChangeRecord carries the stratified sentence, but the SPI income stage's graph kernel still rebuilt the preceding record with the 50% sentence (so the stage evidence named the old allocation), and the release-input coverage manifest required the 50% sentence on the final dataset, which the release-cut coverage gate would fail. Both now take the reason from `uk_spi_support_mass_change_reason`, which reads the declared allocation. diff --git a/changelog.d/uk-state-pension-diagnostics-1069.changed.md b/changelog.d/uk-state-pension-diagnostics-1069.changed.md new file mode 100644 index 000000000..97db5b7c0 --- /dev/null +++ b/changelog.d/uk-state-pension-diagnostics-1069.changed.md @@ -0,0 +1,7 @@ +Move the OBR State Pension line out of the UK fit and keep it, with DWP's forecast-table lines, as diagnostics beside the bound resident level (microcosm#1069 c4, rulings R2 and R4). + +- **Why:** the OBR FY2025-26 forecast (£146.19bn) counts Great Britain plus pensioners paid abroad and leaves out Northern Ireland. It is a different quantity from the resident level that the DWP Stat-Xplore and DfC rows now bind. +- **What is attached:** `dwp.state_pension.amount` carries the exact OBR figure and DWP Spring 2026's Great Britain total (£146.07bn) and paid-abroad line (£5.63bn) as metadata only. `dwp.state_pension.recipients` carries DWP's caseload lines (13.204m, of which 1.088m are abroad). +- **How:** the diagnostic attachment, until now written for the CGT cash forecast alone, is driven by the contract's `diagnostic_references`. Each declaration names its metadata prefix and value unit. +- **Fail-closed:** `UK_REQUIRED_TARGET_DIAGNOSTICS` names the declarations each target requires, so a missing or misdirected one still refuses the target. The CGT diagnostic's metadata is unchanged. +- **Knock-on changes:** the incumbent `obr/state_pension` row moves to `registry_parity.excluded`, and the compile-parity receipts give it and the State Pension rows their ruled rationales. The UC support probes protect `dwp.state_pension.amount` in its place. diff --git a/changelog.d/uk-state-pension-targets-1069.added.md b/changelog.d/uk-state-pension-targets-1069.added.md new file mode 100644 index 000000000..1d3d23197 --- /dev/null +++ b/changelog.d/uk-state-pension-targets-1069.added.md @@ -0,0 +1,8 @@ +Bind the UK resident State Pension on the national surface (microcosm#1069 c3; PolicyEngine/chronicle#302 via #305). The calendar-2025 window is the mean of the four quarterly Stat-Xplore points (February, May, August and November 2025). There are 26 contract targets, compiling to 60 references in the new `dwp_state_pension` family, of which 59 are bound. + +- **Level:** Great Britain residents' recipients (12.05m) and amount (£138.6bn), plus Northern Ireland from DfC (0.33m and £3.7bn). The amounts are recipients times the mean weekly amount times 52, restated per point at the engine's 2025 rate. +- **Age:** recipients by age band (66–69 to 90 and over) × sex × State Pension type, binding only the cells DWP populates. Type follows the State Pension age date, so 66–69 is all new State Pension and 75 and over all pre-2016. +- **Area:** recipients by type in the nine English regions (a region-tier fan-out pinned to England), with Scotland and Wales as their own rows. +- **Weekly amount:** recipients by weekly amount band × type. These keep only the May–November points, which DWP pays at the 2025-26 rate the engine pays. The new State Pension £40.00 to under £60.00 band (2,903 recipients) has no record on the frame, so it is signed out in `target_reference_signed_exclusions.json`. + +The contract gains the `dfc_ni` provider and the two State Pension categories, so the local references restate the hierarchy. diff --git a/docs/uk-chronicle-feed-repin.md b/docs/uk-chronicle-feed-repin.md index 5386c123c..ce7ca146f 100644 --- a/docs/uk-chronicle-feed-repin.md +++ b/docs/uk-chronicle-feed-repin.md @@ -44,6 +44,12 @@ Verify the complete compiled target diff on both surfaces, including targets outside the intended policy area, and record the value moves in the changelog fragment. +A re-pin also moves the charter-H2 parity fixture: every stage that declares a +vendored resource as an artifact binds that resource's digest into its +`stage_contract_sha256`, and the vendored headers restate the feed identity. +Regenerate it with `tools/graph_uk_spine_fixture.py` and check that only those +contract hashes move. + Two-level (country + region) contract targets fan out over the region tier (`UK_REGION_TIER` in `microcosm.calibrate.geography_constants`), one reference per area (microcosm#905); their cells resolve Chronicle's region- and country-stamped @@ -97,3 +103,21 @@ claimants, qualifying gains and tax by band of qualifying gain, individuals, tru taxpayers, 2021-22 to 2024-25; 287,150 rows). The addition is purely additive: the national and local reference files are byte-identical, the vendored resources carry the same rows under the new feed identity, and the three compile-parity receipts are unchanged. +The `825406f` re-pin (microcosm#1069, PolicyEngine/chronicle#302 via #305, on top of `505e0e7`) brought +the UK pension facts: Stat-Xplore State Pension and Pension Credit caseloads and amounts from +February 2023 to March 2026 (by type, age, gender, region, partner and amount band), Northern +Ireland State Pension and Pension Credit (DfC, May 2026), the DWP Spring 2026 State Pension and +Pension Credit forecast lines, Attendance Allowance, Winter Fuel Payment recipients and statistics +for winters 2023-24 to 2025-26 and the HMRC charge, the DWP workplace pension savings trends, ONS +ASHE pension membership and contribution-rate bands, HMRC pension contribution relief (2023-24) and +salary sacrifice relief (2024-25), and the OBR salary-sacrifice costing (344,402 rows). It also +carries chronicle #246, #278, #292 and #304. No compiled value moved on either surface: the +national and local reference files are byte-identical and the vendored resources carry the same +rows under the new feed identity. The artifact carries every `505e0e7` value but is not a strict +row superset: #305 rebuilt the DWP Spring 2026 package's record sets, so 44 incapacity-benefit +forecast rows come back under new keys with the same forecast line and value, and 192 rows change +only their layout fields; no UK target binds them. The five salary-sacrifice relief targets now +match two facts each (the new 2023-24 Table 6.2 rows beside the bound 2024-25 ones) and still +resolve to the 2024-25 fact. For the same reason the 2023 production compile-parity receipt gains +five ledger-only rows (the relief targets now compile at that comparison period from the 2023-24 +facts); the two 2025 incumbent receipts are unchanged. diff --git a/experiments/1069-uk-pensions-receipts.md b/experiments/1069-uk-pensions-receipts.md new file mode 100644 index 000000000..dc09938d1 --- /dev/null +++ b/experiments/1069-uk-pensions-receipts.md @@ -0,0 +1,420 @@ +# microcosm#1069 receipts: UK pensions + +Plan: `repos/microcosm-uk-pensions-implementation-plan.md`, approved 2026-09-30 (rulings R1–R15). The plan +was executed in this order on branch `uk-pensions-1069`, rebased onto main 3598c38de: + +- c5, c1–c4 and the £40–60 band sign-out came earlier (see their own commits). +- This note covers the c5 fix (dae9cc916), c6 (7cac27b27), c7 (f795e9121), c8 (9b66ab395), the D6 + retirement (b19f14d98), c9 (8b3e9f993), the c6 follow-up (be5c13245), c10 (13089945a), c11 + (fcb5c46b5) and the c8/c9 follow-up (d9fca7bb7). Part J covers the first review round: the CI fix + (004b5c9cc), σ_p = 0.2 (3a3fc105c) and the SPI State Pension amount root fix (677336b3d). +- c0 waits for PolicyEngine/policyengine-uk#1899. + +Builds. Every arm is a licensed local build: the spine (the build_930 recipe with the five NTS tabs and +`--was-person-tab`, `--no-staging`), then the national role (`--staging-local-only`). They use the +Chronicle artifact 825406f (PolicyEngine/chronicle#302 via #305) and the 2026-09-30 national build as the +incumbent. The scripts live in `data/ukds/acceptance/pensions-1069/scripts/`: + +- `arm.sh` and `arm2.sh` (`arm2.sh` refines the quiet gate); +- `arm_readout.py`, which reads out from the ordered dense solution, so it also works on arms whose + battery blocked the H5; +- `arm_h5.py`, which writes measurement H5s from a spine and its calibrated weights; +- `wp7.sh`, `wp7_analyse.py` and `relief_decomposition.py`; +- `pc_takeup_realised.py`, `nics_threshold_effect.py`, `sp_band_diag.py` and `fix_compare.py` (round 1). + +Every H5 is measurement only and never released. Engine: policyengine-uk 2.100.0 (the repo's pin). + +The arms, in order: + +- c4: the starting point. +- c5fix. +- c6s50 and c6s20, the σ_p variants (0.2 was committed in round 1). +- c7. +- c9: c8 and c9 together, which blocked on Table 3.8. +- final: d9fca7bb7, reusing the c9 spine. Its battery passed and it wrote an H5. +- finals20: the final state at σ_p = 0.2, a variant. +- fix20 and fix50: 677336b3d (the root fix) at σ_p = 0.2 (committed) and 0.5 (a variant), each on a fresh + spine. Both batteries pass, and each wrote its H5. + +## Part A. The SPI channel's 66-year-olds (c5 fix) + +The c4 arm left 402 66-year-old records without a State Pension, so only 81% of 66-year-olds received +it. That share is what squeezed age 65 inside the ONS 65–69 band (R3). + +- **Where the zeros sat (c4 spine).** 330 of the 402 records, carrying 88% of their weight, were SPI-channel + synthetic records. The SPI channel's zero-State-Pension share was 100%, 51% and 6% at 65, 66 and 67; the + FRS respondents' was 7% at 66 and 3–6% at 67–71. +- **Mechanism.** c5's donors carry whole-year ages plus a uniform fraction, while the hosts carry whole + years. A host at exactly 66.0 sits on the forest's 66.0 split and reads a 65.x donor's leaf, which never + holds a State Pension. In a synthetic forest the whole-year query gives 0% receipt at 66 and the + mid-year query 100%. +- **Fix (dae9cc916).** Stage-1 queries the forest at the whole-year age plus half a year + (`_stage1_query_predictors`, also used for the base redraw). Band carriers now pool only donors on + their own side of State Pension age (`_resample_band_donor_leaves(state_pension_age=…)`, with a receipt + of matched carriers per band). +- **Arm c5fix (spine 39c1254a).** + - Loss 0.00826 on 1,148 targets (c4: 0.00908 on 1,149); 98.0% within 10%; ESS 5,003. + - No row above 25%. The London £12,570–15,000 income-tax row moved from +26.2% to +1.9%, and the + 50–70k State Pension band (D6) from +28.6% to +23.0%. + - State Pension receipt at 66: 95%. + - Single ages 64–68 against ONS mid-2024: +1/−15/0/+2/0% (c4: −5/−27/−7/+20/+4%). + +## Part B. The SPI channel's pension-age mass (c6) + +- **What the prior mix showed (c4 spine).** + - 66+ people at prior weights were 13.88m: 6.07m FRS and 7.81m SPI channel. Pension-age households were + 5.67m in the SPI channel against 4.44m from the FRS. + - The SPI channel's uniform within-region weights inflate pension-age mass: the FRS sample + over-represents pensioner households, and uniform weights keep that composition. Design-weight 66+ + is about 12.1m (ONS about 12.4m). + - The taxpayer share of the 66+ is 67.7% in the FRS channel (HMRC 67%) and 83% in the SPI channel. + - The non-taxpayer share of State Pension is 25.9% in the FRS channel and 10.6% in the SPI channel; + HMRC and DWP imply 32.4% (£46.1bn of £142.3bn). +- **Change (7cac27b27).** The allocation is stratified by region × pension-age household (any member at + or over State Pension age), with a pension-age share σ_p: 0.5 provisionally at c6, 0.2 since 3a3fc105c + (ruled 2026-10-02; Part J). +- **Arms.** + - c6s50 (spine 6721f725): loss 0.00824 on 1,148; within 10% 97.8%; ESS 5,033. + - Prior 66+ people 12.33m. + - SPI State Pension bands: 20–30k +15.8%, 50–70k +23.6%. + - Non-taxpayer State Pension £36.8bn; 66+ calibrated FRS 6.87m / SPI 5.66m. + - c6s20 (spine 0bbf0895; a measurement variant, never committed): loss 0.00857; ESS 4,967. + - SPI bands: 20–30k +10.1%, 50–70k +24.0%. + - Non-taxpayer State Pension £38.6bn. + - Single ages worse: 62 +15%, 63 +10%, 72 −17%. + - Pre-calibration Pension Credit spend: c5fix −17.5%, c6s50 −23.5%, c6s20 −5.8%. Attendance Allowance + −12%, −21% and −17%. +- **HBAI (measurement H5s, Part H).** Pensioner quintile shares before housing costs against HBAI's + 22/25/21/18/14: c6s50 20.9/26.5/20.5/18.7/13.4; c6s20 21.7/27.8/20.3/17.9/12.2. + +## Part C. D6 retired (b19f14d98) + +The 50–70k State Pension band fits at +23.0%, +23.6% and +24.0% on the c5fix, c6s50 and c6s20 arms. +The terminal `uk_target_fit` gate fails its reviewed deferral (ruling D6, 2026-09-23, expiring +2026-10-21) as stale, so every arm from c5fix to c7 blocked its H5 on that one line. The entry is +retired, as the SE deferrals were, and the register is empty. The band's residual turned out to be an +uprating inconsistency between its amount and count rows, fixed at the root in 677336b3d (Part J). + +## Part D. Pension Credit (c7) + +- **Rows.** 14 caseload targets (`dwp_pension_credit`; the CY2025 mean of four quarterly points): Great + Britain, six type-by-partner cells, six age bands and Northern Ireland. `obr.pension_credit` stays bound. +- **Take-up.** A new stage, `pension_credit_take_up`, after the SPI chain. Within each DWP component a + reporter claims, and the other entitled units claim at r = (t·E − R)/(E − R), with FYE2024 take-up of 69% + (Guarantee Credit) and 37% (Savings Credit only). + - Stage gate on the c7 spine: realised take-up 69.4% (1,463 entitled units in the sample) and 39.1% + (392). +- **Arm c7 (spine e5788819).** Loss 0.00818 on 1,162; within 10% 97.8%; ESS 5,004 (66+ households 2,071). + All 14 caseload rows are within 0.3%. +- **The prior misses.** Before calibration the caseload is 0.889m against 1.391m (−36%) and spend −35.3% + (c6s50 −23.5%). + - The take-up lands, so the miss is on the entitled side: too few entitled pensioner units at the + σ_p = 0.5 prior. + - Calibration closes it. R9's fallback, solving take-up against the caseload, would not help: the + rates already reproduce DWP's. + +## Part E. Contributions (c8, c9) and the rows that left the fit + +- **c8 (9b66ab395).** The FRS spine no longer clips personal and stakeholder contributions at the 95th + percentile of every PENPROV amount; the clip removed 28% of the reported amount on 1.8% of rows. The + commit also authored four SPI Table 3.8 targets (net pay and relief at source, amount and count by + total-income band; amounts uprated by the earnings index under R5, counts by taxpayer growth). +- **c9 (8b3e9f993).** + - Employer contributions are an ASHE 2024 rate draw on pay, by scheme type and sector, replacing three + times the employee contribution. + - On the c9 spine: 10,102 members with earnings and a mean member rate of 8.4%. + - Members by ASHE type: 2,204 defined benefit, 2,824 defined contribution, 4,201 group personal and + 568 group stakeholder, plus 305 not specified. + - Converted salary-sacrifice records lose the sacrificed pay: 4,625 converted rows take the headcount + from 2.70m to 5.44m, against the 5.4m staging target. + - Contract: + - DWP employer contributions (£104.2bn) against the engine's employer contributions plus salary + sacrifice; + - DWP gross employee contributions (£45.5bn employees' own plus £20.7bn relief = £66.2bn); + - the 2024-25 salary-sacrifice amount (£24.6bn); + - the 7.7m users total leaves the fit. +- **Arm c9 (be5c13245, spine c2232d87).** The battery blocked on 12 Table 3.8 rows. + - Loss 0.01513 on 1,216 targets (c7: 0.00818); within 10% 95.6%; ESS 4,060 (c7: 5,004). Single ages + distorted (69 +21%). + - Totals against SPI 2023-24, uprated: + - net pay £23.0bn and 9.66m contributors: +67% and +68% at prior, +136% and +78% calibrated; + - relief at source £21.1bn and 10.87m: −28% and −82% at prior, −2% and −74% calibrated; + - DWP employee gross: −43% prior, −18% calibrated; + - DWP employer: +12% prior, +0.1% calibrated; + - salary-sacrifice amount: +57% prior, on target calibrated. +- **Diagnosis.** + - Table 3.8 splits contributions by relief mechanism; the engine's columns split by provider. + `employee_pension_contributions` holds every workplace deduction, and `personal_pension_contributions` + holds the FRS personal and stakeholder pensions. Workplace group personal pensions and many master + trusts take relief at source, so the engine's "net pay" is too large and its relief-at-source + contributors far too few (about 2.0m against 10.9m). No reweighting reaches that. + - DWP's gross employee figure also pulls against SPI's net pay: SPI net pay plus relief at source is + £44.1bn, close to DWP's £45.5bn employees' own contributions, not the £66.2bn gross. +- **Follow-up (c11b).** The four Table 3.8 targets and the DWP employee row leave the fit + (`scripts/c11b_unbind.py`; active references 1,283 → 1,230). The clip removal, the employer draw, the + conversion fix and the DWP employer row stay. Re-specification options are in Part I. + +## Part F. Pension-age benefits (c10, 13089945a) + +- Attendance Allowance cases with entitlement in England (1,597,003) and Wales (124,118): the mean of the + four calendar-2025 quarterly points, in the new family `dwp_attendance_allowance`. + - Scotland is not bound. Its caseload moves to Pension Age Disability Payment through 2025 (171k in + February, 25k in November), which the engine does not model. +- Pension-age Housing Benefit benefit units in Great Britain, as the twelve-month mean for 2025: + 1,107,464 across all tenures, 890,664 in the social and 216,779 in the private rented sector. + - The tenure cells are Stat-Xplore detail rows (measure `claimants`), and the engine reads the eldest + adult's age against 66. +- Winter Fuel Payment recipients in England and Wales, winter 2025/26 (11,003,237; fact key 31256472…), + sit beside `obr.winter_fuel_allowance` as a required diagnostic and are never fitted + (PolicyEngine/policyengine-uk#1760). +- **Final arm.** + - Every row fits within 0.2%: Attendance Allowance England −0.2% and Wales 0.0%; pension-age Housing + Benefit −0.2% (social −0.2%, private 0.0%). + - The prior was far short: Attendance Allowance −35% (England) and −23% (Wales); pension-age Housing + Benefit −41% (social −40%, private −49%). The frame lacks low-income pensioners at prior weights, the + same signal as Pension Credit (Part D). + - `obr.attendance_allowance` (amount) moves from 0.0% to +2.6%, and `obr.winter_fuel_allowance` from + +0.1% to +3.2%. + +## Part G. The salary-sacrifice relief counterfactual (c11, fcb5c46b5) + +- **Route.** The resolution loop resolves `input_substitution_counterfactual` bindings through the + provider. `UKMeasureResolver` builds one extra simulation per substitution: the sacrifice is zeroed and + added to pay at the calibration year, and the result is the output's delta against the baseline. The + delta lands in a slash-free column. +- **Rows (HMRC Table 6.2, 2024-25).** + - Employee NICs relief: £1.0bn. + - Employer NICs relief: restated from 13.8% to the engine's 2025 rate of 15%, so £3.4bn becomes + £3.70bn (new engine index parameter). + - Income-tax relief total: £8.8bn. + - c9's interim amount row retires; the three rate bands stay excluded until the band-test fix. +- **Engine test.** £3,000 returned to pay is taxed at 20% income tax, 8% employee NICs and 15% employer + NICs. +- **Decomposition at c7 (before the c9 pay fix; scripts/relief_decomposition.py).** + - Sacrificed amount £36.9bn across 7.67m sacrificers. + - Income-tax delta £8.31bn: the Child Benefit charge contributes +£0.09bn and the annual-allowance charge + −£0.27bn. + - Employee NICs delta £1.27bn, employer £4.13bn. + - At c7 the deltas double-count, because converted records' pay still carried the sacrifice; c9's fix + removes that. +- **Final arm (fits).** + - Income-tax relief total £8.8bn: −0.0% (prior −2.5%). + - Employee NICs relief £1.0bn: −0.1% (prior +20.6%). + - Employer NICs relief £3.70bn: −0.1% (prior +10.3%). +- **Final-arm decomposition on the H5.** + - Income-tax delta £8.86bn: the Child Benefit charge contributes +£0.09bn and the annual-allowance charge + −£0.39bn, so £9.16bn excluding the charges. + - Employee NICs £1.01bn, employer £3.72bn. + - The sacrificed amount is £36.3bn across 7.66m sacrificers, against the £24.6bn HMRC's employer relief + implies (c9's amount row held it exactly). + - In the final H5, 1.24m sacrificers (16%) have no pay but carry £18.8bn (52% of the amount), and + 0.35m are under 16 (£5.3bn). At prior, on the c9 spine, no-pay records already hold 64% of the + amount (£24.9bn of £38.8bn); in the c9 arm, with the amount row bound, they held £11.3bn of £24.7bn. + - The salary-sacrifice stage's forest predicts a sacrifice for everyone not asked (the #1063 + non-earner finding). Returned pay on those records carries less relief per pound (the personal + allowance and the NICs thresholds absorb it), so the solver inflates amounts to reach the relief + totals. + - So the R7 premise, that the employer row anchors the amount, does not hold until the non-earner + defect is fixed (a #1063 fold-in). Keeping the amount row bound beside the relief rows is the + interim option. + +## Part H. Validation (WP7) and the final arm + +- **Final arm (d9fca7bb7, `runs/uk-pensions-1069-final`).** The battery passed and the H5 was written. + - Loss 0.00730 on 1,170 targets; within 10% 97.5%; ESS 4,900 (66+ households 2,268); top-1% weight + share 0.272. For comparison: c7 0.00818 on 1,162, and the 2026-09-30 main build 0.00836 on 1,090. + - Measure resolution, including the one counterfactual simulation, takes about 10 minutes. + - No row above 25%. The worst rows: + - the 50–70k State Pension band +24.5%; + - East Midlands total income £12,570–15,000 +24.4%; + - VAT +23.9% (PolicyEngine/policyengine-uk#1996); + - Child Benefit +22.7% (#1063); + - employment income £15–20k −21.8% and £20–30k −21.1%. + - SPI State Pension bands: 20–30k +19.7%, 30–40k +20.0%, 40–50k +12.3%, 50–70k +24.5%, 70–100k +16.6%. +- **Engine, FY2025-26, on the final H5 (pension_types.py).** + - State Pension £142.5bn and 12.42m recipients, against the £142.3bn resident level (GB £138.6bn plus NI + £3.7bn). + - New State Pension 4.85m (£54.2bn); basic 7.57m; additional 9.18m. + - Pension Credit 1.46m benefit units and £6.15bn (targets 1.45m and £6.11bn): Guarantee Credit only + 0.859m, both 0.430m, Savings Credit only 0.171m. + - Ages 64–68: 0.874, 0.633, 0.721, 0.757 and 0.698m, against ONS 0.80, 0.77, 0.75, 0.71 and 0.68m. + - Realised Pension Credit take-up (weighted claimants over weighted entitled; Vahid's review): Guarantee + Credit 74.7% and Savings Credit only 46.1%, against the 69% and 37% the stage sets at prior weights + (Part J). +- **HBAI (pensioner_position.py).** + - Pensioner quintile shares before housing costs: 20.6/26.2/21.4/18.8/13.0, against HBAI's + 22/25/21/18/14. The pre-#1069 control (ch3) had 18.3/24.0/22.0/18.8/17.0. + - Pensioner relative poverty: 14.2% BHC and 14.7% AHC, against HBAI FYE 2025's 16% and 14% (ch3: 13.1% + and 11.3%). The arms run from 14.2% to 16.0% BHC. +- **CPI-only State Pension probe (reform_probe.py, wp7_analyse.py; 300 household bootstrap draws).** + - Budget effect +£1.20bn, +£1.79bn, +£2.43bn and +£3.10bn for 2027 to 2030 (SE ≤ £0.08bn). + - ch3 is 10–13% lower and the #979 build 7–8% lower: mostly the State Pension level (the engine's £131bn + on ch3 against £142.5bn now). + - Decile loss shares in 2030: 7.4/8.9/12.6/13.0/11.4/11.4/12.7/8.8/7.7/6.0, SE ≤ 1.0 point. ch3's + heavy D4 record (SE 3.4 points) is gone. +- **Stability.** A second calibration seed would change nothing: the national solve is deterministic + (L0 λ = 0; the seed only feeds L0 gate sampling). Stability is read from the household bootstrap above + and from the σ_p variant below. +- **σ_p variant at the final state (finals20, spine 70f4cb44; uncommitted).** + - The battery blocks on one row: the 50–70k State Pension band at +25.6% (final +24.5%). + - Loss 0.00758 against 0.00730; within 10% 97.7% against 97.5%; ESS 4,994 against 4,900; top-1% weight + share 0.267 against 0.272. + - SPI bands: 20–30k +13.9% and 30–40k +15.1% (better), 70–100k +22.6% (worse). + - Non-taxpayer State Pension £37.5bn against £35.5bn. + - Prior gaps are closer: Pension Credit −24% against −36%; Attendance Allowance (England) −32% against + −35%; pension-age Housing Benefit −28% against −41%. + - Single ages: 62 +15%, 63 +11%, 64 −6%, 65 −17%, 69 +12% (final: +8/+2/+9/−19/+20%). + - HBAI quintiles: 21.5/27.9/21.1/16.7/12.7 (Q2 +2.9 points against HBAI; the final's largest gap is 1.4). + Pensioner relative poverty: 15.1% BHC and 15.1% AHC. + - CPI-only probe against the final: the budget effect agrees within 0.5% in every year, inside WP7's 3% + criterion. Decile loss shares differ by up to 1.2–1.8 points, just outside its 1-point criterion: 0.2 + moves loss towards D1–D4. The bootstrap SE is 0.6–1.0 points. + +## Part I. Remaining gaps and rulings owed + +- **c0 (State Pension age by date of birth).** Blocked on PolicyEngine/policyengine-uk#1899, still open. + The 70–74 type-boundary zig-zag remains until it lands, with single ages 69 to 73 off by 10% to 20%. +- **Engine follow-up (repos/policyengine-uk-1069, 4 local commits).** These cover reform propagation, the + 2025-26 Pension Credit rates and guarantee uprating, the April 2027 rate and the state_pension column + guard. Items 2 (the basic-to-new double count) and 3 (Additional State Pension by CPI) wait for #1899. + Seven engine rulings are owed. +- **σ_p (SPI channel pension-age share).** Ruled 0.2 on 2026-10-02 (3a3fc105c); the post-fix comparison + with 0.5 is in Part J. +- **Single ages (R3).** At the final state 65 is −19% and 64 +9% (c5fix: −15% and +1%); at fix20, 65 is + −17%, 64 −6%, and 62 and 63 are +15% and +12%. The fallback, splitting 65–69 into 65, 66 and 67–69, is + available on her ruling; Vahid recommends taking it now. +- **SPI State Pension bands.** Fixed at the root in 677336b3d (Part J). At fix20 every band is within 4% + except £20–30k (+13.1%), a headcount residual (8.0% too many recipients) that the uprating does not cause. +- **Non-taxpayer State Pension.** The arms' proxy split puts it at £35.5bn (σ_p 0.5) and £37.6bn (0.2), + short of what HMRC and DWP imply (about £41bn against the post-fix SPI rows). +- **Pension Credit entitlement at prior: −36% at σ_p 0.5, −24% at 0.2.** Calibration closes the caseload; + realised take-up then lands at 71.6% and 40.9% at fix20 against DWP's 69% and 37% (Part J). +- **Contribution rows out of the fit (Part E).** Options: + - (1) Bind combined Table 3.8 amounts (net pay plus relief at source) against employee plus personal + contributions, and drop the counts. + - (2) Model the relief mechanism from PENPROV.STEMPPEN: group personal and stakeholder workplace schemes + to relief at source, occupational to net pay. NEST-type master trusts stay ambiguous. + - (3) Keep both families as diagnostics. + - The DWP employee figure: bind employees' own £45.5bn, the gross £66.2bn, or neither. +- **Salary-sacrifice relief.** + - The relief rows fit, but the sacrificed amount rises to £36.3bn at the final state and £34.3bn at + fix20 (£24.6bn implied), because records paid under £9,100 hold about half of it (Part G, Part J). + Her ruling (2026-10-02): #1063's earners-only fix resolves it. Vahid recommends keeping the c9 amount + row bound until then, because the excess displaces genuine employer contributions inside the DWP + employer row; her call. + - The three income-tax rate bands are deferred until the band test reads after-allowance thresholds and + the Scottish bands; the exclusions expire 2026-11-25. + - The FY2024-25 relief and amount rows are not earnings-uprated (consistent with R1 and R10), a gap of + about 4–5%. + - The employer row is restated to 15% by the rate only. The 15% is statute (NICs (Secondary Class 1 + Contributions) Act 2025, ss.1–2), and the engine-measured factor on earners is exactly 15/13.8 + (Part J); recommendation: keep it. + - The income-tax delta includes the Child Benefit and annual-allowance charges. +- **Winter Fuel.** A diagnostic only, until PolicyEngine/policyengine-uk#1760. +- **Attendance Allowance in Scotland (Pension Age Disability Payment).** Not bound. +- **Salary-sacrifice anchor.** Not yet vendored from Chronicle (a plan item; the values already match the + feed). +- **WP7 second seed.** The national solve is deterministic, so stability is measured by bootstrap and + across the σ_p variant. +- **Time-critical, outside this PR.** The `slc.borrowers.plan_2_*` measure exclusions expire 2026-10-03; + an expired entry raises in every build and in the certifier. +- **Outward steps, each on her go.** The draft PR is open (#1084). Held: the reply to Vahid's review; the + comment on PolicyEngine/chronicle#302; the flag on the deleted parameters on + PolicyEngine/policyengine-uk#1899; the engine follow-up issue and PR. + +## Part J. Review round 1, the σ_p ruling and the SPI State Pension amount root fix + +- **CI (004b5c9cc).** The integration-uk smoke build blocked on the new Pension Credit take-up gate, because + a synthetic smoke frame has no real entitlement. The gate now records without blocking on synthetic + builds (`population_fact_check`), like the other population fact gates, and a test pins that. +- **σ_p = 0.2 (3a3fc105c, ruled 2026-10-02).** The stage constant, both stage manifests and the + `pension_age_spi_prior_mass_share` gate move together. The coverage manifest, the charter-H2 fixture and + the gate digests are regenerated. +- **The SPI State Pension amount root fix (677336b3d).** + - **Mechanism.** The 13 Table 3.7 amount rows moved from 2023-24 to 2025 by the new State Pension rate + alone (230.25 / 203.85 = 1.1295). Their count rows moved by HMRC's projected taxpayer growth in the + Table 2.5 band containing each SPI band. So each band's amount kept the 2023-24 number of recipients + while its count row grew them, and the two rows described different populations. + - **Fix.** An amount row now moves by its count row's factor times the rate ratio, with both component + factors receipted. The factors run from 1.106 (£15–20k, where taxpayer numbers fall) to 1.405 + (£100–150k); £50–70k moves by 1.217 × 1.1295 = 1.375. The 13 rows sum to £100.9bn instead of £96.3bn. + A row compiled at its own year (the production-2023 parity surface) stays as published. + - **Per recipient.** Before the fix, the targets' mean State Pension per recipient in the £30,000–100,000 + bands was £9.8–10.7k, below the full new State Pension of £11,973 a year, while the model's means there + were £11.6–12.3k. After it, the target means are £11.9–12.1k and the model is within 1–4% of them. + - **Effect at σ_p 0.2 (finals20 → fix20).** The two spines are data-identical (all 2,494 datasets and + their attributes match), so only the targets differ. + - The battery passes: no row above 25%. + - Loss 0.00742 against 0.00758; within 10% 98.0% against 97.7%; ESS 5,007 against 4,994; top-1% + weight share 0.267. + - SPI State Pension bands: £30–40k +3.3% (was +15.1%), £40–50k +0.8% (+13.0%), £50–70k +3.8% + (+25.6%), £70–100k +1.7% (+22.6%), £12,570–15,000 +0.3% (+4.6%); every other band within 1%. + - The £20–30k band stays at +13.1%. Its count factor is 1.0025, so the uprating is not the cause: the + band has 8.0% too many State Pension recipients and a mean 4.7% high. At σ_p 0.5 its count residual + is +13.9% (final +14.2%). + - Single ages, the HBAI position and the State Pension totals move by at most a point (the same + spine; only the band targets changed). + - **Effect at σ_p 0.5 (final → fix50).** The spines are data-identical too: the c9 spine the final arm + reused matches fix50's dataset for dataset, so nothing since c9 changed the spine data. + - The battery passes. Loss 0.00716 against 0.00730; within 10% 98.0% against 97.5%; ESS 4,937 against + 4,900. + - SPI State Pension bands: £40–50k 0.0% (was +12.3%), £50–70k +3.0% (+24.5%), £70–100k +0.1% + (+16.6%), £30–40k +8.9% (+20.0%), £20–30k +18.7% (+19.7%). +- **σ_p after the fix: fix20 (0.2) against fix50 (0.5).** Both pass every gate, and both put 98.0% of rows + within 10%. + - **For 0.5.** + - Reported loss 0.00716 against 0.00742. The gap is one row: ESA claimants, +6.9% against +9.4%, + contributes more than the whole difference. Without it the weighted loss favours 0.2, and the + unweighted sum of squared relative errors is 0.913 at 0.5 against 0.806 at 0.2. + - Single ages: mean absolute error over 55–79 is 7.3% against 7.6%, and over 60–65 9.3% against 11.7%. + 62 and 63 are +8% and +2% against +15% and +12%. Ages 64, 65 and 69 are better at 0.2: −6%, −17% + and +12%, against +9%, −19% and +21%. + - HBAI pensioner quintiles (BHC): 20.6/26.0/21.5/18.9/13.0 against 21.5/27.9/21.1/16.7/12.7, with + HBAI at 22/25/21/18/14. The total gap is 4.8 points against 6.1 (Q2 +1.0 against +2.9). + - AHC relative poverty 14.8% against 15.3% (HBAI 14%, interval 12–16%). + - ESS on pension-age households 2,304 against 2,217. + - **For 0.2.** + - Pension Credit take-up after calibration: Guarantee Credit 71.6% against 74.7%, and Savings Credit + only 40.9% against 45.7% (DWP 69% and 37%). The entitled pool behind the bound caseload is 1.81m + and 0.41m, against 1.73m and 0.37m (about 1.87m and 0.46m at DWP's rates). + - Before calibration: Pension Credit −24% against −36%, pension-age Housing Benefit −28% against + −41%, Attendance Allowance (England) −32% against −35%. + - The SPI £20–30k State Pension band: count +8.0% against +13.9%, amount +13.1% against +18.7%; + £30–40k +3.3% against +8.9%. + - BHC relative poverty 15.2% against 14.3% (HBAI 16%, interval 14–18%). + - ESS 5,007 against 4,937; top-1% weight share 0.267 against 0.270. + - Non-taxpayer State Pension (proxy split) £37.6bn against £35.4bn. + - The SPI channel, built to supply the top of the income distribution, carries 22% of calibrated + pension-age people against 46%. + - **Neutral.** The CPI-only probe's budget effect agrees within 0.5% in every year (+£3.11bn against + +£3.10bn in 2030, SE £0.07bn). 0.2 moves up to 1.5 points of the 2030 loss towards D1–D4 (SE 0.6–1.0). +- **Vahid's points.** + 1. **The DWP employer row's country.** The contract's measurement block now declares England, + Scotland and Wales. The engine binding already restricted the row to GB households (its + `household_conditions` list the nine English regions, Wales and Scotland), so the fit was GB-only + before; the declaration now matches it. + 2. **The employer NICs threshold.** On the fix20 H5, the counterfactual under 2025 parameters (15% above + £96 a week) against 2024-25 parameters (13.8% above £175 a week): + - sacrificers paid at least £9,100: relief £2.605bn against £2.397bn, factor 1.087, exactly the + rate-only 15/13.8; + - sacrificers paid under £9,100: £1.112bn against £0.778bn, factor 1.430; + - all: £3.717bn against £3.174bn, factor 1.171. + - The excess over the rate ratio sits entirely on records paid under £9,100. They are essentially the + no-pay sacrificers of #1063's non-earner defect, and they carry £16.6bn of the £34.3bn sacrificed; + earners carry £17.6bn, against the £24.6bn HMRC's relief implies. HMRC's sacrificers are earners, + so the rate-only factor restates the real quantity; the engine-measured factor would write the + frame defect into the target. Recommendation: keep the rate-only factor (her call, ruling 4). + 3. **Pension Credit take-up after calibration** (weighted claimants over weighted entitled; DWP FYE2024 + 69% and 37%): + - final (σ_p 0.5): Guarantee Credit 74.7%, Savings Credit only 46.1% (entitled 1.73m and 0.37m); + - finals20: 71.6% and 40.7% (1.80m and 0.42m); + - fix20: 71.6% and 40.9% (1.81m and 0.41m); + - fix50: 74.7% and 45.7% (1.73m and 0.37m). + - At DWP's rates the bound caseload implies entitled pools of about 1.87m and 0.46m. Calibration fixes + the claimants exactly, so the drift is in the entitled pool behind them, which is what a take-up or + rate reform acts on. It is smallest at 0.2. R9's fallback is not needed at 0.2. + 4. **The unit value in the £40–60 band rationale** is removed. The earlier text remains in the branch + history (a2bfee0a0, below the #1063 stack's base); rewriting it is her call. + 5. **The income-tax relief bands after the band-test fix.** Proposal: bind the three bands and make the + total a diagnostic, since the bands carry the distribution and the total is their sum (her call). + 6. **The £50–70k band and the fence**: resolved at the root, above. diff --git a/packages/microcosm-build/src/microcosm/build/ledger_targets.py b/packages/microcosm-build/src/microcosm/build/ledger_targets.py index 8c9d6dad3..c0d5e3ae0 100644 --- a/packages/microcosm-build/src/microcosm/build/ledger_targets.py +++ b/packages/microcosm-build/src/microcosm/build/ledger_targets.py @@ -39,6 +39,17 @@ MONTHLY_WINDOW_OPERATIONS = frozenset( ("monthly_window_average", "monthly_window_sum_average") ) +#: A monthly window whose every point is a published count times a published +#: mean (a caseload and its mean weekly amount), scaled by the mean operand's +#: ``period_factor`` (52 turns a weekly mean into an annual amount) and +#: averaged over the declared months. The two operands name the count and mean +#: concepts, because publishers name the measures after the benefit +#: (``recipients``, ``mean_weekly_amount``) rather than ``*_count``/``*_mean``. +#: It is not one of ``MONTHLY_WINDOW_OPERATIONS``: those average a single +#: series, and this one pairs two. +MONTHLY_WINDOW_COUNT_X_MEAN = "monthly_window_count_x_mean" +#: Ordered operand roles of ``monthly_window_count_x_mean``. +COUNT_X_MEAN_OPERAND_ROLES = ("count", "mean") ALLOWED_VALUE_OPERATIONS = frozenset( ( "identity", @@ -50,6 +61,7 @@ "latest_plateau", "count_x_mean", "scaled_by_ratio", + MONTHLY_WINDOW_COUNT_X_MEAN, *MONTHLY_WINDOW_OPERATIONS, ) ) @@ -63,6 +75,7 @@ "latest_plateau", "count_x_mean", "scaled_by_ratio", + MONTHLY_WINDOW_COUNT_X_MEAN, *MONTHLY_WINDOW_OPERATIONS, ) ) @@ -254,6 +267,8 @@ def __post_init__(self) -> None: _validate_scaled_by_ratio_operands(self.name, self.value_operands) if self.value_operation == "calendar_year_window": _validate_calendar_year_window_reference(self) + if self.value_operation == MONTHLY_WINDOW_COUNT_X_MEAN: + _validate_count_x_mean_operands(self.name, self.value_operands) if self.assertion_policy not in ALLOWED_ASSERTION_POLICIES: raise ValueError( f"LedgerTargetReference {self.name!r}: unsupported " @@ -265,7 +280,10 @@ def __post_init__(self) -> None: f"period_match_policy {self.period_match_policy!r}; expected " f"one of {sorted(ALLOWED_PERIOD_MATCH_POLICIES)!r}." ) - is_window = self.value_operation in MONTHLY_WINDOW_OPERATIONS + is_window = self.value_operation in { + *MONTHLY_WINDOW_OPERATIONS, + MONTHLY_WINDOW_COUNT_X_MEAN, + } if is_window != (self.period_match_policy == "source_window"): raise ValueError( "A monthly window operation requires the paired source_window period policy." @@ -276,7 +294,8 @@ def __post_init__(self) -> None: "A monthly window requires an explicit model target period." ) _declared_source_months(self) - _monthly_window_operands(self) + if self.value_operation in MONTHLY_WINDOW_OPERATIONS: + _monthly_window_operands(self) if self.period_match_policy == "exact" and self.period is None: raise ValueError( f"LedgerTargetReference {self.name!r}: period_match_policy=" @@ -740,6 +759,10 @@ def target_spec_from_ledger_reference( raise ValueError(f"Ledger target reference {reference.name!r} has no facts.") if reference.value_operation in MONTHLY_WINDOW_OPERATIONS: facts = _resolve_monthly_window_reference_facts(reference, list(facts)) + elif reference.value_operation == MONTHLY_WINDOW_COUNT_X_MEAN: + facts = _resolve_monthly_window_count_x_mean_reference_facts( + reference, list(facts) + ) if len(facts) > 1 and reference.value_operation not in MULTI_FACT_VALUE_OPERATIONS: raise ValueError( f"Ledger target reference {reference.name!r}: multiple Ledger facts " @@ -761,6 +784,10 @@ def target_spec_from_ledger_reference( numeric_value = numeric_values[-1] elif reference.value_operation == "count_x_mean": numeric_value = numeric_values[0] * numeric_values[1] + elif reference.value_operation == MONTHLY_WINDOW_COUNT_X_MEAN: + numeric_value, value_metadata = _monthly_window_count_x_mean_value( + reference, facts, numeric_values + ) elif reference.value_operation == "sum": numeric_value = sum(numeric_values) elif reference.value_operation == "difference": @@ -807,19 +834,25 @@ def target_spec_from_ledger_reference( else facts ) publication_metadata = dict(value_metadata) - if reference.value_operation in MONTHLY_WINDOW_OPERATIONS: + if reference.value_operation in { + *MONTHLY_WINDOW_OPERATIONS, + MONTHLY_WINDOW_COUNT_X_MEAN, + }: # The window guard has proved these identities common to every member. publication_metadata = { - key: value - for key, value in { - "ledger_source_release_key": _str_at( - representative_fact, "source_release_key" - ), - "ledger_source_sha256": _str_at( - representative_fact, "source", "source_sha256" - ), - }.items() - if value + **value_metadata, + **{ + key: value + for key, value in { + "ledger_source_release_key": _str_at( + representative_fact, "source_release_key" + ), + "ledger_source_sha256": _str_at( + representative_fact, "source", "source_sha256" + ), + }.items() + if value + }, } if not reference.measure: @@ -947,10 +980,15 @@ def _validate_fact_aggregation( reference.metadata.get("fact_aggregation") == "time_mean" and aggregation == "mean" ) - accepts_count_x_mean = ( - reference.value_operation == "count_x_mean" - and aggregation == "mean" - and _count_mean_fact_role(fact) == "mean" + accepts_count_x_mean = aggregation == "mean" and ( + ( + reference.value_operation == "count_x_mean" + and _count_mean_fact_role(fact) == "mean" + ) + or ( + reference.value_operation == MONTHLY_WINDOW_COUNT_X_MEAN + and _count_x_mean_operand_role(reference, fact) == "mean" + ) ) if ( aggregation not in SUPPORTED_LEDGER_AGGREGATIONS @@ -1701,6 +1739,10 @@ def _resolve_reference_fact( eligible_matches = _eligible_selector_matches(reference, matches) if reference.value_operation in MONTHLY_WINDOW_OPERATIONS: return _resolve_monthly_window_reference_facts(reference, eligible_matches) + if reference.value_operation == MONTHLY_WINDOW_COUNT_X_MEAN: + return _resolve_monthly_window_count_x_mean_reference_facts( + reference, eligible_matches + ) if reference.value_operation == "sum" and eligible_matches: return _resolve_sum_reference_facts(reference, eligible_matches) if reference.value_operation == "difference" and eligible_matches: @@ -1894,6 +1936,218 @@ def _validate_scaled_by_ratio_operands( ) +def _validate_count_x_mean_operands( + name: str, operands: tuple[Mapping[str, object], ...] +) -> None: + prefix = f"LedgerTargetReference {name!r}: {MONTHLY_WINDOW_COUNT_X_MEAN}" + roles = [ + str(operand.get("role")) if isinstance(operand, Mapping) else "" + for operand in operands + ] + if roles != list(COUNT_X_MEAN_OPERAND_ROLES): + raise ValueError( + f"{prefix} requires exactly ordered " + f"{'/'.join(COUNT_X_MEAN_OPERAND_ROLES)} operands, got {roles!r}." + ) + concepts = [] + for operand, allowed in zip( + operands, + ({"role", "concept"}, {"role", "concept", "period_factor"}), + strict=True, + ): + unsupported = set(operand) - allowed + if unsupported: + raise ValueError( + f"{prefix} operand {operand['role']!r} takes only " + f"{sorted(allowed)!r}, got {sorted(unsupported)!r}." + ) + concept = operand.get("concept") + if not isinstance(concept, str) or not concept.strip(): + raise ValueError( + f"{prefix} operand {operand['role']!r} must name its concept." + ) + concepts.append(concept) + if concepts[0] == concepts[1]: + raise ValueError(f"{prefix} count and mean must name different concepts.") + factor = operands[1].get("period_factor", 1) + if ( + isinstance(factor, bool) + or not isinstance(factor, (int, float)) + or not math.isfinite(float(factor)) + or float(factor) <= 0 + ): + raise ValueError( + f"{prefix} period_factor must be a finite positive number, got {factor!r}." + ) + + +def _count_x_mean_operand_role(reference: LedgerTargetReference, fact: object) -> str: + """The operand role whose concept the fact carries, or ``""``.""" + + concepts = {_source_measure_concept(fact), _primary_measure_concept(fact)} - {""} + roles = [ + str(operand["role"]) + for operand in reference.value_operands + if str(operand["concept"]) in concepts + ] + return roles[0] if len(roles) == 1 else "" + + +def _count_x_mean_period_factor(reference: LedgerTargetReference) -> float: + return float(reference.value_operands[1].get("period_factor", 1)) + + +def _count_x_mean_cell_key(fact: object) -> tuple[str, ...]: + """The published cell a count and its mean must share. + + Publishers file the two measures in sibling record sets + (``...age_gender_type.month2025_05`` and ``...age_gender_type.mean.month2025_05``), + so the record set is not part of the cell: its period, geography, entity, + group value, dimensions and universe are. + """ + + return ( + _source_name(fact), + _str_at(fact, "period", "type"), + _str_at(fact, "period", "value"), + _str_at(fact, "geography", "level"), + _str_at(fact, "geography", "id"), + _str_at(fact, "entity", "name"), + _str_at(fact, "layout", "groupby_value_id"), + json.dumps(_dimensions(fact), sort_keys=True, separators=(",", ":")), + json.dumps(_constraint_rows(fact), sort_keys=True, separators=(",", ":")), + _domain(fact), + ) + + +def _resolve_monthly_window_count_x_mean_reference_facts( + reference: LedgerTargetReference, + matches: list[object], +) -> tuple[object, ...]: + """One count and one mean fact per declared month, on one published cell. + + Returns them month by month, count before mean. Like the single-series + windows, the guard also runs after direct-key resolution. + """ + + months = _declared_source_months(reference) + prefix = ( + f"Ledger target reference {reference.name!r}: {MONTHLY_WINDOW_COUNT_X_MEAN}" + ) + expected_count = len(COUNT_X_MEAN_OPERAND_ROLES) * len(months) + if reference.expected_member_count not in (None, expected_count): + raise ValueError( + f"{prefix} expected_member_count disagrees with its " + f"{len(months)} declared months." + ) + grid: dict[tuple[str, str], object] = {} + series: dict[str, set[tuple[str, ...]]] = {} + for fact in matches: + if not _fact_matches_selector(fact, reference.ledger_selector): + raise ValueError(f"{prefix} resolved a fact outside its selector.") + role = _count_x_mean_operand_role(reference, fact) + if not role: + raise ValueError( + f"{prefix} selected a fact whose concept is neither operand's: " + f"{_primary_measure_concept(fact)!r}." + ) + month = _str_at(fact, "period", "value") + if _str_at(fact, "period", "type") != "month" or month not in months: + raise ValueError( + f"{prefix} selected a fact outside the declared months: {month!r}." + ) + if (month, role) in grid: + raise ValueError( + f"{prefix} matched more than one {role} fact for {month}; the " + "selector must pin one published cell." + ) + grid[(month, role)] = fact + series.setdefault(role, set()).add(_selector_period_invariant_key(fact)) + missing = [ + f"{month} {role}" + for month in months + for role in COUNT_X_MEAN_OPERAND_ROLES + if (month, role) not in grid + ] + if missing: + raise ValueError( + f"{prefix} requires one count and one mean fact for every declared " + f"month; missing {missing!r}." + ) + if any(len(keys) != 1 for keys in series.values()): + raise ValueError(f"{prefix} matched more than one series for a role.") + for month in months: + if _count_x_mean_cell_key(grid[(month, "count")]) != _count_x_mean_cell_key( + grid[(month, "mean")] + ): + raise ValueError( + f"{prefix} pairs a count and a mean from different published " + f"cells in {month}." + ) + publications = { + (_str_at(fact, "source_release_key"), _str_at(fact, "source", "source_sha256")) + for fact in grid.values() + } + if len(publications) != 1 or not all(next(iter(publications))): + raise ValueError( + f"{prefix} requires every member to come from one publication with a " + "nonempty source_release_key and source.source_sha256." + ) + return tuple( + grid[(month, role)] for month in months for role in COUNT_X_MEAN_OPERAND_ROLES + ) + + +def _monthly_window_count_x_mean_value( + reference: LedgerTargetReference, + facts: tuple[object, ...], + numeric_values: list[float], +) -> tuple[float, dict[str, str]]: + """Average over months of count x mean x period_factor, with every member.""" + + factor = _count_x_mean_period_factor(reference) + members = [] + products = [] + for index in range(0, len(facts), len(COUNT_X_MEAN_OPERAND_ROLES)): + count_fact, mean_fact = facts[index], facts[index + 1] + count, mean = numeric_values[index], numeric_values[index + 1] + if count < 0 or mean < 0: + raise ValueError( + f"Ledger target reference {reference.name!r}: " + f"{MONTHLY_WINDOW_COUNT_X_MEAN} needs a non-negative count and " + f"mean; got {count!r} and {mean!r} in " + f"{_str_at(count_fact, 'period', 'value')}." + ) + products.append(count * mean * factor) + members.append( + { + "month": _str_at(count_fact, "period", "value"), + "count": f"{count:.15g}", + "mean": f"{mean:.15g}", + "count_fact_key": _fact_key(count_fact) + or _source_record_id(count_fact), + "mean_fact_key": _fact_key(mean_fact) or _source_record_id(mean_fact), + } + ) + mean_unit = _str_at(facts[1], "observed_measure", "unit") + return sum(products) / len(products), { + "ledger_window_count_x_mean_count_concept": str( + reference.value_operands[0]["concept"] + ), + "ledger_window_count_x_mean_mean_concept": str( + reference.value_operands[1]["concept"] + ), + "ledger_window_count_x_mean_period_factor": f"{factor:.15g}", + "ledger_window_count_x_mean_members": json.dumps( + members, sort_keys=True, separators=(",", ":") + ), + # The value is count x mean x factor, not the mean fact's own unit. + "ledger_measure_unit": f"{mean_unit} x {factor:.15g}" + if mean_unit + else f"x {factor:.15g}", + } + + def _scaled_by_ratio_operand_selectors( reference: LedgerTargetReference, ) -> tuple[Mapping[str, object], ...]: @@ -2289,12 +2543,21 @@ def _monthly_window_source_key( constraint for constraint in _constraint_rows(fact) if _str_at(constraint, "variable") not in dimensions + and _str_at(constraint, "operator") not in _BAND_EDGE_OPERATORS ], sort_keys=True, ), ) +#: A summed cell may be a published band whose edges the publisher also states +#: as numeric bounds (a single year of age 66 carries ``age >= 66`` and +#: ``age < 67``). Those edges belong to the cell, like its dimension value, so +#: they differ between cells; each cell's own months are still compared on +#: every constraint by the one-series check (microcosm#1069). +_BAND_EDGE_OPERATORS = frozenset(("<", "<=", ">", ">=")) + + def _resolve_monthly_window_reference_facts( reference: LedgerTargetReference, matches: list[object], diff --git a/packages/microcosm-build/src/microcosm/build/source_manifest.py b/packages/microcosm-build/src/microcosm/build/source_manifest.py index 1f787c140..be741c594 100644 --- a/packages/microcosm-build/src/microcosm/build/source_manifest.py +++ b/packages/microcosm-build/src/microcosm/build/source_manifest.py @@ -50,6 +50,7 @@ "assign_bus_use_incidence", "assign_bus_pass_eligibility", "assign_clipped_normal", + "assign_component_take_up_residual", "assign_period_constant", "assign_student_loan_plan_cohorts", "assign_main_asset_type", @@ -107,6 +108,8 @@ "derive_wic_claim", "disaggregate_aggregate_records", "draw_capital_gains_prior_from_banded_quantiles", + "draw_employer_pension_contributions_from_rate_bands", + "draw_spi_donor_ages_by_population", "fit_labor_market_models", "fit_tip_income_model", "fit_weighted_acs_rent_qrf", @@ -155,6 +158,7 @@ "read_acs_rent_donor", "redraw_columns_from_fitted_qrf", "resample_band_donor_leaves", + "zero_pension_age_reports_below_state_pension_age", "redraw_spi_reported_uc", "redraw_spi_reporter_capital", "record_mass_conservation_receipt", diff --git a/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json b/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json index e3efd2c1a..eaf7c3993 100644 --- a/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json +++ b/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json @@ -6432,6 +6432,66 @@ } } }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "kind", + "output", + "draw", + "seed", + "anchor", + "bands", + "weight_mapping", + "residual_rate" + ], + "properties": { + "kind": { + "const": "assign_component_take_up_residual" + }, + "output": { + "type": "string" + }, + "draw": { + "type": "string" + }, + "seed": { + "type": "integer" + }, + "anchor": { + "type": "string" + }, + "bands": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "rule", + "rate_key" + ], + "properties": { + "name": { + "type": "string" + }, + "rule": { + "type": "string" + }, + "rate_key": { + "type": "string" + } + } + } + }, + "weight_mapping": { + "type": "string" + }, + "residual_rate": { + "type": "string" + } + } + }, { "type": "object", "additionalProperties": false, @@ -7331,6 +7391,12 @@ "conservation": { "type": "string" }, + "pension_age_share": { + "type": "number" + }, + "pension_age_stratum": { + "type": "string" + }, "share": { "type": "number" }, @@ -8572,6 +8638,70 @@ } } }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "kind", + "output", + "artifact_role", + "resource", + "scheme_source", + "sector_source", + "occupational_split", + "rate_basis", + "top_band_ceiling", + "seed", + "salts" + ], + "properties": { + "kind": { + "const": "draw_employer_pension_contributions_from_rate_bands" + }, + "output": {"type": "string"}, + "artifact_role": {"type": "string"}, + "resource": {"type": "string"}, + "scheme_source": {"type": "string"}, + "sector_source": {"type": "string"}, + "occupational_split": {"type": "string"}, + "rate_basis": {"type": "string"}, + "top_band_ceiling": {"type": "number"}, + "seed": {"type": "integer"}, + "salts": {"type": "array", "items": {"type": "string"}} + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "kind", + "artifact_role", + "resource", + "population_period", + "method", + "state_pension_age" + ], + "properties": { + "kind": { + "const": "draw_spi_donor_ages_by_population" + }, + "artifact_role": { + "type": "string" + }, + "resource": { + "type": "string" + }, + "population_period": { + "type": "integer" + }, + "method": { + "type": "string" + }, + "state_pension_age": { + "type": "string" + } + } + }, { "type": "object", "additionalProperties": false, @@ -8621,6 +8751,48 @@ }, "seed": { "type": "integer" + }, + "age_pool_minimum": { + "type": "integer" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "kind", + "spi_state_pension_leaf", + "spi_channel_columns", + "base_channel_columns", + "state_pension_age", + "receipt" + ], + "properties": { + "kind": { + "const": "zero_pension_age_reports_below_state_pension_age" + }, + "spi_state_pension_leaf": { + "type": "string" + }, + "spi_channel_columns": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + }, + "base_channel_columns": { + "type": "array", + "items": { + "type": "string" + } + }, + "state_pension_age": { + "type": "string" + }, + "receipt": { + "type": "string" } } }, diff --git a/packages/microcosm-build/src/microcosm/build/target_materialization.py b/packages/microcosm-build/src/microcosm/build/target_materialization.py index 1a383c4c0..8f11e64a0 100644 --- a/packages/microcosm-build/src/microcosm/build/target_materialization.py +++ b/packages/microcosm-build/src/microcosm/build/target_materialization.py @@ -21,9 +21,10 @@ # spec carries its own band's lower edge in Ledger filter metadata. Two # encodings are in use — a numeric lower bound (HMRC SPI income bands) and a # published range label (DWP award bands, in monthly units, hence -# ``band_period_factor``) — and both reduce to one lower edge, because no -# reference anywhere declares an upper bound. A band's upper edge is its -# sibling's lower edge within the same compiled contract target. Edges must +# ``band_period_factor``) — and both reduce to one lower edge. A band's upper +# edge is its sibling's lower edge within the same compiled contract target, +# except for DWP's half-open labels ("£20.00 to under £40.00", "Under £20.00"), +# which publish their own exclusive upper edge and keep it. Edges must # never derive from an exclusion-pruned roster, or excluding a band silently # widens its lower neighbour; only the compiled register's top band runs to # infinity unless the binding declares a source-unit ``band_upper_bound``. @@ -33,13 +34,22 @@ _BAND_LOWER_BOUND_SUFFIX = "_lower_bound" _LEDGER_FILTER_PREFIX = "ledger_filter_" _RANGE_LABEL = re.compile( - r"([\d,]+(?:\.\d+)?)\s*(?:to|–|—|-)\s*(?:£\s*)?([\d,]+(?:\.\d+)?)", + r"([\d,]+(?:\.\d+)?)\s*(?:to(?:\s+under)?|–|—|-)\s*(?:£\s*)?([\d,]+(?:\.\d+)?)", re.IGNORECASE, ) _OPEN_LABEL = re.compile( r"([\d,]+(?:\.\d+)?)\s*(?:or more|or over|and over|and above|\+)", re.IGNORECASE, ) +# DWP's half-open amount bands publish their own exclusive upper edge: +# "£20.00 to under £40.00", and the bottom band "Under £20.00" (lower edge +# zero). The bottom form needs the pound sign, so an age filter such as +# "Under 25" never reads as an amount band. +_HALF_OPEN_LABEL = re.compile( + r"^\s*£?\s*([\d,]+(?:\.\d+)?)\s*to\s+under\s*£?\s*([\d,]+(?:\.\d+)?)\s*$", + re.IGNORECASE, +) +_UNDER_LABEL = re.compile(r"^\s*under\s*£\s*([\d,]+(?:\.\d+)?)\s*$", re.IGNORECASE) _MISSING_COLUMN = re.compile(r"^'(?:([a-z_0-9]+)\.)?([A-Za-z_0-9]+)'$") #: Provider kinds whose values are additionally masked by the binding's @@ -65,6 +75,24 @@ def knows(self, entity: str, variable: str) -> bool: ... def compute(self, entity: str, variable: str) -> tuple[np.ndarray, str]: ... +#: Prefix of the measure-input column a resolved counterfactual delta lands in. +COUNTERFACTUAL_DELTA_COLUMN_PREFIX = "counterfactual_delta__" + + +def counterfactual_column(binding: Mapping[str, Any]) -> str: + """The slash-free measure-input column of a counterfactual binding's delta. + + A provider with ``counterfactual_delta(binding, period)`` resolves the + binding's per-row delta into this column; slashes in the metric name are + replaced because the prepared frame's HDF writer refuses them. + """ + + metric = str(binding.get("metric_name") or "") + if not metric: + raise ValueError("a counterfactual binding needs a metric_name") + return COUNTERFACTUAL_DELTA_COLUMN_PREFIX + re.sub(r"[^0-9A-Za-z_]", "_", metric) + + @dataclass(frozen=True) class MaterializationSkip: """One target measure the interpreter could not prepare.""" @@ -174,6 +202,7 @@ def resolve_target_measures( "provider": _measure_provider_receipt(provider), } all_skips: list[dict[str, Any]] = [] + specs_by_name = {spec.name: spec for spec in registry.specs} for round_index in range(max_rounds): probe = adapter_factory() @@ -205,11 +234,24 @@ def resolve_target_measures( for skip in skipped: reason = str(skip.reason) if "counterfactual_delta" in reason or "counterfactual delta" in reason: - _raise_measure_resolution( - "counterfactual target measure cannot be resolved", - receipt, - all_skips, + key, values, route = _resolve_counterfactual_skip( + skip, + specs_by_name=specs_by_name, + contract=contract, + provider=provider, + period=period, + provided_this_round=provided_this_round, + provided_before=provided_before, + receipt=receipt, + all_skips=all_skips, ) + if values is not None: + measure_inputs[key] = values + provided_this_round.add(key) + receipt["attached"][f"{key[0]}.{key[1]}"] = route + receipt["provider"] = _measure_provider_receipt(provider) + progressed = True + continue match = _MISSING_COLUMN.match(reason) if match is None: _raise_measure_resolution( @@ -271,6 +313,59 @@ def resolve_target_measures( ) +def _resolve_counterfactual_skip( + skip: MaterializationSkip, + *, + specs_by_name: Mapping[str, Any], + contract: Mapping[str, Mapping[str, Any]], + provider: MeasureProvider, + period: int | str, + provided_this_round: set[tuple[str, str]], + provided_before: set[tuple[str, str]], + receipt: dict[str, Any], + all_skips: list[dict[str, Any]], +) -> tuple[tuple[str, str], np.ndarray | None, str]: + """Resolve one counterfactual skip through the provider, or refuse. + + Returns the measure-input key and the delta, or ``None`` values when this + round already provided the key (several fan-out specs share one binding). + """ + + resolve = getattr(provider, "counterfactual_delta", None) + spec = specs_by_name.get(skip.name) + target = ( + None + if spec is None + else contract.get(str(spec.metadata.get("contract_target_id"))) + ) + if not callable(resolve) or target is None: + _raise_measure_resolution( + "counterfactual target measure cannot be resolved", + receipt, + all_skips, + ) + binding = target["bindings"]["policyengine"] + entity = str(binding.get("from_entity") or spec.entity) + key = (entity, counterfactual_column(binding)) + if key in provided_this_round: + return key, None, "" + if key in provided_before: + _raise_measure_resolution( + f"{entity}.{key[1]} remained unmaterializable after injection", + receipt, + all_skips, + ) + try: + values, route = resolve(binding, binding.get("measurement_period", period)) + except Exception as exc: # noqa: BLE001 - receipt preserves cause + _raise_measure_resolution( + f"provider failed computing counterfactual {entity}.{key[1]}: {exc}", + receipt, + all_skips, + ) + return key, np.asarray(values, dtype=float), str(route) + + def _measure_resolution_contract( registry: TargetRegistry, provider: MeasureProvider, @@ -342,6 +437,9 @@ def _band_lower_edge(spec: Any, binding: Mapping[str, Any]) -> float | None: if key.endswith(_BAND_LOWER_BOUND_SUFFIX): numeric.append((key, float(str(value).replace(",", "")))) continue + if _UNDER_LABEL.match(str(value)): + labelled.append((key, 0.0)) + continue match = _RANGE_LABEL.search(str(value)) or _OPEN_LABEL.search(str(value)) if match is not None: labelled.append((key, float(match.group(1).replace(",", "")))) @@ -352,6 +450,31 @@ def _band_lower_edge(spec: Any, binding: Mapping[str, Any]) -> float | None: return None +def _band_label_upper_edge(spec: Any, binding: Mapping[str, Any]) -> float | None: + """The exclusive upper edge a half-open band label publishes, if any. + + ``"£20.00 to under £40.00"`` and ``"Under £20.00"`` state their own upper + edge, so the band never borrows it from a sibling (whose exclusion would + otherwise widen it), in model units after ``band_period_factor``. + """ + + metadata = getattr(spec, "metadata", None) or {} + factor = float(binding.get("band_period_factor", 1) or 1) + uppers: list[tuple[str, float]] = [] + for key, value in sorted(metadata.items()): + if not key.startswith(_LEDGER_FILTER_PREFIX) or key.endswith( + _BAND_LOWER_BOUND_SUFFIX + ): + continue + match = _HALF_OPEN_LABEL.match(str(value)) or _UNDER_LABEL.match(str(value)) + if match is not None: + upper = match.group(match.lastindex or 1).replace(",", "") + uppers.append((key, float(upper))) + if not uppers: + return None + return _select_band_edge(spec, binding, uppers) * factor + + def _select_band_edge( spec: Any, binding: Mapping[str, Any], @@ -451,6 +574,15 @@ def _band_bounds( if edge > lower: upper = edge break + own_upper = _band_label_upper_edge(spec, binding) + if own_upper is not None: + if not own_upper > lower: + raise ValueError( + f"banded measure {getattr(spec, 'measure', '?')!r} publishes an " + f"upper edge {own_upper!r} that is not above its lower edge " + f"{lower!r}" + ) + upper = own_upper # A consumer may bind only the finite portion of a published histogram. # Declare its source-unit ceiling instead of allowing the last included # row to absorb a separately published, unbound top-coded category. diff --git a/packages/microcosm-build/src/microcosm/build/target_reference_authoring.py b/packages/microcosm-build/src/microcosm/build/target_reference_authoring.py index fd7408d26..7b9dbf194 100644 --- a/packages/microcosm-build/src/microcosm/build/target_reference_authoring.py +++ b/packages/microcosm-build/src/microcosm/build/target_reference_authoring.py @@ -790,6 +790,7 @@ def target_references_resource( in { "monthly_window_average", "monthly_window_sum_average", + "monthly_window_count_x_mean", "linear_combination", "scaled_by_ratio", "calendar_year_window", diff --git a/packages/microcosm-build/src/microcosm/build/uk/ashe_employer_pension_contribution_rates.json b/packages/microcosm-build/src/microcosm/build/uk/ashe_employer_pension_contribution_rates.json new file mode 100644 index 000000000..f55f3b992 --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/uk/ashe_employer_pension_contribution_rates.json @@ -0,0 +1,4118 @@ +{ + "schema_version": 1, + "country": "uk", + "kind": "uk_vendored_ledger_facts", + "resource": "ashe_employer_pension_contribution_rates.json", + "purpose": "ONS ASHE 2024 workplace pension tables: the share of jobs in each employer contribution band (full pay) by pension type and sector, all industries (Table P10), and jobs by pension type and sector (Table P2). Consumed by the FRS HMRC spine-leaves stage, which draws each employer-scheme member's employer contribution rate for their scheme type and sector (microcosm#1069 c9, R6).", + "consumers": [ + "uk_runtime.employer_pension_contributions" + ], + "planned_consumers": [], + "policy": "Rows are copied verbatim from the pinned Chronicle consumer feed named in source_fact_feed; every value is a publisher-stated fact. Consumers declare their own arithmetic on these rows and never edit this file by hand: regenerate it with tools/vendor_uk_ledger_facts.py.", + "generator": { + "tool": "tools/vendor_uk_ledger_facts.py", + "version": 1 + }, + "source_fact_feed": { + "source_repo": "PolicyEngine/chronicle", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "build": "build-bundle --suite uk -> build-consumer-artifact", + "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" + }, + "selections": [ + { + "label": "ashe_p10_employer_rate_band_share_full_pay_by_type_and_sector", + "selector": { + "source_name": "ons", + "source_concept": "ons.workplace_pension_employer_contribution_band_share", + "geography_id": "K02000001", + "period_type": "calendar_year", + "period_value": [ + "2024" + ], + "dimensions": [ + "contribution_basis", + "employer_contribution_rate_band", + "pension_type", + "sector", + "sic2007_section", + "sic2007_summary_category" + ], + "dimension_values": { + "contribution_basis": "full_pay", + "sic2007_section": "all", + "sic2007_summary_category": "all" + } + }, + "row_count": 68 + }, + { + "label": "ashe_p2_jobs_by_type_and_sector", + "selector": { + "source_name": "ons", + "source_concept": "ons.workplace_pension_jobs_by_type", + "geography_id": "K02000001", + "period_type": "calendar_year", + "period_value": [ + "2024" + ], + "dimensions": [ + "pension_type", + "sector", + "sic2007_section", + "sic2007_summary_category", + "weekly_earnings_band" + ], + "dimension_values": { + "sic2007_section": "all", + "sic2007_summary_category": "all", + "weekly_earnings_band": "all" + } + }, + "row_count": 13 + } + ], + "row_count": 81, + "rows": [ + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_93c0cdb16a77b0b81b59f540", + "semantic_fact_key": "ledger_semantic_fact_v2_60586902e9dd81987b452fdf", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.10_to_12.share.cy2024.private_sector__all_pension_types.share_10_to_12", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_10_to_12", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.10_to_12.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__all_pension_types", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "10% to < 12%", + "pension_type": "all", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 5.4 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_eefa99a3a5fdcc3983efb156", + "semantic_fact_key": "ledger_semantic_fact_v2_62d99c5b4019188ae8683a5d", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.12_to_15.share.cy2024.private_sector__all_pension_types.share_12_to_15", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_12_to_15", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.12_to_15.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__all_pension_types", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "12% to < 15%", + "pension_type": "all", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 5.2 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_6ce0ebb782764efc07c2aadb", + "semantic_fact_key": "ledger_semantic_fact_v2_221f2158d0f9620786e9399c", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.15_to_20.share.cy2024.private_sector__all_pension_types.share_15_to_20", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_15_to_20", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.15_to_20.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__all_pension_types", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "15% to < 20%", + "pension_type": "all", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 2.4 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_803e0f9848bece059795731a", + "semantic_fact_key": "ledger_semantic_fact_v2_3d4e5a501a983b3f01fc6f0d", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.20_and_over.share.cy2024.private_sector__all_pension_types.share_20_and_over", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_20_and_over", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.20_and_over.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__all_pension_types", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "20% and over", + "pension_type": "all", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 2.2 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_1216210b2ec6b7997e467f8d", + "semantic_fact_key": "ledger_semantic_fact_v2_aa6dec806a6f8745f4746789", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.4_to_8.share.cy2024.private_sector__all_pension_types.share_4_to_8", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_4_to_8", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.4_to_8.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__all_pension_types", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "4% to < 8%", + "pension_type": "all", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 28.4 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_8cfe946485ce77a0061ae53e", + "semantic_fact_key": "ledger_semantic_fact_v2_ab1755f3314da7d04d43fbe4", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.8_to_10.share.cy2024.private_sector__all_pension_types.share_8_to_10", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_8_to_10", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.8_to_10.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__all_pension_types", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "8% to < 10%", + "pension_type": "all", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 8 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_a001a3e905400d9b01baf361", + "semantic_fact_key": "ledger_semantic_fact_v2_743bb8299fd68234a7fdefe6", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.under_4.share.cy2024.private_sector__all_pension_types.share_under_4", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_under_4", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.under_4.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__all_pension_types", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "Under 4%", + "pension_type": "all", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 48.4 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_6a31d9e670950dc7f9120acb", + "semantic_fact_key": "ledger_semantic_fact_v2_d35bf969c372973e0f731a8e", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.10_to_12.share.cy2024.private_sector__defined_benefit.share_10_to_12", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_10_to_12", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.10_to_12.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__defined_benefit", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "10% to < 12%", + "pension_type": "defined_benefit", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 3.7 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_1862003590801261b1caedd4", + "semantic_fact_key": "ledger_semantic_fact_v2_9dd70da7e66ee03578cc7139", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.12_to_15.share.cy2024.private_sector__defined_benefit.share_12_to_15", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_12_to_15", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.12_to_15.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__defined_benefit", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "12% to < 15%", + "pension_type": "defined_benefit", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 19.4 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_18407118c82d979d52f81aac", + "semantic_fact_key": "ledger_semantic_fact_v2_7f1f044ef18c8e061c4e6c24", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.15_to_20.share.cy2024.private_sector__defined_benefit.share_15_to_20", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_15_to_20", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.15_to_20.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__defined_benefit", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "15% to < 20%", + "pension_type": "defined_benefit", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 7.5 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_46f6ce1ff44e94d67792d345", + "semantic_fact_key": "ledger_semantic_fact_v2_244d4848fc5fc2d53eb2094c", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.20_and_over.share.cy2024.private_sector__defined_benefit.share_20_and_over", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_20_and_over", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.20_and_over.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__defined_benefit", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "20% and over", + "pension_type": "defined_benefit", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 11.4 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_7e2bd273b45315e79a081c7d", + "semantic_fact_key": "ledger_semantic_fact_v2_e7a8552ca0da66aac84f21eb", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.4_to_8.share.cy2024.private_sector__defined_benefit.share_4_to_8", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_4_to_8", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.4_to_8.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__defined_benefit", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "4% to < 8%", + "pension_type": "defined_benefit", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 18.5 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_0adcc1eb328379cd4aa7dded", + "semantic_fact_key": "ledger_semantic_fact_v2_1981b1c2ddbc1bc8222efd56", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.8_to_10.share.cy2024.private_sector__defined_benefit.share_8_to_10", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_8_to_10", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.8_to_10.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__defined_benefit", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "8% to < 10%", + "pension_type": "defined_benefit", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 5.2 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_4cb1415c8b69672913193a39", + "semantic_fact_key": "ledger_semantic_fact_v2_3d35d536f9222ca08c179f79", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.under_4.share.cy2024.private_sector__defined_benefit.share_under_4", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_under_4", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.under_4.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__defined_benefit", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "Under 4%", + "pension_type": "defined_benefit", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 34.3 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_f1e93f5efb1e63b0e720cf59", + "semantic_fact_key": "ledger_semantic_fact_v2_399b35a22bc0bd500598eca4", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.10_to_12.share.cy2024.private_sector__defined_contribution.share_10_to_12", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_10_to_12", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.10_to_12.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__defined_contribution", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "10% to < 12%", + "pension_type": "defined_contribution", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 6.1 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_ead155b7c4b46fbb809edf97", + "semantic_fact_key": "ledger_semantic_fact_v2_4589b9ed81e6537d6f1225b2", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.12_to_15.share.cy2024.private_sector__defined_contribution.share_12_to_15", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_12_to_15", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.12_to_15.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__defined_contribution", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "12% to < 15%", + "pension_type": "defined_contribution", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 4.1 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_bb71c29d73d028536f804305", + "semantic_fact_key": "ledger_semantic_fact_v2_dd41a6bce05da8fec8ef75b1", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.15_to_20.share.cy2024.private_sector__defined_contribution.share_15_to_20", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_15_to_20", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.15_to_20.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__defined_contribution", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "15% to < 20%", + "pension_type": "defined_contribution", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 2.2 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_7a2ecb366ad58d4d1b97dccb", + "semantic_fact_key": "ledger_semantic_fact_v2_b5f359d7efc69fbbca51b05b", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.20_and_over.share.cy2024.private_sector__defined_contribution.share_20_and_over", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_20_and_over", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.20_and_over.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__defined_contribution", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "20% and over", + "pension_type": "defined_contribution", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 1.2 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_556c513fa47866299dd4100c", + "semantic_fact_key": "ledger_semantic_fact_v2_fb80870f6152fdca5b424564", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.4_to_8.share.cy2024.private_sector__defined_contribution.share_4_to_8", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_4_to_8", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.4_to_8.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__defined_contribution", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "4% to < 8%", + "pension_type": "defined_contribution", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 23.8 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_044abe3d6eab0d3e1b82295b", + "semantic_fact_key": "ledger_semantic_fact_v2_ec4d895986500bfef15cc525", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.8_to_10.share.cy2024.private_sector__defined_contribution.share_8_to_10", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_8_to_10", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.8_to_10.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__defined_contribution", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "8% to < 10%", + "pension_type": "defined_contribution", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 8.5 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_fb0d06b00163204f667ab27e", + "semantic_fact_key": "ledger_semantic_fact_v2_f7aa5e95a878af2dd503384c", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.under_4.share.cy2024.private_sector__defined_contribution.share_under_4", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_under_4", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.under_4.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__defined_contribution", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "Under 4%", + "pension_type": "defined_contribution", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 54.1 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_4fb9bee84fba03efce7a6a06", + "semantic_fact_key": "ledger_semantic_fact_v2_f43c64d108d7b2fa479e3bdd", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.10_to_12.share.cy2024.private_sector__group_personal_pension.share_10_to_12", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_10_to_12", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.10_to_12.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__group_personal_pension", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "10% to < 12%", + "pension_type": "group_personal_pension", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 4.6 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_c35510ba1b3ed2f0370fbad2", + "semantic_fact_key": "ledger_semantic_fact_v2_5b6c83182427335941b39f16", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.12_to_15.share.cy2024.private_sector__group_personal_pension.share_12_to_15", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_12_to_15", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.12_to_15.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__group_personal_pension", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "12% to < 15%", + "pension_type": "group_personal_pension", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 3.3 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_7dd42732996af44074b5057a", + "semantic_fact_key": "ledger_semantic_fact_v2_a3446d5f662dd301955ea057", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.15_to_20.share.cy2024.private_sector__group_personal_pension.share_15_to_20", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_15_to_20", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.15_to_20.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__group_personal_pension", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "15% to < 20%", + "pension_type": "group_personal_pension", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 1.5 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_d4226e6982cbbeba004660ec", + "semantic_fact_key": "ledger_semantic_fact_v2_c6699f23c7440abcadc52a45", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.20_and_over.share.cy2024.private_sector__group_personal_pension.share_20_and_over", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_20_and_over", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.20_and_over.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__group_personal_pension", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "20% and over", + "pension_type": "group_personal_pension", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 1.2 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_869faf29ed63489db9de1499", + "semantic_fact_key": "ledger_semantic_fact_v2_6a9074bd247ceb582cd209c3", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.4_to_8.share.cy2024.private_sector__group_personal_pension.share_4_to_8", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_4_to_8", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.4_to_8.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__group_personal_pension", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "4% to < 8%", + "pension_type": "group_personal_pension", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 38.6 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_863b02300ce178c5016a4ad4", + "semantic_fact_key": "ledger_semantic_fact_v2_272ffcc03a7f956ecd084552", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.8_to_10.share.cy2024.private_sector__group_personal_pension.share_8_to_10", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_8_to_10", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.8_to_10.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__group_personal_pension", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "8% to < 10%", + "pension_type": "group_personal_pension", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 8.3 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_ef9561d1d4936bf816f832be", + "semantic_fact_key": "ledger_semantic_fact_v2_0659b2d56d0c997d8db35274", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.under_4.share.cy2024.private_sector__group_personal_pension.share_under_4", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_under_4", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.under_4.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__group_personal_pension", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "Under 4%", + "pension_type": "group_personal_pension", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 42.6 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_f9ffbb4b15752976242022ae", + "semantic_fact_key": "ledger_semantic_fact_v2_3ae713c73cabacf58d6be777", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.10_to_12.share.cy2024.private_sector__group_self_invested_personal_pension.share_10_to_12", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_10_to_12", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.10_to_12.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__group_self_invested_personal_pension", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "10% to < 12%", + "pension_type": "group_self_invested_personal_pension", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 6.6 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_408ed671e319763dfddb3fba", + "semantic_fact_key": "ledger_semantic_fact_v2_9bb3d5d6d20e2fefba937506", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.12_to_15.share.cy2024.private_sector__group_self_invested_personal_pension.share_12_to_15", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_12_to_15", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.12_to_15.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__group_self_invested_personal_pension", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "12% to < 15%", + "pension_type": "group_self_invested_personal_pension", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 4 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_78f8d635f39f449faf785df5", + "semantic_fact_key": "ledger_semantic_fact_v2_9141d01577378803c2dc9986", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.20_and_over.share.cy2024.private_sector__group_self_invested_personal_pension.share_20_and_over", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_20_and_over", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.20_and_over.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__group_self_invested_personal_pension", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "20% and over", + "pension_type": "group_self_invested_personal_pension", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 1.6 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_690cd04f82a4d2e61ef746ac", + "semantic_fact_key": "ledger_semantic_fact_v2_700210e1c6c567096b3a3f51", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.4_to_8.share.cy2024.private_sector__group_self_invested_personal_pension.share_4_to_8", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_4_to_8", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.4_to_8.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__group_self_invested_personal_pension", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "4% to < 8%", + "pension_type": "group_self_invested_personal_pension", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 50.9 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_d76db16b72cf91dfef98aad3", + "semantic_fact_key": "ledger_semantic_fact_v2_df0a7cb12af06184358517c8", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.8_to_10.share.cy2024.private_sector__group_self_invested_personal_pension.share_8_to_10", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_8_to_10", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.8_to_10.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__group_self_invested_personal_pension", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "8% to < 10%", + "pension_type": "group_self_invested_personal_pension", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 10.5 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_593763a4a3d9100460c6ed4b", + "semantic_fact_key": "ledger_semantic_fact_v2_9f2dec853b3ecde19949c5d4", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.under_4.share.cy2024.private_sector__group_self_invested_personal_pension.share_under_4", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_under_4", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.under_4.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__group_self_invested_personal_pension", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "Under 4%", + "pension_type": "group_self_invested_personal_pension", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 25.3 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_4eb7f7ae6fca6ac2f5bdbb53", + "semantic_fact_key": "ledger_semantic_fact_v2_0d048518603576191847709c", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.10_to_12.share.cy2024.private_sector__group_stakeholder_pension.share_10_to_12", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_10_to_12", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.10_to_12.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__group_stakeholder_pension", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "10% to < 12%", + "pension_type": "group_stakeholder_pension", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 4.6 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_51008f70bd9e7a08ae14e8e7", + "semantic_fact_key": "ledger_semantic_fact_v2_dd15b4b76f448e606bcd1e5c", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.12_to_15.share.cy2024.private_sector__group_stakeholder_pension.share_12_to_15", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_12_to_15", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.12_to_15.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__group_stakeholder_pension", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "12% to < 15%", + "pension_type": "group_stakeholder_pension", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 2.7 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_18cdc8a730e53eee3f39147c", + "semantic_fact_key": "ledger_semantic_fact_v2_fbf82bc90847ce6eb013bbb0", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.15_to_20.share.cy2024.private_sector__group_stakeholder_pension.share_15_to_20", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_15_to_20", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.15_to_20.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__group_stakeholder_pension", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "15% to < 20%", + "pension_type": "group_stakeholder_pension", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 1.4 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_6e6f422abfd5b482d437dd23", + "semantic_fact_key": "ledger_semantic_fact_v2_26e28198818863246a24479d", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.20_and_over.share.cy2024.private_sector__group_stakeholder_pension.share_20_and_over", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_20_and_over", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.20_and_over.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__group_stakeholder_pension", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "20% and over", + "pension_type": "group_stakeholder_pension", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 1.3 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_ed1c74c4fb62487bff5d9284", + "semantic_fact_key": "ledger_semantic_fact_v2_e05614625f83c8675d020b3d", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.4_to_8.share.cy2024.private_sector__group_stakeholder_pension.share_4_to_8", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_4_to_8", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.4_to_8.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__group_stakeholder_pension", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "4% to < 8%", + "pension_type": "group_stakeholder_pension", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 31.4 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_555bc67ada97c92d980444f9", + "semantic_fact_key": "ledger_semantic_fact_v2_bea5a7f8f2bc87519848bb01", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.8_to_10.share.cy2024.private_sector__group_stakeholder_pension.share_8_to_10", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_8_to_10", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.8_to_10.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__group_stakeholder_pension", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "8% to < 10%", + "pension_type": "group_stakeholder_pension", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 7.2 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_d4afa05f95e24b4640cba6f1", + "semantic_fact_key": "ledger_semantic_fact_v2_33cc58f20e4c7e7d59a354ce", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.under_4.share.cy2024.private_sector__group_stakeholder_pension.share_under_4", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_under_4", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.under_4.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "private_sector__group_stakeholder_pension", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "Under 4%", + "pension_type": "group_stakeholder_pension", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 51.5 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_1a70912e85589f081326cbd5", + "semantic_fact_key": "ledger_semantic_fact_v2_cc8727b007a74ac2aa6d1923", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.10_to_12.share.cy2024.public_sector__all_pension_types.share_10_to_12", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_10_to_12", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.10_to_12.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "public_sector__all_pension_types", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "10% to < 12%", + "pension_type": "all", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 3.2 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_b159f0edd912c721024e7aff", + "semantic_fact_key": "ledger_semantic_fact_v2_1fd199a6c4d9d49f6375ece2", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.12_to_15.share.cy2024.public_sector__all_pension_types.share_12_to_15", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_12_to_15", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.12_to_15.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "public_sector__all_pension_types", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "12% to < 15%", + "pension_type": "all", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 24.5 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_60258ea975fcb87b7e37d92e", + "semantic_fact_key": "ledger_semantic_fact_v2_b11e598d36ae718de3bedf51", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.15_to_20.share.cy2024.public_sector__all_pension_types.share_15_to_20", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_15_to_20", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.15_to_20.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "public_sector__all_pension_types", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "15% to < 20%", + "pension_type": "all", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 20.7 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_661d88cca65062ec5246370d", + "semantic_fact_key": "ledger_semantic_fact_v2_7f283e70a6ca8003f1d47db3", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.20_and_over.share.cy2024.public_sector__all_pension_types.share_20_and_over", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_20_and_over", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.20_and_over.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "public_sector__all_pension_types", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "20% and over", + "pension_type": "all", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 44.7 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_085b86ea42916e42f02797cd", + "semantic_fact_key": "ledger_semantic_fact_v2_3853f10b0351b63b1813478a", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.4_to_8.share.cy2024.public_sector__all_pension_types.share_4_to_8", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_4_to_8", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.4_to_8.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "public_sector__all_pension_types", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "4% to < 8%", + "pension_type": "all", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 3.8 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_737967496debae64b2f8d993", + "semantic_fact_key": "ledger_semantic_fact_v2_13d5c6d192f736145700c543", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.8_to_10.share.cy2024.public_sector__all_pension_types.share_8_to_10", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_8_to_10", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.8_to_10.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "public_sector__all_pension_types", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "8% to < 10%", + "pension_type": "all", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 2.1 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_8751ffc413b2311e6a90a40e", + "semantic_fact_key": "ledger_semantic_fact_v2_3be083bc40e6f336c497ef90", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.under_4.share.cy2024.public_sector__all_pension_types.share_under_4", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_under_4", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.under_4.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "public_sector__all_pension_types", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "Under 4%", + "pension_type": "all", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 1 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_514ac3d611d5028170ec83e9", + "semantic_fact_key": "ledger_semantic_fact_v2_3e63db2d7a60e2de1c1b0811", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.10_to_12.share.cy2024.public_sector__defined_benefit.share_10_to_12", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_10_to_12", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.10_to_12.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "public_sector__defined_benefit", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "10% to < 12%", + "pension_type": "defined_benefit", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 2.8 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_032e14f588e2ca9d076c22b7", + "semantic_fact_key": "ledger_semantic_fact_v2_7ed127744b54a6374730cc02", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.12_to_15.share.cy2024.public_sector__defined_benefit.share_12_to_15", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_12_to_15", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.12_to_15.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "public_sector__defined_benefit", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "12% to < 15%", + "pension_type": "defined_benefit", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 24.2 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_100f6c8a7b68f50c9612859b", + "semantic_fact_key": "ledger_semantic_fact_v2_5c4d5412dcacfd09584988f4", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.15_to_20.share.cy2024.public_sector__defined_benefit.share_15_to_20", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_15_to_20", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.15_to_20.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "public_sector__defined_benefit", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "15% to < 20%", + "pension_type": "defined_benefit", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 21.8 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_1072ec1d11d78c7dfe8615f6", + "semantic_fact_key": "ledger_semantic_fact_v2_351dddd71376a5a912414b3d", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.20_and_over.share.cy2024.public_sector__defined_benefit.share_20_and_over", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_20_and_over", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.20_and_over.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "public_sector__defined_benefit", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "20% and over", + "pension_type": "defined_benefit", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 45.7 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_6d031f385600112f9d67c363", + "semantic_fact_key": "ledger_semantic_fact_v2_adf5bbba775807ac00ba22d4", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.4_to_8.share.cy2024.public_sector__defined_benefit.share_4_to_8", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_4_to_8", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.4_to_8.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "public_sector__defined_benefit", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "4% to < 8%", + "pension_type": "defined_benefit", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 3.5 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_c48511c056eca7abaa7b0322", + "semantic_fact_key": "ledger_semantic_fact_v2_8bf63d89df1c2444e695c4bd", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.8_to_10.share.cy2024.public_sector__defined_benefit.share_8_to_10", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_8_to_10", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.8_to_10.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "public_sector__defined_benefit", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "8% to < 10%", + "pension_type": "defined_benefit", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 1.8 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_ca96a50564191af127164dbd", + "semantic_fact_key": "ledger_semantic_fact_v2_77f8be38e38552254119dd71", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.under_4.share.cy2024.public_sector__defined_benefit.share_under_4", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_under_4", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.under_4.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "public_sector__defined_benefit", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "Under 4%", + "pension_type": "defined_benefit", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 0.2 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_4f9aaa7625b7cdec3ba5c9b4", + "semantic_fact_key": "ledger_semantic_fact_v2_30f5845b37cb82cf51f531e6", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.10_to_12.share.cy2024.public_sector__defined_contribution.share_10_to_12", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_10_to_12", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.10_to_12.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "public_sector__defined_contribution", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "10% to < 12%", + "pension_type": "defined_contribution", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 5.4 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_5d853091242a4b1c2bebbf0b", + "semantic_fact_key": "ledger_semantic_fact_v2_60d4d1ff82621ebd28b17e59", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.12_to_15.share.cy2024.public_sector__defined_contribution.share_12_to_15", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_12_to_15", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.12_to_15.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "public_sector__defined_contribution", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "12% to < 15%", + "pension_type": "defined_contribution", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 28.4 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_4ff9a6a870e96b7d1eda9e14", + "semantic_fact_key": "ledger_semantic_fact_v2_a56116481c154fc0534a239c", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.15_to_20.share.cy2024.public_sector__defined_contribution.share_15_to_20", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_15_to_20", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.15_to_20.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "public_sector__defined_contribution", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "15% to < 20%", + "pension_type": "defined_contribution", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 14.6 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_0ac7835dcb10fe3eb5fd0c4a", + "semantic_fact_key": "ledger_semantic_fact_v2_e5439e52b90f7bc816c00d9d", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.20_and_over.share.cy2024.public_sector__defined_contribution.share_20_and_over", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_20_and_over", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.20_and_over.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "public_sector__defined_contribution", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "20% and over", + "pension_type": "defined_contribution", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 34.5 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_c51b95d8242cfab813513e47", + "semantic_fact_key": "ledger_semantic_fact_v2_9a4bc96b864d975abaad4083", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.4_to_8.share.cy2024.public_sector__defined_contribution.share_4_to_8", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_4_to_8", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.4_to_8.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "public_sector__defined_contribution", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "4% to < 8%", + "pension_type": "defined_contribution", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 5.9 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_bfe1dc6c3940dfdfcd462462", + "semantic_fact_key": "ledger_semantic_fact_v2_182a69fce0301d56938fb7dc", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.8_to_10.share.cy2024.public_sector__defined_contribution.share_8_to_10", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_8_to_10", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.8_to_10.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "public_sector__defined_contribution", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "8% to < 10%", + "pension_type": "defined_contribution", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 4.2 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_a9e266ea44a900612c7514d0", + "semantic_fact_key": "ledger_semantic_fact_v2_d385e3a9137faee4feba6f5d", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.under_4.share.cy2024.public_sector__defined_contribution.share_under_4", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_under_4", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.under_4.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "public_sector__defined_contribution", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "Under 4%", + "pension_type": "defined_contribution", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 6.9 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_f13e8f31e733ee6e1ed16dc8", + "semantic_fact_key": "ledger_semantic_fact_v2_a8171c71c0e8077be3877250", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.15_to_20.share.cy2024.public_sector__group_personal_pension.share_15_to_20", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_15_to_20", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.15_to_20.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "public_sector__group_personal_pension", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "15% to < 20%", + "pension_type": "group_personal_pension", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 9.5 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_d0b32f08c0eee49ccdd9f7aa", + "semantic_fact_key": "ledger_semantic_fact_v2_9f3001fcda29f05a91ebb107", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.20_and_over.share.cy2024.public_sector__group_personal_pension.share_20_and_over", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_20_and_over", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.20_and_over.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "public_sector__group_personal_pension", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "20% and over", + "pension_type": "group_personal_pension", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 69 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_2fc0f6b619665f24b6e00c8a", + "semantic_fact_key": "ledger_semantic_fact_v2_550c292b32a3aaa3a78335b2", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.4_to_8.share.cy2024.public_sector__group_personal_pension.share_4_to_8", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_4_to_8", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.4_to_8.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "public_sector__group_personal_pension", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "4% to < 8%", + "pension_type": "group_personal_pension", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 7.2 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_ee6c688295a52a91256776e1", + "semantic_fact_key": "ledger_semantic_fact_v2_2931210730faef5cb2b9b0a3", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.15_to_20.share.cy2024.public_sector__group_stakeholder_pension.share_15_to_20", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_15_to_20", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.15_to_20.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "public_sector__group_stakeholder_pension", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "15% to < 20%", + "pension_type": "group_stakeholder_pension", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 16 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_d2f1767704fefd41fc75b3e2", + "semantic_fact_key": "ledger_semantic_fact_v2_973a4717669ee95e3f492447", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.20_and_over.share.cy2024.public_sector__group_stakeholder_pension.share_20_and_over", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_20_and_over", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.20_and_over.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "public_sector__group_stakeholder_pension", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "20% and over", + "pension_type": "group_stakeholder_pension", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 47.5 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_0cb733c9921fe77de6497685", + "semantic_fact_key": "ledger_semantic_fact_v2_672d26aa1ceb0f19b91aa09b", + "source_record_id": "ons.ashe_pensions_2024.p10.full_pay.4_to_8.share.cy2024.public_sector__group_stakeholder_pension.share_4_to_8", + "concept": "ons.workplace_pension_employer_contribution_band_share", + "measure_id": "share_4_to_8", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p10.full_pay.4_to_8.share.cy2024", + "groupby_dimension": "ons.ashe_industry_pension_type", + "groupby_value_id": "public_sector__group_stakeholder_pension", + "table_record_kind": "detail" + }, + "dimensions": { + "contribution_basis": "full_pay", + "employer_contribution_rate_band": "4% to < 8%", + "pension_type": "group_stakeholder_pension", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P10: employer pension contribution bands (full pay) by pension type and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp10.zip!P10 estimates - Employer pension contributions (percentage of full pay) by pension type and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "1fed33447de0187a1d4171ed44428ff7cad1aa41771c7f93faacf3a2746486fd", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-employer-contribution-bands-by-industry-2024-full-pay/2026/1bc4baaf70a278f44d753db84148fda975572d892a13b48ef3a97f28082f3aa1/2024provisionalp10.zip" + }, + "value": 12.1 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_9b05bce12ad1cc14f7824d37", + "semantic_fact_key": "ledger_semantic_fact_v2_c4621358c9471e84adfdebb1", + "source_record_id": "ons.ashe_pensions_2024.p2.defined_benefit.jobs.cy2024.private_sector__all_earnings.jobs_defined_benefit", + "concept": "ons.workplace_pension_jobs_by_type", + "measure_id": "jobs_defined_benefit", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p2.defined_benefit.jobs.cy2024", + "groupby_dimension": "ons.ashe_industry_weekly_earnings", + "groupby_value_id": "private_sector__all_earnings", + "table_record_kind": "detail" + }, + "dimensions": { + "pension_type": "defined_benefit", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all", + "weekly_earnings_band": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P2: pension membership by pension type, earnings and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp2.zip!P2 estimates - Pension membership by pension type, earnings and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "de6dfc4cf078f520f1fb4f8cb6d0ac53432507a6c91132dbb5d958c99a45a354", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-pension-membership-by-industry-earnings-2024/2026/c47ddacb924b23198f8e12bd0915a35ab683597ca1fee1ba5d3cb52868bb43d4/2024provisionalp2.zip" + }, + "value": 1333000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_3d6772fffa68209be2b9b71c", + "semantic_fact_key": "ledger_semantic_fact_v2_d380c1e2cb93c489b724c4ed", + "source_record_id": "ons.ashe_pensions_2024.p2.defined_contribution.jobs.cy2024.private_sector__all_earnings.jobs_defined_contribution", + "concept": "ons.workplace_pension_jobs_by_type", + "measure_id": "jobs_defined_contribution", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p2.defined_contribution.jobs.cy2024", + "groupby_dimension": "ons.ashe_industry_weekly_earnings", + "groupby_value_id": "private_sector__all_earnings", + "table_record_kind": "detail" + }, + "dimensions": { + "pension_type": "defined_contribution", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all", + "weekly_earnings_band": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P2: pension membership by pension type, earnings and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp2.zip!P2 estimates - Pension membership by pension type, earnings and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "de6dfc4cf078f520f1fb4f8cb6d0ac53432507a6c91132dbb5d958c99a45a354", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-pension-membership-by-industry-earnings-2024/2026/c47ddacb924b23198f8e12bd0915a35ab683597ca1fee1ba5d3cb52868bb43d4/2024provisionalp2.zip" + }, + "value": 7729000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_f0144d278ac6c54fe9a13fef", + "semantic_fact_key": "ledger_semantic_fact_v2_d968962341b6b86e05798290", + "source_record_id": "ons.ashe_pensions_2024.p2.group_personal_pension.jobs.cy2024.private_sector__all_earnings.jobs_group_personal_pension", + "concept": "ons.workplace_pension_jobs_by_type", + "measure_id": "jobs_group_personal_pension", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p2.group_personal_pension.jobs.cy2024", + "groupby_dimension": "ons.ashe_industry_weekly_earnings", + "groupby_value_id": "private_sector__all_earnings", + "table_record_kind": "detail" + }, + "dimensions": { + "pension_type": "group_personal_pension", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all", + "weekly_earnings_band": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P2: pension membership by pension type, earnings and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp2.zip!P2 estimates - Pension membership by pension type, earnings and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "de6dfc4cf078f520f1fb4f8cb6d0ac53432507a6c91132dbb5d958c99a45a354", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-pension-membership-by-industry-earnings-2024/2026/c47ddacb924b23198f8e12bd0915a35ab683597ca1fee1ba5d3cb52868bb43d4/2024provisionalp2.zip" + }, + "value": 3688000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_b7f1bb32436c7de5e286e8b6", + "semantic_fact_key": "ledger_semantic_fact_v2_369d2543fbec562d14fdc2f9", + "source_record_id": "ons.ashe_pensions_2024.p2.group_self_invested_personal_pension.jobs.cy2024.private_sector__all_earnings.jobs_group_self_invested_personal_pension", + "concept": "ons.workplace_pension_jobs_by_type", + "measure_id": "jobs_group_self_invested_personal_pension", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p2.group_self_invested_personal_pension.jobs.cy2024", + "groupby_dimension": "ons.ashe_industry_weekly_earnings", + "groupby_value_id": "private_sector__all_earnings", + "table_record_kind": "detail" + }, + "dimensions": { + "pension_type": "group_self_invested_personal_pension", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all", + "weekly_earnings_band": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P2: pension membership by pension type, earnings and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp2.zip!P2 estimates - Pension membership by pension type, earnings and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "de6dfc4cf078f520f1fb4f8cb6d0ac53432507a6c91132dbb5d958c99a45a354", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-pension-membership-by-industry-earnings-2024/2026/c47ddacb924b23198f8e12bd0915a35ab683597ca1fee1ba5d3cb52868bb43d4/2024provisionalp2.zip" + }, + "value": 343000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_0edf34c7dbc43a36e02441b0", + "semantic_fact_key": "ledger_semantic_fact_v2_796a16c18aa33bac8c322fa5", + "source_record_id": "ons.ashe_pensions_2024.p2.group_stakeholder_pension.jobs.cy2024.private_sector__all_earnings.jobs_group_stakeholder_pension", + "concept": "ons.workplace_pension_jobs_by_type", + "measure_id": "jobs_group_stakeholder_pension", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p2.group_stakeholder_pension.jobs.cy2024", + "groupby_dimension": "ons.ashe_industry_weekly_earnings", + "groupby_value_id": "private_sector__all_earnings", + "table_record_kind": "detail" + }, + "dimensions": { + "pension_type": "group_stakeholder_pension", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all", + "weekly_earnings_band": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P2: pension membership by pension type, earnings and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp2.zip!P2 estimates - Pension membership by pension type, earnings and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "de6dfc4cf078f520f1fb4f8cb6d0ac53432507a6c91132dbb5d958c99a45a354", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-pension-membership-by-industry-earnings-2024/2026/c47ddacb924b23198f8e12bd0915a35ab683597ca1fee1ba5d3cb52868bb43d4/2024provisionalp2.zip" + }, + "value": 1034000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_349f905a44cb69d085f6b0ce", + "semantic_fact_key": "ledger_semantic_fact_v2_54859c92504958fd5feb3a8d", + "source_record_id": "ons.ashe_pensions_2024.p2.no_pension_provision.jobs.cy2024.private_sector__all_earnings.jobs_no_pension_provision", + "concept": "ons.workplace_pension_jobs_by_type", + "measure_id": "jobs_no_pension_provision", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p2.no_pension_provision.jobs.cy2024", + "groupby_dimension": "ons.ashe_industry_weekly_earnings", + "groupby_value_id": "private_sector__all_earnings", + "table_record_kind": "detail" + }, + "dimensions": { + "pension_type": "no_pension_provision", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all", + "weekly_earnings_band": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P2: pension membership by pension type, earnings and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp2.zip!P2 estimates - Pension membership by pension type, earnings and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "de6dfc4cf078f520f1fb4f8cb6d0ac53432507a6c91132dbb5d958c99a45a354", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-pension-membership-by-industry-earnings-2024/2026/c47ddacb924b23198f8e12bd0915a35ab683597ca1fee1ba5d3cb52868bb43d4/2024provisionalp2.zip" + }, + "value": 3815000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_0051ad6094432ec4282e8035", + "semantic_fact_key": "ledger_semantic_fact_v2_1f0556bc3b97450b5f315733", + "source_record_id": "ons.ashe_pensions_2024.p2.unknown_pension_provision.jobs.cy2024.private_sector__all_earnings.jobs_unknown_pension_provision", + "concept": "ons.workplace_pension_jobs_by_type", + "measure_id": "jobs_unknown_pension_provision", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p2.unknown_pension_provision.jobs.cy2024", + "groupby_dimension": "ons.ashe_industry_weekly_earnings", + "groupby_value_id": "private_sector__all_earnings", + "table_record_kind": "detail" + }, + "dimensions": { + "pension_type": "unknown_pension_provision", + "sector": "Private", + "sic2007_section": "all", + "sic2007_summary_category": "all", + "weekly_earnings_band": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P2: pension membership by pension type, earnings and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp2.zip!P2 estimates - Pension membership by pension type, earnings and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "de6dfc4cf078f520f1fb4f8cb6d0ac53432507a6c91132dbb5d958c99a45a354", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-pension-membership-by-industry-earnings-2024/2026/c47ddacb924b23198f8e12bd0915a35ab683597ca1fee1ba5d3cb52868bb43d4/2024provisionalp2.zip" + }, + "value": 202000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_3651fcaad6c0d680fd60a502", + "semantic_fact_key": "ledger_semantic_fact_v2_17cd0b6ac1ecba27bb9c1f05", + "source_record_id": "ons.ashe_pensions_2024.p2.defined_benefit.jobs.cy2024.public_sector__all_earnings.jobs_defined_benefit", + "concept": "ons.workplace_pension_jobs_by_type", + "measure_id": "jobs_defined_benefit", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p2.defined_benefit.jobs.cy2024", + "groupby_dimension": "ons.ashe_industry_weekly_earnings", + "groupby_value_id": "public_sector__all_earnings", + "table_record_kind": "detail" + }, + "dimensions": { + "pension_type": "defined_benefit", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all", + "weekly_earnings_band": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P2: pension membership by pension type, earnings and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp2.zip!P2 estimates - Pension membership by pension type, earnings and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "de6dfc4cf078f520f1fb4f8cb6d0ac53432507a6c91132dbb5d958c99a45a354", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-pension-membership-by-industry-earnings-2024/2026/c47ddacb924b23198f8e12bd0915a35ab683597ca1fee1ba5d3cb52868bb43d4/2024provisionalp2.zip" + }, + "value": 5711000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_27f771ae67513d37545bf6da", + "semantic_fact_key": "ledger_semantic_fact_v2_49118ecc890c835d0accf810", + "source_record_id": "ons.ashe_pensions_2024.p2.defined_contribution.jobs.cy2024.public_sector__all_earnings.jobs_defined_contribution", + "concept": "ons.workplace_pension_jobs_by_type", + "measure_id": "jobs_defined_contribution", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p2.defined_contribution.jobs.cy2024", + "groupby_dimension": "ons.ashe_industry_weekly_earnings", + "groupby_value_id": "public_sector__all_earnings", + "table_record_kind": "detail" + }, + "dimensions": { + "pension_type": "defined_contribution", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all", + "weekly_earnings_band": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P2: pension membership by pension type, earnings and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp2.zip!P2 estimates - Pension membership by pension type, earnings and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "de6dfc4cf078f520f1fb4f8cb6d0ac53432507a6c91132dbb5d958c99a45a354", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-pension-membership-by-industry-earnings-2024/2026/c47ddacb924b23198f8e12bd0915a35ab683597ca1fee1ba5d3cb52868bb43d4/2024provisionalp2.zip" + }, + "value": 723000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_50ee88372612f6d2b2d8ce2a", + "semantic_fact_key": "ledger_semantic_fact_v2_ce776160a7cea41abd0095f9", + "source_record_id": "ons.ashe_pensions_2024.p2.group_personal_pension.jobs.cy2024.public_sector__all_earnings.jobs_group_personal_pension", + "concept": "ons.workplace_pension_jobs_by_type", + "measure_id": "jobs_group_personal_pension", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p2.group_personal_pension.jobs.cy2024", + "groupby_dimension": "ons.ashe_industry_weekly_earnings", + "groupby_value_id": "public_sector__all_earnings", + "table_record_kind": "detail" + }, + "dimensions": { + "pension_type": "group_personal_pension", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all", + "weekly_earnings_band": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P2: pension membership by pension type, earnings and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp2.zip!P2 estimates - Pension membership by pension type, earnings and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "de6dfc4cf078f520f1fb4f8cb6d0ac53432507a6c91132dbb5d958c99a45a354", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-pension-membership-by-industry-earnings-2024/2026/c47ddacb924b23198f8e12bd0915a35ab683597ca1fee1ba5d3cb52868bb43d4/2024provisionalp2.zip" + }, + "value": 102000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_e94cbdc1955823fab4ab5842", + "semantic_fact_key": "ledger_semantic_fact_v2_924c33da43623720470068fe", + "source_record_id": "ons.ashe_pensions_2024.p2.group_stakeholder_pension.jobs.cy2024.public_sector__all_earnings.jobs_group_stakeholder_pension", + "concept": "ons.workplace_pension_jobs_by_type", + "measure_id": "jobs_group_stakeholder_pension", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p2.group_stakeholder_pension.jobs.cy2024", + "groupby_dimension": "ons.ashe_industry_weekly_earnings", + "groupby_value_id": "public_sector__all_earnings", + "table_record_kind": "detail" + }, + "dimensions": { + "pension_type": "group_stakeholder_pension", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all", + "weekly_earnings_band": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P2: pension membership by pension type, earnings and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp2.zip!P2 estimates - Pension membership by pension type, earnings and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "de6dfc4cf078f520f1fb4f8cb6d0ac53432507a6c91132dbb5d958c99a45a354", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-pension-membership-by-industry-earnings-2024/2026/c47ddacb924b23198f8e12bd0915a35ab683597ca1fee1ba5d3cb52868bb43d4/2024provisionalp2.zip" + }, + "value": 43000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_eca63750497c6b5ad79fee20", + "semantic_fact_key": "ledger_semantic_fact_v2_dda69ccbb2179197d4b8539f", + "source_record_id": "ons.ashe_pensions_2024.p2.no_pension_provision.jobs.cy2024.public_sector__all_earnings.jobs_no_pension_provision", + "concept": "ons.workplace_pension_jobs_by_type", + "measure_id": "jobs_no_pension_provision", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p2.no_pension_provision.jobs.cy2024", + "groupby_dimension": "ons.ashe_industry_weekly_earnings", + "groupby_value_id": "public_sector__all_earnings", + "table_record_kind": "detail" + }, + "dimensions": { + "pension_type": "no_pension_provision", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all", + "weekly_earnings_band": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P2: pension membership by pension type, earnings and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp2.zip!P2 estimates - Pension membership by pension type, earnings and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "de6dfc4cf078f520f1fb4f8cb6d0ac53432507a6c91132dbb5d958c99a45a354", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-pension-membership-by-industry-earnings-2024/2026/c47ddacb924b23198f8e12bd0915a35ab683597ca1fee1ba5d3cb52868bb43d4/2024provisionalp2.zip" + }, + "value": 729000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_c1d3f2c28d5032cb3aceb4ad", + "semantic_fact_key": "ledger_semantic_fact_v2_ff1ecfa656a856cce1f88911", + "source_record_id": "ons.ashe_pensions_2024.p2.unknown_pension_provision.jobs.cy2024.public_sector__all_earnings.jobs_unknown_pension_provision", + "concept": "ons.workplace_pension_jobs_by_type", + "measure_id": "jobs_unknown_pension_provision", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "employee_job" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "calendar_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.ashe_pensions_2024.p2.unknown_pension_provision.jobs.cy2024", + "groupby_dimension": "ons.ashe_industry_weekly_earnings", + "groupby_value_id": "public_sector__all_earnings", + "table_record_kind": "detail" + }, + "dimensions": { + "pension_type": "unknown_pension_provision", + "sector": "Public", + "sic2007_section": "all", + "sic2007_summary_category": "all", + "weekly_earnings_band": "all" + }, + "source": { + "source_name": "ons", + "source_table": "ASHE pension tables P2: pension membership by pension type, earnings and SIC2007 industry, 2024 provisional", + "source_file": "2024provisionalp2.zip!P2 estimates - Pension membership by pension type, earnings and SIC2007 industry - 2024 PROV.xlsx", + "source_sha256": "de6dfc4cf078f520f1fb4f8cb6d0ac53432507a6c91132dbb5d958c99a45a354", + "vintage": "ashe_pension_tables_2024_provisional", + "raw_r2_key": "raw/uk/ons/ons-ashe-pension-membership-by-industry-earnings-2024/2026/c47ddacb924b23198f8e12bd0915a35ab683597ca1fee1ba5d3cb52868bb43d4/2024provisionalp2.zip" + }, + "value": 52000 + } + ] +} diff --git a/packages/microcosm-build/src/microcosm/build/uk/calibration_measure_exclusions.json b/packages/microcosm-build/src/microcosm/build/uk/calibration_measure_exclusions.json index 21f3addce..0842fc3c4 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/calibration_measure_exclusions.json +++ b/packages/microcosm-build/src/microcosm/build/uk/calibration_measure_exclusions.json @@ -3,47 +3,29 @@ "exclusions": [ { "name": "hmrc.salary_sacrifice.it_relief_basic_rate", - "reason": "The frame adapter reads only a precomputed slash-named delta column; no artifact ships a live counterfactual route.", - "tracking": "microcosm#623", + "reason": "Deferred inside microcosm#1069 c11 (R7): the counterfactual route now resolves the salary-sacrifice relief, but the rate-band test compares adjusted net income with the after-allowance thresholds (0 / 37,700 / 125,140) and ignores the Scottish bands, so the three bands wait for a band-test fix; the all-rates total binds.", + "tracking": "microcosm#1069", "approved_by": "juaristi22", - "adjudication": "microcosm#757 (the #743-audit adjudication, issue comment 5413502559)", - "approved_on": "2026-08-25", + "adjudication": "microcosm#1069 plan R7, approved 2026-09-30: the relief rows bind through the counterfactual route, the rate bands after the band-test fix", + "approved_on": "2026-09-30", "expires_on": "2026-11-25" }, { "name": "hmrc.salary_sacrifice.it_relief_higher_rate", - "reason": "The frame adapter reads only a precomputed slash-named delta column; no artifact ships a live counterfactual route.", - "tracking": "microcosm#623", + "reason": "Deferred inside microcosm#1069 c11 (R7): the counterfactual route now resolves the salary-sacrifice relief, but the rate-band test compares adjusted net income with the after-allowance thresholds (0 / 37,700 / 125,140) and ignores the Scottish bands, so the three bands wait for a band-test fix; the all-rates total binds.", + "tracking": "microcosm#1069", "approved_by": "juaristi22", - "adjudication": "microcosm#757 (the #743-audit adjudication, issue comment 5413502559)", - "approved_on": "2026-08-25", + "adjudication": "microcosm#1069 plan R7, approved 2026-09-30: the relief rows bind through the counterfactual route, the rate bands after the band-test fix", + "approved_on": "2026-09-30", "expires_on": "2026-11-25" }, { "name": "hmrc.salary_sacrifice.it_relief_additional_rate", - "reason": "The frame adapter reads only a precomputed slash-named delta column; no artifact ships a live counterfactual route.", - "tracking": "microcosm#623", + "reason": "Deferred inside microcosm#1069 c11 (R7): the counterfactual route now resolves the salary-sacrifice relief, but the rate-band test compares adjusted net income with the after-allowance thresholds (0 / 37,700 / 125,140) and ignores the Scottish bands, so the three bands wait for a band-test fix; the all-rates total binds.", + "tracking": "microcosm#1069", "approved_by": "juaristi22", - "adjudication": "microcosm#757 (the #743-audit adjudication, issue comment 5413502559)", - "approved_on": "2026-08-25", - "expires_on": "2026-11-25" - }, - { - "name": "hmrc.salary_sacrifice.nics_relief_employee", - "reason": "The frame adapter reads only a precomputed slash-named delta column; no artifact ships a live counterfactual route.", - "tracking": "microcosm#623", - "approved_by": "juaristi22", - "adjudication": "microcosm#757 (the #743-audit adjudication, issue comment 5413502559)", - "approved_on": "2026-08-25", - "expires_on": "2026-11-25" - }, - { - "name": "hmrc.salary_sacrifice.nics_relief_employer", - "reason": "The frame adapter reads only a precomputed slash-named delta column; no artifact ships a live counterfactual route.", - "tracking": "microcosm#623", - "approved_by": "juaristi22", - "adjudication": "microcosm#757 (the #743-audit adjudication, issue comment 5413502559)", - "approved_on": "2026-08-25", + "adjudication": "microcosm#1069 plan R7, approved 2026-09-30: the relief rows bind through the counterfactual route, the rate bands after the band-test fix", + "approved_on": "2026-09-30", "expires_on": "2026-11-25" }, { diff --git a/packages/microcosm-build/src/microcosm/build/uk/chronicle_feed.json b/packages/microcosm-build/src/microcosm/build/uk/chronicle_feed.json index e7beaddc9..35eb3534b 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/chronicle_feed.json +++ b/packages/microcosm-build/src/microcosm/build/uk/chronicle_feed.json @@ -3,14 +3,14 @@ "country": "uk", "scope": "uk_calibration", "source_repo": "PolicyEngine/chronicle", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", "consumer_fact_schema_versions": [ "chronicle.consumer_fact.v4" ], "consumer_fact_schema_sha256": "cc9efb90e9c73913bc76a89e9df435a9ca6ff49942e63dc8d2bf183c65a70224", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7" + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" } diff --git a/packages/microcosm-build/src/microcosm/build/uk/country_package.json b/packages/microcosm-build/src/microcosm/build/uk/country_package.json index 60e08be56..8a7199439 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/country_package.json +++ b/packages/microcosm-build/src/microcosm/build/uk/country_package.json @@ -152,6 +152,16 @@ "kind": "legacy_json", "schema_id": "legacy_json" }, + { + "path": "ashe_employer_pension_contribution_rates.json", + "kind": "legacy_json", + "schema_id": "legacy_json" + }, + { + "path": "ons_single_year_age_populations.json", + "kind": "legacy_json", + "schema_id": "legacy_json" + }, { "path": "lcfs_consumption_support_bounds.json", "kind": "legacy_json", diff --git a/packages/microcosm-build/src/microcosm/build/uk/desnz_domestic_energy_facts.json b/packages/microcosm-build/src/microcosm/build/uk/desnz_domestic_energy_facts.json index 5cb337a61..339bfd57a 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/desnz_domestic_energy_facts.json +++ b/packages/microcosm-build/src/microcosm/build/uk/desnz_domestic_energy_facts.json @@ -15,12 +15,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7" + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/devolved_bus_finance.json b/packages/microcosm-build/src/microcosm/build/uk/devolved_bus_finance.json index 5431b350c..9c3c19dae 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/devolved_bus_finance.json +++ b/packages/microcosm-build/src/microcosm/build/uk/devolved_bus_finance.json @@ -17,12 +17,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7" + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/dft_bus_journeys.json b/packages/microcosm-build/src/microcosm/build/uk/dft_bus_journeys.json index 9623855e2..7834ff903 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/dft_bus_journeys.json +++ b/packages/microcosm-build/src/microcosm/build/uk/dft_bus_journeys.json @@ -17,12 +17,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7" + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/dft_bus_value_anchors.json b/packages/microcosm-build/src/microcosm/build/uk/dft_bus_value_anchors.json index 2932c9ecd..c1cdf4bab 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/dft_bus_value_anchors.json +++ b/packages/microcosm-build/src/microcosm/build/uk/dft_bus_value_anchors.json @@ -17,12 +17,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7" + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/gates.json b/packages/microcosm-build/src/microcosm/build/uk/gates.json index 0eebdd801..4cb1738dd 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/gates.json +++ b/packages/microcosm-build/src/microcosm/build/uk/gates.json @@ -418,11 +418,12 @@ "stage": "spi_support_channel", "check": "spi_support_channel", "spi_prior_mass_share": 0.5, + "pension_age_spi_prior_mass_share": 0.2, "absolute_tolerance": 0.0, "household_weight_kind": "importance", "minimum_spi_households": 1 }, - "notes": "Stage-time mass gate over the SPI support-channel receipt." + "notes": "Stage-time mass gate over the SPI support-channel receipt: the channel's prior share of households without a member at or over State Pension age, and its share of those with one (microcosm#1069)." }, { "id": "uk_stage_hmrc_spi_income_spine_identity", @@ -440,6 +441,21 @@ }, "notes": "Stage-time SPI redraw identity gate over the HMRC SPI income spine receipt." }, + { + "id": "uk_stage_pension_credit_take_up", + "gate": "stage_health", + "phase": "transferred", + "criticality": "release_blocking", + "evidence_absent_blocks": true, + "population_fact_check": true, + "parameters": { + "stage": "pension_credit_take_up", + "check": "pension_credit_take_up", + "maximum_take_up_deviation": 0.05, + "minimum_entitled_units": 1 + }, + "notes": "Stage-time gate over the Pension Credit take-up receipt (microcosm#1069 R9): each component band (Guarantee Credit, Savings Credit only) realizes its DWP FYE 2024 caseload take-up within 0.05 at the stage's weights, or at least the rate where its reporters alone exceed it. The terminal take-up signal gate no longer measures would_claim_pc, whose rate is a share of the entitled units the engine finds, not of every benefit unit." + }, { "id": "uk_stage_cgt_incidence_clone_mass", "gate": "stage_health", @@ -851,7 +867,7 @@ "parameters": { "maximum_share_deviation": 0.05 }, - "notes": "Every contract-driven stochastic flag must be non-constant and have a weighted share within +/-0.05 of its contract target." + "notes": "Every contract-driven stochastic flag must be non-constant and have a weighted share within +/-0.05 of its contract target. would_claim_pc is measured by uk_stage_pension_credit_take_up instead (microcosm#1069 R9)." }, { "id": "uk_brma_enum_domain", diff --git a/packages/microcosm-build/src/microcosm/build/uk/hmrc_cgt_asset_type_facts.json b/packages/microcosm-build/src/microcosm/build/uk/hmrc_cgt_asset_type_facts.json index fe0dbb720..11ccf828a 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/hmrc_cgt_asset_type_facts.json +++ b/packages/microcosm-build/src/microcosm/build/uk/hmrc_cgt_asset_type_facts.json @@ -15,12 +15,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7" + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/hmrc_cgt_conditioning_facts.json b/packages/microcosm-build/src/microcosm/build/uk/hmrc_cgt_conditioning_facts.json index 5db8eaeab..4960f88b2 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/hmrc_cgt_conditioning_facts.json +++ b/packages/microcosm-build/src/microcosm/build/uk/hmrc_cgt_conditioning_facts.json @@ -16,12 +16,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7" + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/hmrc_itl_taxpayer_counts.json b/packages/microcosm-build/src/microcosm/build/uk/hmrc_itl_taxpayer_counts.json index 6a3eaea73..140b02954 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/hmrc_itl_taxpayer_counts.json +++ b/packages/microcosm-build/src/microcosm/build/uk/hmrc_itl_taxpayer_counts.json @@ -15,12 +15,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7" + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/hmrc_uprating_engine_pins.json b/packages/microcosm-build/src/microcosm/build/uk/hmrc_uprating_engine_pins.json index 99f52afe4..dc37bc970 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/hmrc_uprating_engine_pins.json +++ b/packages/microcosm-build/src/microcosm/build/uk/hmrc_uprating_engine_pins.json @@ -76,6 +76,16 @@ "2024-01-01": 221.2, "2025-01-01": 230.25, "2026-01-01": 241.3 + }, + "gov.hmrc.national_insurance.class_1.rates.employer": { + "2019-01-01": 0.138, + "2020-01-01": 0.138, + "2021-01-01": 0.138, + "2022-01-01": 0.138, + "2023-01-01": 0.138, + "2024-01-01": 0.138, + "2025-01-01": 0.15, + "2026-01-01": 0.15 } } } diff --git a/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_incumbent_2025_signed_differences.json b/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_incumbent_2025_signed_differences.json index 475c61706..585358f3e 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_incumbent_2025_signed_differences.json +++ b/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_incumbent_2025_signed_differences.json @@ -1,11 +1,11 @@ { - "compiled_count": 1152, + "compiled_count": 1230, "counts_by_kind": { - "calibration_drift": 555, - "fixture_only": 53, - "ledger_only": 568 + "calibration_drift": 553, + "fixture_only": 55, + "ledger_only": 648 }, - "difference_count": 1176, + "difference_count": 1256, "differences": [ { "fixture_value": 1608000.0, @@ -56,6 +56,13 @@ "period": 2025, "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." }, + { + "fixture_value": 7884800.0, + "kind": "fixture_only", + "name": "hmrc.salary_sacrifice.users_total", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, { "fixture_value": 4845000000.0, "kind": "fixture_only", @@ -238,6 +245,13 @@ "period": 2025, "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." }, + { + "fixture_value": 146185954351.57382, + "kind": "fixture_only", + "name": "obr.state_pension", + "period": 2025, + "reason": "microcosm#1069 (ruling R4) moves the OBR FY2025-26 State Pension forecast out of the fit: it counts Great Britain plus pensioners paid abroad and leaves out Northern Ireland, a different quantity from the resident level the DWP Stat-Xplore and DfC rows bind. The exact forecast is retained as diagnostic provenance on dwp.state_pension.amount, so the frozen fixture's fitted row is fixture-only on the current surface." + }, { "fixture_value": 82000.0, "kind": "fixture_only", @@ -378,6 +392,27 @@ "period": 2025, "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." }, + { + "kind": "ledger_only", + "ledger_value": 60195.0, + "name": "dfc_ni.pension_credit.benefit_units", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 3710881810.1898503, + "name": "dfc_ni.state_pension.amount", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 330147.5, + "name": "dfc_ni.state_pension.recipients", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, { "kind": "ledger_only", "ledger_value": 95031.0, @@ -434,6 +469,20 @@ "period": 2025, "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." }, + { + "kind": "ledger_only", + "ledger_value": 1597003.0, + "name": "dwp.attendance_allowance.recipients_england", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 124117.75, + "name": "dwp.attendance_allowance.recipients_wales", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, { "kind": "ledger_only", "ledger_value": 497.0, @@ -539,6 +588,27 @@ "period": 2025, "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." }, + { + "kind": "ledger_only", + "ledger_value": 1107464.1666666667, + "name": "dwp.hb.households_pension_age", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 216778.66666666666, + "name": "dwp.hb.households_pension_age_private_rented", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 890663.5833333334, + "name": "dwp.hb.households_pension_age_social_rented", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, { "kind": "ledger_only", "ledger_value": 304422.6666666667, @@ -553,6 +623,496 @@ "period": 2025, "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." }, + { + "kind": "ledger_only", + "ledger_value": 1390586.25, + "name": "dwp.pension_credit.benefit_units", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 179022.25, + "name": "dwp.pension_credit.benefit_units_65_69", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 282852.75, + "name": "dwp.pension_credit.benefit_units_70_74", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 367571.25, + "name": "dwp.pension_credit.benefit_units_75_79", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 261310.0, + "name": "dwp.pension_credit.benefit_units_80_84", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 177613.5, + "name": "dwp.pension_credit.benefit_units_85_89", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 122210.75, + "name": "dwp.pension_credit.benefit_units_90_plus", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 47246.25, + "name": "dwp.pension_credit.benefit_units_both_couple", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 366055.25, + "name": "dwp.pension_credit.benefit_units_both_single", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 96794.25, + "name": "dwp.pension_credit.benefit_units_guarantee_only_couple", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 715624.75, + "name": "dwp.pension_credit.benefit_units_guarantee_only_single", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 22458.0, + "name": "dwp.pension_credit.benefit_units_savings_only_couple", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 142408.25, + "name": "dwp.pension_credit.benefit_units_savings_only_single", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 138623908111.01526, + "name": "dwp.state_pension.amount", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 12052874.0, + "name": "dwp.state_pension.recipients", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 1388613.5, + "name": "dwp.state_pension.recipients_female_66_69_new", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 717078.5, + "name": "dwp.state_pension.recipients_female_70_74_new", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 822163.0, + "name": "dwp.state_pension.recipients_female_70_74_pre_2016", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 1502398.25, + "name": "dwp.state_pension.recipients_female_75_79_pre_2016", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 1016169.75, + "name": "dwp.state_pension.recipients_female_80_84_pre_2016", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 644697.25, + "name": "dwp.state_pension.recipients_female_85_89_pre_2016", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 404408.75, + "name": "dwp.state_pension.recipients_female_90_plus_pre_2016", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 1323018.25, + "name": "dwp.state_pension.recipients_male_66_69_new", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 1222116.75, + "name": "dwp.state_pension.recipients_male_70_74_new", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 194617.75, + "name": "dwp.state_pension.recipients_male_70_74_pre_2016", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 1333148.5, + "name": "dwp.state_pension.recipients_male_75_79_pre_2016", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 823789.0, + "name": "dwp.state_pension.recipients_male_80_84_pre_2016", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 452540.25, + "name": "dwp.state_pension.recipients_male_85_89_pre_2016", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 207357.5, + "name": "dwp.state_pension.recipients_male_90_plus_pre_2016", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 221933.75, + "name": "dwp.state_pension.recipients_new_by_english_region@E12000001", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 542356.0, + "name": "dwp.state_pension.recipients_new_by_english_region@E12000002", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 406034.0, + "name": "dwp.state_pension.recipients_new_by_english_region@E12000003", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 363537.75, + "name": "dwp.state_pension.recipients_new_by_english_region@E12000004", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 416229.75, + "name": "dwp.state_pension.recipients_new_by_english_region@E12000005", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 457239.25, + "name": "dwp.state_pension.recipients_new_by_english_region@E12000006", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 421776.5, + "name": "dwp.state_pension.recipients_new_by_english_region@E12000007", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 658266.75, + "name": "dwp.state_pension.recipients_new_by_english_region@E12000008", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 464841.0, + "name": "dwp.state_pension.recipients_new_by_english_region@E12000009", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 124804.0, + "name": "dwp.state_pension.recipients_new_by_weekly_amount.100_00_to_under_150_00__new_state_pension", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 661720.6666666666, + "name": "dwp.state_pension.recipients_new_by_weekly_amount.150_00_to_under_200_00__new_state_pension", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 3390794.6666666665, + "name": "dwp.state_pension.recipients_new_by_weekly_amount.200_00_to_under_250_00__new_state_pension", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 2481.3333333333335, + "name": "dwp.state_pension.recipients_new_by_weekly_amount.20_00_to_under_40_00__new_state_pension", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 433550.3333333333, + "name": "dwp.state_pension.recipients_new_by_weekly_amount.250_00_to_under_300_00__new_state_pension", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 64770.0, + "name": "dwp.state_pension.recipients_new_by_weekly_amount.300_00_and_over__new_state_pension", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 24329.333333333332, + "name": "dwp.state_pension.recipients_new_by_weekly_amount.60_00_to_under_80_00__new_state_pension", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 31134.333333333332, + "name": "dwp.state_pension.recipients_new_by_weekly_amount.80_00_to_under_100_00__new_state_pension", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 2401.3333333333335, + "name": "dwp.state_pension.recipients_new_by_weekly_amount.under_20_00__new_state_pension", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 445194.0, + "name": "dwp.state_pension.recipients_new_scotland", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 253534.75, + "name": "dwp.state_pension.recipients_new_wales", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 324237.75, + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000001", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 835347.75, + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000002", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 631830.75, + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000003", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 586131.0, + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000004", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 682017.5, + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000005", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 782615.75, + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000006", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 593093.25, + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000007", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 1134987.25, + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000008", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 806881.5, + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000009", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 880177.3333333334, + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.100_00_to_under_150_00__pre_2016_state_pension", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 1589409.6666666667, + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.150_00_to_under_200_00__pre_2016_state_pension", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 2730401.3333333335, + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.200_00_to_under_250_00__pre_2016_state_pension", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 8063.0, + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.20_00_to_under_40_00__pre_2016_state_pension", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 1338030.3333333333, + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.250_00_to_under_300_00__pre_2016_state_pension", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 737995.6666666666, + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.300_00_and_over__pre_2016_state_pension", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 12135.666666666666, + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.40_00_to_under_60_00__pre_2016_state_pension", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 17155.0, + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.60_00_to_under_80_00__pre_2016_state_pension", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 23048.0, + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.80_00_to_under_100_00__pre_2016_state_pension", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 12621.333333333334, + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.under_20_00__pre_2016_state_pension", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 621000.25, + "name": "dwp.state_pension.recipients_pre_2016_scotland", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 403793.0, + "name": "dwp.state_pension.recipients_pre_2016_wales", + "period": 2025, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, { "kind": "ledger_only", "ledger_value": 1078514.5, @@ -707,6 +1267,13 @@ "period": 2025, "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." }, + { + "kind": "ledger_only", + "ledger_value": 104200000000.0, + "name": "dwp.workplace_pension.employer_contributions", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, { "kind": "ledger_only", "ledger_value": 32000000.0, @@ -1512,6 +2079,13 @@ "period": 2025, "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." }, + { + "kind": "ledger_only", + "ledger_value": 8800000000.0, + "name": "hmrc.salary_sacrifice.it_relief_total", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, { "kind": "ledger_only", "ledger_value": 1489138606.9960644, @@ -5293,7 +5867,7 @@ { "fixture_value": 2987000000.0, "kind": "calibration_drift", - "ledger_value": 3400000000.0, + "ledger_value": 3695652173.9130435, "name": "hmrc.salary_sacrifice.nics_relief_employer", "period": 2025, "reason": "Ledger-compiled value differs from the fixture value at this comparison period." @@ -5314,14 +5888,6 @@ "period": 2025, "reason": "Ledger-compiled value differs from the fixture value at this comparison period." }, - { - "fixture_value": 7884800.0, - "kind": "calibration_drift", - "ledger_value": 7700000.0, - "name": "hmrc.salary_sacrifice.users_total", - "period": 2025, - "reason": "Ledger-compiled value differs from the fixture value at this comparison period." - }, { "fixture_value": 5805652941.176472, "kind": "calibration_drift", @@ -6509,7 +7075,7 @@ { "fixture_value": 847000000.0, "kind": "calibration_drift", - "ledger_value": 956692420.897719, + "ledger_value": 1190417391.6067786, "name": "hmrc/state_pension_income_band_100_000_to_150_000", "period": 2025, "reason": "Declared uprating (PolicyEngine/chronicle#280 lane, María's ruling of 2026-09-22): ours moves the SPI 2023-24 band value to the 2025 calibration year by the index the reference declares (amounts by the pinned engine's per-variable OBR and ONS indices between 1 January 2023 and 1 January 2025, the state pension by the new State Pension rate the engine pays, counts by HMRC's projected taxpayer growth in the containing Table 2.5 band as the calendar-2025 window); the frozen incumbent fixture holds the 2023-24 values it projects one year forward with its own income-projection ratios." @@ -6517,7 +7083,7 @@ { "fixture_value": 11800000000.0, "kind": "calibration_drift", - "ledger_value": 13328182487.122885, + "ledger_value": 13901060506.30619, "name": "hmrc/state_pension_income_band_12_570_to_15_000", "period": 2025, "reason": "Declared uprating (PolicyEngine/chronicle#280 lane, María's ruling of 2026-09-22): ours moves the SPI 2023-24 band value to the 2025 calibration year by the index the reference declares (amounts by the pinned engine's per-variable OBR and ONS indices between 1 January 2023 and 1 January 2025, the state pension by the new State Pension rate the engine pays, counts by HMRC's projected taxpayer growth in the containing Table 2.5 band as the calendar-2025 window); the frozen incumbent fixture holds the 2023-24 values it projects one year forward with its own income-projection ratios." @@ -6525,7 +7091,7 @@ { "fixture_value": 265000000.0, "kind": "calibration_drift", - "ledger_value": 299319352.46504784, + "ledger_value": 348951387.9503221, "name": "hmrc/state_pension_income_band_150_000_to_200_000", "period": 2025, "reason": "Declared uprating (PolicyEngine/chronicle#280 lane, María's ruling of 2026-09-22): ours moves the SPI 2023-24 band value to the 2025 calibration year by the index the reference declares (amounts by the pinned engine's per-variable OBR and ONS indices between 1 January 2023 and 1 January 2025, the state pension by the new State Pension rate the engine pays, counts by HMRC's projected taxpayer growth in the containing Table 2.5 band as the calendar-2025 window); the frozen incumbent fixture holds the 2023-24 values it projects one year forward with its own income-projection ratios." @@ -6533,7 +7099,7 @@ { "fixture_value": 22200000000.0, "kind": "calibration_drift", - "ledger_value": 25075055187.63797, + "ledger_value": 24542266944.500935, "name": "hmrc/state_pension_income_band_15_000_to_20_000", "period": 2025, "reason": "Declared uprating (PolicyEngine/chronicle#280 lane, María's ruling of 2026-09-22): ours moves the SPI 2023-24 band value to the 2025 calibration year by the index the reference declares (amounts by the pinned engine's per-variable OBR and ONS indices between 1 January 2023 and 1 January 2025, the state pension by the new State Pension rate the engine pays, counts by HMRC's projected taxpayer growth in the containing Table 2.5 band as the calendar-2025 window); the frozen incumbent fixture holds the 2023-24 values it projects one year forward with its own income-projection ratios." @@ -6541,7 +7107,7 @@ { "fixture_value": 20000000.0, "kind": "calibration_drift", - "ledger_value": 22590139.808682855, + "ledger_value": 26355163.11013001, "name": "hmrc/state_pension_income_band_1_000_000_to_inf", "period": 2025, "reason": "Declared uprating (PolicyEngine/chronicle#280 lane, María's ruling of 2026-09-22): ours moves the SPI 2023-24 band value to the 2025 calibration year by the index the reference declares (amounts by the pinned engine's per-variable OBR and ONS indices between 1 January 2023 and 1 January 2025, the state pension by the new State Pension rate the engine pays, counts by HMRC's projected taxpayer growth in the containing Table 2.5 band as the calendar-2025 window); the frozen incumbent fixture holds the 2023-24 values it projects one year forward with its own income-projection ratios." @@ -6549,7 +7115,7 @@ { "fixture_value": 179000000.0, "kind": "calibration_drift", - "ledger_value": 202181751.28771156, + "ledger_value": 242163030.07933253, "name": "hmrc/state_pension_income_band_200_000_to_300_000", "period": 2025, "reason": "Declared uprating (PolicyEngine/chronicle#280 lane, María's ruling of 2026-09-22): ours moves the SPI 2023-24 band value to the 2025 calibration year by the index the reference declares (amounts by the pinned engine's per-variable OBR and ONS indices between 1 January 2023 and 1 January 2025, the state pension by the new State Pension rate the engine pays, counts by HMRC's projected taxpayer growth in the containing Table 2.5 band as the calendar-2025 window); the frozen incumbent fixture holds the 2023-24 values it projects one year forward with its own income-projection ratios." @@ -6557,7 +7123,7 @@ { "fixture_value": 24900000000.0, "kind": "calibration_drift", - "ledger_value": 28124724061.810158, + "ledger_value": 28193657209.02049, "name": "hmrc/state_pension_income_band_20_000_to_30_000", "period": 2025, "reason": "Declared uprating (PolicyEngine/chronicle#280 lane, María's ruling of 2026-09-22): ours moves the SPI 2023-24 band value to the 2025 calibration year by the index the reference declares (amounts by the pinned engine's per-variable OBR and ONS indices between 1 January 2023 and 1 January 2025, the state pension by the new State Pension rate the engine pays, counts by HMRC's projected taxpayer growth in the containing Table 2.5 band as the calendar-2025 window); the frozen incumbent fixture holds the 2023-24 values it projects one year forward with its own income-projection ratios." @@ -6565,7 +7131,7 @@ { "fixture_value": 96000000.0, "kind": "calibration_drift", - "ledger_value": 108432671.0816777, + "ledger_value": 129875144.62355264, "name": "hmrc/state_pension_income_band_300_000_to_500_000", "period": 2025, "reason": "Declared uprating (PolicyEngine/chronicle#280 lane, María's ruling of 2026-09-22): ours moves the SPI 2023-24 band value to the 2025 calibration year by the index the reference declares (amounts by the pinned engine's per-variable OBR and ONS indices between 1 January 2023 and 1 January 2025, the state pension by the new State Pension rate the engine pays, counts by HMRC's projected taxpayer growth in the containing Table 2.5 band as the calendar-2025 window); the frozen incumbent fixture holds the 2023-24 values it projects one year forward with its own income-projection ratios." @@ -6573,7 +7139,7 @@ { "fixture_value": 12300000000.0, "kind": "calibration_drift", - "ledger_value": 13892935982.339956, + "ledger_value": 15597393406.099285, "name": "hmrc/state_pension_income_band_30_000_to_40_000", "period": 2025, "reason": "Declared uprating (PolicyEngine/chronicle#280 lane, María's ruling of 2026-09-22): ours moves the SPI 2023-24 band value to the 2025 calibration year by the index the reference declares (amounts by the pinned engine's per-variable OBR and ONS indices between 1 January 2023 and 1 January 2025, the state pension by the new State Pension rate the engine pays, counts by HMRC's projected taxpayer growth in the containing Table 2.5 band as the calendar-2025 window); the frozen incumbent fixture holds the 2023-24 values it projects one year forward with its own income-projection ratios." @@ -6581,7 +7147,7 @@ { "fixture_value": 6020000000.0, "kind": "calibration_drift", - "ledger_value": 6799632082.41354, + "ledger_value": 7633846203.635585, "name": "hmrc/state_pension_income_band_40_000_to_50_000", "period": 2025, "reason": "Declared uprating (PolicyEngine/chronicle#280 lane, María's ruling of 2026-09-22): ours moves the SPI 2023-24 band value to the 2025 calibration year by the index the reference declares (amounts by the pinned engine's per-variable OBR and ONS indices between 1 January 2023 and 1 January 2025, the state pension by the new State Pension rate the engine pays, counts by HMRC's projected taxpayer growth in the containing Table 2.5 band as the calendar-2025 window); the frozen incumbent fixture holds the 2023-24 values it projects one year forward with its own income-projection ratios." @@ -6589,7 +7155,7 @@ { "fixture_value": 43000000.0, "kind": "calibration_drift", - "ledger_value": 48568800.58866814, + "ledger_value": 58912156.269587904, "name": "hmrc/state_pension_income_band_500_000_to_1_000_000", "period": 2025, "reason": "Declared uprating (PolicyEngine/chronicle#280 lane, María's ruling of 2026-09-22): ours moves the SPI 2023-24 band value to the 2025 calibration year by the index the reference declares (amounts by the pinned engine's per-variable OBR and ONS indices between 1 January 2023 and 1 January 2025, the state pension by the new State Pension rate the engine pays, counts by HMRC's projected taxpayer growth in the containing Table 2.5 band as the calendar-2025 window); the frozen incumbent fixture holds the 2023-24 values it projects one year forward with its own income-projection ratios." @@ -6597,7 +7163,7 @@ { "fixture_value": 4660000000.0, "kind": "calibration_drift", - "ledger_value": 5263502575.423105, + "ledger_value": 6406539912.292578, "name": "hmrc/state_pension_income_band_50_000_to_70_000", "period": 2025, "reason": "Declared uprating (PolicyEngine/chronicle#280 lane, María's ruling of 2026-09-22): ours moves the SPI 2023-24 band value to the 2025 calibration year by the index the reference declares (amounts by the pinned engine's per-variable OBR and ONS indices between 1 January 2023 and 1 January 2025, the state pension by the new State Pension rate the engine pays, counts by HMRC's projected taxpayer growth in the containing Table 2.5 band as the calendar-2025 window); the frozen incumbent fixture holds the 2023-24 values it projects one year forward with its own income-projection ratios." @@ -6605,7 +7171,7 @@ { "fixture_value": 1890000000.0, "kind": "calibration_drift", - "ledger_value": 2134768211.9205298, + "ledger_value": 2598360608.2045007, "name": "hmrc/state_pension_income_band_70_000_to_100_000", "period": 2025, "reason": "Declared uprating (PolicyEngine/chronicle#280 lane, María's ruling of 2026-09-22): ours moves the SPI 2023-24 band value to the 2025 calibration year by the index the reference declares (amounts by the pinned engine's per-variable OBR and ONS indices between 1 January 2023 and 1 January 2025, the state pension by the new State Pension rate the engine pays, counts by HMRC's projected taxpayer growth in the containing Table 2.5 band as the calendar-2025 window); the frozen incumbent fixture holds the 2023-24 values it projects one year forward with its own income-projection ratios." @@ -7386,14 +7952,6 @@ "period": 2025, "reason": "Period basis (PolicyEngine/chronicle#280 lane, María's rule of 2026-09-22 that fiscal-year facts take only the months to the end of the calibration calendar year): ours binds the OBR March 2026 line at the calendar-2025 window, three twelfths of FY2024-25 and nine twelfths of FY2025-26, on the same series; the frozen incumbent fixture holds the FY2025-26 value alone." }, - { - "fixture_value": 146185954351.57382, - "kind": "calibration_drift", - "ledger_value": 144133374882.29138, - "name": "obr.state_pension", - "period": 2025, - "reason": "Period basis (PolicyEngine/chronicle#280 lane, María's rule of 2026-09-22 that fiscal-year facts take only the months to the end of the calibration calendar year): ours binds the OBR March 2026 line at the calendar-2025 window, three twelfths of FY2024-25 and nine twelfths of FY2025-26, on the same series; the frozen incumbent fixture holds the FY2025-26 value alone." - }, { "fixture_value": 3194800881.520547, "kind": "calibration_drift", diff --git a/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_production_2023_signed_differences.json b/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_production_2023_signed_differences.json index 9b5b01dd2..ca5181790 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_production_2023_signed_differences.json +++ b/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_production_2023_signed_differences.json @@ -1,11 +1,11 @@ { - "compiled_count": 837, + "compiled_count": 919, "counts_by_kind": { "calibration_drift": 120, "fixture_only": 17, - "ledger_only": 705 + "ledger_only": 787 }, - "difference_count": 842, + "difference_count": 924, "differences": [ { "fixture_value": 82000.0, @@ -126,6 +126,20 @@ "period": 2023, "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." }, + { + "kind": "ledger_only", + "ledger_value": 60195.0, + "name": "dfc_ni.pension_credit.benefit_units", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 330147.5, + "name": "dfc_ni.state_pension.recipients", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, { "kind": "ledger_only", "ledger_value": 124211.0, @@ -175,6 +189,20 @@ "period": 2023, "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." }, + { + "kind": "ledger_only", + "ledger_value": 1597003.0, + "name": "dwp.attendance_allowance.recipients_england", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 124117.75, + "name": "dwp.attendance_allowance.recipients_wales", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, { "kind": "ledger_only", "ledger_value": 1005791.5, @@ -203,6 +231,27 @@ "period": 2023, "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." }, + { + "kind": "ledger_only", + "ledger_value": 1107464.1666666667, + "name": "dwp.hb.households_pension_age", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 216778.66666666666, + "name": "dwp.hb.households_pension_age_private_rented", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 890663.5833333334, + "name": "dwp.hb.households_pension_age_social_rented", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, { "kind": "ledger_only", "ledger_value": 304422.6666666667, @@ -217,6 +266,489 @@ "period": 2023, "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." }, + { + "kind": "ledger_only", + "ledger_value": 1390586.25, + "name": "dwp.pension_credit.benefit_units", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 179022.25, + "name": "dwp.pension_credit.benefit_units_65_69", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 282852.75, + "name": "dwp.pension_credit.benefit_units_70_74", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 367571.25, + "name": "dwp.pension_credit.benefit_units_75_79", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 261310.0, + "name": "dwp.pension_credit.benefit_units_80_84", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 177613.5, + "name": "dwp.pension_credit.benefit_units_85_89", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 122210.75, + "name": "dwp.pension_credit.benefit_units_90_plus", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 47246.25, + "name": "dwp.pension_credit.benefit_units_both_couple", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 366055.25, + "name": "dwp.pension_credit.benefit_units_both_single", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 96794.25, + "name": "dwp.pension_credit.benefit_units_guarantee_only_couple", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 715624.75, + "name": "dwp.pension_credit.benefit_units_guarantee_only_single", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 22458.0, + "name": "dwp.pension_credit.benefit_units_savings_only_couple", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 142408.25, + "name": "dwp.pension_credit.benefit_units_savings_only_single", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 12052874.0, + "name": "dwp.state_pension.recipients", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 1388613.5, + "name": "dwp.state_pension.recipients_female_66_69_new", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 717078.5, + "name": "dwp.state_pension.recipients_female_70_74_new", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 822163.0, + "name": "dwp.state_pension.recipients_female_70_74_pre_2016", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 1502398.25, + "name": "dwp.state_pension.recipients_female_75_79_pre_2016", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 1016169.75, + "name": "dwp.state_pension.recipients_female_80_84_pre_2016", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 644697.25, + "name": "dwp.state_pension.recipients_female_85_89_pre_2016", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 404408.75, + "name": "dwp.state_pension.recipients_female_90_plus_pre_2016", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 1323018.25, + "name": "dwp.state_pension.recipients_male_66_69_new", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 1222116.75, + "name": "dwp.state_pension.recipients_male_70_74_new", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 194617.75, + "name": "dwp.state_pension.recipients_male_70_74_pre_2016", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 1333148.5, + "name": "dwp.state_pension.recipients_male_75_79_pre_2016", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 823789.0, + "name": "dwp.state_pension.recipients_male_80_84_pre_2016", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 452540.25, + "name": "dwp.state_pension.recipients_male_85_89_pre_2016", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 207357.5, + "name": "dwp.state_pension.recipients_male_90_plus_pre_2016", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 221933.75, + "name": "dwp.state_pension.recipients_new_by_english_region@E12000001", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 542356.0, + "name": "dwp.state_pension.recipients_new_by_english_region@E12000002", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 406034.0, + "name": "dwp.state_pension.recipients_new_by_english_region@E12000003", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 363537.75, + "name": "dwp.state_pension.recipients_new_by_english_region@E12000004", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 416229.75, + "name": "dwp.state_pension.recipients_new_by_english_region@E12000005", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 457239.25, + "name": "dwp.state_pension.recipients_new_by_english_region@E12000006", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 421776.5, + "name": "dwp.state_pension.recipients_new_by_english_region@E12000007", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 658266.75, + "name": "dwp.state_pension.recipients_new_by_english_region@E12000008", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 464841.0, + "name": "dwp.state_pension.recipients_new_by_english_region@E12000009", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 124804.0, + "name": "dwp.state_pension.recipients_new_by_weekly_amount.100_00_to_under_150_00__new_state_pension", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 661720.6666666666, + "name": "dwp.state_pension.recipients_new_by_weekly_amount.150_00_to_under_200_00__new_state_pension", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 3390794.6666666665, + "name": "dwp.state_pension.recipients_new_by_weekly_amount.200_00_to_under_250_00__new_state_pension", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 2481.3333333333335, + "name": "dwp.state_pension.recipients_new_by_weekly_amount.20_00_to_under_40_00__new_state_pension", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 433550.3333333333, + "name": "dwp.state_pension.recipients_new_by_weekly_amount.250_00_to_under_300_00__new_state_pension", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 64770.0, + "name": "dwp.state_pension.recipients_new_by_weekly_amount.300_00_and_over__new_state_pension", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 24329.333333333332, + "name": "dwp.state_pension.recipients_new_by_weekly_amount.60_00_to_under_80_00__new_state_pension", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 31134.333333333332, + "name": "dwp.state_pension.recipients_new_by_weekly_amount.80_00_to_under_100_00__new_state_pension", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 2401.3333333333335, + "name": "dwp.state_pension.recipients_new_by_weekly_amount.under_20_00__new_state_pension", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 445194.0, + "name": "dwp.state_pension.recipients_new_scotland", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 253534.75, + "name": "dwp.state_pension.recipients_new_wales", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 324237.75, + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000001", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 835347.75, + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000002", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 631830.75, + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000003", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 586131.0, + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000004", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 682017.5, + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000005", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 782615.75, + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000006", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 593093.25, + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000007", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 1134987.25, + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000008", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 806881.5, + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000009", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 880177.3333333334, + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.100_00_to_under_150_00__pre_2016_state_pension", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 1589409.6666666667, + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.150_00_to_under_200_00__pre_2016_state_pension", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 2730401.3333333335, + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.200_00_to_under_250_00__pre_2016_state_pension", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 8063.0, + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.20_00_to_under_40_00__pre_2016_state_pension", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 1338030.3333333333, + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.250_00_to_under_300_00__pre_2016_state_pension", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 737995.6666666666, + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.300_00_and_over__pre_2016_state_pension", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 12135.666666666666, + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.40_00_to_under_60_00__pre_2016_state_pension", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 17155.0, + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.60_00_to_under_80_00__pre_2016_state_pension", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 23048.0, + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.80_00_to_under_100_00__pre_2016_state_pension", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 12621.333333333334, + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.under_20_00__pre_2016_state_pension", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 621000.25, + "name": "dwp.state_pension.recipients_pre_2016_scotland", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, + { + "kind": "ledger_only", + "ledger_value": 403793.0, + "name": "dwp.state_pension.recipients_pre_2016_wales", + "period": 2023, + "reason": "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great Britain) and DfC (Northern Ireland) on the four quarterly points inside calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by sex by type, area by type and weekly amount band by type. The frozen fixture has no State Pension caseload or resident-level row." + }, { "kind": "ledger_only", "ledger_value": 6197311.0, @@ -336,6 +868,48 @@ "period": 2023, "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." }, + { + "kind": "ledger_only", + "ledger_value": 1200000000.0, + "name": "hmrc.salary_sacrifice.it_relief_additional_rate", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1600000000.0, + "name": "hmrc.salary_sacrifice.it_relief_basic_rate", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 4400000000.0, + "name": "hmrc.salary_sacrifice.it_relief_higher_rate", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 7200000000.0, + "name": "hmrc.salary_sacrifice.it_relief_total", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1200000000.0, + "name": "hmrc.salary_sacrifice.nics_relief_employee", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2900000000.0, + "name": "hmrc.salary_sacrifice.nics_relief_employer", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, { "kind": "ledger_only", "ledger_value": 1260000000.0, diff --git a/packages/microcosm-build/src/microcosm/build/uk/ledger_fact_vendor_selections.json b/packages/microcosm-build/src/microcosm/build/uk/ledger_fact_vendor_selections.json index a90505b52..a404f29c3 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/ledger_fact_vendor_selections.json +++ b/packages/microcosm-build/src/microcosm/build/uk/ledger_fact_vendor_selections.json @@ -853,6 +853,94 @@ "expected_row_count": 48 } ] + }, + { + "resource": "ons_single_year_age_populations.json", + "purpose": "ONS mid-2023 UK resident population by single year of age (0 to 89 and 90 and over) and sex (MYE2). Consumed by the SPI income stage, which draws each SPI 2022-23 donor's age within its published AGERANGE band in proportion to these single-year populations instead of uniformly, with State Pension recipients drawn at or above State Pension age (microcosm#1069).", + "consumers": [ + "uk_runtime.spi_income" + ], + "planned_consumers": [], + "selections": [ + { + "label": "mye2_uk_single_year_of_age_by_sex_mid2023", + "selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "geography_id": "K02000001", + "period_type": "calendar_year", + "period_value": [ + "2023" + ], + "dimensions": [ + "age", + "sex" + ] + }, + "expected_row_count": 182 + } + ] + }, + { + "resource": "ashe_employer_pension_contribution_rates.json", + "purpose": "ONS ASHE 2024 workplace pension tables: the share of jobs in each employer contribution band (full pay) by pension type and sector, all industries (Table P10), and jobs by pension type and sector (Table P2). Consumed by the FRS HMRC spine-leaves stage, which draws each employer-scheme member's employer contribution rate for their scheme type and sector (microcosm#1069 c9, R6).", + "consumers": [ + "uk_runtime.employer_pension_contributions" + ], + "planned_consumers": [], + "selections": [ + { + "label": "ashe_p10_employer_rate_band_share_full_pay_by_type_and_sector", + "selector": { + "source_name": "ons", + "source_concept": "ons.workplace_pension_employer_contribution_band_share", + "geography_id": "K02000001", + "period_type": "calendar_year", + "period_value": [ + "2024" + ], + "dimensions": [ + "contribution_basis", + "employer_contribution_rate_band", + "pension_type", + "sector", + "sic2007_section", + "sic2007_summary_category" + ], + "dimension_values": { + "contribution_basis": "full_pay", + "sic2007_section": "all", + "sic2007_summary_category": "all" + } + }, + "expected_row_count": 68 + }, + { + "label": "ashe_p2_jobs_by_type_and_sector", + "selector": { + "source_name": "ons", + "source_concept": "ons.workplace_pension_jobs_by_type", + "geography_id": "K02000001", + "period_type": "calendar_year", + "period_value": [ + "2024" + ], + "dimensions": [ + "pension_type", + "sector", + "sic2007_section", + "sic2007_summary_category", + "weekly_earnings_band" + ], + "dimension_values": { + "sic2007_section": "all", + "sic2007_summary_category": "all", + "weekly_earnings_band": "all" + } + }, + "expected_row_count": 13 + } + ] } ] } diff --git a/packages/microcosm-build/src/microcosm/build/uk/licensed_cars_fuel_type.json b/packages/microcosm-build/src/microcosm/build/uk/licensed_cars_fuel_type.json index e9f94f89f..35a3a4a7e 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/licensed_cars_fuel_type.json +++ b/packages/microcosm-build/src/microcosm/build/uk/licensed_cars_fuel_type.json @@ -15,12 +15,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7" + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/local_target_reference_membership.json b/packages/microcosm-build/src/microcosm/build/uk/local_target_reference_membership.json index 39f479b8f..b98ccb7d4 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/local_target_reference_membership.json +++ b/packages/microcosm-build/src/microcosm/build/uk/local_target_reference_membership.json @@ -1,5 +1,5 @@ { - "source_fact_feed": "chronicle-uk-505e0e72-consumer-facts", + "source_fact_feed": "chronicle-uk-825406f9-consumer-facts", "target_period": 2025, "candidate_count": 22464, "contract_target_count": 51, diff --git a/packages/microcosm-build/src/microcosm/build/uk/local_target_references.json b/packages/microcosm-build/src/microcosm/build/uk/local_target_references.json index d4becbb06..3b0fa660b 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/local_target_references.json +++ b/packages/microcosm-build/src/microcosm/build/uk/local_target_references.json @@ -48,6 +48,9 @@ }, "mhclg": { "label": "Ministry of Housing, Communities and Local Government" + }, + "dfc_ni": { + "label": "Department for Communities (Northern Ireland)" } }, "categories": { @@ -206,6 +209,30 @@ "hmrc.income_tax_liabilities_statistics": { "provider_id": "hmrc", "label": "Income Tax liabilities statistics" + }, + "dwp.state_pension": { + "provider_id": "dwp", + "label": "State Pension" + }, + "dfc_ni.state_pension": { + "provider_id": "dfc_ni", + "label": "State Pension" + }, + "dwp.pension_credit": { + "provider_id": "dwp", + "label": "Pension Credit" + }, + "dfc_ni.pension_credit": { + "provider_id": "dfc_ni", + "label": "Pension Credit" + }, + "dwp.workplace_pensions": { + "provider_id": "dwp", + "label": "Workplace pensions" + }, + "dwp.attendance_allowance": { + "provider_id": "dwp", + "label": "Attendance Allowance" } }, "target_categories": { diff --git a/packages/microcosm-build/src/microcosm/build/uk/local_validation_levels.json b/packages/microcosm-build/src/microcosm/build/uk/local_validation_levels.json index 7f75b1fe5..001d6d51f 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/local_validation_levels.json +++ b/packages/microcosm-build/src/microcosm/build/uk/local_validation_levels.json @@ -5,10 +5,10 @@ "source_feed": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7", + "sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119", "source_repo": "PolicyEngine/chronicle", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c" + "source_commit": "825406f98913ab7324c834c3642804e9317a2256" }, "rows": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/need_energy_facts.json b/packages/microcosm-build/src/microcosm/build/uk/need_energy_facts.json index 73e489041..5522cdad2 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/need_energy_facts.json +++ b/packages/microcosm-build/src/microcosm/build/uk/need_energy_facts.json @@ -17,12 +17,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7" + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/nts_bus_use_frequency.json b/packages/microcosm-build/src/microcosm/build/uk/nts_bus_use_frequency.json index 837241d6e..2eeea01de 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/nts_bus_use_frequency.json +++ b/packages/microcosm-build/src/microcosm/build/uk/nts_bus_use_frequency.json @@ -16,12 +16,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7" + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/nts_car_availability.json b/packages/microcosm-build/src/microcosm/build/uk/nts_car_availability.json index baf8e70a1..4c2e36e88 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/nts_car_availability.json +++ b/packages/microcosm-build/src/microcosm/build/uk/nts_car_availability.json @@ -15,12 +15,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7" + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/nts_trip_rates.json b/packages/microcosm-build/src/microcosm/build/uk/nts_trip_rates.json index 18a2052ed..2e889832e 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/nts_trip_rates.json +++ b/packages/microcosm-build/src/microcosm/build/uk/nts_trip_rates.json @@ -15,12 +15,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7" + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/ofgem_price_cap_facts.json b/packages/microcosm-build/src/microcosm/build/uk/ofgem_price_cap_facts.json index e0aedf1f8..d7ca8d89b 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/ofgem_price_cap_facts.json +++ b/packages/microcosm-build/src/microcosm/build/uk/ofgem_price_cap_facts.json @@ -15,12 +15,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7" + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/ons_household_expenditure_facts.json b/packages/microcosm-build/src/microcosm/build/uk/ons_household_expenditure_facts.json index 332268f0f..44ff41c78 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/ons_household_expenditure_facts.json +++ b/packages/microcosm-build/src/microcosm/build/uk/ons_household_expenditure_facts.json @@ -15,12 +15,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7" + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/ons_single_year_age_populations.json b/packages/microcosm-build/src/microcosm/build/uk/ons_single_year_age_populations.json new file mode 100644 index 000000000..249b30e8f --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/uk/ons_single_year_age_populations.json @@ -0,0 +1,8419 @@ +{ + "schema_version": 1, + "country": "uk", + "kind": "uk_vendored_ledger_facts", + "resource": "ons_single_year_age_populations.json", + "purpose": "ONS mid-2023 UK resident population by single year of age (0 to 89 and 90 and over) and sex (MYE2). Consumed by the SPI income stage, which draws each SPI 2022-23 donor's age within its published AGERANGE band in proportion to these single-year populations instead of uniformly, with State Pension recipients drawn at or above State Pension age (microcosm#1069).", + "consumers": [ + "uk_runtime.spi_income" + ], + "planned_consumers": [], + "policy": "Rows are copied verbatim from the pinned Chronicle consumer feed named in source_fact_feed; every value is a publisher-stated fact. Consumers declare their own arithmetic on these rows and never edit this file by hand: regenerate it with tools/vendor_uk_ledger_facts.py.", + "generator": { + "tool": "tools/vendor_uk_ledger_facts.py", + "version": 1 + }, + "source_fact_feed": { + "source_repo": "PolicyEngine/chronicle", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "build": "build-bundle --suite uk -> build-consumer-artifact", + "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" + }, + "selections": [ + { + "label": "mye2_uk_single_year_of_age_by_sex_mid2023", + "selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "geography_id": "K02000001", + "period_type": "calendar_year", + "period_value": [ + "2023" + ], + "dimensions": [ + "age", + "sex" + ] + }, + "row_count": 182 + } + ], + "row_count": 182, + "rows": [ + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_4a3bcfb2d0470af0aebd307b", + "semantic_fact_key": "ledger_semantic_fact_v2_5c02d7a386b2c43f28f781c0", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_90_plus.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_90_plus", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": "90_plus", + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 408216 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_08ad8e4534063e1f81a4f712", + "semantic_fact_key": "ledger_semantic_fact_v2_6fedb24a16e5a2f7177b9218", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_90_plus.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_90_plus", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": "90_plus", + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 203503 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_4ebebdf0cec193ac0fff508d", + "semantic_fact_key": "ledger_semantic_fact_v2_7bce50c58786ab54c9be5a56", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_0.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_0", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 0, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 324854 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_0f454285b7665a2a84d0b93c", + "semantic_fact_key": "ledger_semantic_fact_v2_28028bd22a01f0c288f9e448", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_0.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_0", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 0, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 342328 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_1e3075a4f0ec456b91c2ce96", + "semantic_fact_key": "ledger_semantic_fact_v2_ffde9f26c0acae238e7a137e", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_1.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_1", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 1, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 347745 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_00486b31b3869f84b7b82d31", + "semantic_fact_key": "ledger_semantic_fact_v2_e075d450cd7cd00a711efc1c", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_1.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_1", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 1, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 364505 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_7774c10309d6bc6c5b72ab58", + "semantic_fact_key": "ledger_semantic_fact_v2_4ef6e5fedb35fec94dd450fd", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_10.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_10", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 10, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 398980 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_96519cc6ce84d5a8546ee4a7", + "semantic_fact_key": "ledger_semantic_fact_v2_cf3398d2b5c264f108fb5ff8", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_10.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_10", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 10, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 418524 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_4f5a550a735962cd2fd44f89", + "semantic_fact_key": "ledger_semantic_fact_v2_ada6b7710a12d077d4f9c06c", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_11.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_11", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 11, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 409728 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_2d389ae90d3be70534fddee8", + "semantic_fact_key": "ledger_semantic_fact_v2_21c267ee8d9bc6c5820be0de", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_11.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_11", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 11, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 429361 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_3313a9a641b5b57afd761ca2", + "semantic_fact_key": "ledger_semantic_fact_v2_2a617d85d68722711fff3f95", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_12.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_12", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 12, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 409494 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_2229ce4a4c4d99f304edbdfc", + "semantic_fact_key": "ledger_semantic_fact_v2_e6e9222fd260ccc245e0dc5d", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_12.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_12", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 12, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 430659 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_61947d78ed7fd76937160a27", + "semantic_fact_key": "ledger_semantic_fact_v2_af9920c13a8a3bf57a8740b8", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_13.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_13", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 13, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 405159 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_47d7d0efc40f96f267e0d06b", + "semantic_fact_key": "ledger_semantic_fact_v2_9f000a42edd4c7bf2ef69328", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_13.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_13", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 13, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 424443 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_b888141fdc6c36c38868a115", + "semantic_fact_key": "ledger_semantic_fact_v2_ea70e1fa6345d9dc63e9d460", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_14.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_14", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 14, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 401848 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_2187c9f1957f3d2fc96ad375", + "semantic_fact_key": "ledger_semantic_fact_v2_92dcc14567307adca4ee9983", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_14.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_14", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 14, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 422091 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_9b26fdfc121bf2854e0a964c", + "semantic_fact_key": "ledger_semantic_fact_v2_c6e7386919047f4413f4b389", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_15.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_15", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 15, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 405841 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_b53714893d52d1065ea901a7", + "semantic_fact_key": "ledger_semantic_fact_v2_d10240a7257fb932710bf996", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_15.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_15", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 15, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 425723 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_d2a49f76728d9f7438991c39", + "semantic_fact_key": "ledger_semantic_fact_v2_d01eebbf8908259d139a77d3", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_16.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_16", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 16, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 389062 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_26e95e066a6a7c08dd59fc1e", + "semantic_fact_key": "ledger_semantic_fact_v2_03f9c62009de3dfddd15e536", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_16.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_16", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 16, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 411886 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_f1035266152c10ca25027138", + "semantic_fact_key": "ledger_semantic_fact_v2_397811716143276593c05527", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_17.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_17", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 17, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 381938 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_f8e958b6442614d517122f0b", + "semantic_fact_key": "ledger_semantic_fact_v2_46872525cd0bc960aea694a9", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_17.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_17", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 17, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 406101 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_675deda4d77ec9dba5ba9a6e", + "semantic_fact_key": "ledger_semantic_fact_v2_8be551d3c50245e647ace507", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_18.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_18", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 18, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 381530 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_e27f58be403071d1295fe6bf", + "semantic_fact_key": "ledger_semantic_fact_v2_810e6ab87947bd7c29106812", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_18.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_18", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 18, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 407166 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_ddbe66598370548b43420acf", + "semantic_fact_key": "ledger_semantic_fact_v2_67bc86af3928f58bbc5f5a10", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_19.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_19", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 19, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 388704 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_c92bd6c60c4ec18ea532bf8d", + "semantic_fact_key": "ledger_semantic_fact_v2_b154078820785ad8a1697806", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_19.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_19", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 19, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 413517 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_5581d5b6741e0f36cfac073e", + "semantic_fact_key": "ledger_semantic_fact_v2_bac9beb2f0ac3e97abd8b1c3", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_2.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_2", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 2, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 346068 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_b4d347bdcba9ad9738b6e5e0", + "semantic_fact_key": "ledger_semantic_fact_v2_1af588b147b4afc8017e61ec", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_2.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_2", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 2, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 363201 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_5a51b9d0cb18a9def5e724de", + "semantic_fact_key": "ledger_semantic_fact_v2_cc965b84de8be16831159cf6", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_20.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_20", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 20, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 387458 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_19ec8c84238f91fac741f174", + "semantic_fact_key": "ledger_semantic_fact_v2_d2b7f469112739346c6932c3", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_20.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_20", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 20, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 412991 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_8ea9fffa4c5dc656987f45f8", + "semantic_fact_key": "ledger_semantic_fact_v2_19794cf4811a122de324c33c", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_21.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_21", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 21, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 391433 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_4365733369e3651807009142", + "semantic_fact_key": "ledger_semantic_fact_v2_5786dbc1b0b0532c2c348d49", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_21.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_21", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 21, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 409764 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_92cbd601785fe8be7486ec14", + "semantic_fact_key": "ledger_semantic_fact_v2_8e1358acc145eeb706863368", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_22.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_22", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 22, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 393708 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_96e64ea6fd712a0f5550df72", + "semantic_fact_key": "ledger_semantic_fact_v2_00734e43b34a3ed376469b1b", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_22.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_22", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 22, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 410468 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_3a85d9b439c52e5eb4a77eaa", + "semantic_fact_key": "ledger_semantic_fact_v2_bb6d8c7adac2c12ee241653f", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_23.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_23", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 23, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 408989 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_027282ef4cc6258245dc7da8", + "semantic_fact_key": "ledger_semantic_fact_v2_e1f0d9a6d5c80ff90f5680de", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_23.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_23", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 23, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 421759 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_4e045eebca109429a244fe99", + "semantic_fact_key": "ledger_semantic_fact_v2_c7d1b4dc96b46fc819ccbe84", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_24.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_24", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 24, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 426517 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_2f9bc4be5a85ab101e946d6d", + "semantic_fact_key": "ledger_semantic_fact_v2_58eb1c1a558949dd817ebe17", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_24.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_24", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 24, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 434455 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_651d10c9f786e6019df86b54", + "semantic_fact_key": "ledger_semantic_fact_v2_515deb57a314ae090fd50440", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_25.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_25", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 25, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 434388 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_1d6a2421e00987a9416ea2cc", + "semantic_fact_key": "ledger_semantic_fact_v2_35492d38a8aefcb75b3ef4c8", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_25.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_25", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 25, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 435305 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_6d35ac539f5561cf6c630d0f", + "semantic_fact_key": "ledger_semantic_fact_v2_3a2a8234dd46d28374e410cf", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_26.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_26", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 26, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 445291 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_3907116f5761e97a2642ad96", + "semantic_fact_key": "ledger_semantic_fact_v2_d333960ec16c82c318e9c4bc", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_26.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_26", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 26, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 442513 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_8529cdd8e691b1a6b3589cee", + "semantic_fact_key": "ledger_semantic_fact_v2_c6d1473281ace681b99d6b1a", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_27.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_27", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 27, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 439256 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_ea1b0e6b30597eac3bb1669a", + "semantic_fact_key": "ledger_semantic_fact_v2_7ddf5e7d52deeccdedf637be", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_27.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_27", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 27, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 434605 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_c9bdf4b3dbd47679ed1fbbc5", + "semantic_fact_key": "ledger_semantic_fact_v2_4c93035cf5400dcc724d98d6", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_28.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_28", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 28, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 449215 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_c6c5592c97cb6a6de7b4a534", + "semantic_fact_key": "ledger_semantic_fact_v2_b019c63a85095e7c00f211c1", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_28.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_28", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 28, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 437393 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_86a2c63312414fde298c9efe", + "semantic_fact_key": "ledger_semantic_fact_v2_c2f23a1e5d5805ea551547f6", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_29.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_29", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 29, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 464258 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_cf5d5d1a7c9eb827ae261c7f", + "semantic_fact_key": "ledger_semantic_fact_v2_4ed34e4068b495ed1e146b30", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_29.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_29", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 29, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 445523 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_aeb34b1015a7c15b957128dc", + "semantic_fact_key": "ledger_semantic_fact_v2_db5d1c2ac7ce17557f14f440", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_3.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_3", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 3, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 358704 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_6633eb75338de98e9cd1e934", + "semantic_fact_key": "ledger_semantic_fact_v2_40d420daa830bed845ad3f7c", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_3.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_3", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 3, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 375319 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_ce13155e323d3fca91d9f42b", + "semantic_fact_key": "ledger_semantic_fact_v2_973a51a079a11f20ddaad92f", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_30.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_30", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 30, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 467257 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_9d956a1ab748dcf2d5a441b3", + "semantic_fact_key": "ledger_semantic_fact_v2_6b0551e8672ff7b60e5a515e", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_30.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_30", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 30, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 444933 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_1cd504cc330944fa73cddbc9", + "semantic_fact_key": "ledger_semantic_fact_v2_9fa3f551e48bba5c59ae70a5", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_31.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_31", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 31, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 483270 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_5afe855e626c045a3f30f655", + "semantic_fact_key": "ledger_semantic_fact_v2_504de27106529bfc4e6b39b6", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_31.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_31", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 31, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 457654 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_493d6c3280edf6006fcb78e2", + "semantic_fact_key": "ledger_semantic_fact_v2_c9865f63902f33d3618f0a02", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_32.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_32", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 32, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 489319 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_277043e54ea1b300962bd85d", + "semantic_fact_key": "ledger_semantic_fact_v2_dbc88475ee8454929f7c9c2d", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_32.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_32", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 32, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 463466 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_bb8d03c13fe33172e5693982", + "semantic_fact_key": "ledger_semantic_fact_v2_f442dafad02af57d02e4ea51", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_33.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_33", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 33, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 489488 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_b7b87b1c09067ca8c7c327ac", + "semantic_fact_key": "ledger_semantic_fact_v2_0ba260b4d6cc6e47a8b895e7", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_33.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_33", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 33, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 460182 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_c1914fc8fb2a8b267bfb6a35", + "semantic_fact_key": "ledger_semantic_fact_v2_75ce0ace0e7b7b99890eea1b", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_34.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_34", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 34, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 487748 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_84fb3de0a05f992caa4f54dd", + "semantic_fact_key": "ledger_semantic_fact_v2_85b48d3e07581203400f554e", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_34.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_34", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 34, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 456881 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_527402ac092fbeff42932ccd", + "semantic_fact_key": "ledger_semantic_fact_v2_f64f20a137ea1827a7afc4ff", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_35.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_35", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 35, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 495395 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_5d64ba2cb51dbd6c6b624dbc", + "semantic_fact_key": "ledger_semantic_fact_v2_d39e7cc8a480b210b8c2c95b", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_35.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_35", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 35, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 460721 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_c0db936fbd97602d4bcecd14", + "semantic_fact_key": "ledger_semantic_fact_v2_357754ebc3ed59d6804c5006", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_36.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_36", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 36, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 484598 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_26cb629f3fd9269f751de889", + "semantic_fact_key": "ledger_semantic_fact_v2_52b0f5fc1fd244127a62f8d4", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_36.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_36", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 36, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 449519 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_5eaa09f10cf975e38a53fbb5", + "semantic_fact_key": "ledger_semantic_fact_v2_681bcdc96835686d1aa6eb04", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_37.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_37", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 37, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 478643 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_085fbf06c0548a7fa4c9e9e9", + "semantic_fact_key": "ledger_semantic_fact_v2_a7495cfb75e119122a2039d9", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_37.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_37", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 37, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 449174 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_b74fb0922650d6af5188f5c3", + "semantic_fact_key": "ledger_semantic_fact_v2_f845b324f803b0e745d59300", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_38.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_38", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 38, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 476372 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_71d859320fae913d6a356543", + "semantic_fact_key": "ledger_semantic_fact_v2_cf2d2eb2ff28849a70cebf45", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_38.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_38", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 38, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 447391 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_596c27b5c56f0a423ce388c2", + "semantic_fact_key": "ledger_semantic_fact_v2_994eee32cf0e5c950b588118", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_39.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_39", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 39, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 461282 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_231e3c373ef8891d56718a2a", + "semantic_fact_key": "ledger_semantic_fact_v2_09fde28f972b1314ecd5d408", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_39.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_39", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 39, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 433498 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_66d0baf78c0f1e300a2df11d", + "semantic_fact_key": "ledger_semantic_fact_v2_c50058166493ff777fc13d38", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_4.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_4", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 4, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 365289 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_80f0c0f6930899b3f9887c23", + "semantic_fact_key": "ledger_semantic_fact_v2_26453b072e676fa9403660c9", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_4.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_4", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 4, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 383994 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_6cfa6771576b5f8c32ec4b71", + "semantic_fact_key": "ledger_semantic_fact_v2_6514f395349557527ec60b8f", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_40.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_40", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 40, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 461501 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_66693c98966705b2d98b722c", + "semantic_fact_key": "ledger_semantic_fact_v2_76b1aa33d871cd99b5fd5d0a", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_40.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_40", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 40, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 433474 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_23a57cbb11552eff8e45104b", + "semantic_fact_key": "ledger_semantic_fact_v2_2173767d33db0bf64e247e74", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_41.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_41", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 41, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 457594 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_e5dd869f6dfa1b78edd360be", + "semantic_fact_key": "ledger_semantic_fact_v2_75891a453eede7cac0b13de6", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_41.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_41", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 41, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 432811 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_2ff13f2fef34c65b0e3f9099", + "semantic_fact_key": "ledger_semantic_fact_v2_4f5786edd0380779823fbef0", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_42.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_42", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 42, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 462000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_380d1c0b72eee2f896cdb51c", + "semantic_fact_key": "ledger_semantic_fact_v2_937557a849f46ea06beef51e", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_42.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_42", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 42, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 435957 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_3699d3cb646a1dba7f25c73f", + "semantic_fact_key": "ledger_semantic_fact_v2_c11b8edb780cf1e1683cc5b0", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_43.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_43", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 43, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 460982 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_f83596426a154293f220d0b2", + "semantic_fact_key": "ledger_semantic_fact_v2_1e0cffd7e3e522ad48cd7cd0", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_43.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_43", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 43, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 438824 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_3c30d269ff647729dc7c2f48", + "semantic_fact_key": "ledger_semantic_fact_v2_474eee2e0fee448ecf3fadde", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_44.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_44", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 44, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 440812 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_50624b257ba4ab1dfee69be9", + "semantic_fact_key": "ledger_semantic_fact_v2_f5db537eb81c793f8f88fdc9", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_44.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_44", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 44, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 422271 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_ddb10d50714a4206475e65b3", + "semantic_fact_key": "ledger_semantic_fact_v2_bd376f486c5a6f4e25df18fd", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_45.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_45", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 45, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 409188 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_68614ab4e6fe228e7814ed66", + "semantic_fact_key": "ledger_semantic_fact_v2_32169258a1a4fd99dad96133", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_45.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_45", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 45, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 392461 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_1c885b7442ac751a089c591e", + "semantic_fact_key": "ledger_semantic_fact_v2_6aa5a820726fa1a373cb4240", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_46.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_46", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 46, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 400009 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_f8f4c331654e6ab739ba85da", + "semantic_fact_key": "ledger_semantic_fact_v2_3794880c01a139d58f38b15d", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_46.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_46", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 46, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 386516 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_e223335c3ce66e32a1ab4947", + "semantic_fact_key": "ledger_semantic_fact_v2_206c1182cb908a56148ae19a", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_47.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_47", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 47, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 409067 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_4d51b5560a1fb460671ca12b", + "semantic_fact_key": "ledger_semantic_fact_v2_46c87d03bafa485de6332075", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_47.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_47", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 47, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 395515 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_a325a9b51f5928efdc4eb5b1", + "semantic_fact_key": "ledger_semantic_fact_v2_7b92c9eac34aee4d94596f4d", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_48.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_48", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 48, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 416504 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_449e923c04825ca9cae59a7b", + "semantic_fact_key": "ledger_semantic_fact_v2_a0fd0d4458ab53a6df649cf7", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_48.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_48", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 48, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 403311 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_3e3a464187ab1ef8cde9b199", + "semantic_fact_key": "ledger_semantic_fact_v2_99bb121bdbdd6e177ae7668c", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_49.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_49", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 49, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 422065 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_b7e36882332899d82283dd3c", + "semantic_fact_key": "ledger_semantic_fact_v2_c80c7cb1c79867c2c6ee9044", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_49.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_49", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 49, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 408606 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_4cb79fe10b49072f7c6234aa", + "semantic_fact_key": "ledger_semantic_fact_v2_81e5475c17fcb52bad11282a", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_5.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_5", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 5, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 370522 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_b6564af7335fe44b961e3a4c", + "semantic_fact_key": "ledger_semantic_fact_v2_e3c316a8611edea39655b9fc", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_5.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_5", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 5, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 387948 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_13fd387db71f7eff6c8d784d", + "semantic_fact_key": "ledger_semantic_fact_v2_106e14f567f72a9c551b252f", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_50.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_50", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 50, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 438465 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_fbbb405314eaa1aa1de55699", + "semantic_fact_key": "ledger_semantic_fact_v2_445e687c8e96e1c48f2d6ab1", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_50.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_50", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 50, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 424562 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_51717cef03891f424acf775f", + "semantic_fact_key": "ledger_semantic_fact_v2_b3202a91c3e6f85586b5354d", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_51.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_51", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 51, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 455706 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_e19318af1adb4d9f37c27dbc", + "semantic_fact_key": "ledger_semantic_fact_v2_f30ff5aa39b1dffbeb56f0e6", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_51.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_51", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 51, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 440227 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_6ca714ce9b0c96b142a62a08", + "semantic_fact_key": "ledger_semantic_fact_v2_79364cd1ba28b69dd396bd6b", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_52.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_52", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 52, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 474771 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_30097be8969447f6184b13ce", + "semantic_fact_key": "ledger_semantic_fact_v2_47f0cbb360d0d5b156b61fdf", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_52.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_52", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 52, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 454659 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_2946b6e986b67eaf12bf544f", + "semantic_fact_key": "ledger_semantic_fact_v2_1397b8bf4082f07eaf20a663", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_53.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_53", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 53, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 462696 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_8d1ae2e35715a36cea2b5985", + "semantic_fact_key": "ledger_semantic_fact_v2_17d7c7b46899d5f745ae556f", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_53.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_53", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 53, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 444285 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_1068f1c3abad56b586b369e0", + "semantic_fact_key": "ledger_semantic_fact_v2_81c0a783f63457ec9d2d6bf1", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_54.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_54", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 54, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 472931 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_e70a43e8a71db80ac1c26053", + "semantic_fact_key": "ledger_semantic_fact_v2_2680aa01ac1376b11e10517c", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_54.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_54", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 54, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 454576 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_3e9bcb1e56671c0180bb3359", + "semantic_fact_key": "ledger_semantic_fact_v2_be335f3619a14d93c9d6e6fe", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_55.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_55", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 55, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 471867 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_e35c2bb2826d60841729810b", + "semantic_fact_key": "ledger_semantic_fact_v2_5f77787d798d078174d2d5a4", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_55.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_55", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 55, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 453431 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_a465fd04a116677a5b832d10", + "semantic_fact_key": "ledger_semantic_fact_v2_f267a6483fde54a5723d7a7e", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_56.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_56", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 56, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 472982 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_6edf2c45923807d3a4342a55", + "semantic_fact_key": "ledger_semantic_fact_v2_f48935a02be810e795a0d119", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_56.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_56", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 56, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 456860 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_1ddeb05c3bfa53f412d72751", + "semantic_fact_key": "ledger_semantic_fact_v2_a5f4f92a275cb0be33124351", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_57.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_57", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 57, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 472718 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_30dc996ab52d0ab6829f36f2", + "semantic_fact_key": "ledger_semantic_fact_v2_96e39d463c19a3c0d53895f2", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_57.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_57", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 57, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 452506 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_2322f6e5d59f88d5e97439b6", + "semantic_fact_key": "ledger_semantic_fact_v2_0cdfe5e78014200d6921e57a", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_58.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_58", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 58, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 474539 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_4ee2dd11aff554c244049ae5", + "semantic_fact_key": "ledger_semantic_fact_v2_5ecfe24d8386aad82a0515e6", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_58.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_58", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 58, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 454627 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_c91e8c2c549cb2ab3fe765b7", + "semantic_fact_key": "ledger_semantic_fact_v2_2403e2b6ba316cc3fcd2789f", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_59.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_59", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 59, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 468090 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_6fb817a266bffd372e384ab2", + "semantic_fact_key": "ledger_semantic_fact_v2_5422ca9b3aecc66959c81026", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_59.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_59", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 59, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 447645 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_063f7c99f7fa1cbef8ebf877", + "semantic_fact_key": "ledger_semantic_fact_v2_6b9834d3d255978d637bc936", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_6.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_6", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 6, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 379256 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_c6abdb20b466175583ee4895", + "semantic_fact_key": "ledger_semantic_fact_v2_bbc1209c9af5c12960d6fa65", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_6.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_6", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 6, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 397176 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_8e377055b2cc5c58688fd496", + "semantic_fact_key": "ledger_semantic_fact_v2_738d806295dda826dd13e629", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_60.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_60", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 60, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 456166 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_f09dada5790e3021a3eaccf5", + "semantic_fact_key": "ledger_semantic_fact_v2_97e5db18dbc241a0b22f625c", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_60.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_60", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 60, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 437034 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_8b09487fbfc1e13cdec472c5", + "semantic_fact_key": "ledger_semantic_fact_v2_3bb8ed2ebc48fedf5254fed4", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_61.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_61", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 61, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 443948 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_0a23f40fb64cee6cbf6800dc", + "semantic_fact_key": "ledger_semantic_fact_v2_6202f69ad1aca86b0f5f8cb8", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_61.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_61", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 61, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 425976 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_4d77698edf2e62f4023f6828", + "semantic_fact_key": "ledger_semantic_fact_v2_436526553a863996c7b093d7", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_62.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_62", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 62, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 426158 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_702be7a024a20d0b03a82f03", + "semantic_fact_key": "ledger_semantic_fact_v2_8fb8e9b3a0b737ca324216e3", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_62.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_62", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 62, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 410634 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_b7f69c23f86a4fc9b1559158", + "semantic_fact_key": "ledger_semantic_fact_v2_1b2562813d482c7fa5e25417", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_63.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_63", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 63, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 408782 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_01d29f98791c49b33b2fc671", + "semantic_fact_key": "ledger_semantic_fact_v2_1fe4ef860f8844b4e47dc8ad", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_63.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_63", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 63, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 393466 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_b6ce9730ad90575a3ba0f97e", + "semantic_fact_key": "ledger_semantic_fact_v2_8758de302480d6631be4694e", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_64.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_64", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 64, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 398129 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_4198a174a9de7883e1866869", + "semantic_fact_key": "ledger_semantic_fact_v2_814843eb33c86c8f1d04e077", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_64.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_64", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 64, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 381376 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_5275c18aaf0e7cf5a9ec600d", + "semantic_fact_key": "ledger_semantic_fact_v2_15ebad88987041f02f66e672", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_65.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_65", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 65, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 386663 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_eeb75b179311d50a600e304c", + "semantic_fact_key": "ledger_semantic_fact_v2_ef4ed7a58cb96d79e9870671", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_65.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_65", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 65, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 369625 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_b41e90eb85c3870d602967e1", + "semantic_fact_key": "ledger_semantic_fact_v2_11987364d0bd2bf53d48557b", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_66.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_66", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 66, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 370389 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_92afc8767ceaba8c967eead5", + "semantic_fact_key": "ledger_semantic_fact_v2_3104289a842b80ad7acf5ec2", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_66.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_66", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 66, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 351473 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_733d58f3b1f5dd47d73104fc", + "semantic_fact_key": "ledger_semantic_fact_v2_d62f7c158acd4f6ca36984c4", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_67.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_67", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 67, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 355512 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_ea094807e8da40dbab9c4c3c", + "semantic_fact_key": "ledger_semantic_fact_v2_9fb15d93614bfc3a685227eb", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_67.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_67", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 67, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 336817 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_4d2ab48c5392b06c271900a2", + "semantic_fact_key": "ledger_semantic_fact_v2_12ccf1ed6aaa0c83fc1abf67", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_68.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_68", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 68, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 341641 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_95d77d4a5e4f2145c8216ecb", + "semantic_fact_key": "ledger_semantic_fact_v2_4e68917b07e1d189d66b1246", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_68.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_68", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 68, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 320034 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_b4ec693c3a5fe8b441aa53ac", + "semantic_fact_key": "ledger_semantic_fact_v2_5797af824697a719a655e2bc", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_69.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_69", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 69, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 340756 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_4499e130530bd837d3144eb6", + "semantic_fact_key": "ledger_semantic_fact_v2_ef28734051f25d9e7c1270ed", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_69.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_69", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 69, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 316799 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_88e69819aa332139d86e7214", + "semantic_fact_key": "ledger_semantic_fact_v2_87df946838b4a82f96c52fd8", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_7.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_7", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 7, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 389863 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_1758a667cc5d5802a11d886b", + "semantic_fact_key": "ledger_semantic_fact_v2_c079eb9f3d6441f121c69276", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_7.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_7", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 7, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 409508 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_a16aa4dfa78d29b9ca79ced6", + "semantic_fact_key": "ledger_semantic_fact_v2_697cd14a3422125a51e8dc6e", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_70.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_70", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 70, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 333305 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_71d3fded00a46f536d557157", + "semantic_fact_key": "ledger_semantic_fact_v2_c0901f9015986b53a726ab68", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_70.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_70", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 70, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 309135 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_9dcbff7121fdb1e9224d4530", + "semantic_fact_key": "ledger_semantic_fact_v2_b9517f60ebc2a9aa0dca76f8", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_71.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_71", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 71, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 322701 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_82278ca5e66c5a4a58ea4a2e", + "semantic_fact_key": "ledger_semantic_fact_v2_9b6a6472e0efb914853b93f0", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_71.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_71", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 71, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 294844 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_33153c7ca8409b0c5fa99fe8", + "semantic_fact_key": "ledger_semantic_fact_v2_97dd4ad605f8279290e13865", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_72.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_72", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 72, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 322404 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_4b0f27ac370bb9d9967d99fe", + "semantic_fact_key": "ledger_semantic_fact_v2_15dff6d1b3f75fb32c9bd352", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_72.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_72", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 72, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 293782 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_fd1c5a3a2b3b114b99014ae9", + "semantic_fact_key": "ledger_semantic_fact_v2_0cf3b7ee8ff76d565cf7bd8c", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_73.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_73", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 73, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 325481 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_1b8f29bb87b175d9da302161", + "semantic_fact_key": "ledger_semantic_fact_v2_f5896a98415fc93e3105609a", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_73.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_73", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 73, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 292668 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_dc3a6315bc0e761a07084467", + "semantic_fact_key": "ledger_semantic_fact_v2_ab2d0dc2678363d02cd7534c", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_74.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_74", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 74, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 329858 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_d7140c4ba2545eedbaab8108", + "semantic_fact_key": "ledger_semantic_fact_v2_1f477b95533c32052fd83a14", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_74.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_74", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 74, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 296281 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_c6fd12c81bf1e07adb3bd6f3", + "semantic_fact_key": "ledger_semantic_fact_v2_c754c1800fe723c13e5ef1d7", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_75.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_75", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 75, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 345081 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_e1251d6cacc4ac9bf6447f8e", + "semantic_fact_key": "ledger_semantic_fact_v2_ae5ee4b82c57d52d7cbe66fd", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_75.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_75", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 75, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 306251 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_474d7446845d49371389e259", + "semantic_fact_key": "ledger_semantic_fact_v2_75b21d6e80b20e7b68076e84", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_76.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_76", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 76, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 368136 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_d557c98c95fae185f5be3977", + "semantic_fact_key": "ledger_semantic_fact_v2_4b72195d0c6f03830bfa6774", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_76.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_76", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 76, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 325543 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_52dbb1faa65bfd2908f0ccca", + "semantic_fact_key": "ledger_semantic_fact_v2_5b9728970cc01984225c5840", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_77.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_77", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 77, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 279000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_555511d73c11a6d8777e3a74", + "semantic_fact_key": "ledger_semantic_fact_v2_ef36de2d6295ef13e5108114", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_77.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_77", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 77, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 242896 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_dc1ad449208a0ee1730939ab", + "semantic_fact_key": "ledger_semantic_fact_v2_a34cd3bd69149f6aa6aa6ebb", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_78.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_78", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 78, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 266479 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_8178872763c6784dd0fb9f02", + "semantic_fact_key": "ledger_semantic_fact_v2_b81ac9a71b22d7b7fd4f9434", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_78.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_78", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 78, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 228437 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_45a2c8f16e67f03ca5eb794a", + "semantic_fact_key": "ledger_semantic_fact_v2_964287f88fdd9435cfc0aed5", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_79.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_79", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 79, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 260294 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_593cd5b2138cb791be551482", + "semantic_fact_key": "ledger_semantic_fact_v2_83cc08db280d8401e874cc06", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_79.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_79", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 79, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 221198 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_49f2ac8c7311b71ba73da4ad", + "semantic_fact_key": "ledger_semantic_fact_v2_dc311b28686452e3fb3d883e", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_8.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_8", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 8, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 387517 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_0e1626870c989ec8db50dc54", + "semantic_fact_key": "ledger_semantic_fact_v2_d9b767d0d6c860a81d275483", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_8.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_8", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 8, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 406100 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_05a14960cb9884260a9477b1", + "semantic_fact_key": "ledger_semantic_fact_v2_d0e10f686fb4a48e21ba20a2", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_80.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_80", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 80, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 238211 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_c6225adb93f83db9c4758c1d", + "semantic_fact_key": "ledger_semantic_fact_v2_82fa3505bb9cba193471fa7b", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_80.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_80", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 80, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 196827 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_501f5a9119772a4e559d659f", + "semantic_fact_key": "ledger_semantic_fact_v2_07b5f8f0f99f8646f79fac3e", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_81.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_81", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 81, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 208888 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_dd4b3e404d90304a6ae30944", + "semantic_fact_key": "ledger_semantic_fact_v2_d507f2384d5beef754c32b68", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_81.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_81", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 81, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 168425 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_f255fcd1d70ba266995f07bc", + "semantic_fact_key": "ledger_semantic_fact_v2_92bdb8a7bdac3229d6e9ab1f", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_82.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_82", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 82, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 182086 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_961526a0a42e0d5173f74b21", + "semantic_fact_key": "ledger_semantic_fact_v2_a685de0d532256e968870ae8", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_82.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_82", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 82, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 142412 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_0ed7a3e47a5b25104f2a6b99", + "semantic_fact_key": "ledger_semantic_fact_v2_20268eb111e6c32994c0211e", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_83.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_83", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 83, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 182421 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_d5e91cee6431186e063ec08f", + "semantic_fact_key": "ledger_semantic_fact_v2_91db28b1e4795c174c8513ab", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_83.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_83", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 83, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 139886 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_67b2f246ca4afbdefa40bcba", + "semantic_fact_key": "ledger_semantic_fact_v2_2adb87987389fece9c7bd4bd", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_84.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_84", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 84, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 173745 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_0240f13807c3874bdf41d87f", + "semantic_fact_key": "ledger_semantic_fact_v2_0bbd580912f57278bf8e3003", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_84.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_84", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 84, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 130411 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_f036ed78856082fec5cb90fb", + "semantic_fact_key": "ledger_semantic_fact_v2_7dfa6d9e9d286fc08411c987", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_85.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_85", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 85, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 161467 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_8a4a2ca60598d7191d4b5b41", + "semantic_fact_key": "ledger_semantic_fact_v2_0537e8d89a8ee9f19c28c87e", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_85.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_85", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 85, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 118070 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_53cd638044edf6905f415fd6", + "semantic_fact_key": "ledger_semantic_fact_v2_1d7cdd93569e3f081ecece4b", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_86.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_86", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 86, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 145357 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_596bf15baf8d8ec2d2189eda", + "semantic_fact_key": "ledger_semantic_fact_v2_fe4c8cf1cd716256c5bc3963", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_86.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_86", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 86, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 102785 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_415a97070c66d7f1bedb4259", + "semantic_fact_key": "ledger_semantic_fact_v2_80072ff8bb4a3e7452d36efa", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_87.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_87", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 87, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 130223 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_3ff560ce0cdc33d2cca4faba", + "semantic_fact_key": "ledger_semantic_fact_v2_4f2a3f36397d5cd852e9a163", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_87.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_87", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 87, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 88388 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_173b1607b19e52daa1feda0f", + "semantic_fact_key": "ledger_semantic_fact_v2_a161de5f901e1f6729fe21c0", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_88.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_88", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 88, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 114850 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_a0d6b69d65c8961cca8ca1e8", + "semantic_fact_key": "ledger_semantic_fact_v2_1e5a9e58a40596d13b0adbb6", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_88.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_88", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 88, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 75138 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_7d0db7eb236fc59f80657914", + "semantic_fact_key": "ledger_semantic_fact_v2_7eda023650203883594bbb52", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_89.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_89", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 89, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 98220 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_edbd7022f32427a69019dcb1", + "semantic_fact_key": "ledger_semantic_fact_v2_dc979813e37a835527aaee9b", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_89.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_89", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 89, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 61154 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_ec15d23ace4d685ce8eab8ee", + "semantic_fact_key": "ledger_semantic_fact_v2_7654787a8395ed3a2e6541de", + "source_record_id": "ons.mid2023.mye2_female.uk_countries.age_9.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_female.uk_countries.age_9", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 9, + "sex": "female" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 389740 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_3d737c2ba3df6da0d983df2e", + "semantic_fact_key": "ledger_semantic_fact_v2_9efd1673526f912886ae516c", + "source_record_id": "ons.mid2023.mye2_male.uk_countries.age_9.uk.population", + "concept": "ons.mid_year_population_estimate", + "measure_id": "population", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "person", + "role": "resident_population" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "gss_2023" + }, + "period": { + "type": "calendar_year", + "value": 2023 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "ons.mid2023.mye2_male.uk_countries.age_9", + "groupby_dimension": "age", + "groupby_value_id": "uk", + "table_record_kind": "detail" + }, + "dimensions": { + "age": 9, + "sex": "male" + }, + "source": { + "source_name": "ons", + "source_table": "Mid-2023 population estimates, UK and constituent countries, by single year of age and sex (MYE2)", + "source_file": "mye23tablesuk.xlsx", + "source_sha256": "7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16", + "vintage": "mid_2023", + "raw_r2_key": "raw/ons/ons-mye-2023-uk-countries/2023/7ee5724ecf71abc3d811c89174cdddf1bce7f07d3eefc8b69b15ee8371414b16/mye23tablesuk.xlsx" + }, + "value": 408291 + } + ] +} diff --git a/packages/microcosm-build/src/microcosm/build/uk/orr_rail_facts.json b/packages/microcosm-build/src/microcosm/build/uk/orr_rail_facts.json index 1babc8931..f0db23e36 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/orr_rail_facts.json +++ b/packages/microcosm-build/src/microcosm/build/uk/orr_rail_facts.json @@ -17,12 +17,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7" + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/qep_energy_prices.json b/packages/microcosm-build/src/microcosm/build/uk/qep_energy_prices.json index 8355df0b4..07b760523 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/qep_energy_prices.json +++ b/packages/microcosm-build/src/microcosm/build/uk/qep_energy_prices.json @@ -15,12 +15,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7" + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json b/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json index 0feab8e5e..1edc791c4 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json +++ b/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json @@ -468,7 +468,7 @@ "required_mass_change_reason": "Capital-gains incidence anchor moves the mass of non-liable clone households back to their paired originals until the sub-exempt and loss-making clone mass match the Advani-Summers reporter composition at the redrawn liable mass; every pair's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "01567b46aa26765fea6afd4c9a64674f8ed5e2e8fe32de106a03ec06f1da33bd", + "source_manifest_sha256": "c461c338a92a48409c1537bd1c142852f750ab2529b302fa74bf08af32da4752", "source_vintages": { "source": "Advani and Summers (2020), Capital Gains and UK Inequality, CAGE Working Paper 465", "survey": "Family Resources Survey 2024-25, SPI synthetic support, the HMRC Table 3 redrawn gains on the spine and Advani-Summers capital-gains incidence" @@ -491,7 +491,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "01567b46aa26765fea6afd4c9a64674f8ed5e2e8fe32de106a03ec06f1da33bd", + "source_manifest_sha256": "c461c338a92a48409c1537bd1c142852f750ab2529b302fa74bf08af32da4752", "source_vintages": { "source": "Advani and Summers (2020), Capital Gains and UK Inequality, CAGE Working Paper 465", "survey": "Family Resources Survey 2024-25, SPI synthetic support, and Advani-Summers capital-gains incidence" @@ -513,7 +513,7 @@ "required_mass_change_reason": "Capital-gains support split divides the wealthiest households of each HMRC Table 3 income band into light copies at equal weight; every household's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "01567b46aa26765fea6afd4c9a64674f8ed5e2e8fe32de106a03ec06f1da33bd", + "source_manifest_sha256": "c461c338a92a48409c1537bd1c142852f750ab2529b302fa74bf08af32da4752", "source_vintages": { "source": "HMRC Capital Gains Tax statistics, July 2026 release, Table 3 for 2024-25, via the vendored conditioning facts", "survey": "Family Resources Survey 2024-25, SPI synthetic support and HMRC Capital Gains Tax statistics Table 3 (2024-25 individuals by size of gain and taxable income)" @@ -542,7 +542,7 @@ "required_mass_change_reason": "ETB public-services imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "01567b46aa26765fea6afd4c9a64674f8ed5e2e8fe32de106a03ec06f1da33bd", + "source_manifest_sha256": "c461c338a92a48409c1537bd1c142852f750ab2529b302fa74bf08af32da4752", "source_vintages": { "source": "UK Data Service SN 8856 Effects of Taxes and Benefits household tab, DfT rail fare index, and public NHS activity/cost table.", "survey": "Effects of Taxes and Benefits 1977-2024 and NHS age-gender public table" @@ -562,7 +562,7 @@ "required_mass_change_reason": "ETB VAT expenditure-rate imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "01567b46aa26765fea6afd4c9a64674f8ed5e2e8fe32de106a03ec06f1da33bd", + "source_manifest_sha256": "c461c338a92a48409c1537bd1c142852f750ab2529b302fa74bf08af32da4752", "source_vintages": { "source": "UK Data Service SN 8856 Effects of Taxes and Benefits household tab and cited VAT anchor resource.", "survey": "Effects of Taxes and Benefits 1977-2024" @@ -584,7 +584,7 @@ "required_mass_change_reason": "CGT asset-type assignment on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "01567b46aa26765fea6afd4c9a64674f8ed5e2e8fe32de106a03ec06f1da33bd", + "source_manifest_sha256": "c461c338a92a48409c1537bd1c142852f750ab2529b302fa74bf08af32da4752", "source_vintages": { "source": "https://www.gov.uk/government/statistics/capital-gains-tax-statistics", "survey": "HMRC Capital Gains Tax statistics 2026 release, Table 8 (UK residential property disposals, 2024-25, administrative), Table 4.1 (individuals claiming Business Asset Disposal Relief or Investors' Relief by band of qualifying gain, 2024-25, administrative) and Table 7 (disposals, proceeds and gains by asset type, 2023-24, sample-based), vendored from the pinned Chronicle feed" @@ -608,10 +608,10 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "01567b46aa26765fea6afd4c9a64674f8ed5e2e8fe32de106a03ec06f1da33bd", + "source_manifest_sha256": "c461c338a92a48409c1537bd1c142852f750ab2529b302fa74bf08af32da4752", "source_vintages": { "conditioning_resource": "hmrc_cgt_conditioning_facts.json", - "conditioning_resource_sha256": "24a9440421f9c80ecf3f5ad7035b5b08626e02898f50e4a8ae9c0aad02821bfe", + "conditioning_resource_sha256": "067ba21c12aeb4e95e6a8a16141dbaa075e8787ed875a005f549cab6e91a6b56", "conditioning_surface": "2024-25", "hmrc_surface": "2024-25", "mapped_build_period": "2024" @@ -660,7 +660,7 @@ "dividend_income", "other_investment_income" ], - "required_mass_change_reason": "Allocate 50% of certified UK national household prior mass to the rebuilt 2022-23 SPI support channel; total national mass is conserved.", + "required_mass_change_reason": "Allocate 0.5 of certified UK national household prior mass in households without, and 0.2 in households with, a member at or over State Pension age to the rebuilt 2022-23 SPI support channel; total national mass is conserved.", "required_predecessor_stages": [ "frs_hmrc_spine_leaves", "spi_support_channel", @@ -697,7 +697,7 @@ "full_frs_tei_band_unavailable" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "01567b46aa26765fea6afd4c9a64674f8ed5e2e8fe32de106a03ec06f1da33bd", + "source_manifest_sha256": "c461c338a92a48409c1537bd1c142852f750ab2529b302fa74bf08af32da4752", "source_vintages": { "hmrc_surface": "2023-24", "mapped_build_period": "2024", @@ -738,7 +738,7 @@ "required_mass_change_reason": "LCFS consumption imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "01567b46aa26765fea6afd4c9a64674f8ed5e2e8fe32de106a03ec06f1da33bd", + "source_manifest_sha256": "c461c338a92a48409c1537bd1c142852f750ab2529b302fa74bf08af32da4752", "source_vintages": { "source": "UK Data Service SN 9468 Living Costs and Food Survey 2023-24 household/person tabs and the vendored Chronicle facts for NEED 2023 mean kWh, the FY2024-25 Ofgem cap levels, road-fuel outturn (DESNZ, HMRC, ONS), the DfT VEH1103 licensed-car stock, NTS bus use and the DfT and devolved bus finance tables.", "survey": "Living Costs and Food Survey 2023-24" @@ -764,7 +764,7 @@ "required_mass_change_reason": "NTS bus-travel imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "01567b46aa26765fea6afd4c9a64674f8ed5e2e8fe32de106a03ec06f1da33bd", + "source_manifest_sha256": "c461c338a92a48409c1537bd1c142852f750ab2529b302fa74bf08af32da4752", "source_vintages": { "source": "Department for Transport National Travel Survey, UK Data Service SN 5340 (End User Licence, 19th edition, November 2025), DOI 10.5255/UKDA-SN-5340-19; local licensed tab files (household, individual, trip); England residents only from 2013.", "survey": "National Travel Survey 2002-2024" @@ -785,7 +785,7 @@ "property_wealth" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "01567b46aa26765fea6afd4c9a64674f8ed5e2e8fe32de106a03ec06f1da33bd", + "source_manifest_sha256": "c461c338a92a48409c1537bd1c142852f750ab2529b302fa74bf08af32da4752", "source_vintages": { "source": "MHCLG dwellings and ONS UK House Price Index December 2025 regional average prices.", "survey": "Public regional property reference" @@ -801,15 +801,17 @@ "output_weight_kind": "importance", "outputs": [ "pension_contributions_via_salary_sacrifice", - "employee_pension_contributions" + "employee_pension_contributions", + "employment_income" ], - "required_mass_change_reason": "Salary-sacrifice support stage rewrites pension columns only; household rows and typed household weights pass through and total household mass is conserved.", + "required_mass_change_reason": "Salary-sacrifice support stage rewrites pension columns and converted records' pay; household rows and typed household weights pass through and total household mass is conserved.", "rewrites": [ "pension_contributions_via_salary_sacrifice", - "employee_pension_contributions" + "employee_pension_contributions", + "employment_income" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "01567b46aa26765fea6afd4c9a64674f8ed5e2e8fe32de106a03ec06f1da33bd", + "source_manifest_sha256": "c461c338a92a48409c1537bd1c142852f750ab2529b302fa74bf08af32da4752", "source_vintages": { "source": "HMRC, Salary sacrifice reform for pension contributions effective from 6 April 2029", "survey": "Family Resources Survey 2024-25 salary-sacrifice respondents and HMRC salary-sacrifice reform analysis" @@ -831,7 +833,7 @@ "student_loan_plan" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "01567b46aa26765fea6afd4c9a64674f8ed5e2e8fe32de106a03ec06f1da33bd", + "source_manifest_sha256": "c461c338a92a48409c1537bd1c142852f750ab2529b302fa74bf08af32da4752", "source_vintages": { "source": "Explore Education Statistics Table 6a, Higher education total", "survey": "Family Resources Survey 2024-25 and Student Loans Company borrower forecasts for England" @@ -853,7 +855,7 @@ "required_mass_change_reason": "WAS Lifetime ISA imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "01567b46aa26765fea6afd4c9a64674f8ed5e2e8fe32de106a03ec06f1da33bd", + "source_manifest_sha256": "c461c338a92a48409c1537bd1c142852f750ab2529b302fa74bf08af32da4752", "source_vintages": { "source": "Office for National Statistics Wealth and Assets Survey, UK Data Service SN 7215, DOI 10.5255/UKDA-SN-7215-20; local licensed round-8 person and household tabs (interviews April 2020 to March 2022, Great Britain).", "survey": "Wealth and Assets Survey round 8" @@ -888,7 +890,7 @@ "required_mass_change_reason": "WAS wealth imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "01567b46aa26765fea6afd4c9a64674f8ed5e2e8fe32de106a03ec06f1da33bd", + "source_manifest_sha256": "c461c338a92a48409c1537bd1c142852f750ab2529b302fa74bf08af32da4752", "source_vintages": { "source": "Office for National Statistics Wealth and Assets Survey, UK Data Service SN 7215, DOI 10.5255/UKDA-SN-7215-20; local licensed 2006-22 household tab.", "survey": "Wealth and Assets Survey round 8" diff --git a/packages/microcosm-build/src/microcosm/build/uk/road_fuel_anchors.json b/packages/microcosm-build/src/microcosm/build/uk/road_fuel_anchors.json index 374214076..fce139877 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/road_fuel_anchors.json +++ b/packages/microcosm-build/src/microcosm/build/uk/road_fuel_anchors.json @@ -17,12 +17,12 @@ }, "source_fact_feed": { "source_repo": "PolicyEngine/chronicle", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "build": "build-bundle --suite uk -> build-consumer-artifact", "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7" + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" }, "selections": [ { diff --git a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json index 09990c633..27840af3a 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json +++ b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json @@ -1233,6 +1233,41 @@ "tax_year_start": 2024, "ukds_study_number": 9563, "doi": "10.5255/UKDA-SN-9563-1" + }, + { + "role": "frs_table", + "table": "job", + "kind": "licensed_microdata", + "format": "tab", + "vintage": "2024_25", + "locator": "job.tab", + "sha256": "eb7faf7ada3a3851cb2afb83e2983f8907ffeec897cfbe01e56cb0dfefa853e2", + "size_bytes": 10518760, + "runtime_sha256_required": true, + "tax_year_start": 2024, + "ukds_study_number": 9563, + "doi": "10.5255/UKDA-SN-9563-1" + }, + { + "role": "frs_table", + "table": "penprov", + "kind": "licensed_microdata", + "format": "tab", + "vintage": "2024_25", + "locator": "penprov.tab", + "sha256": "9e53de0dc969baec000b3cd68387f0f2dfb3f678732e408de175e0a1d6e3fdc1", + "size_bytes": 513614, + "runtime_sha256_required": true, + "tax_year_start": 2024, + "ukds_study_number": 9563, + "doi": "10.5255/UKDA-SN-9563-1" + }, + { + "role": "employer_rate_bands", + "kind": "public_aggregate_reference", + "resource": "ashe_employer_pension_contribution_rates.json", + "format": "json", + "runtime_sha256_required": true } ], "operations": [ @@ -1314,10 +1349,20 @@ "fail_on_full_concept_alias": true }, { - "kind": "derive", + "kind": "draw_employer_pension_contributions_from_rate_bands", "output": "employer_pension_contributions", - "formula": "3 * employee_pension_contributions", - "source": "incumbent enhanced-FRS frs.py employer-pension contribution estimate" + "artifact_role": "employer_rate_bands", + "resource": "ashe_employer_pension_contribution_rates.json", + "scheme_source": "PENPROV.STEMPPEN 1 to 4 (employer schemes; occupational before group personal, group stakeholder, other)", + "sector_source": "JOB.JOBSECT (first job with a stated sector)", + "occupational_split": "defined benefit or defined contribution by ASHE Table P2 job counts in the sector", + "rate_basis": "full pay (employment_income)", + "top_band_ceiling": 0.3, + "seed": 0, + "salts": [ + "employer_pension_occupational_type", + "employer_pension_contribution_rate" + ] } ], "outputs": [ @@ -1336,7 +1381,7 @@ "srp_regular_code5", "employer_pension_contributions" ], - "notes": "Retains adjudicated raw-FRS HMRC leaves on the raw FRS spine, where person_id equals the raw sernum*1000+person identity, then ports the incumbent employer-pension-contributions estimate." + "notes": "Retains adjudicated raw-FRS HMRC leaves on the raw FRS spine, where person_id equals the raw sernum*1000+person identity, then draws employer pension contributions: each member of an employer scheme (PENPROV.STEMPPEN 1 to 4) with earnings takes an ASHE 2024 employer contribution rate for their scheme type and sector (Table P10 band shares, full pay, all industries; occupational schemes split into defined benefit and defined contribution by the sector's Table P2 job counts), uniform within the band (top band 20% to 30%), times pay. It replaces the incumbent's three times the employee contribution (microcosm#1069 c9, R6)." }, { "stage": "spi_support_channel", @@ -1376,6 +1421,8 @@ "strata": [ "region" ], + "pension_age_share": 0.2, + "pension_age_stratum": "any_member_at_or_over_state_pension_age", "weight_kind_out": "importance", "conservation": "exact_total" } @@ -1405,7 +1452,7 @@ "source_household_id", "source_year" ], - "notes": "Stacks the pre-clone SPI support channel, gates the 10,000 zero-weight synthetic households under a stage-local declaration, and allocates 50 percent of each region stratum prior mass to the SPI channel with exact national conservation." + "notes": "Stacks the pre-clone SPI support channel, gates the 10,000 zero-weight synthetic households under a stage-local declaration, and allocates prior mass with exact national conservation within each region, split by whether the household has a member at or over State Pension age (the engine's at the build instant): the SPI channel takes 50 percent of the stratum mass of households without one and pension_age_share of those with one. The channel's households are drawn unweighted with one weight per stratum and every adult in them carries a taxpayer's income, so a region-only allocation gave the channel more pension-age mass than the FRS design gives pension-age households (microcosm#1069)." }, { "stage": "spi_income_band_donors", @@ -1532,6 +1579,13 @@ "mapped_build_period": 2024, "period_mapping": "latest_published_tax_year", "runtime_sha256_required": true + }, + { + "role": "donor_age_populations", + "kind": "public_aggregate_reference", + "resource": "ons_single_year_age_populations.json", + "format": "json", + "runtime_sha256_required": true } ], "operations": [ @@ -1586,6 +1640,14 @@ "fail_on_invalid_weight": true, "seed": 42 }, + { + "kind": "draw_spi_donor_ages_by_population", + "artifact_role": "qrf_donor", + "resource": "ons_single_year_age_populations.json", + "population_period": 2023, + "method": "whole-year age drawn within the AGERANGE band in proportion to the ONS single-year population of the donor's sex, then a uniform fraction of a year; State Pension recipients (SRP > 0) are drawn at or above State Pension age, and the band's below-State-Pension-age population share is drawn from its non-recipients", + "state_pension_age": "policyengine-uk gov.dwp.state_pension.age at the build instant" + }, { "kind": "fit_weighted_qrf_stage1", "training_artifact_role": "qrf_donor", @@ -1775,8 +1837,9 @@ 1000000, 2000000 ], - "pool": "full prepared donor tape by published total income band (TEI + TII), narrowed to the carrier's region where that pool holds the minimum", + "pool": "full prepared donor tape by published total income band (TEI + TII), narrowed to the carrier's SPI age band where that pool holds the age minimum (composites never age-match), then to the carrier's region where that pool holds the regional minimum", "regional_pool_minimum": 20, + "age_pool_minimum": 20, "weighting": "FACT", "with_replacement": true, "outputs": "stage-1 outputs, uprated as the stage-1 draws", @@ -1864,6 +1927,20 @@ "n_estimators": 100, "seed": 43 }, + { + "kind": "zero_pension_age_reports_below_state_pension_age", + "spi_state_pension_leaf": "hmrc_spi_state_pension_income", + "spi_channel_columns": [ + "state_pension_reported", + "pension_credit_reported", + "winter_fuel_allowance_reported" + ], + "base_channel_columns": [ + "state_pension_reported" + ], + "state_pension_age": "policyengine-uk gov.dwp.state_pension.age at the build instant", + "receipt": "rows, weighted people and amounts removed per column and step" + }, { "kind": "redraw_columns_from_fitted_qrf", "fit": "stage1", @@ -4367,6 +4444,58 @@ ], "notes": "Runs after the last universal_credit_reported writer and before CGT cloning. Redraws only SPI post-fill reporters from weighted base-FRS reporter capital within dependent-children band by is_uc_couple cells (two retained FRS claimant/partner roles, independently of legal is_married), then applies the monotone reported-UC OR refresh." }, + { + "stage": "pension_credit_take_up", + "survey": "Family Resources Survey 2024-25", + "source": "DWP Income-related benefits: estimates of take-up, financial year ending 2024 (Pension Credit caseload take-up by component), applied to PolicyEngine-UK pre-take-up Pension Credit entitlement after the SPI income chain.", + "grain": "benunit", + "artifacts": [], + "operations": [ + { + "kind": "materialize_rules_engine_predictors", + "predictors": [ + "guarantee_credit", + "savings_credit", + "is_pension_credit_eligible" + ], + "consumed_only": true + }, + { + "kind": "aggregate_person_to_benunit", + "method": "any_positive", + "consumed_only": true, + "aggregates": { + "pension_credit_reported_anchor": "pension_credit_reported" + } + }, + { + "kind": "assign_component_take_up_residual", + "output": "would_claim_pc", + "draw": "would_claim_pc", + "seed": 0, + "anchor": "pension_credit_reported_anchor", + "bands": [ + { + "name": "guarantee_credit", + "rule": "is_pension_credit_eligible AND guarantee_credit > 0", + "rate_key": "pension_credit_guarantee_credit" + }, + { + "name": "savings_credit_only", + "rule": "is_pension_credit_eligible AND guarantee_credit <= 0 AND savings_credit > 0", + "rate_key": "pension_credit_savings_credit_only" + } + ], + "weight_mapping": "household_to_benunit", + "residual_rate": "(rate * entitled - reporters) / (entitled - reporters), weighted, clipped to [0, 1]" + } + ], + "outputs": [], + "rewrites": [ + "would_claim_pc" + ], + "notes": "Runs after the SPI income chain and UC capital coherence, before CGT cloning (microcosm#1069 R9). One temporary engine materialization gives each benefit unit's pre-take-up Pension Credit entitlement (guarantee_credit, savings_credit, is_pension_credit_eligible; consumed only). Entitled units fall into DWP's take-up components, Guarantee Credit (with or without Savings Credit) and Savings Credit only; within a component a reporter claims and the other entitled units claim at r = (t * E - R) / (E - R), t being DWP's financial year ending 2024 caseload take-up (69% and 37%), E the component's entitled units and R its reporters, weighted at the stage's household weights. A unit with no entitlement claims only if it reports. The uniform draw is frs_take_up's would_claim_pc identity stream, whose early draw this rewrite replaces; units with every adult at or over State Pension age are the only ones the engine finds eligible." + }, { "stage": "uc_deduction_attributes", "survey": "DWP Universal Credit deductions statistics, March 2025 to February 2026", @@ -5086,26 +5215,29 @@ "target": 5400000, "donor_pool": "employee_pension_contributions > 0 and pension_contributions_via_salary_sacrifice == 0 and employment_income > 0", "rate_cap": 0.5, - "move": "full employee_pension_contributions to pension_contributions_via_salary_sacrifice; source zeroed", + "move": "full employee_pension_contributions to pension_contributions_via_salary_sacrifice; source zeroed; employment_income lowered by the amount sacrificed", "seed": 2024, "salt": "salary_sacrifice_conversion", "receipt": "weighted_headcount", - "reason": "Salary-sacrifice support stage rewrites pension columns only; household rows and typed household weights pass through and total household mass is conserved." + "reason": "Salary-sacrifice support stage rewrites pension columns and converted records' pay; household rows and typed household weights pass through and total household mass is conserved." } ], "outputs": [ "pension_contributions_via_salary_sacrifice", - "employee_pension_contributions" + "employee_pension_contributions", + "employment_income" ], "nonnegative_outputs": [ "pension_contributions_via_salary_sacrifice", - "employee_pension_contributions" + "employee_pension_contributions", + "employment_income" ], "rewrites": [ "pension_contributions_via_salary_sacrifice", - "employee_pension_contributions" + "employee_pension_contributions", + "employment_income" ], - "notes": "The QRF trains only on the 2024-25 FRS asked subset. The second arm creates support toward the reviewed 5.4m staging target by moving contributors' full pension amounts." + "notes": "The QRF trains only on the 2024-25 FRS asked subset. The second arm creates support toward the reviewed 5.4m staging target by moving contributors' full pension amounts into salary sacrifice and lowering their pay by the same amount, since the engine reads employment_income after sacrifice; before microcosm#1069 c9 the pay stayed whole and the converted record lost its net-pay relief." }, { "stage": "student_loans", diff --git a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml index 7c553946e..3442ecfe4 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml +++ b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml @@ -1089,6 +1089,35 @@ stages: tax_year_start: 2024 ukds_study_number: 9563 doi: 10.5255/UKDA-SN-9563-1 + - role: frs_table + table: job + kind: licensed_microdata + format: tab + vintage: '2024_25' + locator: job.tab + sha256: eb7faf7ada3a3851cb2afb83e2983f8907ffeec897cfbe01e56cb0dfefa853e2 + size_bytes: 10518760 + runtime_sha256_required: true + tax_year_start: 2024 + ukds_study_number: 9563 + doi: 10.5255/UKDA-SN-9563-1 + - role: frs_table + table: penprov + kind: licensed_microdata + format: tab + vintage: '2024_25' + locator: penprov.tab + sha256: 9e53de0dc969baec000b3cd68387f0f2dfb3f678732e408de175e0a1d6e3fdc1 + size_bytes: 513614 + runtime_sha256_required: true + tax_year_start: 2024 + ukds_study_number: 9563 + doi: 10.5255/UKDA-SN-9563-1 + - role: employer_rate_bands + kind: public_aggregate_reference + resource: ashe_employer_pension_contribution_rates.json + format: json + runtime_sha256_required: true operations: - kind: retain_adjudicated_frs_hmrc_leaves population: uk_frs_raw_spine @@ -1150,10 +1179,19 @@ stages: - miscellaneous_income fail_on_missing_retained_constituent: true fail_on_full_concept_alias: true - - kind: derive + - kind: draw_employer_pension_contributions_from_rate_bands output: employer_pension_contributions - formula: 3 * employee_pension_contributions - source: incumbent enhanced-FRS frs.py employer-pension contribution estimate + artifact_role: employer_rate_bands + resource: ashe_employer_pension_contribution_rates.json + scheme_source: PENPROV.STEMPPEN 1 to 4 (employer schemes; occupational before group personal, group stakeholder, other) + sector_source: JOB.JOBSECT (first job with a stated sector) + occupational_split: defined benefit or defined contribution by ASHE Table P2 job counts in the sector + rate_basis: full pay (employment_income) + top_band_ceiling: 0.3 + seed: 0 + salts: + - employer_pension_occupational_type + - employer_pension_contribution_rate outputs: - hmrc_spi_pay - hmrc_spi_unemployment_benefit_income @@ -1168,7 +1206,7 @@ stages: - ossben_identifiable_subset - srp_regular_code5 - employer_pension_contributions - notes: Retains adjudicated raw-FRS HMRC leaves on the raw FRS spine, where person_id equals the raw sernum*1000+person identity, then ports the incumbent employer-pension-contributions estimate. + notes: 'Retains adjudicated raw-FRS HMRC leaves on the raw FRS spine, where person_id equals the raw sernum*1000+person identity, then draws employer pension contributions: each member of an employer scheme (PENPROV.STEMPPEN 1 to 4) with earnings takes an ASHE 2024 employer contribution rate for their scheme type and sector (Table P10 band shares, full pay, all industries; occupational schemes split into defined benefit and defined contribution by the sector''s Table P2 job counts), uniform within the band (top band 20% to 30%), times pay. It replaces the incumbent''s three times the employee contribution (microcosm#1069 c9, R6).' - stage: spi_support_channel survey: Family Resources Survey 2024-25 source: Synthetic SPI support channel sampled uniformly without replacement from the raw FRS spine before cloning. @@ -1195,6 +1233,8 @@ stages: share: 0.5 strata: - region + pension_age_share: 0.2 + pension_age_stratum: any_member_at_or_over_state_pension_age weight_kind_out: importance conservation: exact_total outputs: @@ -1220,7 +1260,7 @@ stages: - household_source_id - source_household_id - source_year - notes: Stacks the pre-clone SPI support channel, gates the 10,000 zero-weight synthetic households under a stage-local declaration, and allocates 50 percent of each region stratum prior mass to the SPI channel with exact national conservation. + notes: "Stacks the pre-clone SPI support channel, gates the 10,000 zero-weight synthetic households under a stage-local declaration, and allocates prior mass with exact national conservation within each region, split by whether the household has a member at or over State Pension age (the engine's at the build instant): the SPI channel takes 50 percent of the stratum mass of households without one and pension_age_share of those with one. The channel's households are drawn unweighted with one weight per stratum and every adult in them carries a taxpayer's income, so a region-only allocation gave the channel more pension-age mass than the FRS design gives pension-age households (microcosm#1069)." - stage: spi_income_band_donors survey: Survey of Personal Incomes Public Use Tape 2022-23 and HMRC Income Tax liabilities statistics July 2026 Table 2.5 source: Reserved SPI support households for the HMRC Table 2.5 total-income bands from GBP 200,000, stacked at the published band taxpayer count over the donors per band (PolicyEngine/chronicle#280 lane). @@ -1327,6 +1367,11 @@ stages: mapped_build_period: 2024 period_mapping: latest_published_tax_year runtime_sha256_required: true + - role: donor_age_populations + kind: public_aggregate_reference + resource: ons_single_year_age_populations.json + format: json + runtime_sha256_required: true operations: - kind: verify_pinned_hmrc_source_pair artifact_roles: @@ -1373,6 +1418,12 @@ stages: fail_on_missing_columns: true fail_on_invalid_weight: true seed: 42 + - kind: draw_spi_donor_ages_by_population + artifact_role: qrf_donor + resource: ons_single_year_age_populations.json + population_period: 2023 + method: whole-year age drawn within the AGERANGE band in proportion to the ONS single-year population of the donor's sex, then a uniform fraction of a year; State Pension recipients (SRP > 0) are drawn at or above State Pension age, and the band's below-State-Pension-age population share is drawn from its non-recipients + state_pension_age: policyengine-uk gov.dwp.state_pension.age at the build instant - kind: fit_weighted_qrf_stage1 training_artifact_role: qrf_donor recipient_minimum_age: 16 @@ -1524,8 +1575,9 @@ stages: - 500000 - 1000000 - 2000000 - pool: full prepared donor tape by published total income band (TEI + TII), narrowed to the carrier's region where that pool holds the minimum + pool: full prepared donor tape by published total income band (TEI + TII), narrowed to the carrier's SPI age band where that pool holds the age minimum (composites never age-match), then to the carrier's region where that pool holds the regional minimum regional_pool_minimum: 20 + age_pool_minimum: 20 weighting: FACT with_replacement: true outputs: stage-1 outputs, uprated as the stage-1 draws @@ -1602,6 +1654,16 @@ stages: require_all_outputs: false n_estimators: 100 seed: 43 + - kind: zero_pension_age_reports_below_state_pension_age + spi_state_pension_leaf: hmrc_spi_state_pension_income + spi_channel_columns: + - state_pension_reported + - pension_credit_reported + - winter_fuel_allowance_reported + base_channel_columns: + - state_pension_reported + state_pension_age: policyengine-uk gov.dwp.state_pension.age at the build instant + receipt: rows, weighted people and amounts removed per column and step - kind: redraw_columns_from_fitted_qrf fit: stage1 columns: @@ -3540,6 +3602,41 @@ stages: - frs_benunit_capital - would_claim_uc notes: Runs after the last universal_credit_reported writer and before CGT cloning. Redraws only SPI post-fill reporters from weighted base-FRS reporter capital within dependent-children band by is_uc_couple cells (two retained FRS claimant/partner roles, independently of legal is_married), then applies the monotone reported-UC OR refresh. +- stage: pension_credit_take_up + survey: Family Resources Survey 2024-25 + source: 'DWP Income-related benefits: estimates of take-up, financial year ending 2024 (Pension Credit caseload take-up by component), applied to PolicyEngine-UK pre-take-up Pension Credit entitlement after the SPI income chain.' + grain: benunit + artifacts: [] + operations: + - kind: materialize_rules_engine_predictors + predictors: + - guarantee_credit + - savings_credit + - is_pension_credit_eligible + consumed_only: true + - kind: aggregate_person_to_benunit + method: any_positive + consumed_only: true + aggregates: + pension_credit_reported_anchor: pension_credit_reported + - kind: assign_component_take_up_residual + output: would_claim_pc + draw: would_claim_pc + seed: 0 + anchor: pension_credit_reported_anchor + bands: + - name: guarantee_credit + rule: is_pension_credit_eligible AND guarantee_credit > 0 + rate_key: pension_credit_guarantee_credit + - name: savings_credit_only + rule: is_pension_credit_eligible AND guarantee_credit <= 0 AND savings_credit > 0 + rate_key: pension_credit_savings_credit_only + weight_mapping: household_to_benunit + residual_rate: (rate * entitled - reporters) / (entitled - reporters), weighted, clipped to [0, 1] + outputs: [] + rewrites: + - would_claim_pc + notes: Runs after the SPI income chain and UC capital coherence, before CGT cloning (microcosm#1069 R9). One temporary engine materialization gives each benefit unit's pre-take-up Pension Credit entitlement (guarantee_credit, savings_credit, is_pension_credit_eligible; consumed only). Entitled units fall into DWP's take-up components, Guarantee Credit (with or without Savings Credit) and Savings Credit only; within a component a reporter claims and the other entitled units claim at r = (t * E - R) / (E - R), t being DWP's financial year ending 2024 caseload take-up (69% and 37%), E the component's entitled units and R its reporters, weighted at the stage's household weights. A unit with no entitlement claims only if it reports. The uniform draw is frs_take_up's would_claim_pc identity stream, whose early draw this rewrite replaces; units with every adult at or over State Pension age are the only ones the engine finds eligible. - stage: uc_deduction_attributes survey: DWP Universal Credit deductions statistics, March 2025 to February 2026 source: Department for Work and Pensions supplementary Tables 2, 5 and 6, sha-pinned by Chronicle package dwp-uc-deductions-march-2025-february-2026. @@ -4121,22 +4218,24 @@ stages: target: 5400000 donor_pool: employee_pension_contributions > 0 and pension_contributions_via_salary_sacrifice == 0 and employment_income > 0 rate_cap: 0.5 - move: full employee_pension_contributions to pension_contributions_via_salary_sacrifice; source zeroed + move: full employee_pension_contributions to pension_contributions_via_salary_sacrifice; source zeroed; employment_income lowered by the amount sacrificed seed: 2024 salt: salary_sacrifice_conversion receipt: weighted_headcount - reason: Salary-sacrifice support stage rewrites pension columns only; household - rows and typed household weights pass through and total household mass is conserved. + reason: Salary-sacrifice support stage rewrites pension columns and converted records' pay; household rows and typed household weights pass through and total household mass is conserved. outputs: - pension_contributions_via_salary_sacrifice - employee_pension_contributions + - employment_income nonnegative_outputs: - pension_contributions_via_salary_sacrifice - employee_pension_contributions + - employment_income rewrites: - pension_contributions_via_salary_sacrifice - employee_pension_contributions - notes: The QRF trains only on the 2024-25 FRS asked subset. The second arm creates support toward the reviewed 5.4m staging target by moving contributors' full pension amounts. + - employment_income + notes: The QRF trains only on the 2024-25 FRS asked subset. The second arm creates support toward the reviewed 5.4m staging target by moving contributors' full pension amounts into salary sacrifice and lowering their pay by the same amount, since the engine reads employment_income after sacrifice; before microcosm#1069 c9 the pay stayed whole and the converted record lost its net-pay relief. - stage: student_loans survey: Family Resources Survey 2024-25 and Student Loans Company borrower forecasts for England source: Explore Education Statistics Table 6a, Higher education total diff --git a/packages/microcosm-build/src/microcosm/build/uk/take_up_contract.json b/packages/microcosm-build/src/microcosm/build/uk/take_up_contract.json index d4df82096..fc2cbcdbb 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/take_up_contract.json +++ b/packages/microcosm-build/src/microcosm/build/uk/take_up_contract.json @@ -54,11 +54,41 @@ "source": { "source": "Income-related benefits: estimates of take-up, financial year 2019 to 2020", "agency": "DWP", - "citation": "Pension Credit take-up estimate used by the incumbent UK pipeline.", + "citation": "Pension Credit take-up estimate used by the incumbent UK pipeline. Since microcosm#1069 (R9) this is only frs_take_up's early draw on FRS incomes, which the intermediate engine simulations read; pension_credit_take_up replaces it after the SPI income chain with the FYE 2024 component rates.", "url": "https://www.gov.uk/government/statistics/income-related-benefits-estimates-of-take-up-financial-year-2019-to-2020/income-related-benefits-estimates-of-take-up-financial-year-2019-to-2020", "status": "sourced_administrative" } }, + { + "key": "pension_credit_guarantee_credit", + "output": "would_claim_pc", + "entity": "benunit", + "values": { + "2023-01-01": 0.69 + }, + "source": { + "source": "Income-related benefits: estimates of take-up, financial year ending 2024", + "agency": "DWP", + "citation": "Pension Credit caseload take-up, Guarantee Credit: 69% in FYE 2024 (all Pension Credit 62%). Applied by pension_credit_take_up as the share of the component's entitled benefit units who claim, reporters first (microcosm#1069 R9).", + "url": "https://www.gov.uk/government/statistics/income-related-benefits-estimates-of-take-up-financial-year-ending-2024/income-related-benefits-estimates-of-take-up-financial-year-ending-2024", + "status": "sourced_administrative" + } + }, + { + "key": "pension_credit_savings_credit_only", + "output": "would_claim_pc", + "entity": "benunit", + "values": { + "2023-01-01": 0.37 + }, + "source": { + "source": "Income-related benefits: estimates of take-up, financial year ending 2024", + "agency": "DWP", + "citation": "Pension Credit caseload take-up, Savings Credit only: 37% in FYE 2024 (all Pension Credit 62%). Applied by pension_credit_take_up as the share of the component's entitled benefit units who claim, reporters first (microcosm#1069 R9).", + "url": "https://www.gov.uk/government/statistics/income-related-benefits-estimates-of-take-up-financial-year-ending-2024/income-related-benefits-estimates-of-take-up-financial-year-ending-2024", + "status": "sourced_administrative" + } + }, { "key": "universal_credit", "output": "would_claim_uc", diff --git a/packages/microcosm-build/src/microcosm/build/uk/target_fit_reviewed_exclusions.json b/packages/microcosm-build/src/microcosm/build/uk/target_fit_reviewed_exclusions.json index 6a9c9660a..1e9d92c1d 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/target_fit_reviewed_exclusions.json +++ b/packages/microcosm-build/src/microcosm/build/uk/target_fit_reviewed_exclusions.json @@ -1,13 +1,5 @@ { "schema_version": 2, "description": "Reviewed target-fit exclusions for the UK terminal battery (schema 2 per #610). Each entry defers one calibration target whose |relative error| breaches the 25% release bound, with the defect diagnosed, tracked, and owned elsewhere; the receipt records the reasoning, approver, adjudication reference, approval date, and expiry. The gate keeps the target BOUND in calibration (exclusion applies to the release fence only, never the solve), reports dormant entries, FAILS stale ones (targets back inside the bound), and FAILS expired ones until the adjudication is renewed, so this register cannot rot.", - "exclusions": { - "hmrc/state_pension_income_band_50_000_to_70_000@2025": { - "reason": "Calibration-competition residual, not a data defect: the SPI state-pension amount band for total income GBP 50,000 to 70,000 (2023-24 Table 3.7, uprated by the new State Pension rate the engine pays) fitted at +23.4% on v21 and +27.6% on v21b (target GBP 5.26bn); the state-pension family sums 6.9% over its target because the engine pays every recipient the 2025-26 rate while the taxpayer counts by band fit within 1%, and this band carries the residual after the reserved income band donors moved the surrounding bands. Deferred four weeks while the state-pension amount anchor is scoped (PolicyEngine/chronicle#280 lane).", - "approved_by": "juaristi22", - "adjudication": "PolicyEngine/microcosm#1006 (issue comment 5812206367, the register rulings María gave in session: ruling D6 of 2026-09-23; income-anchor lane, PolicyEngine/chronicle#280)", - "approved_on": "2026-09-23", - "expires_on": "2026-10-21" - } - } + "exclusions": {} } diff --git a/packages/microcosm-build/src/microcosm/build/uk/target_reference_membership.json b/packages/microcosm-build/src/microcosm/build/uk/target_reference_membership.json index c3c1ede00..554d47588 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/target_reference_membership.json +++ b/packages/microcosm-build/src/microcosm/build/uk/target_reference_membership.json @@ -1,13 +1,13 @@ { - "source_fact_feed": "chronicle-uk-505e0e72-consumer-facts", + "source_fact_feed": "chronicle-uk-825406f9-consumer-facts", "target_period": 2025, - "candidate_count": 1174, - "contract_target_count": 295, - "active_reference_count": 1152, + "candidate_count": 1253, + "contract_target_count": 340, + "active_reference_count": 1230, "status_counts": { - "active": 1152, + "active": 1230, "no_fact_at_or_before_period": 7, - "signed_excluded": 15 + "signed_excluded": 16 }, "geography_pins": { "obr.income_tax": { @@ -98,10 +98,6 @@ "geography_level": "country", "geography_id": "K02000001" }, - "obr.state_pension": { - "geography_level": "country", - "geography_id": "K02000001" - }, "obr.statutory_maternity_pay": { "geography_level": "country", "geography_id": "K02000001" @@ -146,10 +142,6 @@ "geography_level": "country", "geography_id": "K02000001" }, - "hmrc.salary_sacrifice.users_total": { - "geography_level": "country", - "geography_id": "K02000001" - }, "hmrc.salary_sacrifice.users_below_cap": { "geography_level": "country", "geography_id": "K02000001" @@ -3823,11 +3815,272 @@ "geography_id": "N92000002" } ] + }, + "dwp.state_pension.recipients": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.state_pension.amount": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dfc_ni.state_pension.recipients": { + "geography_level": "country", + "geography_id": "N92000002" + }, + "dfc_ni.state_pension.amount": { + "geography_level": "country", + "geography_id": "N92000002" + }, + "dwp.state_pension.recipients_male_66_69_new": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.state_pension.recipients_female_66_69_new": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.state_pension.recipients_male_70_74_new": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.state_pension.recipients_male_70_74_pre_2016": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.state_pension.recipients_female_70_74_new": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.state_pension.recipients_female_70_74_pre_2016": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.state_pension.recipients_male_75_79_pre_2016": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.state_pension.recipients_female_75_79_pre_2016": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.state_pension.recipients_male_80_84_pre_2016": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.state_pension.recipients_female_80_84_pre_2016": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.state_pension.recipients_male_85_89_pre_2016": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.state_pension.recipients_female_85_89_pre_2016": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.state_pension.recipients_male_90_plus_pre_2016": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.state_pension.recipients_female_90_plus_pre_2016": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.state_pension.recipients_new_by_english_region": { + "geography_fanout": [ + { + "geography_level": "region", + "geography_id": "E12000001" + }, + { + "geography_level": "region", + "geography_id": "E12000002" + }, + { + "geography_level": "region", + "geography_id": "E12000003" + }, + { + "geography_level": "region", + "geography_id": "E12000004" + }, + { + "geography_level": "region", + "geography_id": "E12000005" + }, + { + "geography_level": "region", + "geography_id": "E12000006" + }, + { + "geography_level": "region", + "geography_id": "E12000007" + }, + { + "geography_level": "region", + "geography_id": "E12000008" + }, + { + "geography_level": "region", + "geography_id": "E12000009" + } + ] + }, + "dwp.state_pension.recipients_new_scotland": { + "geography_level": "country", + "geography_id": "S92000003" + }, + "dwp.state_pension.recipients_new_wales": { + "geography_level": "country", + "geography_id": "W92000004" + }, + "dwp.state_pension.recipients_pre_2016_by_english_region": { + "geography_fanout": [ + { + "geography_level": "region", + "geography_id": "E12000001" + }, + { + "geography_level": "region", + "geography_id": "E12000002" + }, + { + "geography_level": "region", + "geography_id": "E12000003" + }, + { + "geography_level": "region", + "geography_id": "E12000004" + }, + { + "geography_level": "region", + "geography_id": "E12000005" + }, + { + "geography_level": "region", + "geography_id": "E12000006" + }, + { + "geography_level": "region", + "geography_id": "E12000007" + }, + { + "geography_level": "region", + "geography_id": "E12000008" + }, + { + "geography_level": "region", + "geography_id": "E12000009" + } + ] + }, + "dwp.state_pension.recipients_pre_2016_scotland": { + "geography_level": "country", + "geography_id": "S92000003" + }, + "dwp.state_pension.recipients_pre_2016_wales": { + "geography_level": "country", + "geography_id": "W92000004" + }, + "dwp.state_pension.recipients_new_by_weekly_amount": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.state_pension.recipients_pre_2016_by_weekly_amount": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.pension_credit.benefit_units": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.pension_credit.benefit_units_guarantee_only_couple": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.pension_credit.benefit_units_guarantee_only_single": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.pension_credit.benefit_units_savings_only_couple": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.pension_credit.benefit_units_savings_only_single": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.pension_credit.benefit_units_both_couple": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.pension_credit.benefit_units_both_single": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.pension_credit.benefit_units_65_69": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.pension_credit.benefit_units_70_74": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.pension_credit.benefit_units_75_79": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.pension_credit.benefit_units_80_84": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.pension_credit.benefit_units_85_89": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.pension_credit.benefit_units_90_plus": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dfc_ni.pension_credit.benefit_units": { + "geography_level": "country", + "geography_id": "N92000002" + }, + "dwp.workplace_pension.employer_contributions": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.attendance_allowance.recipients_england": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "dwp.attendance_allowance.recipients_wales": { + "geography_level": "country", + "geography_id": "W92000004" + }, + "dwp.hb.households_pension_age": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.hb.households_pension_age_social_rented": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.hb.households_pension_age_private_rented": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "hmrc.salary_sacrifice.it_relief_total": { + "geography_level": "country", + "geography_id": "K02000001" } }, "genuine_sum_residue": [ "dfe.funded_childcare.working_parent_children_2_to_4", "dfi_ni.bus.passenger_receipts", + "dwp.workplace_pension.employer_contributions", "nithc.public_transport_support", "ons.population.age_0_9_by_region@E12000001", "ons.population.age_0_9_by_region@E12000002", @@ -4019,7 +4272,10 @@ { "name": "hmrc.salary_sacrifice.nics_relief_employer", "from": "2024", - "to": "2025" + "to": "2025", + "index": "policyengine_uk_parameter:gov.hmrc.national_insurance.class_1.rates.employer", + "factor": "1.08695652173913", + "value_before_uprating": "3400000000.0" }, { "name": "hmrc/employment_income_income_band_100_000_to_150_000", @@ -4961,104 +5217,104 @@ "name": "hmrc/state_pension_income_band_100_000_to_150_000", "from": "2023", "to": "2025", - "index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", - "factor": "1.12950699043414", + "index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", + "factor": "1.40545146588758", "value_before_uprating": "847000000.0" }, { "name": "hmrc/state_pension_income_band_1_000_000_to_inf", "from": "2023", "to": "2025", - "index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", - "factor": "1.12950699043414", + "index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", + "factor": "1.3177581555065", "value_before_uprating": "20000000.0" }, { "name": "hmrc/state_pension_income_band_12_570_to_15_000", "from": "2023", "to": "2025", - "index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", - "factor": "1.12950699043414", + "index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", + "factor": "1.17805597511069", "value_before_uprating": "11800000000.0" }, { "name": "hmrc/state_pension_income_band_15_000_to_20_000", "from": "2023", "to": "2025", - "index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", - "factor": "1.12950699043414", + "index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", + "factor": "1.10550752002256", "value_before_uprating": "22200000000.0" }, { "name": "hmrc/state_pension_income_band_150_000_to_200_000", "from": "2023", "to": "2025", - "index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", - "factor": "1.12950699043414", + "index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", + "factor": "1.31679769037857", "value_before_uprating": "265000000.0" }, { "name": "hmrc/state_pension_income_band_20_000_to_30_000", "from": "2023", "to": "2025", - "index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", - "factor": "1.12950699043414", + "index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", + "factor": "1.1322753899205", "value_before_uprating": "24900000000.0" }, { "name": "hmrc/state_pension_income_band_200_000_to_300_000", "from": "2023", "to": "2025", - "index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", - "factor": "1.12950699043414", + "index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", + "factor": "1.35286608982867", "value_before_uprating": "179000000.0" }, { "name": "hmrc/state_pension_income_band_30_000_to_40_000", "from": "2023", "to": "2025", - "index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", - "factor": "1.12950699043414", + "index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", + "factor": "1.26808076472352", "value_before_uprating": "12300000000.0" }, { "name": "hmrc/state_pension_income_band_300_000_to_500_000", "from": "2023", "to": "2025", - "index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", - "factor": "1.12950699043414", + "index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", + "factor": "1.35286608982867", "value_before_uprating": "96000000.0" }, { "name": "hmrc/state_pension_income_band_40_000_to_50_000", "from": "2023", "to": "2025", - "index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", - "factor": "1.12950699043414", + "index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", + "factor": "1.26808076472352", "value_before_uprating": "6020000000.0" }, { "name": "hmrc/state_pension_income_band_50_000_to_70_000", "from": "2023", "to": "2025", - "index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", - "factor": "1.12950699043414", + "index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", + "factor": "1.37479397259497", "value_before_uprating": "4660000000.0" }, { "name": "hmrc/state_pension_income_band_500_000_to_1_000_000", "from": "2023", "to": "2025", - "index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", - "factor": "1.12950699043414", + "index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", + "factor": "1.37005014580437", "value_before_uprating": "43000000.0" }, { "name": "hmrc/state_pension_income_band_70_000_to_100_000", "from": "2023", "to": "2025", - "index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", - "factor": "1.12950699043414", + "index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", + "factor": "1.37479397259497", "value_before_uprating": "1890000000.0" }, { @@ -10778,6 +11034,11 @@ "index": "hmrc.itl_2026.total_tax_growth_by_total_income_band", "factor": "1.21312442637997", "value_before_uprating": "522000000.0" + }, + { + "name": "hmrc.salary_sacrifice.it_relief_total", + "from": "2024", + "to": "2025" } ], "targets": { @@ -11096,21 +11357,6 @@ } ] }, - "obr.state_pension": { - "status": "active", - "candidates": [ - { - "name": "obr.state_pension", - "status": "active", - "matched_fact_count_overall": 7, - "matched_fact_count_at_or_before_period": 2, - "resolved_period": 2025, - "resolved_value": 144133374882.29138, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_567e55f9f73df2808c1c4be8" - } - ] - }, "obr.statutory_maternity_pay": { "status": "active", "candidates": [ @@ -11207,8 +11453,8 @@ { "name": "hmrc.salary_sacrifice.it_relief_basic_rate", "status": "active", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 1, + "matched_fact_count_overall": 2, + "matched_fact_count_at_or_before_period": 2, "resolved_period": 2025, "resolved_value": 1600000000.0, "resolved_fact_period": "2024", @@ -11222,8 +11468,8 @@ { "name": "hmrc.salary_sacrifice.it_relief_higher_rate", "status": "active", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 1, + "matched_fact_count_overall": 2, + "matched_fact_count_at_or_before_period": 2, "resolved_period": 2025, "resolved_value": 5500000000.0, "resolved_fact_period": "2024", @@ -11237,8 +11483,8 @@ { "name": "hmrc.salary_sacrifice.it_relief_additional_rate", "status": "active", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 1, + "matched_fact_count_overall": 2, + "matched_fact_count_at_or_before_period": 2, "resolved_period": 2025, "resolved_value": 1800000000.0, "resolved_fact_period": "2024", @@ -11252,8 +11498,8 @@ { "name": "hmrc.salary_sacrifice.nics_relief_employee", "status": "active", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 1, + "matched_fact_count_overall": 2, + "matched_fact_count_at_or_before_period": 2, "resolved_period": 2025, "resolved_value": 1000000000.0, "resolved_fact_period": "2024", @@ -11267,27 +11513,17 @@ { "name": "hmrc.salary_sacrifice.nics_relief_employer", "status": "active", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 1, + "matched_fact_count_overall": 2, + "matched_fact_count_at_or_before_period": 2, "resolved_period": 2025, - "resolved_value": 3400000000.0, + "resolved_value": 3695652173.9130435, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_026ae1169f5f0f997bb06479" - } - ] - }, - "hmrc.salary_sacrifice.users_total": { - "status": "active", - "candidates": [ - { - "name": "hmrc.salary_sacrifice.users_total", - "status": "active", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 7700000.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_06d585b8684b5fe0ce25f6ec" + "resolved_fact_key": "ledger_aggregate_fact_v2_026ae1169f5f0f997bb06479", + "uprating": { + "index": "policyengine_uk_parameter:gov.hmrc.national_insurance.class_1.rates.employer", + "factor": "1.08695652173913", + "value_before_uprating": "3400000000.0" + } } ] }, @@ -13142,12 +13378,12 @@ "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, "resolved_period": 2025, - "resolved_value": 956692420.897719, + "resolved_value": 1190417391.6067786, "resolved_fact_period": "2023", "resolved_fact_key": "ledger_aggregate_fact_v2_d63e1a96cab57582f482b8c2", "uprating": { - "index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", - "factor": "1.12950699043414", + "index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", + "factor": "1.40545146588758", "value_before_uprating": "847000000.0" } }, @@ -13157,12 +13393,12 @@ "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, "resolved_period": 2025, - "resolved_value": 22590139.808682855, + "resolved_value": 26355163.11013001, "resolved_fact_period": "2023", "resolved_fact_key": "ledger_aggregate_fact_v2_9a20bd62d4d5984865242929", "uprating": { - "index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", - "factor": "1.12950699043414", + "index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", + "factor": "1.3177581555065", "value_before_uprating": "20000000.0" } }, @@ -13172,12 +13408,12 @@ "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, "resolved_period": 2025, - "resolved_value": 13328182487.122885, + "resolved_value": 13901060506.30619, "resolved_fact_period": "2023", "resolved_fact_key": "ledger_aggregate_fact_v2_45083c1383ea711226aebd1b", "uprating": { - "index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", - "factor": "1.12950699043414", + "index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", + "factor": "1.17805597511069", "value_before_uprating": "11800000000.0" } }, @@ -13187,12 +13423,12 @@ "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, "resolved_period": 2025, - "resolved_value": 25075055187.63797, + "resolved_value": 24542266944.500935, "resolved_fact_period": "2023", "resolved_fact_key": "ledger_aggregate_fact_v2_310febb949c686fad2b71a94", "uprating": { - "index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", - "factor": "1.12950699043414", + "index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", + "factor": "1.10550752002256", "value_before_uprating": "22200000000.0" } }, @@ -13202,12 +13438,12 @@ "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, "resolved_period": 2025, - "resolved_value": 299319352.46504784, + "resolved_value": 348951387.9503221, "resolved_fact_period": "2023", "resolved_fact_key": "ledger_aggregate_fact_v2_e79668076aadc063559585e9", "uprating": { - "index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", - "factor": "1.12950699043414", + "index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", + "factor": "1.31679769037857", "value_before_uprating": "265000000.0" } }, @@ -13217,12 +13453,12 @@ "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, "resolved_period": 2025, - "resolved_value": 28124724061.810158, + "resolved_value": 28193657209.02049, "resolved_fact_period": "2023", "resolved_fact_key": "ledger_aggregate_fact_v2_3d18e138c32f6581d6dafdd7", "uprating": { - "index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", - "factor": "1.12950699043414", + "index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", + "factor": "1.1322753899205", "value_before_uprating": "24900000000.0" } }, @@ -13232,12 +13468,12 @@ "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, "resolved_period": 2025, - "resolved_value": 202181751.28771156, + "resolved_value": 242163030.07933253, "resolved_fact_period": "2023", "resolved_fact_key": "ledger_aggregate_fact_v2_e1dda799099ac0f4f439700d", "uprating": { - "index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", - "factor": "1.12950699043414", + "index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", + "factor": "1.35286608982867", "value_before_uprating": "179000000.0" } }, @@ -13247,12 +13483,12 @@ "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, "resolved_period": 2025, - "resolved_value": 13892935982.339956, + "resolved_value": 15597393406.099285, "resolved_fact_period": "2023", "resolved_fact_key": "ledger_aggregate_fact_v2_151045b793ac454ab29260fc", "uprating": { - "index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", - "factor": "1.12950699043414", + "index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", + "factor": "1.26808076472352", "value_before_uprating": "12300000000.0" } }, @@ -13262,12 +13498,12 @@ "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, "resolved_period": 2025, - "resolved_value": 108432671.0816777, + "resolved_value": 129875144.62355264, "resolved_fact_period": "2023", "resolved_fact_key": "ledger_aggregate_fact_v2_c95154893499181b7f3a8903", "uprating": { - "index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", - "factor": "1.12950699043414", + "index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", + "factor": "1.35286608982867", "value_before_uprating": "96000000.0" } }, @@ -13277,12 +13513,12 @@ "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, "resolved_period": 2025, - "resolved_value": 6799632082.41354, + "resolved_value": 7633846203.635585, "resolved_fact_period": "2023", "resolved_fact_key": "ledger_aggregate_fact_v2_bc4cee7d39f5e1c311464a55", "uprating": { - "index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", - "factor": "1.12950699043414", + "index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", + "factor": "1.26808076472352", "value_before_uprating": "6020000000.0" } }, @@ -13292,12 +13528,12 @@ "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, "resolved_period": 2025, - "resolved_value": 5263502575.423105, + "resolved_value": 6406539912.292578, "resolved_fact_period": "2023", "resolved_fact_key": "ledger_aggregate_fact_v2_7f09c940c0fbc3cc42b9e510", "uprating": { - "index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", - "factor": "1.12950699043414", + "index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", + "factor": "1.37479397259497", "value_before_uprating": "4660000000.0" } }, @@ -13307,12 +13543,12 @@ "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, "resolved_period": 2025, - "resolved_value": 48568800.58866814, + "resolved_value": 58912156.269587904, "resolved_fact_period": "2023", "resolved_fact_key": "ledger_aggregate_fact_v2_d265dfcd4ba09d10053a78a4", "uprating": { - "index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", - "factor": "1.12950699043414", + "index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", + "factor": "1.37005014580437", "value_before_uprating": "43000000.0" } }, @@ -13322,12 +13558,12 @@ "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, "resolved_period": 2025, - "resolved_value": 2134768211.9205298, + "resolved_value": 2598360608.2045007, "resolved_fact_period": "2023", "resolved_fact_key": "ledger_aggregate_fact_v2_41c1df25454fdf413d5765d7", "uprating": { - "index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", - "factor": "1.12950699043414", + "index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", + "factor": "1.37479397259497", "value_before_uprating": "1890000000.0" } } @@ -27781,65 +28017,1248 @@ } } ] - } - }, - "fanout_family_outcomes": [ - { - "family": "hmrc_spi", - "status": "active_with_signed_property_amount_exclusion", - "active_reference_count": 169, - "signed_rationale": "SPI income-band targets fan out by strict total-income-band dimension pins, except the HMRC property-income amount surface. Those 13 rows are signed out because Ledger carries the official SPI Table 3.7 net property-income amounts, while the incumbent target applies the populace-side x1.9 property-income undercount adjustment traced to policyengine-uk-data PR #311 / issue #230 and HMRC Property Rental Income Statistics." }, - { - "family": "hmrc_itl", - "status": "active_calendar_year_window_anchors", - "active_reference_count": 33, - "signed_rationale": "The three HMRC Income Tax liabilities statistics targets (Income Tax payers, total income and Income Tax liabilities by eleven total-income bands, Table 2.5, July 2026) fan out by strict total-income-band pins and bind at the calendar-2025 window of HMRC's 2024-25 and 2025-26 source projections (three twelfths and nine twelfths; PolicyEngine/chronicle#280 lane, Mar\u00eda's ruling of 2026-09-22). They are the calibration-year anchors the SPI component bands lack; the OBR fiscal-year receipts row stays bound beside them." + "dwp.state_pension.recipients": { + "status": "active", + "candidates": [ + { + "name": "dwp.state_pension.recipients", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 12052874.0, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_f2e868eab6a5afc6f73ccfae" + } + ] }, - { - "family": "hmrc_spi_region", - "status": "active_region_tier_fanout_uprated", - "active_reference_count": 360, - "signed_rationale": "The thirty SPI 2023-24 Table 3.11 targets (Income Tax payers, total income and Income Tax liabilities by ten regional total-income bands) fan out over the twelve-area region tier (microcosm#905), one reference per area scoped by the household-region predicate, each row moved to the calendar-2025 calibration period by HMRC's own projected growth for the measure in the Table 2.5 band(s) the regional band spans (Income Tax liabilities statistics, July 2026; PolicyEngine/chronicle#280 lane). The publisher's regional bands stop at 200,000 and over, so that row takes the window over the 200k-500k, 500k-1m, 1m-2m and 2m+ bands together." + "dwp.state_pension.amount": { + "status": "active", + "candidates": [ + { + "name": "dwp.state_pension.amount", + "status": "active", + "matched_fact_count_overall": 8, + "matched_fact_count_at_or_before_period": 8, + "matched_fact_count_in_source_window": 8, + "resolved_period": 2025, + "resolved_value": 138623908111.01526, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_040841c571b5743340438be9", + "uprating": { + "index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", + "factor": "1.00984637199515", + "value_before_uprating": "137272274234.284" + } + } + ] }, - { - "family": "dwp_universal_credit", - "status": "active_with_unmapped_vintage_residue_skipped", - "active_reference_count": 100, - "skipped_unmapped_fact_count": 12, - "signed_rationale": "UC payment-distribution targets fan out over family_type and monthly_award_amount_bands into incumbent-compatible annual-payment rows. The four source-only 'No payment' facts and eight overlapping source-only 'or over' facts are left out; no active reference may use the legacy nan_to_nan band name." + "dfc_ni.state_pension.recipients": { + "status": "active", + "candidates": [ + { + "name": "dfc_ni.state_pension.recipients", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 330147.5, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_d4760fdd674487fca8e784e2" + } + ] }, - { - "family": "council_tax_stock", - "status": "active_declared_rows", - "active_reference_count": 100, - "signed_rationale": "MHCLG council taxbase (England), Welsh Government CT1 (Wales) and Scottish Government CTAXBASE (Scotland) council-tax stock bands are declared as explicit target rows per band plus total (England and Scotland A-H, Wales A-I). The Welsh and Scottish rows resolve with their country-level geography and band pin; the English rows fan out over the nine English regions of the region tier (microcosm#905), each cell composed as the linear combination of the billing-authority facts the crosswalk places in that region (microcosm#929)." + "dfc_ni.state_pension.amount": { + "status": "active", + "candidates": [ + { + "name": "dfc_ni.state_pension.amount", + "status": "active", + "matched_fact_count_overall": 8, + "matched_fact_count_at_or_before_period": 8, + "matched_fact_count_in_source_window": 8, + "resolved_period": 2025, + "resolved_value": 3710881810.1898503, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_7d24b9929753d6b31c53cce4", + "uprating": { + "index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", + "factor": "1.0098105097383", + "value_before_uprating": "3674829856.1" + } + } + ] }, - { - "family": "hmrc_cgt", - "status": "active_with_row_level_signed_exclusions", - "active_reference_count": 102, - "signed_rationale": "The FY2024-25 individual CGT observations fan out five ways (microcosm#725, #467, #1014): Table 6 age bands as dimension rows (the 0-15 band and the all-ages total are signed out row by row), Table 5 country/region cells over the twelve-area region tier restated on the individuals basis by the Table 1 share through the scaled_by_ratio operation, Table 2.1a size-of-gain bands under the incumbent banded names (the 0-2,999 band below the 2024 annual exempt amount is signed out), Table 4.1 Business Asset Disposal Relief and Investors' Relief claimants and qualifying gains by band of qualifying gain (the individuals total row, which restates the eight bands, is signed out), and Table 3's all-gains taxpayers and gains by taxable-income band, measured on the taxable income the engine's CGT formula stacks gains on and named by that band (the joint cells stay fenced). Chronicle's Table 2.1a package emits taxpayers and gains only, although the published sheet also carries an amounts-of-tax column, so liability binds nationally and by age band; a liability-by-size-of-gain family becomes possible once Chronicle emits that column." + "dwp.state_pension.recipients_male_66_69_new": { + "status": "active", + "candidates": [ + { + "name": "dwp.state_pension.recipients_male_66_69_new", + "status": "active", + "matched_fact_count_overall": 16, + "matched_fact_count_at_or_before_period": 16, + "matched_fact_count_in_source_window": 16, + "resolved_period": 2025, + "resolved_value": 1323018.25, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_f90d42d3b41d1cd122e1bc96" + } + ] }, - { - "family": "ons_population", - "status": "active_region_tier_fanout", - "active_reference_count": 108, - "signed_rationale": "The nine ONS population-by-age-band targets fan out over the twelve-area region tier (nine English regions at Chronicle's region level, Wales, Scotland and Northern Ireland at country level), one reference per area, each scoped on the spine by a household-region predicate and placed at the region grain of the cross-grain rule (microcosm#905). The former single UK-wide row per band is retired: the tier sums to it within the same publication." - } - ], - "signed_exclusion_rationales": [ - { - "family": "hmrc_spi", - "target_id": "hmrc.spi.property_income.amount_by_total_income_band", - "status": "signed_excluded", - "signed_rationale": "Signed out pending a first-class value-scaling operation or a Chronicle package for HMRC Property Rental Income Statistics with declared reconciliation: the Ledger facts are official HMRC SPI Table 3.7 net property-income amounts, while the incumbent calibration target applies the populace-side x1.9 property-income undercount adjustment. The x1.9 trace is uk-data PR #311 / issue uk-data#230: SPI covers only taxpayers with liability, and HMRC Property Rental Income Statistics show GBP 46.68bn versus SPI about GBP 24.5bn for 2020-21. Binding the raw SPI facts would knowingly calibrate to 10/19 of the incumbent surface." + "dwp.state_pension.recipients_female_66_69_new": { + "status": "active", + "candidates": [ + { + "name": "dwp.state_pension.recipients_female_66_69_new", + "status": "active", + "matched_fact_count_overall": 16, + "matched_fact_count_at_or_before_period": 16, + "matched_fact_count_in_source_window": 16, + "resolved_period": 2025, + "resolved_value": 1388613.5, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_c5cbedb94e282e12f237204e" + } + ] }, - { - "family": "ons_population", - "target_id": "ons.population.scotland_households_3plus_children", - "status": "signed_excluded", - "signed_rationale": "Signed out pending a Scotland household-composition fact: the current selector reaches person-level ONS mid-year population age rows, not households with three or more children. microcosm#736 tracks the missing declaration." + "dwp.state_pension.recipients_male_70_74_new": { + "status": "active", + "candidates": [ + { + "name": "dwp.state_pension.recipients_male_70_74_new", + "status": "active", + "matched_fact_count_overall": 20, + "matched_fact_count_at_or_before_period": 20, + "matched_fact_count_in_source_window": 20, + "resolved_period": 2025, + "resolved_value": 1222116.75, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_1d6c387978c7dcb31a3eb2f9" + } + ] + }, + "dwp.state_pension.recipients_male_70_74_pre_2016": { + "status": "active", + "candidates": [ + { + "name": "dwp.state_pension.recipients_male_70_74_pre_2016", + "status": "active", + "matched_fact_count_overall": 20, + "matched_fact_count_at_or_before_period": 20, + "matched_fact_count_in_source_window": 20, + "resolved_period": 2025, + "resolved_value": 194617.75, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_d2f0b8ce001fffdaf3af3d1c" + } + ] + }, + "dwp.state_pension.recipients_female_70_74_new": { + "status": "active", + "candidates": [ + { + "name": "dwp.state_pension.recipients_female_70_74_new", + "status": "active", + "matched_fact_count_overall": 20, + "matched_fact_count_at_or_before_period": 20, + "matched_fact_count_in_source_window": 20, + "resolved_period": 2025, + "resolved_value": 717078.5, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_5f23bd5308686d3879b58097" + } + ] + }, + "dwp.state_pension.recipients_female_70_74_pre_2016": { + "status": "active", + "candidates": [ + { + "name": "dwp.state_pension.recipients_female_70_74_pre_2016", + "status": "active", + "matched_fact_count_overall": 20, + "matched_fact_count_at_or_before_period": 20, + "matched_fact_count_in_source_window": 20, + "resolved_period": 2025, + "resolved_value": 822163.0, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_2b52033f8fc2c92f545c5472" + } + ] + }, + "dwp.state_pension.recipients_male_75_79_pre_2016": { + "status": "active", + "candidates": [ + { + "name": "dwp.state_pension.recipients_male_75_79_pre_2016", + "status": "active", + "matched_fact_count_overall": 20, + "matched_fact_count_at_or_before_period": 20, + "matched_fact_count_in_source_window": 20, + "resolved_period": 2025, + "resolved_value": 1333148.5, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_f1e0302e9fb24b411cf7acaa" + } + ] + }, + "dwp.state_pension.recipients_female_75_79_pre_2016": { + "status": "active", + "candidates": [ + { + "name": "dwp.state_pension.recipients_female_75_79_pre_2016", + "status": "active", + "matched_fact_count_overall": 20, + "matched_fact_count_at_or_before_period": 20, + "matched_fact_count_in_source_window": 20, + "resolved_period": 2025, + "resolved_value": 1502398.25, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_b0e7ea9a1c711aa2cd974913" + } + ] + }, + "dwp.state_pension.recipients_male_80_84_pre_2016": { + "status": "active", + "candidates": [ + { + "name": "dwp.state_pension.recipients_male_80_84_pre_2016", + "status": "active", + "matched_fact_count_overall": 20, + "matched_fact_count_at_or_before_period": 20, + "matched_fact_count_in_source_window": 20, + "resolved_period": 2025, + "resolved_value": 823789.0, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_414a97d3cb5a8e56646dc9fb" + } + ] + }, + "dwp.state_pension.recipients_female_80_84_pre_2016": { + "status": "active", + "candidates": [ + { + "name": "dwp.state_pension.recipients_female_80_84_pre_2016", + "status": "active", + "matched_fact_count_overall": 20, + "matched_fact_count_at_or_before_period": 20, + "matched_fact_count_in_source_window": 20, + "resolved_period": 2025, + "resolved_value": 1016169.75, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_ad548b86aefde2661cc4ffff" + } + ] + }, + "dwp.state_pension.recipients_male_85_89_pre_2016": { + "status": "active", + "candidates": [ + { + "name": "dwp.state_pension.recipients_male_85_89_pre_2016", + "status": "active", + "matched_fact_count_overall": 20, + "matched_fact_count_at_or_before_period": 20, + "matched_fact_count_in_source_window": 20, + "resolved_period": 2025, + "resolved_value": 452540.25, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_deab1a4a30a55e76ed713c27" + } + ] + }, + "dwp.state_pension.recipients_female_85_89_pre_2016": { + "status": "active", + "candidates": [ + { + "name": "dwp.state_pension.recipients_female_85_89_pre_2016", + "status": "active", + "matched_fact_count_overall": 20, + "matched_fact_count_at_or_before_period": 20, + "matched_fact_count_in_source_window": 20, + "resolved_period": 2025, + "resolved_value": 644697.25, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_7bfbbc2af979ffaa9db09fe5" + } + ] + }, + "dwp.state_pension.recipients_male_90_plus_pre_2016": { + "status": "active", + "candidates": [ + { + "name": "dwp.state_pension.recipients_male_90_plus_pre_2016", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 207357.5, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_65392f782c463d5c4458c188" + } + ] + }, + "dwp.state_pension.recipients_female_90_plus_pre_2016": { + "status": "active", + "candidates": [ + { + "name": "dwp.state_pension.recipients_female_90_plus_pre_2016", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 404408.75, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_32834cf0a5aa400ad3ea6632" + } + ] + }, + "dwp.state_pension.recipients_new_by_english_region": { + "status": "active", + "candidates": [ + { + "name": "dwp.state_pension.recipients_new_by_english_region@E12000001", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "geography_level": "region", + "geography_id": "E12000001", + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 221933.75, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_3849cd7f9fb2c0a11406df09" + }, + { + "name": "dwp.state_pension.recipients_new_by_english_region@E12000002", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "geography_level": "region", + "geography_id": "E12000002", + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 542356.0, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_3598d15875dc7df98a20123d" + }, + { + "name": "dwp.state_pension.recipients_new_by_english_region@E12000003", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "geography_level": "region", + "geography_id": "E12000003", + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 406034.0, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_f7290dcc14753b1a54e005cf" + }, + { + "name": "dwp.state_pension.recipients_new_by_english_region@E12000004", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "geography_level": "region", + "geography_id": "E12000004", + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 363537.75, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_a1a24b040c70a32bd4e354e6" + }, + { + "name": "dwp.state_pension.recipients_new_by_english_region@E12000005", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "geography_level": "region", + "geography_id": "E12000005", + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 416229.75, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_9e4621361253499530e31b54" + }, + { + "name": "dwp.state_pension.recipients_new_by_english_region@E12000006", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "geography_level": "region", + "geography_id": "E12000006", + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 457239.25, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_70971f09dfaeab499d7aeb7e" + }, + { + "name": "dwp.state_pension.recipients_new_by_english_region@E12000007", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "geography_level": "region", + "geography_id": "E12000007", + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 421776.5, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_79d46ff506d2db6cd18e2148" + }, + { + "name": "dwp.state_pension.recipients_new_by_english_region@E12000008", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "geography_level": "region", + "geography_id": "E12000008", + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 658266.75, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_abd2497289e3331cb7e82012" + }, + { + "name": "dwp.state_pension.recipients_new_by_english_region@E12000009", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "geography_level": "region", + "geography_id": "E12000009", + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 464841.0, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_9f36f3a7a1a4d6d7ebaecbde" + } + ] + }, + "dwp.state_pension.recipients_new_scotland": { + "status": "active", + "candidates": [ + { + "name": "dwp.state_pension.recipients_new_scotland", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 445194.0, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_d9b8e48df3e64a1e63372634" + } + ] + }, + "dwp.state_pension.recipients_new_wales": { + "status": "active", + "candidates": [ + { + "name": "dwp.state_pension.recipients_new_wales", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 253534.75, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_b82917f7a577c897f0d3dd60" + } + ] + }, + "dwp.state_pension.recipients_pre_2016_by_english_region": { + "status": "active", + "candidates": [ + { + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000001", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "geography_level": "region", + "geography_id": "E12000001", + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 324237.75, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_1db0810df0a5b05c1fd0914a" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000002", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "geography_level": "region", + "geography_id": "E12000002", + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 835347.75, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_c8a6ef7647ae7caef2c80667" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000003", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "geography_level": "region", + "geography_id": "E12000003", + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 631830.75, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_139a07b36899bf4ace64291d" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000004", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "geography_level": "region", + "geography_id": "E12000004", + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 586131.0, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_011954008b768323576d61c8" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000005", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "geography_level": "region", + "geography_id": "E12000005", + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 682017.5, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_f7d63e0a74e6de675a11ed6f" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000006", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "geography_level": "region", + "geography_id": "E12000006", + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 782615.75, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_ecd6638d3a14dcee4ef46782" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000007", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "geography_level": "region", + "geography_id": "E12000007", + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 593093.25, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_b670e556716dbd64f9fe8178" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000008", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "geography_level": "region", + "geography_id": "E12000008", + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 1134987.25, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_b4d062de5c11bbac34b30be6" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000009", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "geography_level": "region", + "geography_id": "E12000009", + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 806881.5, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_5a45e1cc548ab80887ffe67f" + } + ] + }, + "dwp.state_pension.recipients_pre_2016_scotland": { + "status": "active", + "candidates": [ + { + "name": "dwp.state_pension.recipients_pre_2016_scotland", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 621000.25, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_0c208e973105fa7c8029b17f" + } + ] + }, + "dwp.state_pension.recipients_pre_2016_wales": { + "status": "active", + "candidates": [ + { + "name": "dwp.state_pension.recipients_pre_2016_wales", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 403793.0, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_5c95cf4efb7008b1f359e9ec" + } + ] + }, + "dwp.state_pension.recipients_new_by_weekly_amount": { + "status": "active", + "candidates": [ + { + "name": "dwp.state_pension.recipients_new_by_weekly_amount.under_20_00__new_state_pension", + "status": "active", + "matched_fact_count_overall": 3, + "matched_fact_count_at_or_before_period": 3, + "matched_fact_count_in_source_window": 3, + "resolved_period": 2025, + "resolved_value": 2401.3333333333335, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_dc5561861c73ee31f86bfae3" + }, + { + "name": "dwp.state_pension.recipients_new_by_weekly_amount.100_00_to_under_150_00__new_state_pension", + "status": "active", + "matched_fact_count_overall": 3, + "matched_fact_count_at_or_before_period": 3, + "matched_fact_count_in_source_window": 3, + "resolved_period": 2025, + "resolved_value": 124804.0, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_ffb27f4d7915353defe32986" + }, + { + "name": "dwp.state_pension.recipients_new_by_weekly_amount.150_00_to_under_200_00__new_state_pension", + "status": "active", + "matched_fact_count_overall": 3, + "matched_fact_count_at_or_before_period": 3, + "matched_fact_count_in_source_window": 3, + "resolved_period": 2025, + "resolved_value": 661720.6666666666, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_86da47003654aefcff806052" + }, + { + "name": "dwp.state_pension.recipients_new_by_weekly_amount.20_00_to_under_40_00__new_state_pension", + "status": "active", + "matched_fact_count_overall": 3, + "matched_fact_count_at_or_before_period": 3, + "matched_fact_count_in_source_window": 3, + "resolved_period": 2025, + "resolved_value": 2481.3333333333335, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_8cfd09ae2cadbb3594d4dad5" + }, + { + "name": "dwp.state_pension.recipients_new_by_weekly_amount.200_00_to_under_250_00__new_state_pension", + "status": "active", + "matched_fact_count_overall": 3, + "matched_fact_count_at_or_before_period": 3, + "matched_fact_count_in_source_window": 3, + "resolved_period": 2025, + "resolved_value": 3390794.6666666665, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_d31686dffeaa07295af35f7b" + }, + { + "name": "dwp.state_pension.recipients_new_by_weekly_amount.250_00_to_under_300_00__new_state_pension", + "status": "active", + "matched_fact_count_overall": 3, + "matched_fact_count_at_or_before_period": 3, + "matched_fact_count_in_source_window": 3, + "resolved_period": 2025, + "resolved_value": 433550.3333333333, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_a97b5dcb7950ad4cab590462" + }, + { + "name": "dwp.state_pension.recipients_new_by_weekly_amount.300_00_and_over__new_state_pension", + "status": "active", + "matched_fact_count_overall": 3, + "matched_fact_count_at_or_before_period": 3, + "matched_fact_count_in_source_window": 3, + "resolved_period": 2025, + "resolved_value": 64770.0, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_234575a44d456803d36f9ec4" + }, + { + "name": "dwp.state_pension.recipients_new_by_weekly_amount.40_00_to_under_60_00__new_state_pension", + "status": "signed_excluded", + "matched_fact_count_overall": 3, + "matched_fact_count_at_or_before_period": 3, + "signed_row": { + "dimension": "grouped_amount_of_benefit", + "value": "\u00a340.00 to under \u00a360.00" + }, + "signed_rationale": "DWP's new State Pension \u00a340.00 to under \u00a360.00 a week cell (2,903 recipients over May to November 2025, 0.06% of new State Pension recipients) has no record on the frame: about thirty distinct new State Pension recipients report under \u00a3100 a week in FRS 2024-25, and the nearest of them restate above \u00a360 at the 2025 rate the engine pays, so the row would always measure zero. Signed out of the weekly-amount fan-out; the other nine new State Pension bands stay bound." + }, + { + "name": "dwp.state_pension.recipients_new_by_weekly_amount.60_00_to_under_80_00__new_state_pension", + "status": "active", + "matched_fact_count_overall": 3, + "matched_fact_count_at_or_before_period": 3, + "matched_fact_count_in_source_window": 3, + "resolved_period": 2025, + "resolved_value": 24329.333333333332, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_405455404e78ca1ca8915baa" + }, + { + "name": "dwp.state_pension.recipients_new_by_weekly_amount.80_00_to_under_100_00__new_state_pension", + "status": "active", + "matched_fact_count_overall": 3, + "matched_fact_count_at_or_before_period": 3, + "matched_fact_count_in_source_window": 3, + "resolved_period": 2025, + "resolved_value": 31134.333333333332, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_e76e2f663aa361fe4df2dc36" + } + ] + }, + "dwp.state_pension.recipients_pre_2016_by_weekly_amount": { + "status": "active", + "candidates": [ + { + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.under_20_00__pre_2016_state_pension", + "status": "active", + "matched_fact_count_overall": 3, + "matched_fact_count_at_or_before_period": 3, + "matched_fact_count_in_source_window": 3, + "resolved_period": 2025, + "resolved_value": 12621.333333333334, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_a9ffc9a251267e97840eeb90" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.100_00_to_under_150_00__pre_2016_state_pension", + "status": "active", + "matched_fact_count_overall": 3, + "matched_fact_count_at_or_before_period": 3, + "matched_fact_count_in_source_window": 3, + "resolved_period": 2025, + "resolved_value": 880177.3333333334, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_0a3f30c5e7b17728baa6576a" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.150_00_to_under_200_00__pre_2016_state_pension", + "status": "active", + "matched_fact_count_overall": 3, + "matched_fact_count_at_or_before_period": 3, + "matched_fact_count_in_source_window": 3, + "resolved_period": 2025, + "resolved_value": 1589409.6666666667, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_d3e4db18223e8507eeaaab8f" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.20_00_to_under_40_00__pre_2016_state_pension", + "status": "active", + "matched_fact_count_overall": 3, + "matched_fact_count_at_or_before_period": 3, + "matched_fact_count_in_source_window": 3, + "resolved_period": 2025, + "resolved_value": 8063.0, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_e18cb71ca3b17102c67c509a" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.200_00_to_under_250_00__pre_2016_state_pension", + "status": "active", + "matched_fact_count_overall": 3, + "matched_fact_count_at_or_before_period": 3, + "matched_fact_count_in_source_window": 3, + "resolved_period": 2025, + "resolved_value": 2730401.3333333335, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_8ff59898eaacc667e5d3a895" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.250_00_to_under_300_00__pre_2016_state_pension", + "status": "active", + "matched_fact_count_overall": 3, + "matched_fact_count_at_or_before_period": 3, + "matched_fact_count_in_source_window": 3, + "resolved_period": 2025, + "resolved_value": 1338030.3333333333, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_49fe17b08fad3d6420f9e283" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.300_00_and_over__pre_2016_state_pension", + "status": "active", + "matched_fact_count_overall": 3, + "matched_fact_count_at_or_before_period": 3, + "matched_fact_count_in_source_window": 3, + "resolved_period": 2025, + "resolved_value": 737995.6666666666, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_473df488b16a42cd28c857d0" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.40_00_to_under_60_00__pre_2016_state_pension", + "status": "active", + "matched_fact_count_overall": 3, + "matched_fact_count_at_or_before_period": 3, + "matched_fact_count_in_source_window": 3, + "resolved_period": 2025, + "resolved_value": 12135.666666666666, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_1e158bc3779f81fcac6382ac" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.60_00_to_under_80_00__pre_2016_state_pension", + "status": "active", + "matched_fact_count_overall": 3, + "matched_fact_count_at_or_before_period": 3, + "matched_fact_count_in_source_window": 3, + "resolved_period": 2025, + "resolved_value": 17155.0, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_3c529dd5476ae78f33fdba1b" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.80_00_to_under_100_00__pre_2016_state_pension", + "status": "active", + "matched_fact_count_overall": 3, + "matched_fact_count_at_or_before_period": 3, + "matched_fact_count_in_source_window": 3, + "resolved_period": 2025, + "resolved_value": 23048.0, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_01743bfc73ac3ee49e3fa953" + } + ] + }, + "dwp.pension_credit.benefit_units": { + "status": "active", + "candidates": [ + { + "name": "dwp.pension_credit.benefit_units", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 1390586.25, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_1959918af196c44861e31167" + } + ] + }, + "dwp.pension_credit.benefit_units_guarantee_only_couple": { + "status": "active", + "candidates": [ + { + "name": "dwp.pension_credit.benefit_units_guarantee_only_couple", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 96794.25, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_091a1b6931243d1d3f5b35c1" + } + ] + }, + "dwp.pension_credit.benefit_units_guarantee_only_single": { + "status": "active", + "candidates": [ + { + "name": "dwp.pension_credit.benefit_units_guarantee_only_single", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 715624.75, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_122348c34ab5eb4857e379e0" + } + ] + }, + "dwp.pension_credit.benefit_units_savings_only_couple": { + "status": "active", + "candidates": [ + { + "name": "dwp.pension_credit.benefit_units_savings_only_couple", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 22458.0, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_48eceb66dbc0a8badeed5d21" + } + ] + }, + "dwp.pension_credit.benefit_units_savings_only_single": { + "status": "active", + "candidates": [ + { + "name": "dwp.pension_credit.benefit_units_savings_only_single", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 142408.25, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_4bba18fa22663b03e2c56da8" + } + ] + }, + "dwp.pension_credit.benefit_units_both_couple": { + "status": "active", + "candidates": [ + { + "name": "dwp.pension_credit.benefit_units_both_couple", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 47246.25, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_53774b182677de4df96ecd2b" + } + ] + }, + "dwp.pension_credit.benefit_units_both_single": { + "status": "active", + "candidates": [ + { + "name": "dwp.pension_credit.benefit_units_both_single", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 366055.25, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_35b6b695fc790496848d8a94" + } + ] + }, + "dwp.pension_credit.benefit_units_65_69": { + "status": "active", + "candidates": [ + { + "name": "dwp.pension_credit.benefit_units_65_69", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 179022.25, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_c6e9a9036eab7716e57dd68b" + } + ] + }, + "dwp.pension_credit.benefit_units_70_74": { + "status": "active", + "candidates": [ + { + "name": "dwp.pension_credit.benefit_units_70_74", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 282852.75, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_d8c9b2a912de0a21e93b5e8d" + } + ] + }, + "dwp.pension_credit.benefit_units_75_79": { + "status": "active", + "candidates": [ + { + "name": "dwp.pension_credit.benefit_units_75_79", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 367571.25, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_6e88be95734a1e2312fb284d" + } + ] + }, + "dwp.pension_credit.benefit_units_80_84": { + "status": "active", + "candidates": [ + { + "name": "dwp.pension_credit.benefit_units_80_84", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 261310.0, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_f92bbdf9046d27d8c45149a0" + } + ] + }, + "dwp.pension_credit.benefit_units_85_89": { + "status": "active", + "candidates": [ + { + "name": "dwp.pension_credit.benefit_units_85_89", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 177613.5, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_cf3443a3e0be02b52bf5651f" + } + ] + }, + "dwp.pension_credit.benefit_units_90_plus": { + "status": "active", + "candidates": [ + { + "name": "dwp.pension_credit.benefit_units_90_plus", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 122210.75, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_92e1c482a72763db14b6264d" + } + ] + }, + "dfc_ni.pension_credit.benefit_units": { + "status": "active", + "candidates": [ + { + "name": "dfc_ni.pension_credit.benefit_units", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 60195.0, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_31088d4513e7b7e4b21233d7" + } + ] + }, + "dwp.workplace_pension.employer_contributions": { + "status": "active", + "candidates": [ + { + "name": "dwp.workplace_pension.employer_contributions", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 104200000000.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_084d676d6e9bd618bb35e125" + } + ] + }, + "dwp.attendance_allowance.recipients_england": { + "status": "active", + "candidates": [ + { + "name": "dwp.attendance_allowance.recipients_england", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 1597003.0, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_70b671884790c8bf52c7fbb6" + } + ] + }, + "dwp.attendance_allowance.recipients_wales": { + "status": "active", + "candidates": [ + { + "name": "dwp.attendance_allowance.recipients_wales", + "status": "active", + "matched_fact_count_overall": 4, + "matched_fact_count_at_or_before_period": 4, + "matched_fact_count_in_source_window": 4, + "resolved_period": 2025, + "resolved_value": 124117.75, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_22a183260c3229f9cf14a1a3" + } + ] + }, + "dwp.hb.households_pension_age": { + "status": "active", + "candidates": [ + { + "name": "dwp.hb.households_pension_age", + "status": "active", + "matched_fact_count_overall": 12, + "matched_fact_count_at_or_before_period": 12, + "matched_fact_count_in_source_window": 12, + "resolved_period": 2025, + "resolved_value": 1107464.1666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_5f65e5ab6439a1308e1ce27a" + } + ] + }, + "dwp.hb.households_pension_age_social_rented": { + "status": "active", + "candidates": [ + { + "name": "dwp.hb.households_pension_age_social_rented", + "status": "active", + "matched_fact_count_overall": 12, + "matched_fact_count_at_or_before_period": 12, + "matched_fact_count_in_source_window": 12, + "resolved_period": 2025, + "resolved_value": 890663.5833333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_5688aae2091cc34caf9ef695" + } + ] + }, + "dwp.hb.households_pension_age_private_rented": { + "status": "active", + "candidates": [ + { + "name": "dwp.hb.households_pension_age_private_rented", + "status": "active", + "matched_fact_count_overall": 12, + "matched_fact_count_at_or_before_period": 12, + "matched_fact_count_in_source_window": 12, + "resolved_period": 2025, + "resolved_value": 216778.66666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_f46445e7e639bfd9fea6921b" + } + ] + }, + "hmrc.salary_sacrifice.it_relief_total": { + "status": "active", + "candidates": [ + { + "name": "hmrc.salary_sacrifice.it_relief_total", + "status": "active", + "matched_fact_count_overall": 2, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 8800000000.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_ab19a7f36038519a7f359742" + } + ] + } + }, + "fanout_family_outcomes": [ + { + "family": "hmrc_spi", + "status": "active_with_signed_property_amount_exclusion", + "active_reference_count": 169, + "signed_rationale": "SPI income-band targets fan out by strict total-income-band dimension pins, except the HMRC property-income amount surface. Those 13 rows are signed out because Ledger carries the official SPI Table 3.7 net property-income amounts, while the incumbent target applies the populace-side x1.9 property-income undercount adjustment traced to policyengine-uk-data PR #311 / issue #230 and HMRC Property Rental Income Statistics." + }, + { + "family": "hmrc_itl", + "status": "active_calendar_year_window_anchors", + "active_reference_count": 33, + "signed_rationale": "The three HMRC Income Tax liabilities statistics targets (Income Tax payers, total income and Income Tax liabilities by eleven total-income bands, Table 2.5, July 2026) fan out by strict total-income-band pins and bind at the calendar-2025 window of HMRC's 2024-25 and 2025-26 source projections (three twelfths and nine twelfths; PolicyEngine/chronicle#280 lane, Mar\u00eda's ruling of 2026-09-22). They are the calibration-year anchors the SPI component bands lack; the OBR fiscal-year receipts row stays bound beside them." + }, + { + "family": "hmrc_spi_region", + "status": "active_region_tier_fanout_uprated", + "active_reference_count": 360, + "signed_rationale": "The thirty SPI 2023-24 Table 3.11 targets (Income Tax payers, total income and Income Tax liabilities by ten regional total-income bands) fan out over the twelve-area region tier (microcosm#905), one reference per area scoped by the household-region predicate, each row moved to the calendar-2025 calibration period by HMRC's own projected growth for the measure in the Table 2.5 band(s) the regional band spans (Income Tax liabilities statistics, July 2026; PolicyEngine/chronicle#280 lane). The publisher's regional bands stop at 200,000 and over, so that row takes the window over the 200k-500k, 500k-1m, 1m-2m and 2m+ bands together." + }, + { + "family": "dwp_universal_credit", + "status": "active_with_unmapped_vintage_residue_skipped", + "active_reference_count": 100, + "skipped_unmapped_fact_count": 12, + "signed_rationale": "UC payment-distribution targets fan out over family_type and monthly_award_amount_bands into incumbent-compatible annual-payment rows. The four source-only 'No payment' facts and eight overlapping source-only 'or over' facts are left out; no active reference may use the legacy nan_to_nan band name." + }, + { + "family": "council_tax_stock", + "status": "active_declared_rows", + "active_reference_count": 100, + "signed_rationale": "MHCLG council taxbase (England), Welsh Government CT1 (Wales) and Scottish Government CTAXBASE (Scotland) council-tax stock bands are declared as explicit target rows per band plus total (England and Scotland A-H, Wales A-I). The Welsh and Scottish rows resolve with their country-level geography and band pin; the English rows fan out over the nine English regions of the region tier (microcosm#905), each cell composed as the linear combination of the billing-authority facts the crosswalk places in that region (microcosm#929)." + }, + { + "family": "hmrc_cgt", + "status": "active_with_row_level_signed_exclusions", + "active_reference_count": 102, + "signed_rationale": "The FY2024-25 individual CGT observations fan out five ways (microcosm#725, #467, #1014): Table 6 age bands as dimension rows (the 0-15 band and the all-ages total are signed out row by row), Table 5 country/region cells over the twelve-area region tier restated on the individuals basis by the Table 1 share through the scaled_by_ratio operation, Table 2.1a size-of-gain bands under the incumbent banded names (the 0-2,999 band below the 2024 annual exempt amount is signed out), Table 4.1 Business Asset Disposal Relief and Investors' Relief claimants and qualifying gains by band of qualifying gain (the individuals total row, which restates the eight bands, is signed out), and Table 3's all-gains taxpayers and gains by taxable-income band, measured on the taxable income the engine's CGT formula stacks gains on and named by that band (the joint cells stay fenced). Chronicle's Table 2.1a package emits taxpayers and gains only, although the published sheet also carries an amounts-of-tax column, so liability binds nationally and by age band; a liability-by-size-of-gain family becomes possible once Chronicle emits that column." + }, + { + "family": "ons_population", + "status": "active_region_tier_fanout", + "active_reference_count": 108, + "signed_rationale": "The nine ONS population-by-age-band targets fan out over the twelve-area region tier (nine English regions at Chronicle's region level, Wales, Scotland and Northern Ireland at country level), one reference per area, each scoped on the spine by a household-region predicate and placed at the region grain of the cross-grain rule (microcosm#905). The former single UK-wide row per band is retired: the tier sums to it within the same publication." + }, + { + "family": "dwp_state_pension", + "status": "active_english_region_and_amount_band_fanout", + "active_reference_count": 37, + "signed_rationale": "The State Pension recipients by type fan out over the nine English regions (Scotland and Wales are their own rows, since DWP publishes no Northern Ireland cell for a twelve-area tier) and over DWP's weekly amount bands, whose 'all' margin is a total row the detail measure pin leaves out; the empty new State Pension \u00a340-\u00a360 band is signed out (microcosm#1069)." + } + ], + "signed_exclusion_rationales": [ + { + "family": "hmrc_spi", + "target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "status": "signed_excluded", + "signed_rationale": "Signed out pending a first-class value-scaling operation or a Chronicle package for HMRC Property Rental Income Statistics with declared reconciliation: the Ledger facts are official HMRC SPI Table 3.7 net property-income amounts, while the incumbent calibration target applies the populace-side x1.9 property-income undercount adjustment. The x1.9 trace is uk-data PR #311 / issue uk-data#230: SPI covers only taxpayers with liability, and HMRC Property Rental Income Statistics show GBP 46.68bn versus SPI about GBP 24.5bn for 2020-21. Binding the raw SPI facts would knowingly calibrate to 10/19 of the incumbent surface." + }, + { + "family": "ons_population", + "target_id": "ons.population.scotland_households_3plus_children", + "status": "signed_excluded", + "signed_rationale": "Signed out pending a Scotland household-composition fact: the current selector reaches person-level ONS mid-year population age rows, not households with three or more children. microcosm#736 tracks the missing declaration." + }, + { + "family": "dwp_state_pension", + "target_id": "dwp.state_pension.recipients_new_by_weekly_amount", + "row": "dwp.state_pension.recipients_new_by_weekly_amount.40_00_to_under_60_00__new_state_pension", + "status": "signed_excluded", + "signed_rationale": "DWP's new State Pension \u00a340.00 to under \u00a360.00 a week cell (2,903 recipients over May to November 2025, 0.06% of new State Pension recipients) has no record on the frame: about thirty distinct new State Pension recipients report under \u00a3100 a week in FRS 2024-25, and the nearest of them restate above \u00a360 at the 2025 rate the engine pays, so the row would always measure zero. Signed out of the weekly-amount fan-out; the other nine new State Pension bands stay bound." }, { "family": "hmrc_cgt", diff --git a/packages/microcosm-build/src/microcosm/build/uk/target_reference_signed_exclusions.json b/packages/microcosm-build/src/microcosm/build/uk/target_reference_signed_exclusions.json index c6348cbb1..c7fb3ae25 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/target_reference_signed_exclusions.json +++ b/packages/microcosm-build/src/microcosm/build/uk/target_reference_signed_exclusions.json @@ -155,6 +155,19 @@ "dimension": "cgt_badr_ir_gain_band", "value": "total" } + }, + { + "target_id": "dwp.state_pension.recipients_new_by_weekly_amount", + "reason_id": "no_frame_support", + "rationale": "DWP's new State Pension £40.00 to under £60.00 a week cell (2,903 recipients over May to November 2025, 0.06% of new State Pension recipients) has no record on the frame: about thirty distinct new State Pension recipients report under £100 a week in FRS 2024-25, and the nearest of them restate above £60 at the 2025 rate the engine pays, so the row would always measure zero. Signed out of the weekly-amount fan-out; the other nine new State Pension bands stay bound.", + "tracking": "microcosm#1069", + "approved_by": "juaristi22", + "approved_on": "2026-10-01", + "adjudication": "María in session, 2026-10-01: remove the empty band (microcosm#1069 c4 measurement arm, the row fitted at -100%)", + "row": { + "dimension": "grouped_amount_of_benefit", + "value": "£40.00 to under £60.00" + } } ] } diff --git a/packages/microcosm-build/src/microcosm/build/uk/target_references.json b/packages/microcosm-build/src/microcosm/build/uk/target_references.json index dcf5f0f2e..4af44a21d 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/target_references.json +++ b/packages/microcosm-build/src/microcosm/build/uk/target_references.json @@ -48,6 +48,9 @@ }, "mhclg": { "label": "Ministry of Housing, Communities and Local Government" + }, + "dfc_ni": { + "label": "Department for Communities (Northern Ireland)" } }, "categories": { @@ -206,9 +209,36 @@ "hmrc.income_tax_liabilities_statistics": { "provider_id": "hmrc", "label": "Income Tax liabilities statistics" + }, + "dwp.state_pension": { + "provider_id": "dwp", + "label": "State Pension" + }, + "dfc_ni.state_pension": { + "provider_id": "dfc_ni", + "label": "State Pension" + }, + "dwp.pension_credit": { + "provider_id": "dwp", + "label": "Pension Credit" + }, + "dfc_ni.pension_credit": { + "provider_id": "dfc_ni", + "label": "Pension Credit" + }, + "dwp.workplace_pensions": { + "provider_id": "dwp", + "label": "Workplace pensions" + }, + "dwp.attendance_allowance": { + "provider_id": "dwp", + "label": "Attendance Allowance" } }, "target_categories": { + "dfc_ni.pension_credit.benefit_units": "dfc_ni.pension_credit", + "dfc_ni.state_pension.amount": "dfc_ni.state_pension", + "dfc_ni.state_pension.recipients": "dfc_ni.state_pension", "dfe.funded_childcare.early_learning_2_year_olds": "dfe.funded_childcare", "dfe.funded_childcare.universal_only_children": "dfe.funded_childcare", "dfe.funded_childcare.working_parent_children_2_to_4": "dfe.funded_childcare", @@ -217,6 +247,8 @@ "dft.bus_fare_receipts.london": "dft.local_bus_finances", "dft.bus_net_support.england": "dft.local_bus_finances", "dft.bus_net_support.london": "dft.local_bus_finances", + "dwp.attendance_allowance.recipients_england": "dwp.attendance_allowance", + "dwp.attendance_allowance.recipients_wales": "dwp.attendance_allowance", "dwp.benefit_cap.capped_households": "dwp.benefit_cap", "dwp.benefit_cap.capped_households_1000_01_to_1100": "dwp.benefit_cap", "dwp.benefit_cap.capped_households_100_01_to_200": "dwp.benefit_cap", @@ -236,9 +268,49 @@ "dwp.esa_contrib_claimants": "dwp.legacy_benefits", "dwp.esa_income_claimants": "dwp.legacy_benefits", "dwp.hb.households": "dwp.housing_benefit", + "dwp.hb.households_pension_age": "dwp.legacy_benefits", + "dwp.hb.households_pension_age_private_rented": "dwp.legacy_benefits", + "dwp.hb.households_pension_age_social_rented": "dwp.legacy_benefits", "dwp.hb.households_private_rented": "dwp.housing_benefit", "dwp.hb.households_social_rented": "dwp.housing_benefit", "dwp.jsa_claimants": "dwp.legacy_benefits", + "dwp.pension_credit.benefit_units": "dwp.pension_credit", + "dwp.pension_credit.benefit_units_65_69": "dwp.pension_credit", + "dwp.pension_credit.benefit_units_70_74": "dwp.pension_credit", + "dwp.pension_credit.benefit_units_75_79": "dwp.pension_credit", + "dwp.pension_credit.benefit_units_80_84": "dwp.pension_credit", + "dwp.pension_credit.benefit_units_85_89": "dwp.pension_credit", + "dwp.pension_credit.benefit_units_90_plus": "dwp.pension_credit", + "dwp.pension_credit.benefit_units_both_couple": "dwp.pension_credit", + "dwp.pension_credit.benefit_units_both_single": "dwp.pension_credit", + "dwp.pension_credit.benefit_units_guarantee_only_couple": "dwp.pension_credit", + "dwp.pension_credit.benefit_units_guarantee_only_single": "dwp.pension_credit", + "dwp.pension_credit.benefit_units_savings_only_couple": "dwp.pension_credit", + "dwp.pension_credit.benefit_units_savings_only_single": "dwp.pension_credit", + "dwp.state_pension.amount": "dwp.state_pension", + "dwp.state_pension.recipients": "dwp.state_pension", + "dwp.state_pension.recipients_female_66_69_new": "dwp.state_pension", + "dwp.state_pension.recipients_female_70_74_new": "dwp.state_pension", + "dwp.state_pension.recipients_female_70_74_pre_2016": "dwp.state_pension", + "dwp.state_pension.recipients_female_75_79_pre_2016": "dwp.state_pension", + "dwp.state_pension.recipients_female_80_84_pre_2016": "dwp.state_pension", + "dwp.state_pension.recipients_female_85_89_pre_2016": "dwp.state_pension", + "dwp.state_pension.recipients_female_90_plus_pre_2016": "dwp.state_pension", + "dwp.state_pension.recipients_male_66_69_new": "dwp.state_pension", + "dwp.state_pension.recipients_male_70_74_new": "dwp.state_pension", + "dwp.state_pension.recipients_male_70_74_pre_2016": "dwp.state_pension", + "dwp.state_pension.recipients_male_75_79_pre_2016": "dwp.state_pension", + "dwp.state_pension.recipients_male_80_84_pre_2016": "dwp.state_pension", + "dwp.state_pension.recipients_male_85_89_pre_2016": "dwp.state_pension", + "dwp.state_pension.recipients_male_90_plus_pre_2016": "dwp.state_pension", + "dwp.state_pension.recipients_new_by_english_region": "dwp.state_pension", + "dwp.state_pension.recipients_new_by_weekly_amount": "dwp.state_pension", + "dwp.state_pension.recipients_new_scotland": "dwp.state_pension", + "dwp.state_pension.recipients_new_wales": "dwp.state_pension", + "dwp.state_pension.recipients_pre_2016_by_english_region": "dwp.state_pension", + "dwp.state_pension.recipients_pre_2016_by_weekly_amount": "dwp.state_pension", + "dwp.state_pension.recipients_pre_2016_scotland": "dwp.state_pension", + "dwp.state_pension.recipients_pre_2016_wales": "dwp.state_pension", "dwp.uc.households": "dwp.universal_credit", "dwp.uc.households_carer_element": "dwp.universal_credit", "dwp.uc.households_childcare_element": "dwp.universal_credit", @@ -276,6 +348,7 @@ "dwp.uc.two_child_limit.households_affected": "dwp.universal_credit_two_child_limit", "dwp.uc.two_child_limit.households_claimant_pip": "dwp.universal_credit_two_child_limit", "dwp.uc.two_child_limit.households_disabled_child_element": "dwp.universal_credit_two_child_limit", + "dwp.workplace_pension.employer_contributions": "dwp.workplace_pensions", "hmrc.cgt.badr_ir_qualifying_gains_by_band": "hmrc.capital_gains_tax", "hmrc.cgt.badr_ir_taxpayers_by_band": "hmrc.capital_gains_tax", "hmrc.cgt.gains_by_age_band": "hmrc.capital_gains_tax", @@ -298,11 +371,11 @@ "hmrc.salary_sacrifice.it_relief_additional_rate": "hmrc.salary_sacrifice_income_tax_relief", "hmrc.salary_sacrifice.it_relief_basic_rate": "hmrc.salary_sacrifice_income_tax_relief", "hmrc.salary_sacrifice.it_relief_higher_rate": "hmrc.salary_sacrifice_income_tax_relief", + "hmrc.salary_sacrifice.it_relief_total": "hmrc.salary_sacrifice_income_tax_relief", "hmrc.salary_sacrifice.nics_relief_employee": "hmrc.salary_sacrifice_national_insurance_relief", "hmrc.salary_sacrifice.nics_relief_employer": "hmrc.salary_sacrifice_national_insurance_relief", "hmrc.salary_sacrifice.users_above_cap": "hmrc.salary_sacrifice_pension_users", "hmrc.salary_sacrifice.users_below_cap": "hmrc.salary_sacrifice_pension_users", - "hmrc.salary_sacrifice.users_total": "hmrc.salary_sacrifice_pension_users", "hmrc.spi.dividend_income.amount_by_total_income_band": "hmrc.survey_of_personal_incomes", "hmrc.spi.dividend_income.count_by_total_income_band": "hmrc.survey_of_personal_incomes", "hmrc.spi.employment_income.amount_by_total_income_band": "hmrc.survey_of_personal_incomes", @@ -375,7 +448,6 @@ "obr.pension_credit": "obr.efo_expenditure", "obr.pip": "obr.efo_expenditure", "obr.sdlt": "obr.efo_receipts", - "obr.state_pension": "obr.efo_expenditure", "obr.statutory_maternity_pay": "obr.efo_expenditure", "obr.tv_licence_fee": "obr.efo_expenditure", "obr.universal_credit": "obr.efo_expenditure", @@ -491,6 +563,9 @@ "welshgov.council_tax_stock.total": "welshgov.council_tax_stock" }, "target_labels": { + "dfc_ni.pension_credit.benefit_units": "Pension Credit benefit units, Northern Ireland", + "dfc_ni.state_pension.amount": "State Pension paid, Northern Ireland", + "dfc_ni.state_pension.recipients": "State Pension recipients, Northern Ireland", "dfe.funded_childcare.early_learning_2_year_olds": "Early learning 2 year olds", "dfe.funded_childcare.universal_only_children": "Universal only children", "dfe.funded_childcare.working_parent_children_2_to_4": "Working parent children 2 to 4", @@ -499,6 +574,8 @@ "dft.bus_fare_receipts.london": "London", "dft.bus_net_support.england": "England", "dft.bus_net_support.london": "London", + "dwp.attendance_allowance.recipients_england": "Attendance Allowance recipients, England", + "dwp.attendance_allowance.recipients_wales": "Attendance Allowance recipients, Wales", "dwp.benefit_cap.capped_households": "Capped households", "dwp.benefit_cap.capped_households_1000_01_to_1100": "Capped households, \u00a31,000.01 to \u00a31,100 a month", "dwp.benefit_cap.capped_households_100_01_to_200": "Capped households, \u00a3100.01 to \u00a3200 a month", @@ -518,9 +595,49 @@ "dwp.esa_contrib_claimants": "Employment and Support Allowance contrib claimants", "dwp.esa_income_claimants": "Employment and Support Allowance income claimants", "dwp.hb.households": "Housing Benefit claimants, all tenures", + "dwp.hb.households_pension_age": "Housing Benefit benefit units, pension age", + "dwp.hb.households_pension_age_private_rented": "Housing Benefit benefit units, pension age, private rented sector", + "dwp.hb.households_pension_age_social_rented": "Housing Benefit benefit units, pension age, social rented sector", "dwp.hb.households_private_rented": "Housing Benefit claimants, private rented", "dwp.hb.households_social_rented": "Housing Benefit claimants, social rented", "dwp.jsa_claimants": "Jobseeker\u2019s Allowance claimants", + "dwp.pension_credit.benefit_units": "Pension Credit benefit units, Great Britain", + "dwp.pension_credit.benefit_units_65_69": "Pension Credit benefit units, claimant aged 65 to 69", + "dwp.pension_credit.benefit_units_70_74": "Pension Credit benefit units, claimant aged 70 to 74", + "dwp.pension_credit.benefit_units_75_79": "Pension Credit benefit units, claimant aged 75 to 79", + "dwp.pension_credit.benefit_units_80_84": "Pension Credit benefit units, claimant aged 80 to 84", + "dwp.pension_credit.benefit_units_85_89": "Pension Credit benefit units, claimant aged 85 to 89", + "dwp.pension_credit.benefit_units_90_plus": "Pension Credit benefit units, claimant aged 90 and over", + "dwp.pension_credit.benefit_units_both_couple": "Pension Credit benefit units, Both Guarantee and Savings Credit, has a partner", + "dwp.pension_credit.benefit_units_both_single": "Pension Credit benefit units, Both Guarantee and Savings Credit, has no partner", + "dwp.pension_credit.benefit_units_guarantee_only_couple": "Pension Credit benefit units, Guarantee Credit only, has a partner", + "dwp.pension_credit.benefit_units_guarantee_only_single": "Pension Credit benefit units, Guarantee Credit only, has no partner", + "dwp.pension_credit.benefit_units_savings_only_couple": "Pension Credit benefit units, Savings Credit only, has a partner", + "dwp.pension_credit.benefit_units_savings_only_single": "Pension Credit benefit units, Savings Credit only, has no partner", + "dwp.state_pension.amount": "State Pension paid, Great Britain residents", + "dwp.state_pension.recipients": "State Pension recipients, Great Britain residents", + "dwp.state_pension.recipients_female_66_69_new": "State Pension recipients, female 66 to 69, New State Pension", + "dwp.state_pension.recipients_female_70_74_new": "State Pension recipients, female 70 to 74, New State Pension", + "dwp.state_pension.recipients_female_70_74_pre_2016": "State Pension recipients, female 70 to 74, Pre-2016 State Pension", + "dwp.state_pension.recipients_female_75_79_pre_2016": "State Pension recipients, female 75 to 79, Pre-2016 State Pension", + "dwp.state_pension.recipients_female_80_84_pre_2016": "State Pension recipients, female 80 to 84, Pre-2016 State Pension", + "dwp.state_pension.recipients_female_85_89_pre_2016": "State Pension recipients, female 85 to 89, Pre-2016 State Pension", + "dwp.state_pension.recipients_female_90_plus_pre_2016": "State Pension recipients, female 90 and over, Pre-2016 State Pension", + "dwp.state_pension.recipients_male_66_69_new": "State Pension recipients, male 66 to 69, New State Pension", + "dwp.state_pension.recipients_male_70_74_new": "State Pension recipients, male 70 to 74, New State Pension", + "dwp.state_pension.recipients_male_70_74_pre_2016": "State Pension recipients, male 70 to 74, Pre-2016 State Pension", + "dwp.state_pension.recipients_male_75_79_pre_2016": "State Pension recipients, male 75 to 79, Pre-2016 State Pension", + "dwp.state_pension.recipients_male_80_84_pre_2016": "State Pension recipients, male 80 to 84, Pre-2016 State Pension", + "dwp.state_pension.recipients_male_85_89_pre_2016": "State Pension recipients, male 85 to 89, Pre-2016 State Pension", + "dwp.state_pension.recipients_male_90_plus_pre_2016": "State Pension recipients, male 90 and over, Pre-2016 State Pension", + "dwp.state_pension.recipients_new_by_english_region": "State Pension recipients, New State Pension, English regions", + "dwp.state_pension.recipients_new_by_weekly_amount": "State Pension recipients by weekly amount, New State Pension", + "dwp.state_pension.recipients_new_scotland": "State Pension recipients, New State Pension, Scotland", + "dwp.state_pension.recipients_new_wales": "State Pension recipients, New State Pension, Wales", + "dwp.state_pension.recipients_pre_2016_by_english_region": "State Pension recipients, Pre-2016 State Pension, English regions", + "dwp.state_pension.recipients_pre_2016_by_weekly_amount": "State Pension recipients by weekly amount, Pre-2016 State Pension", + "dwp.state_pension.recipients_pre_2016_scotland": "State Pension recipients, Pre-2016 State Pension, Scotland", + "dwp.state_pension.recipients_pre_2016_wales": "State Pension recipients, Pre-2016 State Pension, Wales", "dwp.uc.households": "Universal Credit households", "dwp.uc.households_carer_element": "Households with carer entitlement", "dwp.uc.households_childcare_element": "Households receiving the childcare element", @@ -558,6 +675,7 @@ "dwp.uc.two_child_limit.households_affected": "Households affected", "dwp.uc.two_child_limit.households_claimant_pip": "Households claimant Personal Independence Payment", "dwp.uc.two_child_limit.households_disabled_child_element": "Households disabled child element", + "dwp.workplace_pension.employer_contributions": "Employer workplace pension contributions, Great Britain", "hmrc.cgt.badr_ir_qualifying_gains_by_band": "Capital Gains Tax BADR and Investors' Relief qualifying gains by band", "hmrc.cgt.badr_ir_taxpayers_by_band": "Capital Gains Tax BADR and Investors' Relief claimants by band of qualifying gain", "hmrc.cgt.gains_by_age_band": "Capital Gains Tax gains by age band", @@ -580,11 +698,11 @@ "hmrc.salary_sacrifice.it_relief_additional_rate": "It relief additional rate", "hmrc.salary_sacrifice.it_relief_basic_rate": "It relief basic rate", "hmrc.salary_sacrifice.it_relief_higher_rate": "It relief higher rate", + "hmrc.salary_sacrifice.it_relief_total": "Income Tax relief total", "hmrc.salary_sacrifice.nics_relief_employee": "National Insurance contributions relief employee", "hmrc.salary_sacrifice.nics_relief_employer": "National Insurance contributions relief employer", "hmrc.salary_sacrifice.users_above_cap": "Users above cap", "hmrc.salary_sacrifice.users_below_cap": "Users below cap", - "hmrc.salary_sacrifice.users_total": "Users total", "hmrc.spi.dividend_income.amount_by_total_income_band": "Amount by total income band", "hmrc.spi.dividend_income.count_by_total_income_band": "Count by total income band", "hmrc.spi.employment_income.amount_by_total_income_band": "Amount by total income band", @@ -657,7 +775,6 @@ "obr.pension_credit": "Pension credit", "obr.pip": "Personal Independence Payment", "obr.sdlt": "Stamp Duty Land Tax", - "obr.state_pension": "State pension", "obr.statutory_maternity_pay": "Statutory maternity pay", "obr.tv_licence_fee": "TV licence fee", "obr.universal_credit": "Universal Credit expenditure", @@ -783,6 +900,7 @@ "calendar_year_window", "linear_combination", "monthly_window_average", + "monthly_window_count_x_mean", "monthly_window_sum_average", "scaled_by_ratio" ], @@ -1133,26 +1251,6 @@ "assertion_policy": "allow_source_projection", "value_operation": "calendar_year_window" }, - { - "name": "obr.state_pension", - "ledger_selector": { - "source_name": "obr", - "source_concept": "obr.state_pension", - "entity_name": "person", - "geography_level": "country", - "geography_id": "K02000001" - }, - "entity": "person", - "measure": "obr/state_pension", - "family": "obr", - "period": 2025, - "metadata": { - "contract_target_id": "obr.state_pension", - "measure_kind": "prepared_column" - }, - "assertion_policy": "allow_source_projection", - "value_operation": "calendar_year_window" - }, { "name": "obr.statutory_maternity_pay", "ledger_selector": { @@ -1364,29 +1462,10 @@ "contract_target_id": "hmrc.salary_sacrifice.nics_relief_employer", "measure_kind": "prepared_column" }, + "uprating_index": "policyengine_uk_parameter:gov.hmrc.national_insurance.class_1.rates.employer", "uprating_from_period": "2024", "uprating_to_period": 2025 }, - { - "name": "hmrc.salary_sacrifice.users_total", - "ledger_selector": { - "source_name": "hmrc", - "source_concept": "hmrc.salary_sacrifice_pension_users", - "dimension_values": { - "salary_sacrifice_threshold_position": "all" - }, - "geography_level": "country", - "geography_id": "K02000001" - }, - "entity": "person", - "measure": "obr/salary_sacrifice_users_total", - "family": "hmrc_salary_sacrifice", - "period": 2025, - "metadata": { - "contract_target_id": "hmrc.salary_sacrifice.users_total", - "measure_kind": "prepared_column" - } - }, { "name": "hmrc.salary_sacrifice.users_below_cap", "ledger_selector": { @@ -4308,7 +4387,7 @@ "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", "measure_kind": "prepared_column" }, - "uprating_index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", + "uprating_index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", "uprating_from_period": "2023", "uprating_to_period": 2025 }, @@ -4333,7 +4412,7 @@ "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", "measure_kind": "prepared_column" }, - "uprating_index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", + "uprating_index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", "uprating_from_period": "2023", "uprating_to_period": 2025 }, @@ -4358,7 +4437,7 @@ "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", "measure_kind": "prepared_column" }, - "uprating_index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", + "uprating_index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", "uprating_from_period": "2023", "uprating_to_period": 2025 }, @@ -4383,7 +4462,7 @@ "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", "measure_kind": "prepared_column" }, - "uprating_index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", + "uprating_index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", "uprating_from_period": "2023", "uprating_to_period": 2025 }, @@ -4408,7 +4487,7 @@ "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", "measure_kind": "prepared_column" }, - "uprating_index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", + "uprating_index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", "uprating_from_period": "2023", "uprating_to_period": 2025 }, @@ -4433,7 +4512,7 @@ "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", "measure_kind": "prepared_column" }, - "uprating_index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", + "uprating_index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", "uprating_from_period": "2023", "uprating_to_period": 2025 }, @@ -4458,7 +4537,7 @@ "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", "measure_kind": "prepared_column" }, - "uprating_index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", + "uprating_index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", "uprating_from_period": "2023", "uprating_to_period": 2025 }, @@ -4483,7 +4562,7 @@ "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", "measure_kind": "prepared_column" }, - "uprating_index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", + "uprating_index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", "uprating_from_period": "2023", "uprating_to_period": 2025 }, @@ -4508,7 +4587,7 @@ "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", "measure_kind": "prepared_column" }, - "uprating_index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", + "uprating_index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", "uprating_from_period": "2023", "uprating_to_period": 2025 }, @@ -4533,7 +4612,7 @@ "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", "measure_kind": "prepared_column" }, - "uprating_index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", + "uprating_index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", "uprating_from_period": "2023", "uprating_to_period": 2025 }, @@ -4558,7 +4637,7 @@ "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", "measure_kind": "prepared_column" }, - "uprating_index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", + "uprating_index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", "uprating_from_period": "2023", "uprating_to_period": 2025 }, @@ -4583,7 +4662,7 @@ "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", "measure_kind": "prepared_column" }, - "uprating_index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", + "uprating_index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", "uprating_from_period": "2023", "uprating_to_period": 2025 }, @@ -4608,7 +4687,7 @@ "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", "measure_kind": "prepared_column" }, - "uprating_index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", + "uprating_index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", "uprating_from_period": "2023", "uprating_to_period": 2025 }, @@ -41250,6 +41329,3786 @@ "uprating_index": "hmrc.itl_2026.total_tax_growth_by_total_income_band", "uprating_from_period": "2023", "uprating_to_period": 2025 + }, + { + "name": "dwp.state_pension.recipients", + "ledger_selector": { + "source_name": "dwp", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": "all", + "category_of_pension": "all", + "gender": "all" + }, + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "total_recipients", + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp/state_pension/recipients", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.amount", + "ledger_selector": { + "source_name": "dwp", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": "all", + "category_of_pension": "all", + "gender": "all" + }, + "source_concept": [ + "dwp.state_pension_caseload", + "dwp.state_pension_mean_weekly_amount" + ], + "source_measure_id": [ + "total_recipients", + "total_mean_weekly_amount" + ], + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp/state_pension/amount", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.amount", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "uprating_index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", + "value_operation": "monthly_window_count_x_mean", + "value_operands": [ + { + "role": "count", + "concept": "dwp.state_pension_recipients" + }, + { + "role": "mean", + "concept": "dwp.state_pension_mean_weekly_amount", + "period_factor": 52 + } + ] + }, + { + "name": "dfc_ni.state_pension.recipients", + "ledger_selector": { + "source_name": "dfc_ni", + "dimensions": [], + "source_measure_id": "claimants_all", + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "N92000002" + }, + "entity": "person", + "measure": "dfc_ni/state_pension/recipients", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dfc_ni.state_pension.recipients", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dfc_ni.state_pension.amount", + "ledger_selector": { + "source_name": "dfc_ni", + "dimensions": [], + "source_measure_id": [ + "claimants_all", + "average_weekly_payment_all" + ], + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "N92000002" + }, + "entity": "person", + "measure": "dfc_ni/state_pension/amount", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dfc_ni.state_pension.amount", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "uprating_index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", + "value_operation": "monthly_window_count_x_mean", + "value_operands": [ + { + "role": "count", + "concept": "dwp.state_pension_recipients" + }, + { + "role": "mean", + "concept": "dwp.state_pension_mean_weekly_amount", + "period_factor": 52 + } + ] + }, + { + "name": "dwp.state_pension.recipients_male_66_69_new", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": [ + 66, + 67, + 68, + 69 + ], + "category_of_pension": "New State Pension", + "gender": "Male" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp/state_pension/recipients_male_66_69_new", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_male_66_69_new", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_sum_average", + "value_operands": [ + { + "dimension_values": { + "age_bands_and_single_year": 66, + "category_of_pension": "New State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 67, + "category_of_pension": "New State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 68, + "category_of_pension": "New State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 69, + "category_of_pension": "New State Pension", + "gender": "Male" + } + } + ] + }, + { + "name": "dwp.state_pension.recipients_female_66_69_new", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": [ + 66, + 67, + 68, + 69 + ], + "category_of_pension": "New State Pension", + "gender": "Female" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp/state_pension/recipients_female_66_69_new", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_female_66_69_new", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_sum_average", + "value_operands": [ + { + "dimension_values": { + "age_bands_and_single_year": 66, + "category_of_pension": "New State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 67, + "category_of_pension": "New State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 68, + "category_of_pension": "New State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 69, + "category_of_pension": "New State Pension", + "gender": "Female" + } + } + ] + }, + { + "name": "dwp.state_pension.recipients_male_70_74_new", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": [ + 70, + 71, + 72, + 73, + 74 + ], + "category_of_pension": "New State Pension", + "gender": "Male" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp/state_pension/recipients_male_70_74_new", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_male_70_74_new", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_sum_average", + "value_operands": [ + { + "dimension_values": { + "age_bands_and_single_year": 70, + "category_of_pension": "New State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 71, + "category_of_pension": "New State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 72, + "category_of_pension": "New State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 73, + "category_of_pension": "New State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 74, + "category_of_pension": "New State Pension", + "gender": "Male" + } + } + ] + }, + { + "name": "dwp.state_pension.recipients_male_70_74_pre_2016", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": [ + 70, + 71, + 72, + 73, + 74 + ], + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp/state_pension/recipients_male_70_74_pre_2016", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_male_70_74_pre_2016", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_sum_average", + "value_operands": [ + { + "dimension_values": { + "age_bands_and_single_year": 70, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 71, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 72, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 73, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 74, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + } + ] + }, + { + "name": "dwp.state_pension.recipients_female_70_74_new", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": [ + 70, + 71, + 72, + 73, + 74 + ], + "category_of_pension": "New State Pension", + "gender": "Female" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp/state_pension/recipients_female_70_74_new", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_female_70_74_new", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_sum_average", + "value_operands": [ + { + "dimension_values": { + "age_bands_and_single_year": 70, + "category_of_pension": "New State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 71, + "category_of_pension": "New State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 72, + "category_of_pension": "New State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 73, + "category_of_pension": "New State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 74, + "category_of_pension": "New State Pension", + "gender": "Female" + } + } + ] + }, + { + "name": "dwp.state_pension.recipients_female_70_74_pre_2016", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": [ + 70, + 71, + 72, + 73, + 74 + ], + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp/state_pension/recipients_female_70_74_pre_2016", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_female_70_74_pre_2016", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_sum_average", + "value_operands": [ + { + "dimension_values": { + "age_bands_and_single_year": 70, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 71, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 72, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 73, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 74, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + } + ] + }, + { + "name": "dwp.state_pension.recipients_male_75_79_pre_2016", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": [ + 75, + 76, + 77, + 78, + 79 + ], + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp/state_pension/recipients_male_75_79_pre_2016", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_male_75_79_pre_2016", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_sum_average", + "value_operands": [ + { + "dimension_values": { + "age_bands_and_single_year": 75, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 76, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 77, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 78, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 79, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + } + ] + }, + { + "name": "dwp.state_pension.recipients_female_75_79_pre_2016", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": [ + 75, + 76, + 77, + 78, + 79 + ], + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp/state_pension/recipients_female_75_79_pre_2016", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_female_75_79_pre_2016", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_sum_average", + "value_operands": [ + { + "dimension_values": { + "age_bands_and_single_year": 75, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 76, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 77, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 78, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 79, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + } + ] + }, + { + "name": "dwp.state_pension.recipients_male_80_84_pre_2016", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": [ + 80, + 81, + 82, + 83, + 84 + ], + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp/state_pension/recipients_male_80_84_pre_2016", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_male_80_84_pre_2016", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_sum_average", + "value_operands": [ + { + "dimension_values": { + "age_bands_and_single_year": 80, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 81, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 82, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 83, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 84, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + } + ] + }, + { + "name": "dwp.state_pension.recipients_female_80_84_pre_2016", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": [ + 80, + 81, + 82, + 83, + 84 + ], + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp/state_pension/recipients_female_80_84_pre_2016", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_female_80_84_pre_2016", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_sum_average", + "value_operands": [ + { + "dimension_values": { + "age_bands_and_single_year": 80, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 81, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 82, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 83, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 84, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + } + ] + }, + { + "name": "dwp.state_pension.recipients_male_85_89_pre_2016", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": [ + 85, + 86, + 87, + 88, + 89 + ], + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp/state_pension/recipients_male_85_89_pre_2016", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_male_85_89_pre_2016", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_sum_average", + "value_operands": [ + { + "dimension_values": { + "age_bands_and_single_year": 85, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 86, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 87, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 88, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 89, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + } + ] + }, + { + "name": "dwp.state_pension.recipients_female_85_89_pre_2016", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": [ + 85, + 86, + 87, + 88, + 89 + ], + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp/state_pension/recipients_female_85_89_pre_2016", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_female_85_89_pre_2016", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_sum_average", + "value_operands": [ + { + "dimension_values": { + "age_bands_and_single_year": 85, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 86, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 87, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 88, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 89, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + } + ] + }, + { + "name": "dwp.state_pension.recipients_male_90_plus_pre_2016", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": "90 and over", + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp/state_pension/recipients_male_90_plus_pre_2016", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_male_90_plus_pre_2016", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_female_90_plus_pre_2016", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": "90 and over", + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp/state_pension/recipients_female_90_plus_pre_2016", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_female_90_plus_pre_2016", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_new_by_english_region@E12000001", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "groupby_dimension": "dwp.state_pension_region_type_gender", + "dimensions": [ + "category_of_pension", + "gender" + ], + "dimension_values": { + "category_of_pension": "New State Pension", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "region", + "geography_id": "E12000001" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_new_by_english_region@E12000001", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_new_by_english_region", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]", + "geography_level": "region", + "geography_id": "E12000001", + "geography_predicate": "{\"entity\":\"household\",\"map_to\":\"person\",\"operator\":\"==\",\"reduce\":\"any\",\"value\":\"NORTH_EAST\",\"variable\":\"region\"}", + "cross_grain_grain": "region" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_new_by_english_region@E12000002", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "groupby_dimension": "dwp.state_pension_region_type_gender", + "dimensions": [ + "category_of_pension", + "gender" + ], + "dimension_values": { + "category_of_pension": "New State Pension", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "region", + "geography_id": "E12000002" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_new_by_english_region@E12000002", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_new_by_english_region", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]", + "geography_level": "region", + "geography_id": "E12000002", + "geography_predicate": "{\"entity\":\"household\",\"map_to\":\"person\",\"operator\":\"==\",\"reduce\":\"any\",\"value\":\"NORTH_WEST\",\"variable\":\"region\"}", + "cross_grain_grain": "region" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_new_by_english_region@E12000003", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "groupby_dimension": "dwp.state_pension_region_type_gender", + "dimensions": [ + "category_of_pension", + "gender" + ], + "dimension_values": { + "category_of_pension": "New State Pension", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "region", + "geography_id": "E12000003" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_new_by_english_region@E12000003", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_new_by_english_region", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]", + "geography_level": "region", + "geography_id": "E12000003", + "geography_predicate": "{\"entity\":\"household\",\"map_to\":\"person\",\"operator\":\"==\",\"reduce\":\"any\",\"value\":\"YORKSHIRE\",\"variable\":\"region\"}", + "cross_grain_grain": "region" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_new_by_english_region@E12000004", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "groupby_dimension": "dwp.state_pension_region_type_gender", + "dimensions": [ + "category_of_pension", + "gender" + ], + "dimension_values": { + "category_of_pension": "New State Pension", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "region", + "geography_id": "E12000004" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_new_by_english_region@E12000004", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_new_by_english_region", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]", + "geography_level": "region", + "geography_id": "E12000004", + "geography_predicate": "{\"entity\":\"household\",\"map_to\":\"person\",\"operator\":\"==\",\"reduce\":\"any\",\"value\":\"EAST_MIDLANDS\",\"variable\":\"region\"}", + "cross_grain_grain": "region" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_new_by_english_region@E12000005", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "groupby_dimension": "dwp.state_pension_region_type_gender", + "dimensions": [ + "category_of_pension", + "gender" + ], + "dimension_values": { + "category_of_pension": "New State Pension", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "region", + "geography_id": "E12000005" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_new_by_english_region@E12000005", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_new_by_english_region", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]", + "geography_level": "region", + "geography_id": "E12000005", + "geography_predicate": "{\"entity\":\"household\",\"map_to\":\"person\",\"operator\":\"==\",\"reduce\":\"any\",\"value\":\"WEST_MIDLANDS\",\"variable\":\"region\"}", + "cross_grain_grain": "region" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_new_by_english_region@E12000006", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "groupby_dimension": "dwp.state_pension_region_type_gender", + "dimensions": [ + "category_of_pension", + "gender" + ], + "dimension_values": { + "category_of_pension": "New State Pension", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "region", + "geography_id": "E12000006" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_new_by_english_region@E12000006", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_new_by_english_region", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]", + "geography_level": "region", + "geography_id": "E12000006", + "geography_predicate": "{\"entity\":\"household\",\"map_to\":\"person\",\"operator\":\"==\",\"reduce\":\"any\",\"value\":\"EAST_OF_ENGLAND\",\"variable\":\"region\"}", + "cross_grain_grain": "region" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_new_by_english_region@E12000007", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "groupby_dimension": "dwp.state_pension_region_type_gender", + "dimensions": [ + "category_of_pension", + "gender" + ], + "dimension_values": { + "category_of_pension": "New State Pension", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "region", + "geography_id": "E12000007" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_new_by_english_region@E12000007", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_new_by_english_region", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]", + "geography_level": "region", + "geography_id": "E12000007", + "geography_predicate": "{\"entity\":\"household\",\"map_to\":\"person\",\"operator\":\"==\",\"reduce\":\"any\",\"value\":\"LONDON\",\"variable\":\"region\"}", + "cross_grain_grain": "region" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_new_by_english_region@E12000008", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "groupby_dimension": "dwp.state_pension_region_type_gender", + "dimensions": [ + "category_of_pension", + "gender" + ], + "dimension_values": { + "category_of_pension": "New State Pension", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "region", + "geography_id": "E12000008" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_new_by_english_region@E12000008", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_new_by_english_region", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]", + "geography_level": "region", + "geography_id": "E12000008", + "geography_predicate": "{\"entity\":\"household\",\"map_to\":\"person\",\"operator\":\"==\",\"reduce\":\"any\",\"value\":\"SOUTH_EAST\",\"variable\":\"region\"}", + "cross_grain_grain": "region" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_new_by_english_region@E12000009", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "groupby_dimension": "dwp.state_pension_region_type_gender", + "dimensions": [ + "category_of_pension", + "gender" + ], + "dimension_values": { + "category_of_pension": "New State Pension", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "region", + "geography_id": "E12000009" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_new_by_english_region@E12000009", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_new_by_english_region", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]", + "geography_level": "region", + "geography_id": "E12000009", + "geography_predicate": "{\"entity\":\"household\",\"map_to\":\"person\",\"operator\":\"==\",\"reduce\":\"any\",\"value\":\"SOUTH_WEST\",\"variable\":\"region\"}", + "cross_grain_grain": "region" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_new_scotland", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "groupby_dimension": "dwp.state_pension_region_type_gender", + "dimensions": [ + "category_of_pension", + "gender" + ], + "dimension_values": { + "category_of_pension": "New State Pension", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "S92000003" + }, + "entity": "person", + "measure": "dwp/state_pension/recipients_new_scotland", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_new_scotland", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_new_wales", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "groupby_dimension": "dwp.state_pension_region_type_gender", + "dimensions": [ + "category_of_pension", + "gender" + ], + "dimension_values": { + "category_of_pension": "New State Pension", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "W92000004" + }, + "entity": "person", + "measure": "dwp/state_pension/recipients_new_wales", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_new_wales", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000001", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "groupby_dimension": "dwp.state_pension_region_type_gender", + "dimensions": [ + "category_of_pension", + "gender" + ], + "dimension_values": { + "category_of_pension": "Pre-2016 State Pension", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "region", + "geography_id": "E12000001" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000001", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_pre_2016_by_english_region", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]", + "geography_level": "region", + "geography_id": "E12000001", + "geography_predicate": "{\"entity\":\"household\",\"map_to\":\"person\",\"operator\":\"==\",\"reduce\":\"any\",\"value\":\"NORTH_EAST\",\"variable\":\"region\"}", + "cross_grain_grain": "region" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000002", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "groupby_dimension": "dwp.state_pension_region_type_gender", + "dimensions": [ + "category_of_pension", + "gender" + ], + "dimension_values": { + "category_of_pension": "Pre-2016 State Pension", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "region", + "geography_id": "E12000002" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000002", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_pre_2016_by_english_region", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]", + "geography_level": "region", + "geography_id": "E12000002", + "geography_predicate": "{\"entity\":\"household\",\"map_to\":\"person\",\"operator\":\"==\",\"reduce\":\"any\",\"value\":\"NORTH_WEST\",\"variable\":\"region\"}", + "cross_grain_grain": "region" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000003", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "groupby_dimension": "dwp.state_pension_region_type_gender", + "dimensions": [ + "category_of_pension", + "gender" + ], + "dimension_values": { + "category_of_pension": "Pre-2016 State Pension", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "region", + "geography_id": "E12000003" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000003", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_pre_2016_by_english_region", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]", + "geography_level": "region", + "geography_id": "E12000003", + "geography_predicate": "{\"entity\":\"household\",\"map_to\":\"person\",\"operator\":\"==\",\"reduce\":\"any\",\"value\":\"YORKSHIRE\",\"variable\":\"region\"}", + "cross_grain_grain": "region" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000004", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "groupby_dimension": "dwp.state_pension_region_type_gender", + "dimensions": [ + "category_of_pension", + "gender" + ], + "dimension_values": { + "category_of_pension": "Pre-2016 State Pension", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "region", + "geography_id": "E12000004" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000004", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_pre_2016_by_english_region", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]", + "geography_level": "region", + "geography_id": "E12000004", + "geography_predicate": "{\"entity\":\"household\",\"map_to\":\"person\",\"operator\":\"==\",\"reduce\":\"any\",\"value\":\"EAST_MIDLANDS\",\"variable\":\"region\"}", + "cross_grain_grain": "region" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000005", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "groupby_dimension": "dwp.state_pension_region_type_gender", + "dimensions": [ + "category_of_pension", + "gender" + ], + "dimension_values": { + "category_of_pension": "Pre-2016 State Pension", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "region", + "geography_id": "E12000005" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000005", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_pre_2016_by_english_region", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]", + "geography_level": "region", + "geography_id": "E12000005", + "geography_predicate": "{\"entity\":\"household\",\"map_to\":\"person\",\"operator\":\"==\",\"reduce\":\"any\",\"value\":\"WEST_MIDLANDS\",\"variable\":\"region\"}", + "cross_grain_grain": "region" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000006", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "groupby_dimension": "dwp.state_pension_region_type_gender", + "dimensions": [ + "category_of_pension", + "gender" + ], + "dimension_values": { + "category_of_pension": "Pre-2016 State Pension", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "region", + "geography_id": "E12000006" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000006", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_pre_2016_by_english_region", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]", + "geography_level": "region", + "geography_id": "E12000006", + "geography_predicate": "{\"entity\":\"household\",\"map_to\":\"person\",\"operator\":\"==\",\"reduce\":\"any\",\"value\":\"EAST_OF_ENGLAND\",\"variable\":\"region\"}", + "cross_grain_grain": "region" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000007", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "groupby_dimension": "dwp.state_pension_region_type_gender", + "dimensions": [ + "category_of_pension", + "gender" + ], + "dimension_values": { + "category_of_pension": "Pre-2016 State Pension", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "region", + "geography_id": "E12000007" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000007", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_pre_2016_by_english_region", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]", + "geography_level": "region", + "geography_id": "E12000007", + "geography_predicate": "{\"entity\":\"household\",\"map_to\":\"person\",\"operator\":\"==\",\"reduce\":\"any\",\"value\":\"LONDON\",\"variable\":\"region\"}", + "cross_grain_grain": "region" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000008", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "groupby_dimension": "dwp.state_pension_region_type_gender", + "dimensions": [ + "category_of_pension", + "gender" + ], + "dimension_values": { + "category_of_pension": "Pre-2016 State Pension", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "region", + "geography_id": "E12000008" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000008", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_pre_2016_by_english_region", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]", + "geography_level": "region", + "geography_id": "E12000008", + "geography_predicate": "{\"entity\":\"household\",\"map_to\":\"person\",\"operator\":\"==\",\"reduce\":\"any\",\"value\":\"SOUTH_EAST\",\"variable\":\"region\"}", + "cross_grain_grain": "region" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000009", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "groupby_dimension": "dwp.state_pension_region_type_gender", + "dimensions": [ + "category_of_pension", + "gender" + ], + "dimension_values": { + "category_of_pension": "Pre-2016 State Pension", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "region", + "geography_id": "E12000009" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_pre_2016_by_english_region@E12000009", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_pre_2016_by_english_region", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]", + "geography_level": "region", + "geography_id": "E12000009", + "geography_predicate": "{\"entity\":\"household\",\"map_to\":\"person\",\"operator\":\"==\",\"reduce\":\"any\",\"value\":\"SOUTH_WEST\",\"variable\":\"region\"}", + "cross_grain_grain": "region" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_scotland", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "groupby_dimension": "dwp.state_pension_region_type_gender", + "dimensions": [ + "category_of_pension", + "gender" + ], + "dimension_values": { + "category_of_pension": "Pre-2016 State Pension", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "S92000003" + }, + "entity": "person", + "measure": "dwp/state_pension/recipients_pre_2016_scotland", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_pre_2016_scotland", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_wales", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "groupby_dimension": "dwp.state_pension_region_type_gender", + "dimensions": [ + "category_of_pension", + "gender" + ], + "dimension_values": { + "category_of_pension": "Pre-2016 State Pension", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "W92000004" + }, + "entity": "person", + "measure": "dwp/state_pension/recipients_pre_2016_wales", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_pre_2016_wales", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_new_by_weekly_amount.under_20_00__new_state_pension", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_amount_band_type", + "dimensions": [ + "category_of_pension", + "grouped_amount_of_benefit" + ], + "dimension_values": { + "category_of_pension": "New State Pension", + "grouped_amount_of_benefit": "Under \u00a320.00" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_new_by_weekly_amount.under_20_00__new_state_pension", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_new_by_weekly_amount", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_new_by_weekly_amount.100_00_to_under_150_00__new_state_pension", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_amount_band_type", + "dimensions": [ + "category_of_pension", + "grouped_amount_of_benefit" + ], + "dimension_values": { + "category_of_pension": "New State Pension", + "grouped_amount_of_benefit": "\u00a3100.00 to under \u00a3150.00" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_new_by_weekly_amount.100_00_to_under_150_00__new_state_pension", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_new_by_weekly_amount", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_new_by_weekly_amount.150_00_to_under_200_00__new_state_pension", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_amount_band_type", + "dimensions": [ + "category_of_pension", + "grouped_amount_of_benefit" + ], + "dimension_values": { + "category_of_pension": "New State Pension", + "grouped_amount_of_benefit": "\u00a3150.00 to under \u00a3200.00" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_new_by_weekly_amount.150_00_to_under_200_00__new_state_pension", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_new_by_weekly_amount", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_new_by_weekly_amount.20_00_to_under_40_00__new_state_pension", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_amount_band_type", + "dimensions": [ + "category_of_pension", + "grouped_amount_of_benefit" + ], + "dimension_values": { + "category_of_pension": "New State Pension", + "grouped_amount_of_benefit": "\u00a320.00 to under \u00a340.00" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_new_by_weekly_amount.20_00_to_under_40_00__new_state_pension", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_new_by_weekly_amount", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_new_by_weekly_amount.200_00_to_under_250_00__new_state_pension", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_amount_band_type", + "dimensions": [ + "category_of_pension", + "grouped_amount_of_benefit" + ], + "dimension_values": { + "category_of_pension": "New State Pension", + "grouped_amount_of_benefit": "\u00a3200.00 to under \u00a3250.00" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_new_by_weekly_amount.200_00_to_under_250_00__new_state_pension", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_new_by_weekly_amount", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_new_by_weekly_amount.250_00_to_under_300_00__new_state_pension", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_amount_band_type", + "dimensions": [ + "category_of_pension", + "grouped_amount_of_benefit" + ], + "dimension_values": { + "category_of_pension": "New State Pension", + "grouped_amount_of_benefit": "\u00a3250.00 to under \u00a3300.00" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_new_by_weekly_amount.250_00_to_under_300_00__new_state_pension", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_new_by_weekly_amount", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_new_by_weekly_amount.300_00_and_over__new_state_pension", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_amount_band_type", + "dimensions": [ + "category_of_pension", + "grouped_amount_of_benefit" + ], + "dimension_values": { + "category_of_pension": "New State Pension", + "grouped_amount_of_benefit": "\u00a3300.00 and over" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_new_by_weekly_amount.300_00_and_over__new_state_pension", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_new_by_weekly_amount", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_new_by_weekly_amount.60_00_to_under_80_00__new_state_pension", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_amount_band_type", + "dimensions": [ + "category_of_pension", + "grouped_amount_of_benefit" + ], + "dimension_values": { + "category_of_pension": "New State Pension", + "grouped_amount_of_benefit": "\u00a360.00 to under \u00a380.00" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_new_by_weekly_amount.60_00_to_under_80_00__new_state_pension", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_new_by_weekly_amount", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_new_by_weekly_amount.80_00_to_under_100_00__new_state_pension", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_amount_band_type", + "dimensions": [ + "category_of_pension", + "grouped_amount_of_benefit" + ], + "dimension_values": { + "category_of_pension": "New State Pension", + "grouped_amount_of_benefit": "\u00a380.00 to under \u00a3100.00" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_new_by_weekly_amount.80_00_to_under_100_00__new_state_pension", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_new_by_weekly_amount", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.under_20_00__pre_2016_state_pension", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_amount_band_type", + "dimensions": [ + "category_of_pension", + "grouped_amount_of_benefit" + ], + "dimension_values": { + "category_of_pension": "Pre-2016 State Pension", + "grouped_amount_of_benefit": "Under \u00a320.00" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.under_20_00__pre_2016_state_pension", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_pre_2016_by_weekly_amount", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.100_00_to_under_150_00__pre_2016_state_pension", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_amount_band_type", + "dimensions": [ + "category_of_pension", + "grouped_amount_of_benefit" + ], + "dimension_values": { + "category_of_pension": "Pre-2016 State Pension", + "grouped_amount_of_benefit": "\u00a3100.00 to under \u00a3150.00" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.100_00_to_under_150_00__pre_2016_state_pension", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_pre_2016_by_weekly_amount", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.150_00_to_under_200_00__pre_2016_state_pension", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_amount_band_type", + "dimensions": [ + "category_of_pension", + "grouped_amount_of_benefit" + ], + "dimension_values": { + "category_of_pension": "Pre-2016 State Pension", + "grouped_amount_of_benefit": "\u00a3150.00 to under \u00a3200.00" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.150_00_to_under_200_00__pre_2016_state_pension", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_pre_2016_by_weekly_amount", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.20_00_to_under_40_00__pre_2016_state_pension", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_amount_band_type", + "dimensions": [ + "category_of_pension", + "grouped_amount_of_benefit" + ], + "dimension_values": { + "category_of_pension": "Pre-2016 State Pension", + "grouped_amount_of_benefit": "\u00a320.00 to under \u00a340.00" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.20_00_to_under_40_00__pre_2016_state_pension", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_pre_2016_by_weekly_amount", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.200_00_to_under_250_00__pre_2016_state_pension", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_amount_band_type", + "dimensions": [ + "category_of_pension", + "grouped_amount_of_benefit" + ], + "dimension_values": { + "category_of_pension": "Pre-2016 State Pension", + "grouped_amount_of_benefit": "\u00a3200.00 to under \u00a3250.00" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.200_00_to_under_250_00__pre_2016_state_pension", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_pre_2016_by_weekly_amount", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.250_00_to_under_300_00__pre_2016_state_pension", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_amount_band_type", + "dimensions": [ + "category_of_pension", + "grouped_amount_of_benefit" + ], + "dimension_values": { + "category_of_pension": "Pre-2016 State Pension", + "grouped_amount_of_benefit": "\u00a3250.00 to under \u00a3300.00" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.250_00_to_under_300_00__pre_2016_state_pension", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_pre_2016_by_weekly_amount", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.300_00_and_over__pre_2016_state_pension", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_amount_band_type", + "dimensions": [ + "category_of_pension", + "grouped_amount_of_benefit" + ], + "dimension_values": { + "category_of_pension": "Pre-2016 State Pension", + "grouped_amount_of_benefit": "\u00a3300.00 and over" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.300_00_and_over__pre_2016_state_pension", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_pre_2016_by_weekly_amount", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.40_00_to_under_60_00__pre_2016_state_pension", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_amount_band_type", + "dimensions": [ + "category_of_pension", + "grouped_amount_of_benefit" + ], + "dimension_values": { + "category_of_pension": "Pre-2016 State Pension", + "grouped_amount_of_benefit": "\u00a340.00 to under \u00a360.00" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.40_00_to_under_60_00__pre_2016_state_pension", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_pre_2016_by_weekly_amount", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.60_00_to_under_80_00__pre_2016_state_pension", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_amount_band_type", + "dimensions": [ + "category_of_pension", + "grouped_amount_of_benefit" + ], + "dimension_values": { + "category_of_pension": "Pre-2016 State Pension", + "grouped_amount_of_benefit": "\u00a360.00 to under \u00a380.00" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.60_00_to_under_80_00__pre_2016_state_pension", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_pre_2016_by_weekly_amount", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.80_00_to_under_100_00__pre_2016_state_pension", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_amount_band_type", + "dimensions": [ + "category_of_pension", + "grouped_amount_of_benefit" + ], + "dimension_values": { + "category_of_pension": "Pre-2016 State Pension", + "grouped_amount_of_benefit": "\u00a380.00 to under \u00a3100.00" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp.state_pension.recipients_pre_2016_by_weekly_amount.80_00_to_under_100_00__pre_2016_state_pension", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.state_pension.recipients_pre_2016_by_weekly_amount", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.pension_credit.benefit_units", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.pension_credit_caseload" + ], + "source_measure_id": "total_claims", + "groupby_dimension": "dwp.pension_credit_type_partner_age", + "dimensions": [ + "age_bands_and_single_year", + "partner_indicator", + "type_of_pension_credit" + ], + "dimension_values": { + "age_bands_and_single_year": "all", + "partner_indicator": "all", + "type_of_pension_credit": "all" + }, + "entity_name": "benefit_unit", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/pension_credit/benefit_units", + "family": "dwp_pension_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.pension_credit.benefit_units", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.pension_credit.benefit_units_guarantee_only_couple", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.pension_credit_caseload" + ], + "source_measure_id": "total_claims", + "groupby_dimension": "dwp.pension_credit_type_partner_age", + "dimensions": [ + "age_bands_and_single_year", + "partner_indicator", + "type_of_pension_credit" + ], + "dimension_values": { + "age_bands_and_single_year": "all", + "partner_indicator": "Has a partner", + "type_of_pension_credit": "Guarantee Credit only" + }, + "entity_name": "benefit_unit", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/pension_credit/benefit_units_guarantee_only_couple", + "family": "dwp_pension_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.pension_credit.benefit_units_guarantee_only_couple", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.pension_credit.benefit_units_guarantee_only_single", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.pension_credit_caseload" + ], + "source_measure_id": "total_claims", + "groupby_dimension": "dwp.pension_credit_type_partner_age", + "dimensions": [ + "age_bands_and_single_year", + "partner_indicator", + "type_of_pension_credit" + ], + "dimension_values": { + "age_bands_and_single_year": "all", + "partner_indicator": "Has no partner", + "type_of_pension_credit": "Guarantee Credit only" + }, + "entity_name": "benefit_unit", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/pension_credit/benefit_units_guarantee_only_single", + "family": "dwp_pension_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.pension_credit.benefit_units_guarantee_only_single", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.pension_credit.benefit_units_savings_only_couple", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.pension_credit_caseload" + ], + "source_measure_id": "total_claims", + "groupby_dimension": "dwp.pension_credit_type_partner_age", + "dimensions": [ + "age_bands_and_single_year", + "partner_indicator", + "type_of_pension_credit" + ], + "dimension_values": { + "age_bands_and_single_year": "all", + "partner_indicator": "Has a partner", + "type_of_pension_credit": "Savings Credit only" + }, + "entity_name": "benefit_unit", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/pension_credit/benefit_units_savings_only_couple", + "family": "dwp_pension_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.pension_credit.benefit_units_savings_only_couple", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.pension_credit.benefit_units_savings_only_single", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.pension_credit_caseload" + ], + "source_measure_id": "total_claims", + "groupby_dimension": "dwp.pension_credit_type_partner_age", + "dimensions": [ + "age_bands_and_single_year", + "partner_indicator", + "type_of_pension_credit" + ], + "dimension_values": { + "age_bands_and_single_year": "all", + "partner_indicator": "Has no partner", + "type_of_pension_credit": "Savings Credit only" + }, + "entity_name": "benefit_unit", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/pension_credit/benefit_units_savings_only_single", + "family": "dwp_pension_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.pension_credit.benefit_units_savings_only_single", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.pension_credit.benefit_units_both_couple", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.pension_credit_caseload" + ], + "source_measure_id": "total_claims", + "groupby_dimension": "dwp.pension_credit_type_partner_age", + "dimensions": [ + "age_bands_and_single_year", + "partner_indicator", + "type_of_pension_credit" + ], + "dimension_values": { + "age_bands_and_single_year": "all", + "partner_indicator": "Has a partner", + "type_of_pension_credit": "Both Guarantee and Savings Credit" + }, + "entity_name": "benefit_unit", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/pension_credit/benefit_units_both_couple", + "family": "dwp_pension_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.pension_credit.benefit_units_both_couple", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.pension_credit.benefit_units_both_single", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.pension_credit_caseload" + ], + "source_measure_id": "total_claims", + "groupby_dimension": "dwp.pension_credit_type_partner_age", + "dimensions": [ + "age_bands_and_single_year", + "partner_indicator", + "type_of_pension_credit" + ], + "dimension_values": { + "age_bands_and_single_year": "all", + "partner_indicator": "Has no partner", + "type_of_pension_credit": "Both Guarantee and Savings Credit" + }, + "entity_name": "benefit_unit", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/pension_credit/benefit_units_both_single", + "family": "dwp_pension_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.pension_credit.benefit_units_both_single", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.pension_credit.benefit_units_65_69", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.pension_credit_caseload" + ], + "source_measure_id": "total_claims", + "groupby_dimension": "dwp.pension_credit_type_partner_age", + "dimensions": [ + "age_bands_and_single_year", + "partner_indicator", + "type_of_pension_credit" + ], + "dimension_values": { + "age_bands_and_single_year": "65-69", + "partner_indicator": "all", + "type_of_pension_credit": "all" + }, + "entity_name": "benefit_unit", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/pension_credit/benefit_units_65_69", + "family": "dwp_pension_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.pension_credit.benefit_units_65_69", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.pension_credit.benefit_units_70_74", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.pension_credit_caseload" + ], + "source_measure_id": "total_claims", + "groupby_dimension": "dwp.pension_credit_type_partner_age", + "dimensions": [ + "age_bands_and_single_year", + "partner_indicator", + "type_of_pension_credit" + ], + "dimension_values": { + "age_bands_and_single_year": "70-74", + "partner_indicator": "all", + "type_of_pension_credit": "all" + }, + "entity_name": "benefit_unit", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/pension_credit/benefit_units_70_74", + "family": "dwp_pension_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.pension_credit.benefit_units_70_74", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.pension_credit.benefit_units_75_79", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.pension_credit_caseload" + ], + "source_measure_id": "total_claims", + "groupby_dimension": "dwp.pension_credit_type_partner_age", + "dimensions": [ + "age_bands_and_single_year", + "partner_indicator", + "type_of_pension_credit" + ], + "dimension_values": { + "age_bands_and_single_year": "75-79", + "partner_indicator": "all", + "type_of_pension_credit": "all" + }, + "entity_name": "benefit_unit", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/pension_credit/benefit_units_75_79", + "family": "dwp_pension_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.pension_credit.benefit_units_75_79", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.pension_credit.benefit_units_80_84", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.pension_credit_caseload" + ], + "source_measure_id": "total_claims", + "groupby_dimension": "dwp.pension_credit_type_partner_age", + "dimensions": [ + "age_bands_and_single_year", + "partner_indicator", + "type_of_pension_credit" + ], + "dimension_values": { + "age_bands_and_single_year": "80-84", + "partner_indicator": "all", + "type_of_pension_credit": "all" + }, + "entity_name": "benefit_unit", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/pension_credit/benefit_units_80_84", + "family": "dwp_pension_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.pension_credit.benefit_units_80_84", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.pension_credit.benefit_units_85_89", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.pension_credit_caseload" + ], + "source_measure_id": "total_claims", + "groupby_dimension": "dwp.pension_credit_type_partner_age", + "dimensions": [ + "age_bands_and_single_year", + "partner_indicator", + "type_of_pension_credit" + ], + "dimension_values": { + "age_bands_and_single_year": "85-89", + "partner_indicator": "all", + "type_of_pension_credit": "all" + }, + "entity_name": "benefit_unit", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/pension_credit/benefit_units_85_89", + "family": "dwp_pension_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.pension_credit.benefit_units_85_89", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.pension_credit.benefit_units_90_plus", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.pension_credit_caseload" + ], + "source_measure_id": "total_claims", + "groupby_dimension": "dwp.pension_credit_type_partner_age", + "dimensions": [ + "age_bands_and_single_year", + "partner_indicator", + "type_of_pension_credit" + ], + "dimension_values": { + "age_bands_and_single_year": "90 and over", + "partner_indicator": "all", + "type_of_pension_credit": "all" + }, + "entity_name": "benefit_unit", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/pension_credit/benefit_units_90_plus", + "family": "dwp_pension_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.pension_credit.benefit_units_90_plus", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dfc_ni.pension_credit.benefit_units", + "ledger_selector": { + "source_name": "dfc_ni", + "source_concept": [ + "dfc_ni.pension_credit_claimants" + ], + "source_measure_id": "claimants_all", + "dimensions": [], + "entity_name": "benefit_unit", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "N92000002" + }, + "entity": "benunit", + "measure": "dfc_ni/pension_credit/benefit_units", + "family": "dwp_pension_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dfc_ni.pension_credit.benefit_units", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.workplace_pension.employer_contributions", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.workplace_pension_annual_saving", + "entity_name": "person", + "dimensions": [ + "price_basis", + "saver_population", + "saving_component", + "sector" + ], + "period_type": "calendar_year", + "period_value": 2025, + "dimension_values": { + "price_basis": "2025_earnings_terms", + "saver_population": "all_savers", + "saving_component": "employer_contributions", + "sector": "all" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp/workplace_pension/employer_contributions", + "family": "dwp_workplace_pensions", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.workplace_pension.employer_contributions", + "measure_kind": "prepared_column" + }, + "period_match_policy": "exact", + "value_operation": "sum" + }, + { + "name": "dwp.attendance_allowance.recipients_england", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.attendance_allowance_cases_with_entitlement" + ], + "source_measure_id": "total_cases_with_entitlement", + "dimensions": [ + "aa_award_type", + "age_bands_and_single_year", + "gender" + ], + "dimension_values": { + "aa_award_type": "all", + "age_bands_and_single_year": "all", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "E92000001" + }, + "entity": "person", + "measure": "dwp/attendance_allowance/recipients_england", + "family": "dwp_attendance_allowance", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.attendance_allowance.recipients_england", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.attendance_allowance.recipients_wales", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.attendance_allowance_cases_with_entitlement" + ], + "source_measure_id": "total_cases_with_entitlement", + "dimensions": [ + "aa_award_type", + "age_bands_and_single_year", + "gender" + ], + "dimension_values": { + "aa_award_type": "all", + "age_bands_and_single_year": "all", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ], + "geography_level": "country", + "geography_id": "W92000004" + }, + "entity": "person", + "measure": "dwp/attendance_allowance/recipients_wales", + "family": "dwp_attendance_allowance", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.attendance_allowance.recipients_wales", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-02\",\"2025-05\",\"2025-08\",\"2025-11\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.hb.households_pension_age", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.housing_benefit_claimants", + "groupby_dimension": "dwp.hb_client_type", + "dimensions": [ + "client_type", + "private_or_social_rented" + ], + "dimension_values": { + "client_type": "Pension age", + "private_or_social_rented": "all" + }, + "source_measure_id": "total_claimants", + "period_type": "month", + "period_value": [ + "2025-01", + "2025-02", + "2025-03", + "2025-04", + "2025-05", + "2025-06", + "2025-07", + "2025-08", + "2025-09", + "2025-10", + "2025-11", + "2025-12" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/hb/households_pension_age", + "family": "dwp_housing_benefit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.hb.households_pension_age", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-01\",\"2025-02\",\"2025-03\",\"2025-04\",\"2025-05\",\"2025-06\",\"2025-07\",\"2025-08\",\"2025-09\",\"2025-10\",\"2025-11\",\"2025-12\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.hb.households_pension_age_social_rented", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.housing_benefit_claimants", + "groupby_dimension": "dwp.hb_client_type", + "dimensions": [ + "client_type", + "private_or_social_rented" + ], + "dimension_values": { + "client_type": "Pension age", + "private_or_social_rented": "Social Rented Sector" + }, + "source_measure_id": "claimants", + "period_type": "month", + "period_value": [ + "2025-01", + "2025-02", + "2025-03", + "2025-04", + "2025-05", + "2025-06", + "2025-07", + "2025-08", + "2025-09", + "2025-10", + "2025-11", + "2025-12" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/hb/households_pension_age_social_rented", + "family": "dwp_housing_benefit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.hb.households_pension_age_social_rented", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-01\",\"2025-02\",\"2025-03\",\"2025-04\",\"2025-05\",\"2025-06\",\"2025-07\",\"2025-08\",\"2025-09\",\"2025-10\",\"2025-11\",\"2025-12\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "dwp.hb.households_pension_age_private_rented", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.housing_benefit_claimants", + "groupby_dimension": "dwp.hb_client_type", + "dimensions": [ + "client_type", + "private_or_social_rented" + ], + "dimension_values": { + "client_type": "Pension age", + "private_or_social_rented": "Private Rented Sector" + }, + "source_measure_id": "claimants", + "period_type": "month", + "period_value": [ + "2025-01", + "2025-02", + "2025-03", + "2025-04", + "2025-05", + "2025-06", + "2025-07", + "2025-08", + "2025-09", + "2025-10", + "2025-11", + "2025-12" + ], + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/hb/households_pension_age_private_rented", + "family": "dwp_housing_benefit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.hb.households_pension_age_private_rented", + "measure_kind": "prepared_column", + "uk_uc_expected_source_months": "[\"2025-01\",\"2025-02\",\"2025-03\",\"2025-04\",\"2025-05\",\"2025-06\",\"2025-07\",\"2025-08\",\"2025-09\",\"2025-10\",\"2025-11\",\"2025-12\"]" + }, + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" + }, + { + "name": "hmrc.salary_sacrifice.it_relief_total", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.ss_income_tax_relief_total", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "person", + "measure": "hmrc/salary_sacrifice_it_relief_total", + "family": "hmrc_salary_sacrifice", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.salary_sacrifice.it_relief_total", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2024", + "uprating_to_period": 2025 } ] } diff --git a/packages/microcosm-build/src/microcosm/build/uk/uk_local_target_census.json b/packages/microcosm-build/src/microcosm/build/uk/uk_local_target_census.json index e99de64f8..135df6003 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/uk_local_target_census.json +++ b/packages/microcosm-build/src/microcosm/build/uk/uk_local_target_census.json @@ -565,11 +565,11 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "source_repo": "PolicyEngine/chronicle" }, "notes": "Unbanded area statistics in the pinned Ledger fact feed supply the local HMRC count targets directly and the amount targets via the signed count_x_mean construction. The feed publishes SPI target count/mean measures for 650/650 constituencies except self_employment_income_mean at E14001416 (so that one amount row is signed deferred), and for 359/361 crosswalk local authorities; E06000027 has only median SPI measures and E06000053 has no SPI local-authority target-measure rows. This remains a different surface from the 208 banded Total Income facts held fenced by the national adjudication.", @@ -588,11 +588,11 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "source_repo": "PolicyEngine/chronicle" }, "notes": "The pinned Ledger fact feed carries the PCON24 constituency population age specs for all 650 constituencies across the ONS, NRS, and NISRA publisher legs. Mid-year estimates cover the total usual-resident population \u2014 see the population_universe_private_households adjudication.", @@ -611,11 +611,11 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "source_repo": "PolicyEngine/chronicle" }, "notes": "The pinned Ledger fact feed carries local-authority population age specs for all 361 crosswalk local authorities. Covers the total usual-resident population \u2014 see the population_universe_private_households adjudication.", @@ -635,11 +635,11 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "source_repo": "PolicyEngine/chronicle" }, "notes": "The pinned Ledger fact feed carries the compiled household cells.", @@ -659,11 +659,11 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "source_repo": "PolicyEngine/chronicle" }, "notes": "The pinned Ledger fact feed carries the compiled household cells; the source specification defines HouseholdCount as occupied households.", @@ -683,11 +683,11 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "source_repo": "PolicyEngine/chronicle" }, "notes": "The pinned Ledger fact feed carries the compiled household cells.", @@ -707,11 +707,11 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "source_repo": "PolicyEngine/chronicle" }, "notes": "The pinned Ledger fact feed carries DWP Stat-Xplore UC household facts for 632/650 constituencies and 350/361 local authorities, plus the four constituency child-bucket specs. DWP UC official statistics in this feed cover Great Britain; the 18 Northern Ireland constituencies and 11 Northern Ireland local authorities are signed deferred. DWP counts UC claim households \u2014 see the uc_unit_vs_household_grain adjudication.", @@ -730,11 +730,11 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "source_repo": "PolicyEngine/chronicle" }, "notes": "Model-based estimates built from the Family Resources Survey \u2014 see the frs_model_based_target_circularity adjudication. The BHC and AHC measures are independently modelled and not directly comparable \u2014 see the ons_bhc_ahc_noncomparable adjudication. MSOA-to-local-authority aggregation is signed deferred for this run; England and Wales only.", @@ -756,11 +756,11 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "source_repo": "PolicyEngine/chronicle" }, "notes": "The pinned Ledger fact feed carries tenure specs for all 361 crosswalk local authorities across ONS Census 2021, NRS Census 2022, and NISRA Census 2021 publisher legs. Private-rent and social-rent tenure rows are additive over publisher-native subclasses and compile through the signed sum operation.", @@ -779,11 +779,11 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "source_repo": "PolicyEngine/chronicle" }, "notes": "PIPR publishes average rent price levels, not additive rent totals; a bound cell composes the level into a total (see the signed rationale). Of the 361 local-authority cells, 314 bind for the 2025 compile and 47 remain signed deferred: four English cells have no matching LA id, 32 Scottish cells are represented only at BRMA grain without a signed translation, and 11 Northern Ireland cells are absent.", @@ -804,11 +804,11 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "source_repo": "PolicyEngine/chronicle" }, "notes": "The pinned feed record-set specs uk.local_geography.council_tax.england_ctb.line_07_chargeable_dwellings_adjusted_for_disabled_relief.v1, line_11_second_homes.v1 and line_15_empty_dwellings.v1 supply the 296 English billing authorities by band A-, A-H at the October 2025 count. Each cell binds line 7 minus line 11 minus line 15 (band A adds line 7's A- column): the dwellings charged as someone's sole or main residence, the universe a household frame carries. Bands A-G bind 294 authorities after E06000053 and E09000001 are support-floor excluded; the 296-cell band H family stays signed deferred on spine support (microcosm#762 A14). Barnsley and Sheffield bind through the crosswalk's declared aliases of their April 2025 codes. The family is scoped to the 296 English authorities: Wales and Scotland bind their own returns below and Northern Ireland levies domestic rates.", @@ -827,11 +827,11 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "source_repo": "PolicyEngine/chronicle" }, "notes": "The pinned feed record-set specs uk.local_geography.council_tax.wales_ct1.a1_all_chargeable_dwellings.v1, h7_total_chargeable_empty_properties.v1 and h8_total_chargeable_second_homes.v1 supply the 22 Welsh authorities by band A-I per financial year. Each cell binds a1 minus h7 minus h8 on the 2025-26 row (the taxbase set for that year, counted on the 31 October 2024 list, one count-year behind England and Scotland by ruling of 2026-09-15); all 198 cells bind, band I included.", @@ -850,11 +850,11 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "fact_row_count": 287150, - "facts_sha256": "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9", + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "manifest_sha256": "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7", - "source_commit": "505e0e72aa7c82b96dc06941d84fa797a629161c", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", "source_repo": "PolicyEngine/chronicle" }, "notes": "The pinned feed record-set spec uk.local_geography.council_tax_stock.scotland_ctaxbase_chargeable_dwellings.by_council_area.v1 supplies the 32 councils by band A-H, the concept the scotgov.council_tax_stock country rows already bind; 255 cells bind and Shetland band H is signed deferred (no band-H clone at K=15). Chargeable dwellings run about 1 % above the household frame nationally, the residual the universe fence records.", diff --git a/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json b/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json index 661cb7618..2cefb5368 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json +++ b/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json @@ -9,6 +9,7 @@ "calendar_year_average", "monthly_window_average", "monthly_window_sum_average", + "monthly_window_count_x_mean", "linear_combination", "scaled_by_ratio", "calendar_year_window" @@ -23,8 +24,8 @@ "pinned_ref": "12a1e028afeef08d8b2d74ee03fd9de3a78b2dd3", "pinned_version": "1.56.16", "registry_rows": 652, - "mapped_rows": 627, - "excluded_rows": 25, + "mapped_rows": 625, + "excluded_rows": 27, "mapped": { "dwp/benefit_capped_households": "dwp.benefit_cap.capped_households", "dwp/esa_claimants": "dwp.esa_claimants", @@ -363,9 +364,7 @@ "obr/salary_sacrifice_employer_ni_relief": "hmrc.salary_sacrifice.nics_relief_employer", "obr/salary_sacrifice_users_above_cap": "hmrc.salary_sacrifice.users_above_cap", "obr/salary_sacrifice_users_below_cap": "hmrc.salary_sacrifice.users_below_cap", - "obr/salary_sacrifice_users_total": "hmrc.salary_sacrifice.users_total", "obr/sdlt": "obr.sdlt", - "obr/state_pension": "obr.state_pension", "obr/statutory_maternity_pay": "obr.statutory_maternity_pay", "obr/tv_licence_fee": "obr.tv_licence_fee", "obr/universal_credit_in_cap": "obr.universal_credit_in_cap", @@ -679,7 +678,9 @@ "ons/tenure_england_rented_privately": "England tenure counts come from an LA-grain workbook uk-data code-sums; ruled non-portable as national facts on chronicle#133 - moved to the wave-3 LA package (chronicle#134).", "ons/tenure_england_social_rent": "England tenure counts come from an LA-grain workbook uk-data code-sums; ruled non-portable as national facts on chronicle#133 - moved to the wave-3 LA package (chronicle#134).", "ons/tenure_england_total": "England tenure counts come from an LA-grain workbook uk-data code-sums; ruled non-portable as national facts on chronicle#133 - moved to the wave-3 LA package (chronicle#134).", - "obr/capital_gains_tax": "Observed FY2024-25 treatment (#875): the incumbent OBR cash forecast is retained only as diagnostic provenance. It has no same-basis liability mapping and is removed from fitting; no source value is adjusted." + "obr/capital_gains_tax": "Observed FY2024-25 treatment (#875): the incumbent OBR cash forecast is retained only as diagnostic provenance. It has no same-basis liability mapping and is removed from fitting; no source value is adjusted.", + "obr/state_pension": "Resident treatment (microcosm#1069 R4): the incumbent OBR FY State Pension forecast counts Great Britain plus pensioners paid abroad and leaves out Northern Ireland. The DWP Stat-Xplore and DfC resident level is bound instead and the exact OBR FY2025-26 figure is retained only as diagnostic provenance on dwp.state_pension.amount; no source value is adjusted.", + "obr/salary_sacrifice_users_total": "R10 (microcosm#1069 c9): the salary-sacrifice users total contradicts the staged support and the two headcounts either side of £2,000 already bind it; it leaves the fit." }, "unmapped_declarations": { "hmrc.salary_sacrifice.it_relief_basic_rate": "New declaration backed by chronicle#139 salary-sacrifice facts; the incumbent source CSV is still 410-Gone at 12a1e028 and its rows are silently suppressed by the bare-except drop in build_loss_matrix.py:376-394.", @@ -782,7 +783,54 @@ "hmrc.spi_region.income_tax_by_region_70000_100000": "New declaration backed by SPI 2023-24 Table 3.11 (income and tax by sex, region and country) in Chronicle (spi_income_by_region_2023_24), uprated to the calibration year by HMRC's projected growth in the containing Table 2.5 band(s); the incumbent registry has no regional SPI band metric (PolicyEngine/chronicle#280 lane).", "hmrc.spi_region.income_tax_by_region_100000_150000": "New declaration backed by SPI 2023-24 Table 3.11 (income and tax by sex, region and country) in Chronicle (spi_income_by_region_2023_24), uprated to the calibration year by HMRC's projected growth in the containing Table 2.5 band(s); the incumbent registry has no regional SPI band metric (PolicyEngine/chronicle#280 lane).", "hmrc.spi_region.income_tax_by_region_150000_200000": "New declaration backed by SPI 2023-24 Table 3.11 (income and tax by sex, region and country) in Chronicle (spi_income_by_region_2023_24), uprated to the calibration year by HMRC's projected growth in the containing Table 2.5 band(s); the incumbent registry has no regional SPI band metric (PolicyEngine/chronicle#280 lane).", - "hmrc.spi_region.income_tax_by_region_200000_plus": "New declaration backed by SPI 2023-24 Table 3.11 (income and tax by sex, region and country) in Chronicle (spi_income_by_region_2023_24), uprated to the calibration year by HMRC's projected growth in the containing Table 2.5 band(s); the incumbent registry has no regional SPI band metric (PolicyEngine/chronicle#280 lane)." + "hmrc.spi_region.income_tax_by_region_200000_plus": "New declaration backed by SPI 2023-24 Table 3.11 (income and tax by sex, region and country) in Chronicle (spi_income_by_region_2023_24), uprated to the calibration year by HMRC's projected growth in the containing Table 2.5 band(s); the incumbent registry has no regional SPI band metric (PolicyEngine/chronicle#280 lane).", + "dwp.state_pension.recipients": "Post-freeze fact family (DWP Stat-Xplore State Pension caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.state_pension.amount": "Post-freeze fact family (DWP Stat-Xplore State Pension caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dfc_ni.state_pension.recipients": "Post-freeze fact family (DfC Northern Ireland State Pension statistics, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dfc_ni.state_pension.amount": "Post-freeze fact family (DfC Northern Ireland State Pension statistics, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.state_pension.recipients_male_66_69_new": "Post-freeze fact family (DWP Stat-Xplore State Pension caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.state_pension.recipients_female_66_69_new": "Post-freeze fact family (DWP Stat-Xplore State Pension caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.state_pension.recipients_male_70_74_new": "Post-freeze fact family (DWP Stat-Xplore State Pension caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.state_pension.recipients_male_70_74_pre_2016": "Post-freeze fact family (DWP Stat-Xplore State Pension caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.state_pension.recipients_female_70_74_new": "Post-freeze fact family (DWP Stat-Xplore State Pension caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.state_pension.recipients_female_70_74_pre_2016": "Post-freeze fact family (DWP Stat-Xplore State Pension caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.state_pension.recipients_male_75_79_pre_2016": "Post-freeze fact family (DWP Stat-Xplore State Pension caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.state_pension.recipients_female_75_79_pre_2016": "Post-freeze fact family (DWP Stat-Xplore State Pension caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.state_pension.recipients_male_80_84_pre_2016": "Post-freeze fact family (DWP Stat-Xplore State Pension caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.state_pension.recipients_female_80_84_pre_2016": "Post-freeze fact family (DWP Stat-Xplore State Pension caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.state_pension.recipients_male_85_89_pre_2016": "Post-freeze fact family (DWP Stat-Xplore State Pension caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.state_pension.recipients_female_85_89_pre_2016": "Post-freeze fact family (DWP Stat-Xplore State Pension caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.state_pension.recipients_male_90_plus_pre_2016": "Post-freeze fact family (DWP Stat-Xplore State Pension caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.state_pension.recipients_female_90_plus_pre_2016": "Post-freeze fact family (DWP Stat-Xplore State Pension caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.state_pension.recipients_new_by_english_region": "Post-freeze fact family (DWP Stat-Xplore State Pension caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.state_pension.recipients_new_scotland": "Post-freeze fact family (DWP Stat-Xplore State Pension caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.state_pension.recipients_new_wales": "Post-freeze fact family (DWP Stat-Xplore State Pension caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.state_pension.recipients_pre_2016_by_english_region": "Post-freeze fact family (DWP Stat-Xplore State Pension caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.state_pension.recipients_pre_2016_scotland": "Post-freeze fact family (DWP Stat-Xplore State Pension caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.state_pension.recipients_pre_2016_wales": "Post-freeze fact family (DWP Stat-Xplore State Pension caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.state_pension.recipients_new_by_weekly_amount": "Post-freeze fact family (DWP Stat-Xplore State Pension caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.state_pension.recipients_pre_2016_by_weekly_amount": "Post-freeze fact family (DWP Stat-Xplore State Pension caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.pension_credit.benefit_units": "Post-freeze fact family (DWP Stat-Xplore Pension Credit caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.pension_credit.benefit_units_guarantee_only_couple": "Post-freeze fact family (DWP Stat-Xplore Pension Credit caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.pension_credit.benefit_units_guarantee_only_single": "Post-freeze fact family (DWP Stat-Xplore Pension Credit caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.pension_credit.benefit_units_savings_only_couple": "Post-freeze fact family (DWP Stat-Xplore Pension Credit caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.pension_credit.benefit_units_savings_only_single": "Post-freeze fact family (DWP Stat-Xplore Pension Credit caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.pension_credit.benefit_units_both_couple": "Post-freeze fact family (DWP Stat-Xplore Pension Credit caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.pension_credit.benefit_units_both_single": "Post-freeze fact family (DWP Stat-Xplore Pension Credit caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.pension_credit.benefit_units_65_69": "Post-freeze fact family (DWP Stat-Xplore Pension Credit caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.pension_credit.benefit_units_70_74": "Post-freeze fact family (DWP Stat-Xplore Pension Credit caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.pension_credit.benefit_units_75_79": "Post-freeze fact family (DWP Stat-Xplore Pension Credit caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.pension_credit.benefit_units_80_84": "Post-freeze fact family (DWP Stat-Xplore Pension Credit caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.pension_credit.benefit_units_85_89": "Post-freeze fact family (DWP Stat-Xplore Pension Credit caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.pension_credit.benefit_units_90_plus": "Post-freeze fact family (DWP Stat-Xplore Pension Credit caseload, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dfc_ni.pension_credit.benefit_units": "Post-freeze fact family (DfC Northern Ireland Pension Credit statistics, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069).", + "dwp.workplace_pension.employer_contributions": "Post-freeze fact family (DWP workplace pension savings trends / HMRC Table 6.2, PolicyEngine/chronicle#302 via #305), no uk-data metric (microcosm#1069 c9).", + "dwp.attendance_allowance.recipients_england": "Post-freeze fact family (DWP Stat-Xplore Attendance Allowance), no uk-data metric (microcosm#1069 c10).", + "dwp.attendance_allowance.recipients_wales": "Post-freeze fact family (DWP Stat-Xplore Attendance Allowance), no uk-data metric (microcosm#1069 c10).", + "dwp.hb.households_pension_age": "Post-freeze fact family (DWP Stat-Xplore Housing Benefit, pension age), no uk-data metric (microcosm#1069 c10).", + "dwp.hb.households_pension_age_social_rented": "Post-freeze fact family (DWP Stat-Xplore Housing Benefit, pension age), no uk-data metric (microcosm#1069 c10).", + "dwp.hb.households_pension_age_private_rented": "Post-freeze fact family (DWP Stat-Xplore Housing Benefit, pension age), no uk-data metric (microcosm#1069 c10).", + "hmrc.salary_sacrifice.it_relief_total": "New declaration backed by HMRC Table 6.2 (PolicyEngine/chronicle#302 via #305): the all-rates income-tax relief on salary sacrifice, resolved by the live counterfactual route (microcosm#1069 c11)." }, "suppressed_ancestors": { "hmrc/salary_sacrifice_it_relief_basic_rate": { @@ -838,7 +886,6 @@ "obr.jobseekers_allowance", "obr.pension_credit", "obr.pip", - "obr.state_pension", "obr.statutory_maternity_pay", "obr.tv_licence_fee", "obr.universal_credit_in_cap", @@ -850,7 +897,6 @@ "hmrc.salary_sacrifice.it_relief_additional_rate", "hmrc.salary_sacrifice.nics_relief_employee", "hmrc.salary_sacrifice.nics_relief_employer", - "hmrc.salary_sacrifice.users_total", "hmrc.salary_sacrifice.users_below_cap", "hmrc.salary_sacrifice.users_above_cap", "hmrc.spi.employment_income.amount_by_total_income_band", @@ -1110,7 +1156,54 @@ "hmrc.spi_region.income_tax_by_region_70000_100000", "hmrc.spi_region.income_tax_by_region_100000_150000", "hmrc.spi_region.income_tax_by_region_150000_200000", - "hmrc.spi_region.income_tax_by_region_200000_plus" + "hmrc.spi_region.income_tax_by_region_200000_plus", + "dwp.state_pension.recipients", + "dwp.state_pension.amount", + "dfc_ni.state_pension.recipients", + "dfc_ni.state_pension.amount", + "dwp.state_pension.recipients_male_66_69_new", + "dwp.state_pension.recipients_female_66_69_new", + "dwp.state_pension.recipients_male_70_74_new", + "dwp.state_pension.recipients_male_70_74_pre_2016", + "dwp.state_pension.recipients_female_70_74_new", + "dwp.state_pension.recipients_female_70_74_pre_2016", + "dwp.state_pension.recipients_male_75_79_pre_2016", + "dwp.state_pension.recipients_female_75_79_pre_2016", + "dwp.state_pension.recipients_male_80_84_pre_2016", + "dwp.state_pension.recipients_female_80_84_pre_2016", + "dwp.state_pension.recipients_male_85_89_pre_2016", + "dwp.state_pension.recipients_female_85_89_pre_2016", + "dwp.state_pension.recipients_male_90_plus_pre_2016", + "dwp.state_pension.recipients_female_90_plus_pre_2016", + "dwp.state_pension.recipients_new_by_english_region", + "dwp.state_pension.recipients_new_scotland", + "dwp.state_pension.recipients_new_wales", + "dwp.state_pension.recipients_pre_2016_by_english_region", + "dwp.state_pension.recipients_pre_2016_scotland", + "dwp.state_pension.recipients_pre_2016_wales", + "dwp.state_pension.recipients_new_by_weekly_amount", + "dwp.state_pension.recipients_pre_2016_by_weekly_amount", + "dwp.pension_credit.benefit_units", + "dwp.pension_credit.benefit_units_guarantee_only_couple", + "dwp.pension_credit.benefit_units_guarantee_only_single", + "dwp.pension_credit.benefit_units_savings_only_couple", + "dwp.pension_credit.benefit_units_savings_only_single", + "dwp.pension_credit.benefit_units_both_couple", + "dwp.pension_credit.benefit_units_both_single", + "dwp.pension_credit.benefit_units_65_69", + "dwp.pension_credit.benefit_units_70_74", + "dwp.pension_credit.benefit_units_75_79", + "dwp.pension_credit.benefit_units_80_84", + "dwp.pension_credit.benefit_units_85_89", + "dwp.pension_credit.benefit_units_90_plus", + "dfc_ni.pension_credit.benefit_units", + "dwp.workplace_pension.employer_contributions", + "dwp.attendance_allowance.recipients_england", + "dwp.attendance_allowance.recipients_wales", + "dwp.hb.households_pension_age", + "dwp.hb.households_pension_age_social_rented", + "dwp.hb.households_pension_age_private_rented", + "hmrc.salary_sacrifice.it_relief_total" ] }, "profile_parity": { @@ -2412,41 +2505,6 @@ "label": "Personal Independence Payment", "value_operation": "calendar_year_window" }, - { - "target_id": "obr.state_pension", - "family": "obr", - "geography_levels": [ - "country" - ], - "measurement": { - "entity": "person", - "concept": "uk.benefits.state_pension.amount", - "map_to": "household" - }, - "bindings": { - "policyengine": { - "metric_name": "obr/state_pension", - "value_variable": "state_pension", - "from_entity": "person", - "map_to": "household", - "notes": "Bound at the calendar-2025 window of the OBR fiscal years (three twelfths of FY2024-25, nine twelfths of FY2025-26; calendar_year_window), María's rule of 2026-09-22 that fiscal-year facts take only the months to the end of the calibration calendar year (PolicyEngine/chronicle#280 lane)." - }, - "axiom": { - "metric_name": "obr/state_pension", - "status": "pending", - "value_rule": "uk.benefits.state_pension.amount" - } - }, - "assertion_policy": "allow_source_projection", - "ledger_selector": { - "source_name": "obr", - "source_concept": "obr.state_pension", - "entity_name": "person" - }, - "category_id": "obr.efo_expenditure", - "label": "State pension", - "value_operation": "calendar_year_window" - }, { "target_id": "obr.statutory_maternity_pay", "family": "obr", @@ -2882,50 +2940,9 @@ "source_concept": "hmrc.ss_nics_relief_employer" }, "category_id": "hmrc.salary_sacrifice_national_insurance_relief", - "label": "National Insurance contributions relief employer" - }, - { - "target_id": "hmrc.salary_sacrifice.users_total", - "family": "hmrc_salary_sacrifice", - "geography_levels": [ - "country" - ], - "measurement": { - "entity": "person", - "map_to": "household", - "concept": "uk.person.count" - }, - "bindings": { - "policyengine": { - "metric_name": "obr/salary_sacrifice_users_total", - "filters": [ - { - "variable": "pension_contributions_via_salary_sacrifice", - "operator": ">", - "value": 0 - } - ], - "value_variable": "person_count", - "from_entity": "person", - "map_to": "household", - "threshold_price_base_year": 2023, - "notes": "The GBP 2,000 cap is defined at FRS base-year (2023) prices; deflate salary-sacrifice amounts before banding (compute/income.py:71-95)." - }, - "axiom": { - "metric_name": "obr/salary_sacrifice_users_total", - "status": "pending", - "value_rule": "uk.person.count" - } - }, - "ledger_selector": { - "source_name": "hmrc", - "source_concept": "hmrc.salary_sacrifice_pension_users", - "dimension_values": { - "salary_sacrifice_threshold_position": "all" - } - }, - "category_id": "hmrc.salary_sacrifice_pension_users", - "label": "Users total" + "label": "National Insurance contributions relief employer", + "uprating_index": "policyengine_uk_parameter:gov.hmrc.national_insurance.class_1.rates.employer", + "selector_note": "HMRC Table 6.2's 2024-25 employer NICs relief, charged at 13.8%, restated to the rate the engine charges in 2025 (15% from April 2025) by the pinned engine's gov.hmrc.national_insurance.class_1.rates.employer between 1 January 2024 and 1 January 2025, so the row anchors the sacrificed amount at the 2024-25 level, as R10's conversion row did (microcosm#1069 c11, R7)." }, { "target_id": "hmrc.salary_sacrifice.users_below_cap", @@ -3493,8 +3510,8 @@ }, "category_id": "hmrc.survey_of_personal_incomes", "label": "Amount by total income band", - "uprating_index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", - "selector_note": "Uprated from the SPI 2023-24 fact to the 2025 calibration period by the new State Pension weekly rate the engine pays at each period (203.85 at 2023, 230.25 at 2025 on the pinned engine): the engine fixes every pensioner's amount at the period's rate, so the bands can only be met at that level. Ruled by María on 2026-09-22 (PolicyEngine/chronicle#280 lane)." + "uprating_index": "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band", + "selector_note": "Uprated from the SPI 2023-24 fact to the 2025 calibration period as recipients times the amount per recipient: the band's recipients grow by HMRC's projected Income Tax payer growth for the Table 2.5 band containing it (the index its count row declares, the calendar-2025 window of the 2024-25 and 2025-26 projections over the 2023-24 outturn), and the amount per recipient by the new State Pension weekly rate the engine pays (203.85 at 2023, 230.25 at 2025 on the pinned engine). The rate alone held the band's recipients at the 2023-24 number while the count row grew them, so the two rows described different populations (microcosm#1069)." }, { "target_id": "hmrc.spi.state_pension.count_by_total_income_band", @@ -20251,142 +20268,6187 @@ "label": "Income Tax liabilities by region, total income 200,000 and over" }, { - "target_id": "hmrc.self_employment_income.amount", - "family": "hmrc", + "target_id": "dwp.state_pension.recipients", + "family": "dwp_state_pension", "geography_levels": [ - "constituency", - "local_authority" + "country" ], "measurement": { "entity": "person", "map_to": "household", - "concept": "uk.income.self_employment.amount", + "concept": "uk.person.count", "filters": [ { - "concept": "uk.tax.income_tax", + "concept": "uk.benefits.state_pension.amount", "operator": ">", "value": 0 + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" ] }, "bindings": { "policyengine": { - "metric_name": "hmrc/self_employment_income/amount", - "value_variable": "self_employment_income", "from_entity": "person", "map_to": "household", + "metric_name": "dwp/state_pension/recipients", + "value_variable": "person_count", "filters": [ { - "variable": "income_tax", + "variable": "state_pension", "operator": ">", "value": 0 } - ] + ], + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "person" + } + ], + "notes": "DWP Stat-Xplore State Pension caseload, Great Britain residents (PolicyEngine/chronicle#302 via #305): every recipient living in Great Britain, as the mean of the four quarterly points inside calendar 2025 (February, May, August, November), the Employment and Support Allowance window precedent (microcosm#1069 R1, R2). Pensioners paid abroad are outside the cube and outside any household frame." }, "axiom": { - "metric_name": "hmrc/self_employment_income/amount", + "metric_name": "dwp/state_pension/recipients", "status": "pending", - "value_rule": "uk.income.self_employment.amount" + "value_rule": "uk.person.count" } }, "ledger_selector": { - "source_name": "hmrc", - "source_measure_id": [ - "self_employment_income_count", - "self_employment_income_mean" + "source_name": "dwp", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" ], - "record_set_spec_id": [ - "uk.local_geography.spi_income.by_constituency.v1", - "uk.local_geography.spi_income.by_local_authority.v1" + "dimension_values": { + "age_bands_and_single_year": "all", + "category_of_pension": "all", + "gender": "all" + }, + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "total_recipients", + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" ] }, - "selector_note": "No Chronicle amount fact exists; count_x_mean consumes the ordered count and mean facts from the same SPI area record-set spec.", - "category_id": "hmrc.tax_statistics", - "label": "Amount" + "category_id": "dwp.state_pension", + "label": "State Pension recipients, Great Britain residents", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" }, { - "target_id": "hmrc.self_employment_income.count", - "family": "hmrc", + "target_id": "dwp.state_pension.amount", + "family": "dwp_state_pension", "geography_levels": [ - "constituency", - "local_authority" + "country" ], "measurement": { "entity": "person", "map_to": "household", - "concept": "uk.person.count", + "concept": "uk.benefits.state_pension.amount", "filters": [ { - "concept": "uk.income.self_employment.amount", - "operator": "!=", - "value": 0 - }, - { - "concept": "uk.tax.income_tax", - "operator": ">", - "value": 0 + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" ] }, "bindings": { "policyengine": { - "metric_name": "hmrc/self_employment_income/count", - "value_variable": "person_count", "from_entity": "person", "map_to": "household", - "filters": [ - { - "variable": "self_employment_income", - "operator": "!=", - "value": 0 - }, + "metric_name": "dwp/state_pension/amount", + "value_variable": "state_pension", + "household_conditions": [ { - "variable": "income_tax", - "operator": ">", - "value": 0 + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "person" } - ] + ], + "notes": "DWP Stat-Xplore State Pension caseload, Great Britain residents (PolicyEngine/chronicle#302 via #305): recipients times their mean weekly amount times 52 at each quarterly point inside calendar 2025, averaged (monthly_window_count_x_mean). Each point's mean is restated at the new State Pension rate the engine pays in 2025, so only February (paid at the 2024-25 rate) moves (microcosm#1069 R1)." }, "axiom": { - "metric_name": "hmrc/self_employment_income/count", + "metric_name": "dwp/state_pension/amount", "status": "pending", - "value_rule": "uk.person.count" + "value_rule": "uk.benefits.state_pension.amount" } }, "ledger_selector": { - "source_name": "hmrc", - "source_measure_id": "self_employment_income_count", - "record_set_spec_id": [ - "uk.local_geography.spi_income.by_constituency.v1", - "uk.local_geography.spi_income.by_local_authority.v1" + "source_name": "dwp", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": "all", + "category_of_pension": "all", + "gender": "all" + }, + "source_concept": [ + "dwp.state_pension_caseload", + "dwp.state_pension_mean_weekly_amount" + ], + "source_measure_id": [ + "total_recipients", + "total_mean_weekly_amount" + ], + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" ] }, - "category_id": "hmrc.tax_statistics", - "label": "Count" + "category_id": "dwp.state_pension", + "label": "State Pension paid, Great Britain residents", + "value_operation": "monthly_window_count_x_mean", + "period_match_policy": "source_window", + "value_operands": [ + { + "role": "count", + "concept": "dwp.state_pension_recipients" + }, + { + "role": "mean", + "concept": "dwp.state_pension_mean_weekly_amount", + "period_factor": 52 + } + ], + "uprating_index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount", + "selector_note": "Restated per point by the new State Pension weekly rate the engine pays (221.20 for 2024-25, 230.25 for 2025-26 on the pinned engine)." }, { - "target_id": "hmrc.employment_income.amount", - "family": "hmrc", + "target_id": "dfc_ni.state_pension.recipients", + "family": "dwp_state_pension", "geography_levels": [ - "constituency", - "local_authority" + "country" ], "measurement": { "entity": "person", "map_to": "household", - "concept": "uk.income.employment.amount", + "concept": "uk.person.count", "filters": [ { - "concept": "uk.tax.income_tax", + "concept": "uk.benefits.state_pension.amount", "operator": ">", "value": 0 + }, + { + "concept": "uk.geography.country", + "equals": "northern_ireland" } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" ] }, "bindings": { "policyengine": { - "metric_name": "hmrc/employment_income/amount", - "value_variable": "employment_income", + "from_entity": "person", + "map_to": "household", + "metric_name": "dfc_ni/state_pension/recipients", + "value_variable": "person_count", + "filters": [ + { + "variable": "state_pension", + "operator": ">", + "value": 0 + } + ], + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "==", + "value": "NORTHERN_IRELAND", + "map_to": "person" + } + ], + "notes": "DfC Northern Ireland benefit statistics, State Pension (PolicyEngine/chronicle#302 via #305): all claimants, as the mean of the four quarterly points inside calendar 2025. With the Great Britain rows it completes the UK resident level (microcosm#1069 R2)." + }, + "axiom": { + "metric_name": "dfc_ni/state_pension/recipients", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dfc_ni", + "dimensions": [], + "source_measure_id": "claimants_all", + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dfc_ni.state_pension", + "label": "State Pension recipients, Northern Ireland", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dfc_ni.state_pension.amount", + "family": "dwp_state_pension", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.benefits.state_pension.amount", + "filters": [ + { + "concept": "uk.geography.country", + "equals": "northern_ireland" + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "from_entity": "person", + "map_to": "household", + "metric_name": "dfc_ni/state_pension/amount", + "value_variable": "state_pension", + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "==", + "value": "NORTHERN_IRELAND", + "map_to": "person" + } + ], + "notes": "DfC Northern Ireland benefit statistics, State Pension (PolicyEngine/chronicle#302 via #305): claimants times the average weekly payment times 52 at each quarterly point inside calendar 2025, averaged, with each point restated at the engine's 2025 rate (microcosm#1069 R1)." + }, + "axiom": { + "metric_name": "dfc_ni/state_pension/amount", + "status": "pending", + "value_rule": "uk.benefits.state_pension.amount" + } + }, + "ledger_selector": { + "source_name": "dfc_ni", + "dimensions": [], + "source_measure_id": [ + "claimants_all", + "average_weekly_payment_all" + ], + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dfc_ni.state_pension", + "label": "State Pension paid, Northern Ireland", + "value_operation": "monthly_window_count_x_mean", + "period_match_policy": "source_window", + "value_operands": [ + { + "role": "count", + "concept": "dwp.state_pension_recipients" + }, + { + "role": "mean", + "concept": "dwp.state_pension_mean_weekly_amount", + "period_factor": 52 + } + ], + "uprating_index": "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount" + }, + { + "target_id": "dwp.state_pension.recipients_male_66_69_new", + "family": "dwp_state_pension", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.benefits.state_pension.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.demographics.gender", + "equals": "male" + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 66 + }, + { + "concept": "uk.demographics.age", + "operator": "<=", + "value": 69 + }, + { + "concept": "uk.benefits.state_pension.type", + "equals": "new" + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "from_entity": "person", + "map_to": "household", + "metric_name": "dwp/state_pension/recipients_male_66_69_new", + "value_variable": "person_count", + "filters": [ + { + "variable": "state_pension", + "operator": ">", + "value": 0 + }, + { + "variable": "gender", + "equals": "MALE" + }, + { + "variable": "age", + "operator": ">=", + "value": 66 + }, + { + "variable": "age", + "operator": "<=", + "value": 69 + }, + { + "variable": "state_pension_type", + "operator": "==", + "value": "NEW" + } + ], + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "person" + } + ], + "notes": "DWP Stat-Xplore State Pension caseload, Great Britain residents (PolicyEngine/chronicle#302 via #305): male recipients aged 66 to 69 on the New State Pension, summed over the published single years of age at each quarterly point inside calendar 2025 and averaged. Only the cells DWP populates are bound: the type follows the State Pension age date, so 66 to 69 is all new State Pension and 75 and over all pre-2016 (microcosm#1069 c3)." + }, + "axiom": { + "metric_name": "dwp/state_pension/recipients_male_66_69_new", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": [ + 66, + 67, + 68, + 69 + ], + "category_of_pension": "New State Pension", + "gender": "Male" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.state_pension", + "label": "State Pension recipients, male 66 to 69, New State Pension", + "value_operation": "monthly_window_sum_average", + "period_match_policy": "source_window", + "value_operands": [ + { + "dimension_values": { + "age_bands_and_single_year": 66, + "category_of_pension": "New State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 67, + "category_of_pension": "New State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 68, + "category_of_pension": "New State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 69, + "category_of_pension": "New State Pension", + "gender": "Male" + } + } + ] + }, + { + "target_id": "dwp.state_pension.recipients_female_66_69_new", + "family": "dwp_state_pension", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.benefits.state_pension.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.demographics.gender", + "equals": "female" + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 66 + }, + { + "concept": "uk.demographics.age", + "operator": "<=", + "value": 69 + }, + { + "concept": "uk.benefits.state_pension.type", + "equals": "new" + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "from_entity": "person", + "map_to": "household", + "metric_name": "dwp/state_pension/recipients_female_66_69_new", + "value_variable": "person_count", + "filters": [ + { + "variable": "state_pension", + "operator": ">", + "value": 0 + }, + { + "variable": "gender", + "equals": "FEMALE" + }, + { + "variable": "age", + "operator": ">=", + "value": 66 + }, + { + "variable": "age", + "operator": "<=", + "value": 69 + }, + { + "variable": "state_pension_type", + "operator": "==", + "value": "NEW" + } + ], + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "person" + } + ], + "notes": "DWP Stat-Xplore State Pension caseload, Great Britain residents (PolicyEngine/chronicle#302 via #305): female recipients aged 66 to 69 on the New State Pension, summed over the published single years of age at each quarterly point inside calendar 2025 and averaged. Only the cells DWP populates are bound: the type follows the State Pension age date, so 66 to 69 is all new State Pension and 75 and over all pre-2016 (microcosm#1069 c3)." + }, + "axiom": { + "metric_name": "dwp/state_pension/recipients_female_66_69_new", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": [ + 66, + 67, + 68, + 69 + ], + "category_of_pension": "New State Pension", + "gender": "Female" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.state_pension", + "label": "State Pension recipients, female 66 to 69, New State Pension", + "value_operation": "monthly_window_sum_average", + "period_match_policy": "source_window", + "value_operands": [ + { + "dimension_values": { + "age_bands_and_single_year": 66, + "category_of_pension": "New State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 67, + "category_of_pension": "New State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 68, + "category_of_pension": "New State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 69, + "category_of_pension": "New State Pension", + "gender": "Female" + } + } + ] + }, + { + "target_id": "dwp.state_pension.recipients_male_70_74_new", + "family": "dwp_state_pension", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.benefits.state_pension.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.demographics.gender", + "equals": "male" + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 70 + }, + { + "concept": "uk.demographics.age", + "operator": "<=", + "value": 74 + }, + { + "concept": "uk.benefits.state_pension.type", + "equals": "new" + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "from_entity": "person", + "map_to": "household", + "metric_name": "dwp/state_pension/recipients_male_70_74_new", + "value_variable": "person_count", + "filters": [ + { + "variable": "state_pension", + "operator": ">", + "value": 0 + }, + { + "variable": "gender", + "equals": "MALE" + }, + { + "variable": "age", + "operator": ">=", + "value": 70 + }, + { + "variable": "age", + "operator": "<=", + "value": 74 + }, + { + "variable": "state_pension_type", + "operator": "==", + "value": "NEW" + } + ], + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "person" + } + ], + "notes": "DWP Stat-Xplore State Pension caseload, Great Britain residents (PolicyEngine/chronicle#302 via #305): male recipients aged 70 to 74 on the New State Pension, summed over the published single years of age at each quarterly point inside calendar 2025 and averaged. Only the cells DWP populates are bound: the type follows the State Pension age date, so 66 to 69 is all new State Pension and 75 and over all pre-2016 (microcosm#1069 c3)." + }, + "axiom": { + "metric_name": "dwp/state_pension/recipients_male_70_74_new", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": [ + 70, + 71, + 72, + 73, + 74 + ], + "category_of_pension": "New State Pension", + "gender": "Male" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.state_pension", + "label": "State Pension recipients, male 70 to 74, New State Pension", + "value_operation": "monthly_window_sum_average", + "period_match_policy": "source_window", + "value_operands": [ + { + "dimension_values": { + "age_bands_and_single_year": 70, + "category_of_pension": "New State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 71, + "category_of_pension": "New State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 72, + "category_of_pension": "New State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 73, + "category_of_pension": "New State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 74, + "category_of_pension": "New State Pension", + "gender": "Male" + } + } + ] + }, + { + "target_id": "dwp.state_pension.recipients_male_70_74_pre_2016", + "family": "dwp_state_pension", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.benefits.state_pension.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.demographics.gender", + "equals": "male" + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 70 + }, + { + "concept": "uk.demographics.age", + "operator": "<=", + "value": 74 + }, + { + "concept": "uk.benefits.state_pension.type", + "equals": "pre_2016" + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "from_entity": "person", + "map_to": "household", + "metric_name": "dwp/state_pension/recipients_male_70_74_pre_2016", + "value_variable": "person_count", + "filters": [ + { + "variable": "state_pension", + "operator": ">", + "value": 0 + }, + { + "variable": "gender", + "equals": "MALE" + }, + { + "variable": "age", + "operator": ">=", + "value": 70 + }, + { + "variable": "age", + "operator": "<=", + "value": 74 + }, + { + "variable": "state_pension_type", + "operator": "==", + "value": "BASIC" + } + ], + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "person" + } + ], + "notes": "DWP Stat-Xplore State Pension caseload, Great Britain residents (PolicyEngine/chronicle#302 via #305): male recipients aged 70 to 74 on the Pre-2016 State Pension, summed over the published single years of age at each quarterly point inside calendar 2025 and averaged. Only the cells DWP populates are bound: the type follows the State Pension age date, so 66 to 69 is all new State Pension and 75 and over all pre-2016 (microcosm#1069 c3)." + }, + "axiom": { + "metric_name": "dwp/state_pension/recipients_male_70_74_pre_2016", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": [ + 70, + 71, + 72, + 73, + 74 + ], + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.state_pension", + "label": "State Pension recipients, male 70 to 74, Pre-2016 State Pension", + "value_operation": "monthly_window_sum_average", + "period_match_policy": "source_window", + "value_operands": [ + { + "dimension_values": { + "age_bands_and_single_year": 70, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 71, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 72, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 73, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 74, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + } + ] + }, + { + "target_id": "dwp.state_pension.recipients_female_70_74_new", + "family": "dwp_state_pension", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.benefits.state_pension.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.demographics.gender", + "equals": "female" + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 70 + }, + { + "concept": "uk.demographics.age", + "operator": "<=", + "value": 74 + }, + { + "concept": "uk.benefits.state_pension.type", + "equals": "new" + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "from_entity": "person", + "map_to": "household", + "metric_name": "dwp/state_pension/recipients_female_70_74_new", + "value_variable": "person_count", + "filters": [ + { + "variable": "state_pension", + "operator": ">", + "value": 0 + }, + { + "variable": "gender", + "equals": "FEMALE" + }, + { + "variable": "age", + "operator": ">=", + "value": 70 + }, + { + "variable": "age", + "operator": "<=", + "value": 74 + }, + { + "variable": "state_pension_type", + "operator": "==", + "value": "NEW" + } + ], + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "person" + } + ], + "notes": "DWP Stat-Xplore State Pension caseload, Great Britain residents (PolicyEngine/chronicle#302 via #305): female recipients aged 70 to 74 on the New State Pension, summed over the published single years of age at each quarterly point inside calendar 2025 and averaged. Only the cells DWP populates are bound: the type follows the State Pension age date, so 66 to 69 is all new State Pension and 75 and over all pre-2016 (microcosm#1069 c3)." + }, + "axiom": { + "metric_name": "dwp/state_pension/recipients_female_70_74_new", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": [ + 70, + 71, + 72, + 73, + 74 + ], + "category_of_pension": "New State Pension", + "gender": "Female" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.state_pension", + "label": "State Pension recipients, female 70 to 74, New State Pension", + "value_operation": "monthly_window_sum_average", + "period_match_policy": "source_window", + "value_operands": [ + { + "dimension_values": { + "age_bands_and_single_year": 70, + "category_of_pension": "New State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 71, + "category_of_pension": "New State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 72, + "category_of_pension": "New State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 73, + "category_of_pension": "New State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 74, + "category_of_pension": "New State Pension", + "gender": "Female" + } + } + ] + }, + { + "target_id": "dwp.state_pension.recipients_female_70_74_pre_2016", + "family": "dwp_state_pension", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.benefits.state_pension.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.demographics.gender", + "equals": "female" + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 70 + }, + { + "concept": "uk.demographics.age", + "operator": "<=", + "value": 74 + }, + { + "concept": "uk.benefits.state_pension.type", + "equals": "pre_2016" + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "from_entity": "person", + "map_to": "household", + "metric_name": "dwp/state_pension/recipients_female_70_74_pre_2016", + "value_variable": "person_count", + "filters": [ + { + "variable": "state_pension", + "operator": ">", + "value": 0 + }, + { + "variable": "gender", + "equals": "FEMALE" + }, + { + "variable": "age", + "operator": ">=", + "value": 70 + }, + { + "variable": "age", + "operator": "<=", + "value": 74 + }, + { + "variable": "state_pension_type", + "operator": "==", + "value": "BASIC" + } + ], + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "person" + } + ], + "notes": "DWP Stat-Xplore State Pension caseload, Great Britain residents (PolicyEngine/chronicle#302 via #305): female recipients aged 70 to 74 on the Pre-2016 State Pension, summed over the published single years of age at each quarterly point inside calendar 2025 and averaged. Only the cells DWP populates are bound: the type follows the State Pension age date, so 66 to 69 is all new State Pension and 75 and over all pre-2016 (microcosm#1069 c3)." + }, + "axiom": { + "metric_name": "dwp/state_pension/recipients_female_70_74_pre_2016", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": [ + 70, + 71, + 72, + 73, + 74 + ], + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.state_pension", + "label": "State Pension recipients, female 70 to 74, Pre-2016 State Pension", + "value_operation": "monthly_window_sum_average", + "period_match_policy": "source_window", + "value_operands": [ + { + "dimension_values": { + "age_bands_and_single_year": 70, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 71, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 72, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 73, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 74, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + } + ] + }, + { + "target_id": "dwp.state_pension.recipients_male_75_79_pre_2016", + "family": "dwp_state_pension", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.benefits.state_pension.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.demographics.gender", + "equals": "male" + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 75 + }, + { + "concept": "uk.demographics.age", + "operator": "<=", + "value": 79 + }, + { + "concept": "uk.benefits.state_pension.type", + "equals": "pre_2016" + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "from_entity": "person", + "map_to": "household", + "metric_name": "dwp/state_pension/recipients_male_75_79_pre_2016", + "value_variable": "person_count", + "filters": [ + { + "variable": "state_pension", + "operator": ">", + "value": 0 + }, + { + "variable": "gender", + "equals": "MALE" + }, + { + "variable": "age", + "operator": ">=", + "value": 75 + }, + { + "variable": "age", + "operator": "<=", + "value": 79 + }, + { + "variable": "state_pension_type", + "operator": "==", + "value": "BASIC" + } + ], + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "person" + } + ], + "notes": "DWP Stat-Xplore State Pension caseload, Great Britain residents (PolicyEngine/chronicle#302 via #305): male recipients aged 75 to 79 on the Pre-2016 State Pension, summed over the published single years of age at each quarterly point inside calendar 2025 and averaged. Only the cells DWP populates are bound: the type follows the State Pension age date, so 66 to 69 is all new State Pension and 75 and over all pre-2016 (microcosm#1069 c3)." + }, + "axiom": { + "metric_name": "dwp/state_pension/recipients_male_75_79_pre_2016", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": [ + 75, + 76, + 77, + 78, + 79 + ], + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.state_pension", + "label": "State Pension recipients, male 75 to 79, Pre-2016 State Pension", + "value_operation": "monthly_window_sum_average", + "period_match_policy": "source_window", + "value_operands": [ + { + "dimension_values": { + "age_bands_and_single_year": 75, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 76, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 77, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 78, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 79, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + } + ] + }, + { + "target_id": "dwp.state_pension.recipients_female_75_79_pre_2016", + "family": "dwp_state_pension", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.benefits.state_pension.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.demographics.gender", + "equals": "female" + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 75 + }, + { + "concept": "uk.demographics.age", + "operator": "<=", + "value": 79 + }, + { + "concept": "uk.benefits.state_pension.type", + "equals": "pre_2016" + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "from_entity": "person", + "map_to": "household", + "metric_name": "dwp/state_pension/recipients_female_75_79_pre_2016", + "value_variable": "person_count", + "filters": [ + { + "variable": "state_pension", + "operator": ">", + "value": 0 + }, + { + "variable": "gender", + "equals": "FEMALE" + }, + { + "variable": "age", + "operator": ">=", + "value": 75 + }, + { + "variable": "age", + "operator": "<=", + "value": 79 + }, + { + "variable": "state_pension_type", + "operator": "==", + "value": "BASIC" + } + ], + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "person" + } + ], + "notes": "DWP Stat-Xplore State Pension caseload, Great Britain residents (PolicyEngine/chronicle#302 via #305): female recipients aged 75 to 79 on the Pre-2016 State Pension, summed over the published single years of age at each quarterly point inside calendar 2025 and averaged. Only the cells DWP populates are bound: the type follows the State Pension age date, so 66 to 69 is all new State Pension and 75 and over all pre-2016 (microcosm#1069 c3)." + }, + "axiom": { + "metric_name": "dwp/state_pension/recipients_female_75_79_pre_2016", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": [ + 75, + 76, + 77, + 78, + 79 + ], + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.state_pension", + "label": "State Pension recipients, female 75 to 79, Pre-2016 State Pension", + "value_operation": "monthly_window_sum_average", + "period_match_policy": "source_window", + "value_operands": [ + { + "dimension_values": { + "age_bands_and_single_year": 75, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 76, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 77, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 78, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 79, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + } + ] + }, + { + "target_id": "dwp.state_pension.recipients_male_80_84_pre_2016", + "family": "dwp_state_pension", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.benefits.state_pension.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.demographics.gender", + "equals": "male" + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 80 + }, + { + "concept": "uk.demographics.age", + "operator": "<=", + "value": 84 + }, + { + "concept": "uk.benefits.state_pension.type", + "equals": "pre_2016" + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "from_entity": "person", + "map_to": "household", + "metric_name": "dwp/state_pension/recipients_male_80_84_pre_2016", + "value_variable": "person_count", + "filters": [ + { + "variable": "state_pension", + "operator": ">", + "value": 0 + }, + { + "variable": "gender", + "equals": "MALE" + }, + { + "variable": "age", + "operator": ">=", + "value": 80 + }, + { + "variable": "age", + "operator": "<=", + "value": 84 + }, + { + "variable": "state_pension_type", + "operator": "==", + "value": "BASIC" + } + ], + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "person" + } + ], + "notes": "DWP Stat-Xplore State Pension caseload, Great Britain residents (PolicyEngine/chronicle#302 via #305): male recipients aged 80 to 84 on the Pre-2016 State Pension, summed over the published single years of age at each quarterly point inside calendar 2025 and averaged. Only the cells DWP populates are bound: the type follows the State Pension age date, so 66 to 69 is all new State Pension and 75 and over all pre-2016 (microcosm#1069 c3)." + }, + "axiom": { + "metric_name": "dwp/state_pension/recipients_male_80_84_pre_2016", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": [ + 80, + 81, + 82, + 83, + 84 + ], + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.state_pension", + "label": "State Pension recipients, male 80 to 84, Pre-2016 State Pension", + "value_operation": "monthly_window_sum_average", + "period_match_policy": "source_window", + "value_operands": [ + { + "dimension_values": { + "age_bands_and_single_year": 80, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 81, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 82, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 83, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 84, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + } + ] + }, + { + "target_id": "dwp.state_pension.recipients_female_80_84_pre_2016", + "family": "dwp_state_pension", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.benefits.state_pension.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.demographics.gender", + "equals": "female" + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 80 + }, + { + "concept": "uk.demographics.age", + "operator": "<=", + "value": 84 + }, + { + "concept": "uk.benefits.state_pension.type", + "equals": "pre_2016" + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "from_entity": "person", + "map_to": "household", + "metric_name": "dwp/state_pension/recipients_female_80_84_pre_2016", + "value_variable": "person_count", + "filters": [ + { + "variable": "state_pension", + "operator": ">", + "value": 0 + }, + { + "variable": "gender", + "equals": "FEMALE" + }, + { + "variable": "age", + "operator": ">=", + "value": 80 + }, + { + "variable": "age", + "operator": "<=", + "value": 84 + }, + { + "variable": "state_pension_type", + "operator": "==", + "value": "BASIC" + } + ], + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "person" + } + ], + "notes": "DWP Stat-Xplore State Pension caseload, Great Britain residents (PolicyEngine/chronicle#302 via #305): female recipients aged 80 to 84 on the Pre-2016 State Pension, summed over the published single years of age at each quarterly point inside calendar 2025 and averaged. Only the cells DWP populates are bound: the type follows the State Pension age date, so 66 to 69 is all new State Pension and 75 and over all pre-2016 (microcosm#1069 c3)." + }, + "axiom": { + "metric_name": "dwp/state_pension/recipients_female_80_84_pre_2016", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": [ + 80, + 81, + 82, + 83, + 84 + ], + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.state_pension", + "label": "State Pension recipients, female 80 to 84, Pre-2016 State Pension", + "value_operation": "monthly_window_sum_average", + "period_match_policy": "source_window", + "value_operands": [ + { + "dimension_values": { + "age_bands_and_single_year": 80, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 81, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 82, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 83, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 84, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + } + ] + }, + { + "target_id": "dwp.state_pension.recipients_male_85_89_pre_2016", + "family": "dwp_state_pension", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.benefits.state_pension.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.demographics.gender", + "equals": "male" + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 85 + }, + { + "concept": "uk.demographics.age", + "operator": "<=", + "value": 89 + }, + { + "concept": "uk.benefits.state_pension.type", + "equals": "pre_2016" + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "from_entity": "person", + "map_to": "household", + "metric_name": "dwp/state_pension/recipients_male_85_89_pre_2016", + "value_variable": "person_count", + "filters": [ + { + "variable": "state_pension", + "operator": ">", + "value": 0 + }, + { + "variable": "gender", + "equals": "MALE" + }, + { + "variable": "age", + "operator": ">=", + "value": 85 + }, + { + "variable": "age", + "operator": "<=", + "value": 89 + }, + { + "variable": "state_pension_type", + "operator": "==", + "value": "BASIC" + } + ], + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "person" + } + ], + "notes": "DWP Stat-Xplore State Pension caseload, Great Britain residents (PolicyEngine/chronicle#302 via #305): male recipients aged 85 to 89 on the Pre-2016 State Pension, summed over the published single years of age at each quarterly point inside calendar 2025 and averaged. Only the cells DWP populates are bound: the type follows the State Pension age date, so 66 to 69 is all new State Pension and 75 and over all pre-2016 (microcosm#1069 c3)." + }, + "axiom": { + "metric_name": "dwp/state_pension/recipients_male_85_89_pre_2016", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": [ + 85, + 86, + 87, + 88, + 89 + ], + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.state_pension", + "label": "State Pension recipients, male 85 to 89, Pre-2016 State Pension", + "value_operation": "monthly_window_sum_average", + "period_match_policy": "source_window", + "value_operands": [ + { + "dimension_values": { + "age_bands_and_single_year": 85, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 86, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 87, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 88, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 89, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + } + } + ] + }, + { + "target_id": "dwp.state_pension.recipients_female_85_89_pre_2016", + "family": "dwp_state_pension", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.benefits.state_pension.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.demographics.gender", + "equals": "female" + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 85 + }, + { + "concept": "uk.demographics.age", + "operator": "<=", + "value": 89 + }, + { + "concept": "uk.benefits.state_pension.type", + "equals": "pre_2016" + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "from_entity": "person", + "map_to": "household", + "metric_name": "dwp/state_pension/recipients_female_85_89_pre_2016", + "value_variable": "person_count", + "filters": [ + { + "variable": "state_pension", + "operator": ">", + "value": 0 + }, + { + "variable": "gender", + "equals": "FEMALE" + }, + { + "variable": "age", + "operator": ">=", + "value": 85 + }, + { + "variable": "age", + "operator": "<=", + "value": 89 + }, + { + "variable": "state_pension_type", + "operator": "==", + "value": "BASIC" + } + ], + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "person" + } + ], + "notes": "DWP Stat-Xplore State Pension caseload, Great Britain residents (PolicyEngine/chronicle#302 via #305): female recipients aged 85 to 89 on the Pre-2016 State Pension, summed over the published single years of age at each quarterly point inside calendar 2025 and averaged. Only the cells DWP populates are bound: the type follows the State Pension age date, so 66 to 69 is all new State Pension and 75 and over all pre-2016 (microcosm#1069 c3)." + }, + "axiom": { + "metric_name": "dwp/state_pension/recipients_female_85_89_pre_2016", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": [ + 85, + 86, + 87, + 88, + 89 + ], + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.state_pension", + "label": "State Pension recipients, female 85 to 89, Pre-2016 State Pension", + "value_operation": "monthly_window_sum_average", + "period_match_policy": "source_window", + "value_operands": [ + { + "dimension_values": { + "age_bands_and_single_year": 85, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 86, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 87, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 88, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + }, + { + "dimension_values": { + "age_bands_and_single_year": 89, + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + } + } + ] + }, + { + "target_id": "dwp.state_pension.recipients_male_90_plus_pre_2016", + "family": "dwp_state_pension", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.benefits.state_pension.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.demographics.gender", + "equals": "male" + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 90 + }, + { + "concept": "uk.benefits.state_pension.type", + "equals": "pre_2016" + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "from_entity": "person", + "map_to": "household", + "metric_name": "dwp/state_pension/recipients_male_90_plus_pre_2016", + "value_variable": "person_count", + "filters": [ + { + "variable": "state_pension", + "operator": ">", + "value": 0 + }, + { + "variable": "gender", + "equals": "MALE" + }, + { + "variable": "age", + "operator": ">=", + "value": 90 + }, + { + "variable": "state_pension_type", + "operator": "==", + "value": "BASIC" + } + ], + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "person" + } + ], + "notes": "DWP Stat-Xplore State Pension caseload, Great Britain residents (PolicyEngine/chronicle#302 via #305): male recipients aged 90 and over on the Pre-2016 State Pension, summed over the published single years of age at each quarterly point inside calendar 2025 and averaged. Only the cells DWP populates are bound: the type follows the State Pension age date, so 66 to 69 is all new State Pension and 75 and over all pre-2016 (microcosm#1069 c3)." + }, + "axiom": { + "metric_name": "dwp/state_pension/recipients_male_90_plus_pre_2016", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": "90 and over", + "category_of_pension": "Pre-2016 State Pension", + "gender": "Male" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.state_pension", + "label": "State Pension recipients, male 90 and over, Pre-2016 State Pension", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dwp.state_pension.recipients_female_90_plus_pre_2016", + "family": "dwp_state_pension", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.benefits.state_pension.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.demographics.gender", + "equals": "female" + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 90 + }, + { + "concept": "uk.benefits.state_pension.type", + "equals": "pre_2016" + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "from_entity": "person", + "map_to": "household", + "metric_name": "dwp/state_pension/recipients_female_90_plus_pre_2016", + "value_variable": "person_count", + "filters": [ + { + "variable": "state_pension", + "operator": ">", + "value": 0 + }, + { + "variable": "gender", + "equals": "FEMALE" + }, + { + "variable": "age", + "operator": ">=", + "value": 90 + }, + { + "variable": "state_pension_type", + "operator": "==", + "value": "BASIC" + } + ], + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "person" + } + ], + "notes": "DWP Stat-Xplore State Pension caseload, Great Britain residents (PolicyEngine/chronicle#302 via #305): female recipients aged 90 and over on the Pre-2016 State Pension, summed over the published single years of age at each quarterly point inside calendar 2025 and averaged. Only the cells DWP populates are bound: the type follows the State Pension age date, so 66 to 69 is all new State Pension and 75 and over all pre-2016 (microcosm#1069 c3)." + }, + "axiom": { + "metric_name": "dwp/state_pension/recipients_female_90_plus_pre_2016", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_age_gender_type", + "dimensions": [ + "age_bands_and_single_year", + "category_of_pension", + "gender" + ], + "dimension_values": { + "age_bands_and_single_year": "90 and over", + "category_of_pension": "Pre-2016 State Pension", + "gender": "Female" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.state_pension", + "label": "State Pension recipients, female 90 and over, Pre-2016 State Pension", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dwp.state_pension.recipients_new_by_english_region", + "family": "dwp_state_pension", + "geography_levels": [ + "country", + "region" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.benefits.state_pension.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.benefits.state_pension.type", + "equals": "new" + }, + { + "concept": "uk.geography.country", + "equals": "england" + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "from_entity": "person", + "map_to": "household", + "metric_name": "dwp/state_pension/recipients_new_by_english_region", + "value_variable": "person_count", + "filters": [ + { + "variable": "state_pension", + "operator": ">", + "value": 0 + }, + { + "variable": "state_pension_type", + "operator": "==", + "value": "NEW" + } + ], + "household_conditions": [ + { + "variable": "country", + "entity": "household", + "reduce": "any", + "operator": "==", + "value": "ENGLAND", + "map_to": "person" + } + ], + "notes": "DWP Stat-Xplore State Pension caseload, Great Britain residents (PolicyEngine/chronicle#302 via #305): New State Pension recipients in each of the nine English regions (one row per region); Scotland and Wales are their own rows because the region tier fans out over England or the whole UK and DWP publishes no Northern Ireland cell, as the mean of the four quarterly points inside calendar 2025 (microcosm#1069 c3)." + }, + "axiom": { + "metric_name": "dwp/state_pension/recipients_new_by_english_region", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "groupby_dimension": "dwp.state_pension_region_type_gender", + "dimensions": [ + "category_of_pension", + "gender" + ], + "dimension_values": { + "category_of_pension": "New State Pension", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.state_pension", + "label": "State Pension recipients, New State Pension, English regions", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dwp.state_pension.recipients_new_scotland", + "family": "dwp_state_pension", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.benefits.state_pension.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.benefits.state_pension.type", + "equals": "new" + }, + { + "concept": "uk.geography.country", + "equals": "scotland" + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "from_entity": "person", + "map_to": "household", + "metric_name": "dwp/state_pension/recipients_new_scotland", + "value_variable": "person_count", + "filters": [ + { + "variable": "state_pension", + "operator": ">", + "value": 0 + }, + { + "variable": "state_pension_type", + "operator": "==", + "value": "NEW" + } + ], + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "==", + "value": "SCOTLAND", + "map_to": "person" + } + ], + "notes": "DWP Stat-Xplore State Pension caseload, Great Britain residents (PolicyEngine/chronicle#302 via #305): New State Pension recipients in Scotland, as the mean of the four quarterly points inside calendar 2025 (microcosm#1069 c3)." + }, + "axiom": { + "metric_name": "dwp/state_pension/recipients_new_scotland", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "groupby_dimension": "dwp.state_pension_region_type_gender", + "dimensions": [ + "category_of_pension", + "gender" + ], + "dimension_values": { + "category_of_pension": "New State Pension", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.state_pension", + "label": "State Pension recipients, New State Pension, Scotland", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dwp.state_pension.recipients_new_wales", + "family": "dwp_state_pension", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.benefits.state_pension.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.benefits.state_pension.type", + "equals": "new" + }, + { + "concept": "uk.geography.country", + "equals": "wales" + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "from_entity": "person", + "map_to": "household", + "metric_name": "dwp/state_pension/recipients_new_wales", + "value_variable": "person_count", + "filters": [ + { + "variable": "state_pension", + "operator": ">", + "value": 0 + }, + { + "variable": "state_pension_type", + "operator": "==", + "value": "NEW" + } + ], + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "==", + "value": "WALES", + "map_to": "person" + } + ], + "notes": "DWP Stat-Xplore State Pension caseload, Great Britain residents (PolicyEngine/chronicle#302 via #305): New State Pension recipients in Wales, as the mean of the four quarterly points inside calendar 2025 (microcosm#1069 c3)." + }, + "axiom": { + "metric_name": "dwp/state_pension/recipients_new_wales", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "groupby_dimension": "dwp.state_pension_region_type_gender", + "dimensions": [ + "category_of_pension", + "gender" + ], + "dimension_values": { + "category_of_pension": "New State Pension", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.state_pension", + "label": "State Pension recipients, New State Pension, Wales", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dwp.state_pension.recipients_pre_2016_by_english_region", + "family": "dwp_state_pension", + "geography_levels": [ + "country", + "region" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.benefits.state_pension.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.benefits.state_pension.type", + "equals": "pre_2016" + }, + { + "concept": "uk.geography.country", + "equals": "england" + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "from_entity": "person", + "map_to": "household", + "metric_name": "dwp/state_pension/recipients_pre_2016_by_english_region", + "value_variable": "person_count", + "filters": [ + { + "variable": "state_pension", + "operator": ">", + "value": 0 + }, + { + "variable": "state_pension_type", + "operator": "==", + "value": "BASIC" + } + ], + "household_conditions": [ + { + "variable": "country", + "entity": "household", + "reduce": "any", + "operator": "==", + "value": "ENGLAND", + "map_to": "person" + } + ], + "notes": "DWP Stat-Xplore State Pension caseload, Great Britain residents (PolicyEngine/chronicle#302 via #305): Pre-2016 State Pension recipients in each of the nine English regions (one row per region); Scotland and Wales are their own rows because the region tier fans out over England or the whole UK and DWP publishes no Northern Ireland cell, as the mean of the four quarterly points inside calendar 2025 (microcosm#1069 c3)." + }, + "axiom": { + "metric_name": "dwp/state_pension/recipients_pre_2016_by_english_region", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "groupby_dimension": "dwp.state_pension_region_type_gender", + "dimensions": [ + "category_of_pension", + "gender" + ], + "dimension_values": { + "category_of_pension": "Pre-2016 State Pension", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.state_pension", + "label": "State Pension recipients, Pre-2016 State Pension, English regions", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dwp.state_pension.recipients_pre_2016_scotland", + "family": "dwp_state_pension", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.benefits.state_pension.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.benefits.state_pension.type", + "equals": "pre_2016" + }, + { + "concept": "uk.geography.country", + "equals": "scotland" + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "from_entity": "person", + "map_to": "household", + "metric_name": "dwp/state_pension/recipients_pre_2016_scotland", + "value_variable": "person_count", + "filters": [ + { + "variable": "state_pension", + "operator": ">", + "value": 0 + }, + { + "variable": "state_pension_type", + "operator": "==", + "value": "BASIC" + } + ], + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "==", + "value": "SCOTLAND", + "map_to": "person" + } + ], + "notes": "DWP Stat-Xplore State Pension caseload, Great Britain residents (PolicyEngine/chronicle#302 via #305): Pre-2016 State Pension recipients in Scotland, as the mean of the four quarterly points inside calendar 2025 (microcosm#1069 c3)." + }, + "axiom": { + "metric_name": "dwp/state_pension/recipients_pre_2016_scotland", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "groupby_dimension": "dwp.state_pension_region_type_gender", + "dimensions": [ + "category_of_pension", + "gender" + ], + "dimension_values": { + "category_of_pension": "Pre-2016 State Pension", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.state_pension", + "label": "State Pension recipients, Pre-2016 State Pension, Scotland", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dwp.state_pension.recipients_pre_2016_wales", + "family": "dwp_state_pension", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.benefits.state_pension.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.benefits.state_pension.type", + "equals": "pre_2016" + }, + { + "concept": "uk.geography.country", + "equals": "wales" + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "from_entity": "person", + "map_to": "household", + "metric_name": "dwp/state_pension/recipients_pre_2016_wales", + "value_variable": "person_count", + "filters": [ + { + "variable": "state_pension", + "operator": ">", + "value": 0 + }, + { + "variable": "state_pension_type", + "operator": "==", + "value": "BASIC" + } + ], + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "==", + "value": "WALES", + "map_to": "person" + } + ], + "notes": "DWP Stat-Xplore State Pension caseload, Great Britain residents (PolicyEngine/chronicle#302 via #305): Pre-2016 State Pension recipients in Wales, as the mean of the four quarterly points inside calendar 2025 (microcosm#1069 c3)." + }, + "axiom": { + "metric_name": "dwp/state_pension/recipients_pre_2016_wales", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "groupby_dimension": "dwp.state_pension_region_type_gender", + "dimensions": [ + "category_of_pension", + "gender" + ], + "dimension_values": { + "category_of_pension": "Pre-2016 State Pension", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.state_pension", + "label": "State Pension recipients, Pre-2016 State Pension, Wales", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dwp.state_pension.recipients_new_by_weekly_amount", + "family": "dwp_state_pension", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.benefits.state_pension.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.benefits.state_pension.type", + "equals": "new" + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "from_entity": "person", + "map_to": "household", + "metric_name": "dwp/state_pension/recipients_new_by_weekly_amount", + "value_variable": "person_count", + "groupby_variable": "state_pension", + "band_period_factor": 52, + "band_filter_dimension": "grouped_amount_of_benefit", + "filters": [ + { + "variable": "state_pension", + "operator": ">", + "value": 0 + }, + { + "variable": "state_pension_type", + "operator": "==", + "value": "NEW" + } + ], + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "person" + } + ], + "notes": "DWP Stat-Xplore State Pension caseload, Great Britain residents (PolicyEngine/chronicle#302 via #305): New State Pension recipients by weekly amount band (DWP's half-open bands, 'Under £20.00' to '£300.00 and over'), sliced on the engine's annual State Pension at 52 weeks. Counts by band cannot be restated to another year's rates, so the window keeps the May, August and November 2025 points, which DWP pays at the 2025-26 rate the engine pays (microcosm#1069 R1). The publisher's 'all' margin is a total row and is left out by the detail measure pin." + }, + "axiom": { + "metric_name": "dwp/state_pension/recipients_new_by_weekly_amount", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_amount_band_type", + "dimensions": [ + "category_of_pension", + "grouped_amount_of_benefit" + ], + "dimension_values": { + "category_of_pension": "New State Pension" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.state_pension", + "label": "State Pension recipients by weekly amount, New State Pension", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dwp.state_pension.recipients_pre_2016_by_weekly_amount", + "family": "dwp_state_pension", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.benefits.state_pension.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.benefits.state_pension.type", + "equals": "pre_2016" + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "from_entity": "person", + "map_to": "household", + "metric_name": "dwp/state_pension/recipients_pre_2016_by_weekly_amount", + "value_variable": "person_count", + "groupby_variable": "state_pension", + "band_period_factor": 52, + "band_filter_dimension": "grouped_amount_of_benefit", + "filters": [ + { + "variable": "state_pension", + "operator": ">", + "value": 0 + }, + { + "variable": "state_pension_type", + "operator": "==", + "value": "BASIC" + } + ], + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "person" + } + ], + "notes": "DWP Stat-Xplore State Pension caseload, Great Britain residents (PolicyEngine/chronicle#302 via #305): Pre-2016 State Pension recipients by weekly amount band (DWP's half-open bands, 'Under £20.00' to '£300.00 and over'), sliced on the engine's annual State Pension at 52 weeks. Counts by band cannot be restated to another year's rates, so the window keeps the May, August and November 2025 points, which DWP pays at the 2025-26 rate the engine pays (microcosm#1069 R1). The publisher's 'all' margin is a total row and is left out by the detail measure pin." + }, + "axiom": { + "metric_name": "dwp/state_pension/recipients_pre_2016_by_weekly_amount", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload" + ], + "source_measure_id": "recipients", + "groupby_dimension": "dwp.state_pension_amount_band_type", + "dimensions": [ + "category_of_pension", + "grouped_amount_of_benefit" + ], + "dimension_values": { + "category_of_pension": "Pre-2016 State Pension" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.state_pension", + "label": "State Pension recipients by weekly amount, Pre-2016 State Pension", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dwp.pension_credit.benefit_units", + "family": "dwp_pension_credit", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "benunit", + "concept": "uk.benefit_unit.count", + "filters": [ + { + "concept": "uk.benefits.pension_credit.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dwp/pension_credit/benefit_units", + "filters": [ + { + "variable": "pension_credit", + "operator": ">", + "value": 0 + } + ], + "value_variable": "benunit_count", + "from_entity": "benunit", + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "benunit" + } + ], + "notes": "DWP Stat-Xplore Pension Credit caseload, Great Britain (claims, one per benefit unit; PolicyEngine/chronicle#302 via #305): every claim in payment in Great Britain, as the mean of the four quarterly points inside calendar 2025 (February, May, August, November), the State Pension window (microcosm#1069 R1). Bound at benefit-unit grain on pension_credit > 0." + }, + "axiom": { + "metric_name": "dwp/pension_credit/benefit_units", + "status": "pending", + "value_rule": "uk.benefit_unit.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.pension_credit_caseload" + ], + "source_measure_id": "total_claims", + "groupby_dimension": "dwp.pension_credit_type_partner_age", + "dimensions": [ + "age_bands_and_single_year", + "partner_indicator", + "type_of_pension_credit" + ], + "dimension_values": { + "age_bands_and_single_year": "all", + "partner_indicator": "all", + "type_of_pension_credit": "all" + }, + "entity_name": "benefit_unit", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.pension_credit", + "label": "Pension Credit benefit units, Great Britain", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dwp.pension_credit.benefit_units_guarantee_only_couple", + "family": "dwp_pension_credit", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "benunit", + "concept": "uk.benefit_unit.count", + "filters": [ + { + "concept": "uk.benefits.pension_credit.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.benefits.pension_credit.type", + "equals": "guarantee_only" + }, + { + "concept": "uk.benefit_unit.relation_type", + "equals": "couple" + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dwp/pension_credit/benefit_units_guarantee_only_couple", + "filters": [ + { + "variable": "pension_credit", + "operator": ">", + "value": 0 + }, + { + "variable": "guarantee_credit", + "operator": ">", + "value": 0 + }, + { + "variable": "savings_credit", + "operator": "<=", + "value": 0 + }, + { + "variable": "relation_type", + "operator": "==", + "value": "COUPLE" + } + ], + "value_variable": "benunit_count", + "from_entity": "benunit", + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "benunit" + } + ], + "notes": "DWP Stat-Xplore Pension Credit caseload, Great Britain (claims, one per benefit unit; PolicyEngine/chronicle#302 via #305): claims of Guarantee Credit only by a benefit unit that has a partner, all ages, as the mean of the four quarterly points inside calendar 2025. The type is read from the engine's paid components: Guarantee Credit and Savings Credit are each positive or zero on a unit with Pension Credit in payment; the partner cell is the engine's relation_type (microcosm#1069 c7)." + }, + "axiom": { + "metric_name": "dwp/pension_credit/benefit_units_guarantee_only_couple", + "status": "pending", + "value_rule": "uk.benefit_unit.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.pension_credit_caseload" + ], + "source_measure_id": "total_claims", + "groupby_dimension": "dwp.pension_credit_type_partner_age", + "dimensions": [ + "age_bands_and_single_year", + "partner_indicator", + "type_of_pension_credit" + ], + "dimension_values": { + "age_bands_and_single_year": "all", + "partner_indicator": "Has a partner", + "type_of_pension_credit": "Guarantee Credit only" + }, + "entity_name": "benefit_unit", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.pension_credit", + "label": "Pension Credit benefit units, Guarantee Credit only, has a partner", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dwp.pension_credit.benefit_units_guarantee_only_single", + "family": "dwp_pension_credit", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "benunit", + "concept": "uk.benefit_unit.count", + "filters": [ + { + "concept": "uk.benefits.pension_credit.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.benefits.pension_credit.type", + "equals": "guarantee_only" + }, + { + "concept": "uk.benefit_unit.relation_type", + "equals": "single" + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dwp/pension_credit/benefit_units_guarantee_only_single", + "filters": [ + { + "variable": "pension_credit", + "operator": ">", + "value": 0 + }, + { + "variable": "guarantee_credit", + "operator": ">", + "value": 0 + }, + { + "variable": "savings_credit", + "operator": "<=", + "value": 0 + }, + { + "variable": "relation_type", + "operator": "==", + "value": "SINGLE" + } + ], + "value_variable": "benunit_count", + "from_entity": "benunit", + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "benunit" + } + ], + "notes": "DWP Stat-Xplore Pension Credit caseload, Great Britain (claims, one per benefit unit; PolicyEngine/chronicle#302 via #305): claims of Guarantee Credit only by a benefit unit that has no partner, all ages, as the mean of the four quarterly points inside calendar 2025. The type is read from the engine's paid components: Guarantee Credit and Savings Credit are each positive or zero on a unit with Pension Credit in payment; the partner cell is the engine's relation_type (microcosm#1069 c7)." + }, + "axiom": { + "metric_name": "dwp/pension_credit/benefit_units_guarantee_only_single", + "status": "pending", + "value_rule": "uk.benefit_unit.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.pension_credit_caseload" + ], + "source_measure_id": "total_claims", + "groupby_dimension": "dwp.pension_credit_type_partner_age", + "dimensions": [ + "age_bands_and_single_year", + "partner_indicator", + "type_of_pension_credit" + ], + "dimension_values": { + "age_bands_and_single_year": "all", + "partner_indicator": "Has no partner", + "type_of_pension_credit": "Guarantee Credit only" + }, + "entity_name": "benefit_unit", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.pension_credit", + "label": "Pension Credit benefit units, Guarantee Credit only, has no partner", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dwp.pension_credit.benefit_units_savings_only_couple", + "family": "dwp_pension_credit", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "benunit", + "concept": "uk.benefit_unit.count", + "filters": [ + { + "concept": "uk.benefits.pension_credit.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.benefits.pension_credit.type", + "equals": "savings_only" + }, + { + "concept": "uk.benefit_unit.relation_type", + "equals": "couple" + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dwp/pension_credit/benefit_units_savings_only_couple", + "filters": [ + { + "variable": "pension_credit", + "operator": ">", + "value": 0 + }, + { + "variable": "guarantee_credit", + "operator": "<=", + "value": 0 + }, + { + "variable": "savings_credit", + "operator": ">", + "value": 0 + }, + { + "variable": "relation_type", + "operator": "==", + "value": "COUPLE" + } + ], + "value_variable": "benunit_count", + "from_entity": "benunit", + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "benunit" + } + ], + "notes": "DWP Stat-Xplore Pension Credit caseload, Great Britain (claims, one per benefit unit; PolicyEngine/chronicle#302 via #305): claims of Savings Credit only by a benefit unit that has a partner, all ages, as the mean of the four quarterly points inside calendar 2025. The type is read from the engine's paid components: Guarantee Credit and Savings Credit are each positive or zero on a unit with Pension Credit in payment; the partner cell is the engine's relation_type (microcosm#1069 c7)." + }, + "axiom": { + "metric_name": "dwp/pension_credit/benefit_units_savings_only_couple", + "status": "pending", + "value_rule": "uk.benefit_unit.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.pension_credit_caseload" + ], + "source_measure_id": "total_claims", + "groupby_dimension": "dwp.pension_credit_type_partner_age", + "dimensions": [ + "age_bands_and_single_year", + "partner_indicator", + "type_of_pension_credit" + ], + "dimension_values": { + "age_bands_and_single_year": "all", + "partner_indicator": "Has a partner", + "type_of_pension_credit": "Savings Credit only" + }, + "entity_name": "benefit_unit", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.pension_credit", + "label": "Pension Credit benefit units, Savings Credit only, has a partner", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dwp.pension_credit.benefit_units_savings_only_single", + "family": "dwp_pension_credit", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "benunit", + "concept": "uk.benefit_unit.count", + "filters": [ + { + "concept": "uk.benefits.pension_credit.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.benefits.pension_credit.type", + "equals": "savings_only" + }, + { + "concept": "uk.benefit_unit.relation_type", + "equals": "single" + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dwp/pension_credit/benefit_units_savings_only_single", + "filters": [ + { + "variable": "pension_credit", + "operator": ">", + "value": 0 + }, + { + "variable": "guarantee_credit", + "operator": "<=", + "value": 0 + }, + { + "variable": "savings_credit", + "operator": ">", + "value": 0 + }, + { + "variable": "relation_type", + "operator": "==", + "value": "SINGLE" + } + ], + "value_variable": "benunit_count", + "from_entity": "benunit", + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "benunit" + } + ], + "notes": "DWP Stat-Xplore Pension Credit caseload, Great Britain (claims, one per benefit unit; PolicyEngine/chronicle#302 via #305): claims of Savings Credit only by a benefit unit that has no partner, all ages, as the mean of the four quarterly points inside calendar 2025. The type is read from the engine's paid components: Guarantee Credit and Savings Credit are each positive or zero on a unit with Pension Credit in payment; the partner cell is the engine's relation_type (microcosm#1069 c7)." + }, + "axiom": { + "metric_name": "dwp/pension_credit/benefit_units_savings_only_single", + "status": "pending", + "value_rule": "uk.benefit_unit.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.pension_credit_caseload" + ], + "source_measure_id": "total_claims", + "groupby_dimension": "dwp.pension_credit_type_partner_age", + "dimensions": [ + "age_bands_and_single_year", + "partner_indicator", + "type_of_pension_credit" + ], + "dimension_values": { + "age_bands_and_single_year": "all", + "partner_indicator": "Has no partner", + "type_of_pension_credit": "Savings Credit only" + }, + "entity_name": "benefit_unit", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.pension_credit", + "label": "Pension Credit benefit units, Savings Credit only, has no partner", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dwp.pension_credit.benefit_units_both_couple", + "family": "dwp_pension_credit", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "benunit", + "concept": "uk.benefit_unit.count", + "filters": [ + { + "concept": "uk.benefits.pension_credit.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.benefits.pension_credit.type", + "equals": "both" + }, + { + "concept": "uk.benefit_unit.relation_type", + "equals": "couple" + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dwp/pension_credit/benefit_units_both_couple", + "filters": [ + { + "variable": "pension_credit", + "operator": ">", + "value": 0 + }, + { + "variable": "guarantee_credit", + "operator": ">", + "value": 0 + }, + { + "variable": "savings_credit", + "operator": ">", + "value": 0 + }, + { + "variable": "relation_type", + "operator": "==", + "value": "COUPLE" + } + ], + "value_variable": "benunit_count", + "from_entity": "benunit", + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "benunit" + } + ], + "notes": "DWP Stat-Xplore Pension Credit caseload, Great Britain (claims, one per benefit unit; PolicyEngine/chronicle#302 via #305): claims of Both Guarantee and Savings Credit by a benefit unit that has a partner, all ages, as the mean of the four quarterly points inside calendar 2025. The type is read from the engine's paid components: Guarantee Credit and Savings Credit are each positive or zero on a unit with Pension Credit in payment; the partner cell is the engine's relation_type (microcosm#1069 c7)." + }, + "axiom": { + "metric_name": "dwp/pension_credit/benefit_units_both_couple", + "status": "pending", + "value_rule": "uk.benefit_unit.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.pension_credit_caseload" + ], + "source_measure_id": "total_claims", + "groupby_dimension": "dwp.pension_credit_type_partner_age", + "dimensions": [ + "age_bands_and_single_year", + "partner_indicator", + "type_of_pension_credit" + ], + "dimension_values": { + "age_bands_and_single_year": "all", + "partner_indicator": "Has a partner", + "type_of_pension_credit": "Both Guarantee and Savings Credit" + }, + "entity_name": "benefit_unit", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.pension_credit", + "label": "Pension Credit benefit units, Both Guarantee and Savings Credit, has a partner", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dwp.pension_credit.benefit_units_both_single", + "family": "dwp_pension_credit", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "benunit", + "concept": "uk.benefit_unit.count", + "filters": [ + { + "concept": "uk.benefits.pension_credit.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.benefits.pension_credit.type", + "equals": "both" + }, + { + "concept": "uk.benefit_unit.relation_type", + "equals": "single" + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dwp/pension_credit/benefit_units_both_single", + "filters": [ + { + "variable": "pension_credit", + "operator": ">", + "value": 0 + }, + { + "variable": "guarantee_credit", + "operator": ">", + "value": 0 + }, + { + "variable": "savings_credit", + "operator": ">", + "value": 0 + }, + { + "variable": "relation_type", + "operator": "==", + "value": "SINGLE" + } + ], + "value_variable": "benunit_count", + "from_entity": "benunit", + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "benunit" + } + ], + "notes": "DWP Stat-Xplore Pension Credit caseload, Great Britain (claims, one per benefit unit; PolicyEngine/chronicle#302 via #305): claims of Both Guarantee and Savings Credit by a benefit unit that has no partner, all ages, as the mean of the four quarterly points inside calendar 2025. The type is read from the engine's paid components: Guarantee Credit and Savings Credit are each positive or zero on a unit with Pension Credit in payment; the partner cell is the engine's relation_type (microcosm#1069 c7)." + }, + "axiom": { + "metric_name": "dwp/pension_credit/benefit_units_both_single", + "status": "pending", + "value_rule": "uk.benefit_unit.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.pension_credit_caseload" + ], + "source_measure_id": "total_claims", + "groupby_dimension": "dwp.pension_credit_type_partner_age", + "dimensions": [ + "age_bands_and_single_year", + "partner_indicator", + "type_of_pension_credit" + ], + "dimension_values": { + "age_bands_and_single_year": "all", + "partner_indicator": "Has no partner", + "type_of_pension_credit": "Both Guarantee and Savings Credit" + }, + "entity_name": "benefit_unit", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.pension_credit", + "label": "Pension Credit benefit units, Both Guarantee and Savings Credit, has no partner", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dwp.pension_credit.benefit_units_65_69", + "family": "dwp_pension_credit", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "benunit", + "concept": "uk.benefit_unit.count", + "filters": [ + { + "concept": "uk.benefits.pension_credit.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 65 + }, + { + "concept": "uk.demographics.age", + "operator": "<=", + "value": 69 + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dwp/pension_credit/benefit_units_65_69", + "filters": [ + { + "variable": "pension_credit", + "operator": ">", + "value": 0 + }, + { + "variable": "eldest_adult_age", + "operator": ">=", + "value": 65 + }, + { + "variable": "eldest_adult_age", + "operator": "<=", + "value": 69 + } + ], + "value_variable": "benunit_count", + "from_entity": "benunit", + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "benunit" + } + ], + "notes": "DWP Stat-Xplore Pension Credit caseload, Great Britain (claims, one per benefit unit; PolicyEngine/chronicle#302 via #305): claims whose claimant is aged 65-69, every type and partner status, as the mean of the four quarterly points inside calendar 2025. The engine reads the age of the benefit unit's eldest adult: both partners must have reached State Pension age to claim, so the claimant and the eldest adult share the band except where a couple straddles a band edge (microcosm#1069 c7)." + }, + "axiom": { + "metric_name": "dwp/pension_credit/benefit_units_65_69", + "status": "pending", + "value_rule": "uk.benefit_unit.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.pension_credit_caseload" + ], + "source_measure_id": "total_claims", + "groupby_dimension": "dwp.pension_credit_type_partner_age", + "dimensions": [ + "age_bands_and_single_year", + "partner_indicator", + "type_of_pension_credit" + ], + "dimension_values": { + "age_bands_and_single_year": "65-69", + "partner_indicator": "all", + "type_of_pension_credit": "all" + }, + "entity_name": "benefit_unit", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.pension_credit", + "label": "Pension Credit benefit units, claimant aged 65 to 69", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dwp.pension_credit.benefit_units_70_74", + "family": "dwp_pension_credit", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "benunit", + "concept": "uk.benefit_unit.count", + "filters": [ + { + "concept": "uk.benefits.pension_credit.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 70 + }, + { + "concept": "uk.demographics.age", + "operator": "<=", + "value": 74 + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dwp/pension_credit/benefit_units_70_74", + "filters": [ + { + "variable": "pension_credit", + "operator": ">", + "value": 0 + }, + { + "variable": "eldest_adult_age", + "operator": ">=", + "value": 70 + }, + { + "variable": "eldest_adult_age", + "operator": "<=", + "value": 74 + } + ], + "value_variable": "benunit_count", + "from_entity": "benunit", + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "benunit" + } + ], + "notes": "DWP Stat-Xplore Pension Credit caseload, Great Britain (claims, one per benefit unit; PolicyEngine/chronicle#302 via #305): claims whose claimant is aged 70-74, every type and partner status, as the mean of the four quarterly points inside calendar 2025. The engine reads the age of the benefit unit's eldest adult: both partners must have reached State Pension age to claim, so the claimant and the eldest adult share the band except where a couple straddles a band edge (microcosm#1069 c7)." + }, + "axiom": { + "metric_name": "dwp/pension_credit/benefit_units_70_74", + "status": "pending", + "value_rule": "uk.benefit_unit.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.pension_credit_caseload" + ], + "source_measure_id": "total_claims", + "groupby_dimension": "dwp.pension_credit_type_partner_age", + "dimensions": [ + "age_bands_and_single_year", + "partner_indicator", + "type_of_pension_credit" + ], + "dimension_values": { + "age_bands_and_single_year": "70-74", + "partner_indicator": "all", + "type_of_pension_credit": "all" + }, + "entity_name": "benefit_unit", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.pension_credit", + "label": "Pension Credit benefit units, claimant aged 70 to 74", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dwp.pension_credit.benefit_units_75_79", + "family": "dwp_pension_credit", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "benunit", + "concept": "uk.benefit_unit.count", + "filters": [ + { + "concept": "uk.benefits.pension_credit.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 75 + }, + { + "concept": "uk.demographics.age", + "operator": "<=", + "value": 79 + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dwp/pension_credit/benefit_units_75_79", + "filters": [ + { + "variable": "pension_credit", + "operator": ">", + "value": 0 + }, + { + "variable": "eldest_adult_age", + "operator": ">=", + "value": 75 + }, + { + "variable": "eldest_adult_age", + "operator": "<=", + "value": 79 + } + ], + "value_variable": "benunit_count", + "from_entity": "benunit", + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "benunit" + } + ], + "notes": "DWP Stat-Xplore Pension Credit caseload, Great Britain (claims, one per benefit unit; PolicyEngine/chronicle#302 via #305): claims whose claimant is aged 75-79, every type and partner status, as the mean of the four quarterly points inside calendar 2025. The engine reads the age of the benefit unit's eldest adult: both partners must have reached State Pension age to claim, so the claimant and the eldest adult share the band except where a couple straddles a band edge (microcosm#1069 c7)." + }, + "axiom": { + "metric_name": "dwp/pension_credit/benefit_units_75_79", + "status": "pending", + "value_rule": "uk.benefit_unit.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.pension_credit_caseload" + ], + "source_measure_id": "total_claims", + "groupby_dimension": "dwp.pension_credit_type_partner_age", + "dimensions": [ + "age_bands_and_single_year", + "partner_indicator", + "type_of_pension_credit" + ], + "dimension_values": { + "age_bands_and_single_year": "75-79", + "partner_indicator": "all", + "type_of_pension_credit": "all" + }, + "entity_name": "benefit_unit", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.pension_credit", + "label": "Pension Credit benefit units, claimant aged 75 to 79", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dwp.pension_credit.benefit_units_80_84", + "family": "dwp_pension_credit", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "benunit", + "concept": "uk.benefit_unit.count", + "filters": [ + { + "concept": "uk.benefits.pension_credit.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 80 + }, + { + "concept": "uk.demographics.age", + "operator": "<=", + "value": 84 + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dwp/pension_credit/benefit_units_80_84", + "filters": [ + { + "variable": "pension_credit", + "operator": ">", + "value": 0 + }, + { + "variable": "eldest_adult_age", + "operator": ">=", + "value": 80 + }, + { + "variable": "eldest_adult_age", + "operator": "<=", + "value": 84 + } + ], + "value_variable": "benunit_count", + "from_entity": "benunit", + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "benunit" + } + ], + "notes": "DWP Stat-Xplore Pension Credit caseload, Great Britain (claims, one per benefit unit; PolicyEngine/chronicle#302 via #305): claims whose claimant is aged 80-84, every type and partner status, as the mean of the four quarterly points inside calendar 2025. The engine reads the age of the benefit unit's eldest adult: both partners must have reached State Pension age to claim, so the claimant and the eldest adult share the band except where a couple straddles a band edge (microcosm#1069 c7)." + }, + "axiom": { + "metric_name": "dwp/pension_credit/benefit_units_80_84", + "status": "pending", + "value_rule": "uk.benefit_unit.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.pension_credit_caseload" + ], + "source_measure_id": "total_claims", + "groupby_dimension": "dwp.pension_credit_type_partner_age", + "dimensions": [ + "age_bands_and_single_year", + "partner_indicator", + "type_of_pension_credit" + ], + "dimension_values": { + "age_bands_and_single_year": "80-84", + "partner_indicator": "all", + "type_of_pension_credit": "all" + }, + "entity_name": "benefit_unit", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.pension_credit", + "label": "Pension Credit benefit units, claimant aged 80 to 84", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dwp.pension_credit.benefit_units_85_89", + "family": "dwp_pension_credit", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "benunit", + "concept": "uk.benefit_unit.count", + "filters": [ + { + "concept": "uk.benefits.pension_credit.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 85 + }, + { + "concept": "uk.demographics.age", + "operator": "<=", + "value": 89 + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dwp/pension_credit/benefit_units_85_89", + "filters": [ + { + "variable": "pension_credit", + "operator": ">", + "value": 0 + }, + { + "variable": "eldest_adult_age", + "operator": ">=", + "value": 85 + }, + { + "variable": "eldest_adult_age", + "operator": "<=", + "value": 89 + } + ], + "value_variable": "benunit_count", + "from_entity": "benunit", + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "benunit" + } + ], + "notes": "DWP Stat-Xplore Pension Credit caseload, Great Britain (claims, one per benefit unit; PolicyEngine/chronicle#302 via #305): claims whose claimant is aged 85-89, every type and partner status, as the mean of the four quarterly points inside calendar 2025. The engine reads the age of the benefit unit's eldest adult: both partners must have reached State Pension age to claim, so the claimant and the eldest adult share the band except where a couple straddles a band edge (microcosm#1069 c7)." + }, + "axiom": { + "metric_name": "dwp/pension_credit/benefit_units_85_89", + "status": "pending", + "value_rule": "uk.benefit_unit.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.pension_credit_caseload" + ], + "source_measure_id": "total_claims", + "groupby_dimension": "dwp.pension_credit_type_partner_age", + "dimensions": [ + "age_bands_and_single_year", + "partner_indicator", + "type_of_pension_credit" + ], + "dimension_values": { + "age_bands_and_single_year": "85-89", + "partner_indicator": "all", + "type_of_pension_credit": "all" + }, + "entity_name": "benefit_unit", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.pension_credit", + "label": "Pension Credit benefit units, claimant aged 85 to 89", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dwp.pension_credit.benefit_units_90_plus", + "family": "dwp_pension_credit", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "benunit", + "concept": "uk.benefit_unit.count", + "filters": [ + { + "concept": "uk.benefits.pension_credit.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 90 + }, + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dwp/pension_credit/benefit_units_90_plus", + "filters": [ + { + "variable": "pension_credit", + "operator": ">", + "value": 0 + }, + { + "variable": "eldest_adult_age", + "operator": ">=", + "value": 90 + } + ], + "value_variable": "benunit_count", + "from_entity": "benunit", + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "benunit" + } + ], + "notes": "DWP Stat-Xplore Pension Credit caseload, Great Britain (claims, one per benefit unit; PolicyEngine/chronicle#302 via #305): claims whose claimant is aged 90 and over, every type and partner status, as the mean of the four quarterly points inside calendar 2025. The engine reads the age of the benefit unit's eldest adult: both partners must have reached State Pension age to claim, so the claimant and the eldest adult share the band except where a couple straddles a band edge (microcosm#1069 c7)." + }, + "axiom": { + "metric_name": "dwp/pension_credit/benefit_units_90_plus", + "status": "pending", + "value_rule": "uk.benefit_unit.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.pension_credit_caseload" + ], + "source_measure_id": "total_claims", + "groupby_dimension": "dwp.pension_credit_type_partner_age", + "dimensions": [ + "age_bands_and_single_year", + "partner_indicator", + "type_of_pension_credit" + ], + "dimension_values": { + "age_bands_and_single_year": "90 and over", + "partner_indicator": "all", + "type_of_pension_credit": "all" + }, + "entity_name": "benefit_unit", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.pension_credit", + "label": "Pension Credit benefit units, claimant aged 90 and over", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dfc_ni.pension_credit.benefit_units", + "family": "dwp_pension_credit", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "benunit", + "concept": "uk.benefit_unit.count", + "filters": [ + { + "concept": "uk.benefits.pension_credit.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.geography.country", + "equals": "northern_ireland" + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dfc_ni/pension_credit/benefit_units", + "filters": [ + { + "variable": "pension_credit", + "operator": ">", + "value": 0 + } + ], + "value_variable": "benunit_count", + "from_entity": "benunit", + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "==", + "value": "NORTHERN_IRELAND", + "map_to": "benunit" + } + ], + "notes": "DfC Northern Ireland benefit statistics, Pension Credit claimants (PolicyEngine/chronicle#302 via #305): all claimants (one claim per benefit unit), as the mean of the four quarterly points inside calendar 2025. With the Great Britain rows it completes the UK caseload (microcosm#1069 c7)." + }, + "axiom": { + "metric_name": "dfc_ni/pension_credit/benefit_units", + "status": "pending", + "value_rule": "uk.benefit_unit.count" + } + }, + "ledger_selector": { + "source_name": "dfc_ni", + "source_concept": [ + "dfc_ni.pension_credit_claimants" + ], + "source_measure_id": "claimants_all", + "dimensions": [], + "entity_name": "benefit_unit", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dfc_ni.pension_credit", + "label": "Pension Credit benefit units, Northern Ireland", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dwp.workplace_pension.employer_contributions", + "family": "dwp_workplace_pensions", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.pensions.contributions.employer.amount", + "filters": [ + { + "concept": "uk.geography.country", + "operator": "in", + "value": [ + "england", + "scotland", + "wales" + ] + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dwp/workplace_pension/employer_contributions", + "value_expression": "employer_pension_contributions + pension_contributions_via_salary_sacrifice", + "from_entity": "person", + "map_to": "household", + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "person" + } + ], + "notes": "DWP Workplace pension participation and savings trends 2025 (ONS ASHE, Great Britain, all savers, 2025 earnings terms; PolicyEngine/chronicle#302 via #305): employer contributions into workplace pensions in calendar 2025, against the engine's employer contributions plus salary sacrifice, which ASHE and DWP count as an employer contribution (microcosm#1069 c9, R6)." + }, + "axiom": { + "metric_name": "dwp/workplace_pension/employer_contributions", + "status": "pending", + "value_rule": "uk.pensions.contributions.employer.amount" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.workplace_pension_annual_saving", + "entity_name": "person", + "dimensions": [ + "price_basis", + "saver_population", + "saving_component", + "sector" + ], + "period_type": "calendar_year", + "period_value": 2025, + "dimension_values": { + "price_basis": "2025_earnings_terms", + "saver_population": "all_savers", + "saving_component": "employer_contributions", + "sector": "all" + } + }, + "category_id": "dwp.workplace_pensions", + "label": "Employer workplace pension contributions, Great Britain", + "period_match_policy": "exact" + }, + { + "target_id": "dwp.attendance_allowance.recipients_england", + "family": "dwp_attendance_allowance", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.benefits.attendance_allowance.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.geography.country", + "equals": "england" + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dwp/attendance_allowance/recipients_england", + "value_variable": "person_count", + "from_entity": "person", + "map_to": "household", + "filters": [ + { + "variable": "attendance_allowance", + "operator": ">", + "value": 0 + } + ], + "household_conditions": [ + { + "variable": "country", + "entity": "household", + "reduce": "any", + "operator": "==", + "value": "ENGLAND", + "map_to": "person" + } + ], + "notes": "DWP Stat-Xplore Attendance Allowance cases with entitlement (PolicyEngine/chronicle#302 via #305): cases with entitlement in England, every award rate, as the mean of the four quarterly points inside calendar 2025 (microcosm#1069 c10). Scotland is not bound: its Attendance Allowance caseload moves to Pension Age Disability Payment through 2025, which the engine does not model." + }, + "axiom": { + "metric_name": "dwp/attendance_allowance/recipients_england", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.attendance_allowance_cases_with_entitlement" + ], + "source_measure_id": "total_cases_with_entitlement", + "dimensions": [ + "aa_award_type", + "age_bands_and_single_year", + "gender" + ], + "dimension_values": { + "aa_award_type": "all", + "age_bands_and_single_year": "all", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.attendance_allowance", + "label": "Attendance Allowance recipients, England", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dwp.attendance_allowance.recipients_wales", + "family": "dwp_attendance_allowance", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.benefits.attendance_allowance.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.geography.country", + "equals": "wales" + } + ], + "source_months": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dwp/attendance_allowance/recipients_wales", + "value_variable": "person_count", + "from_entity": "person", + "map_to": "household", + "filters": [ + { + "variable": "attendance_allowance", + "operator": ">", + "value": 0 + } + ], + "household_conditions": [ + { + "variable": "country", + "entity": "household", + "reduce": "any", + "operator": "==", + "value": "WALES", + "map_to": "person" + } + ], + "notes": "DWP Stat-Xplore Attendance Allowance cases with entitlement (PolicyEngine/chronicle#302 via #305): cases with entitlement in Wales, every award rate, as the mean of the four quarterly points inside calendar 2025 (microcosm#1069 c10). Scotland is not bound: its Attendance Allowance caseload moves to Pension Age Disability Payment through 2025, which the engine does not model." + }, + "axiom": { + "metric_name": "dwp/attendance_allowance/recipients_wales", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.attendance_allowance_cases_with_entitlement" + ], + "source_measure_id": "total_cases_with_entitlement", + "dimensions": [ + "aa_award_type", + "age_bands_and_single_year", + "gender" + ], + "dimension_values": { + "aa_award_type": "all", + "age_bands_and_single_year": "all", + "gender": "all" + }, + "entity_name": "person", + "period_type": "month", + "period_value": [ + "2025-02", + "2025-05", + "2025-08", + "2025-11" + ] + }, + "category_id": "dwp.attendance_allowance", + "label": "Attendance Allowance recipients, Wales", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dwp.hb.households_pension_age", + "family": "dwp_housing_benefit", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "benunit", + "concept": "uk.benefit_unit.count", + "filters": [ + { + "concept": "uk.benefits.housing_benefit.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 66 + } + ], + "source_months": [ + "2025-01", + "2025-02", + "2025-03", + "2025-04", + "2025-05", + "2025-06", + "2025-07", + "2025-08", + "2025-09", + "2025-10", + "2025-11", + "2025-12" + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dwp/hb/households_pension_age", + "value_variable": "benunit_count", + "from_entity": "benunit", + "filters": [ + { + "variable": "housing_benefit", + "operator": ">", + "value": 0 + }, + { + "variable": "eldest_adult_age", + "operator": ">=", + "value": 66 + } + ], + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "benunit" + } + ], + "notes": "DWP Stat-Xplore Housing Benefit caseload by client type and tenure (PolicyEngine/chronicle#259 / #260): pension-age claims , mean monthly Great Britain caseload over the twelve months of calendar 2025, the window of the existing Housing Benefit rows. DWP's pension-age client type is a claim whose claimant or partner has reached State Pension age; the engine reads the age of the benefit unit's eldest adult against 66, the State Pension age of everyone who reaches it in 2025 (microcosm#1069 c10, #867)." + }, + "axiom": { + "metric_name": "dwp/hb/households_pension_age", + "status": "pending", + "value_rule": "uk.benefit_unit.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.housing_benefit_claimants", + "groupby_dimension": "dwp.hb_client_type", + "dimensions": [ + "client_type", + "private_or_social_rented" + ], + "dimension_values": { + "client_type": "Pension age", + "private_or_social_rented": "all" + }, + "source_measure_id": "total_claimants", + "period_type": "month", + "period_value": [ + "2025-01", + "2025-02", + "2025-03", + "2025-04", + "2025-05", + "2025-06", + "2025-07", + "2025-08", + "2025-09", + "2025-10", + "2025-11", + "2025-12" + ] + }, + "category_id": "dwp.legacy_benefits", + "label": "Housing Benefit benefit units, pension age", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dwp.hb.households_pension_age_social_rented", + "family": "dwp_housing_benefit", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "benunit", + "concept": "uk.benefit_unit.count", + "filters": [ + { + "concept": "uk.benefits.housing_benefit.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 66 + }, + { + "concept": "uk.household.tenure", + "operator": "in", + "value": [ + "rent_from_council", + "rent_from_housing_association" + ] + } + ], + "source_months": [ + "2025-01", + "2025-02", + "2025-03", + "2025-04", + "2025-05", + "2025-06", + "2025-07", + "2025-08", + "2025-09", + "2025-10", + "2025-11", + "2025-12" + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dwp/hb/households_pension_age_social_rented", + "value_variable": "benunit_count", + "from_entity": "benunit", + "filters": [ + { + "variable": "housing_benefit", + "operator": ">", + "value": 0 + }, + { + "variable": "eldest_adult_age", + "operator": ">=", + "value": 66 + }, + { + "variable": "benunit_tenure_type", + "operator": "in", + "value": [ + "RENT_FROM_COUNCIL", + "RENT_FROM_HA" + ] + } + ], + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "benunit" + } + ], + "notes": "DWP Stat-Xplore Housing Benefit caseload by client type and tenure (PolicyEngine/chronicle#259 / #260): pension-age claims social rented sector, mean monthly Great Britain caseload over the twelve months of calendar 2025, the window of the existing Housing Benefit rows. DWP's pension-age client type is a claim whose claimant or partner has reached State Pension age; the engine reads the age of the benefit unit's eldest adult against 66, the State Pension age of everyone who reaches it in 2025 (microcosm#1069 c10, #867)." + }, + "axiom": { + "metric_name": "dwp/hb/households_pension_age_social_rented", + "status": "pending", + "value_rule": "uk.benefit_unit.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.housing_benefit_claimants", + "groupby_dimension": "dwp.hb_client_type", + "dimensions": [ + "client_type", + "private_or_social_rented" + ], + "dimension_values": { + "client_type": "Pension age", + "private_or_social_rented": "Social Rented Sector" + }, + "source_measure_id": "claimants", + "period_type": "month", + "period_value": [ + "2025-01", + "2025-02", + "2025-03", + "2025-04", + "2025-05", + "2025-06", + "2025-07", + "2025-08", + "2025-09", + "2025-10", + "2025-11", + "2025-12" + ] + }, + "category_id": "dwp.legacy_benefits", + "label": "Housing Benefit benefit units, pension age, social rented sector", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "dwp.hb.households_pension_age_private_rented", + "family": "dwp_housing_benefit", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "benunit", + "concept": "uk.benefit_unit.count", + "filters": [ + { + "concept": "uk.benefits.housing_benefit.amount", + "operator": ">", + "value": 0 + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 66 + }, + { + "concept": "uk.household.tenure", + "operator": "in", + "value": [ + "rent_privately" + ] + } + ], + "source_months": [ + "2025-01", + "2025-02", + "2025-03", + "2025-04", + "2025-05", + "2025-06", + "2025-07", + "2025-08", + "2025-09", + "2025-10", + "2025-11", + "2025-12" + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dwp/hb/households_pension_age_private_rented", + "value_variable": "benunit_count", + "from_entity": "benunit", + "filters": [ + { + "variable": "housing_benefit", + "operator": ">", + "value": 0 + }, + { + "variable": "eldest_adult_age", + "operator": ">=", + "value": 66 + }, + { + "variable": "benunit_tenure_type", + "operator": "in", + "value": [ + "RENT_PRIVATELY" + ] + } + ], + "household_conditions": [ + { + "variable": "region", + "entity": "household", + "reduce": "any", + "operator": "in", + "value": [ + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND" + ], + "map_to": "benunit" + } + ], + "notes": "DWP Stat-Xplore Housing Benefit caseload by client type and tenure (PolicyEngine/chronicle#259 / #260): pension-age claims private rented sector, mean monthly Great Britain caseload over the twelve months of calendar 2025, the window of the existing Housing Benefit rows. DWP's pension-age client type is a claim whose claimant or partner has reached State Pension age; the engine reads the age of the benefit unit's eldest adult against 66, the State Pension age of everyone who reaches it in 2025 (microcosm#1069 c10, #867)." + }, + "axiom": { + "metric_name": "dwp/hb/households_pension_age_private_rented", + "status": "pending", + "value_rule": "uk.benefit_unit.count" + } + }, + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.housing_benefit_claimants", + "groupby_dimension": "dwp.hb_client_type", + "dimensions": [ + "client_type", + "private_or_social_rented" + ], + "dimension_values": { + "client_type": "Pension age", + "private_or_social_rented": "Private Rented Sector" + }, + "source_measure_id": "claimants", + "period_type": "month", + "period_value": [ + "2025-01", + "2025-02", + "2025-03", + "2025-04", + "2025-05", + "2025-06", + "2025-07", + "2025-08", + "2025-09", + "2025-10", + "2025-11", + "2025-12" + ] + }, + "category_id": "dwp.legacy_benefits", + "label": "Housing Benefit benefit units, pension age, private rented sector", + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" + }, + { + "target_id": "hmrc.salary_sacrifice.it_relief_total", + "family": "hmrc_salary_sacrifice", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.tax.salary_sacrifice.income_tax_relief" + }, + "bindings": { + "policyengine": { + "metric_name": "hmrc/salary_sacrifice_it_relief_total", + "kind": "input_substitution_counterfactual", + "zeroed_input": "pension_contributions_via_salary_sacrifice", + "folded_into": "employment_income", + "output_delta": "counterfactual_minus_baseline", + "output_variable": "income_tax", + "from_entity": "person", + "map_to": "household", + "notes": "HMRC Private pension statistics Table 6.2, 2024-25: income-tax relief on salary-sacrificed pension contributions, all rates, as the rise in income tax when the sacrifice is returned to pay (one counterfactual simulation from the same frame at the calibration year, uk-data's recipe; microcosm#1069 c11, R7). income_tax carries the High Income Child Benefit charge and the annual-allowance charge, so the delta includes their response to the returned pay (measured on the c11 arm). The rate-band rows wait for a band test that reads after-allowance thresholds and the Scottish bands." + }, + "axiom": { + "metric_name": "hmrc/salary_sacrifice_it_relief_total", + "status": "pending", + "value_rule": "uk.tax.salary_sacrifice.income_tax_relief" + } + }, + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.ss_income_tax_relief_total" + }, + "category_id": "hmrc.salary_sacrifice_income_tax_relief", + "label": "Income Tax relief total" + }, + { + "target_id": "hmrc.self_employment_income.amount", + "family": "hmrc", + "geography_levels": [ + "constituency", + "local_authority" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.income.self_employment.amount", + "filters": [ + { + "concept": "uk.tax.income_tax", + "operator": ">", + "value": 0 + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "hmrc/self_employment_income/amount", + "value_variable": "self_employment_income", + "from_entity": "person", + "map_to": "household", + "filters": [ + { + "variable": "income_tax", + "operator": ">", + "value": 0 + } + ] + }, + "axiom": { + "metric_name": "hmrc/self_employment_income/amount", + "status": "pending", + "value_rule": "uk.income.self_employment.amount" + } + }, + "ledger_selector": { + "source_name": "hmrc", + "source_measure_id": [ + "self_employment_income_count", + "self_employment_income_mean" + ], + "record_set_spec_id": [ + "uk.local_geography.spi_income.by_constituency.v1", + "uk.local_geography.spi_income.by_local_authority.v1" + ] + }, + "selector_note": "No Chronicle amount fact exists; count_x_mean consumes the ordered count and mean facts from the same SPI area record-set spec.", + "category_id": "hmrc.tax_statistics", + "label": "Amount" + }, + { + "target_id": "hmrc.self_employment_income.count", + "family": "hmrc", + "geography_levels": [ + "constituency", + "local_authority" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.income.self_employment.amount", + "operator": "!=", + "value": 0 + }, + { + "concept": "uk.tax.income_tax", + "operator": ">", + "value": 0 + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "hmrc/self_employment_income/count", + "value_variable": "person_count", + "from_entity": "person", + "map_to": "household", + "filters": [ + { + "variable": "self_employment_income", + "operator": "!=", + "value": 0 + }, + { + "variable": "income_tax", + "operator": ">", + "value": 0 + } + ] + }, + "axiom": { + "metric_name": "hmrc/self_employment_income/count", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "hmrc", + "source_measure_id": "self_employment_income_count", + "record_set_spec_id": [ + "uk.local_geography.spi_income.by_constituency.v1", + "uk.local_geography.spi_income.by_local_authority.v1" + ] + }, + "category_id": "hmrc.tax_statistics", + "label": "Count" + }, + { + "target_id": "hmrc.employment_income.amount", + "family": "hmrc", + "geography_levels": [ + "constituency", + "local_authority" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.income.employment.amount", + "filters": [ + { + "concept": "uk.tax.income_tax", + "operator": ">", + "value": 0 + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "hmrc/employment_income/amount", + "value_variable": "employment_income", "from_entity": "person", "map_to": "household", "filters": [ @@ -23115,6 +29177,11 @@ "diagnostic_references": { "obr.capital_gains_tax": { "attach_to_target": "hmrc.cgt.liability_total", + "metadata_prefix": "cgt_cash_diagnostic", + "value_unit": "gbp", + "receipt_metadata": { + "cgt_cash_reconciliation_status": "unresolved" + }, "required_period_type": "fiscal_year", "required_assertion": "source_projection", "reference": { @@ -23138,6 +29205,186 @@ "ledger_fact_key": "ledger.aggregate_fact.v2:93699bb9caa7ec0d6833f420" }, "notes": "Original March 2026 OBR FY2025-26 cash forecast retained unchanged as diagnostic provenance only. No liability-to-cash payment bridge is identified; never insert this diagnostic into the fitting registry." + }, + "obr.state_pension": { + "attach_to_target": "dwp.state_pension.amount", + "metadata_prefix": "obr_state_pension_diagnostic", + "value_unit": "gbp", + "required_period_type": "fiscal_year", + "required_assertion": "source_projection", + "reference": { + "name": "obr.state_pension", + "ledger_selector": { + "source_name": "obr", + "source_concept": "obr.state_pension", + "entity_name": "person", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "person", + "measure": "obr/state_pension", + "family": "obr", + "period": 2025, + "metadata": { + "diagnostic_role": "efo_forecast_definition_differs" + }, + "assertion_policy": "allow_source_projection", + "period_match_policy": "exact", + "ledger_fact_key": "ledger.aggregate_fact.v2:567e55f9f73df2808c1c4be8" + }, + "notes": "March 2026 OBR FY2025-26 State Pension forecast retained unchanged as diagnostic provenance (microcosm#1069 R4). It matches DWP's Great Britain total including pensioners paid outside the UK and, on that evidence, leaves out Northern Ireland, so it measures a different quantity from the bound resident level; never insert it into the fitting registry." + }, + "dwp.state_pension.forecast_expenditure": { + "attach_to_target": "dwp.state_pension.amount", + "metadata_prefix": "dwp_forecast_state_pension_diagnostic", + "value_unit": "gbp", + "required_period_type": "fiscal_year", + "required_assertion": "source_projection", + "reference": { + "name": "dwp.state_pension.forecast_expenditure", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.benefit_expenditure_amount", + "entity_name": "government", + "geography_level": "country", + "geography_id": "K03000001", + "dimension_values": { + "benefit_forecast_line": "state_pension__total" + } + }, + "entity": "person", + "measure": "dwp/state_pension/forecast_expenditure", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "diagnostic_role": "forecast_table_line_definition_differs" + }, + "assertion_policy": "allow_source_projection", + "period_match_policy": "exact", + "ledger_fact_key": "ledger.aggregate_fact.v2:0d513485be6af9f8b0ee51a6" + }, + "notes": "DWP benefit expenditure and caseload tables, Spring 2026, FY2025-26 (PolicyEngine/chronicle#302 via #305), retained as diagnostic provenance beside the resident level (microcosm#1069 R2): the forecast line counts Great Britain including pensioners paid outside the UK and, being a fiscal-year projection, is a different quantity from the bound calendar-2025 resident rows. Never insert it into the fitting registry." + }, + "dwp.state_pension.forecast_expenditure_paid_abroad": { + "attach_to_target": "dwp.state_pension.amount", + "metadata_prefix": "dwp_forecast_state_pension_paid_abroad_diagnostic", + "value_unit": "gbp", + "required_period_type": "fiscal_year", + "required_assertion": "source_projection", + "reference": { + "name": "dwp.state_pension.forecast_expenditure_paid_abroad", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.benefit_expenditure_amount", + "entity_name": "government", + "geography_level": "country", + "geography_id": "K03000001", + "dimension_values": { + "benefit_forecast_line": "state_pension__state_pension_paid_outside_uk_included_above" + } + }, + "entity": "person", + "measure": "dwp/state_pension/forecast_expenditure_paid_abroad", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "diagnostic_role": "forecast_table_line_definition_differs" + }, + "assertion_policy": "allow_source_projection", + "period_match_policy": "exact", + "ledger_fact_key": "ledger.aggregate_fact.v2:64a0093265b3a376331360ed" + }, + "notes": "DWP benefit expenditure and caseload tables, Spring 2026, FY2025-26 (PolicyEngine/chronicle#302 via #305), retained as diagnostic provenance beside the resident level (microcosm#1069 R2): the forecast line counts Great Britain including pensioners paid outside the UK and, being a fiscal-year projection, is a different quantity from the bound calendar-2025 resident rows. Never insert it into the fitting registry." + }, + "dwp.state_pension.forecast_caseload": { + "attach_to_target": "dwp.state_pension.recipients", + "metadata_prefix": "dwp_forecast_state_pension_caseload_diagnostic", + "value_unit": "count", + "required_period_type": "fiscal_year", + "required_assertion": "source_projection", + "reference": { + "name": "dwp.state_pension.forecast_caseload", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.benefit_caseload_count", + "entity_name": "person", + "geography_level": "country", + "geography_id": "K03000001", + "dimension_values": { + "benefit_forecast_line": "state_pension__total_state_pension_caseload" + } + }, + "entity": "person", + "measure": "dwp/state_pension/forecast_caseload", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "diagnostic_role": "forecast_table_line_definition_differs" + }, + "assertion_policy": "allow_source_projection", + "period_match_policy": "exact", + "ledger_fact_key": "ledger.aggregate_fact.v2:20717cd0a29cd2184abe1e6f" + }, + "notes": "DWP benefit expenditure and caseload tables, Spring 2026, FY2025-26 (PolicyEngine/chronicle#302 via #305), retained as diagnostic provenance beside the resident level (microcosm#1069 R2): the forecast line counts Great Britain including pensioners paid outside the UK and, being a fiscal-year projection, is a different quantity from the bound calendar-2025 resident rows. Never insert it into the fitting registry." + }, + "dwp.state_pension.forecast_caseload_paid_abroad": { + "attach_to_target": "dwp.state_pension.recipients", + "metadata_prefix": "dwp_forecast_state_pension_caseload_paid_abroad_diagnostic", + "value_unit": "count", + "required_period_type": "fiscal_year", + "required_assertion": "source_projection", + "reference": { + "name": "dwp.state_pension.forecast_caseload_paid_abroad", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.benefit_caseload_count", + "entity_name": "person", + "geography_level": "country", + "geography_id": "K03000001", + "dimension_values": { + "benefit_forecast_line": "state_pension__state_pension_paid_outside_uk_included_above" + } + }, + "entity": "person", + "measure": "dwp/state_pension/forecast_caseload_paid_abroad", + "family": "dwp_state_pension", + "period": 2025, + "metadata": { + "diagnostic_role": "forecast_table_line_definition_differs" + }, + "assertion_policy": "allow_source_projection", + "period_match_policy": "exact", + "ledger_fact_key": "ledger.aggregate_fact.v2:fc1a88f15ba47efd9dc496ef" + }, + "notes": "DWP benefit expenditure and caseload tables, Spring 2026, FY2025-26 (PolicyEngine/chronicle#302 via #305), retained as diagnostic provenance beside the resident level (microcosm#1069 R2): the forecast line counts Great Britain including pensioners paid outside the UK and, being a fiscal-year projection, is a different quantity from the bound calendar-2025 resident rows. Never insert it into the fitting registry." + }, + "dwp.winter_fuel_payment.recipients": { + "attach_to_target": "obr.winter_fuel_allowance", + "metadata_prefix": "dwp_winter_fuel_recipients_diagnostic", + "value_unit": "count", + "required_period_type": "fiscal_year", + "required_assertion": "observation", + "reference": { + "name": "dwp.winter_fuel_payment.recipients", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.winter_fuel_payment_beneficiaries", + "entity_name": "person", + "geography_level": "country", + "geography_id": "K04000001" + }, + "entity": "person", + "measure": "dwp/winter_fuel_payment/recipients", + "family": "dwp_winter_fuel", + "period": 2025, + "metadata": { + "diagnostic_role": "payment_before_recovery_definition_differs" + }, + "assertion_policy": "observed_only", + "period_match_policy": "exact", + "ledger_fact_key": "ledger.aggregate_fact.v2:31256472aba8a0b143c30697" + }, + "notes": "DWP Winter Fuel Payment statistics, winter 2025/26 recipients in England and Wales (11.0m), retained as diagnostic provenance beside the bound OBR line (microcosm#1069 c10): DWP counts everyone paid and HMRC recovers the payment above £35,000 later, while the engine withholds the household payment above £35,000 (PolicyEngine/policyengine-uk#1760), so the count measures a different quantity until the engine separates payment from recovery. Never insert it into the fitting registry." } }, "hierarchy": { @@ -23186,6 +29433,9 @@ }, "mhclg": { "label": "Ministry of Housing, Communities and Local Government" + }, + "dfc_ni": { + "label": "Department for Communities (Northern Ireland)" } }, "categories": { @@ -23344,6 +29594,30 @@ "hmrc.income_tax_liabilities_statistics": { "provider_id": "hmrc", "label": "Income Tax liabilities statistics" + }, + "dwp.state_pension": { + "provider_id": "dwp", + "label": "State Pension" + }, + "dfc_ni.state_pension": { + "provider_id": "dfc_ni", + "label": "State Pension" + }, + "dwp.pension_credit": { + "provider_id": "dwp", + "label": "Pension Credit" + }, + "dfc_ni.pension_credit": { + "provider_id": "dfc_ni", + "label": "Pension Credit" + }, + "dwp.workplace_pensions": { + "provider_id": "dwp", + "label": "Workplace pensions" + }, + "dwp.attendance_allowance": { + "provider_id": "dwp", + "label": "Attendance Allowance" } } } diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/battery_bindings.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/battery_bindings.py index 874daf82c..d301381da 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/battery_bindings.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/battery_bindings.py @@ -1617,6 +1617,11 @@ def _ledger_compile_parity_required_artifacts( "maximum_stock_relative_deviation", "maximum_relative_mass_imbalance", "spi_prior_mass_share", + # microcosm#1069 c6 spi_support_channel stage-health check. + "pension_age_spi_prior_mass_share", + # microcosm#1069 c7 pension_credit_take_up stage-health check. + "maximum_take_up_deviation", + "minimum_entitled_units", "absolute_tolerance", "household_weight_kind", "minimum_spi_households", diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py index b44ba665e..ef4dbd5b4 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py @@ -102,6 +102,7 @@ "uk_stage_frs_hmrc_spine_leaves_signal", "uk_stage_spi_support_channel_mass", "uk_stage_hmrc_spi_income_spine_identity", + "uk_stage_pension_credit_take_up", "uk_stage_cgt_incidence_clone_mass", "uk_stage_cgt_support_split_mass", "uk_stage_spi_income_band_donors_support", diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/employer_pension_contributions.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/employer_pension_contributions.py new file mode 100644 index 000000000..1d9293c39 --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/employer_pension_contributions.py @@ -0,0 +1,301 @@ +"""Employer pension contributions from ASHE contribution-rate bands (microcosm#1069 R6). + +The FRS records whether a person belongs to an employer's pension scheme and of +what kind (``PENPROV.STEMPPEN`` 1 to 4: group personal, occupational, group +stakeholder, other or not known) but not what the employer pays. The incumbent +estimate set employer contributions to three times the employee's, which gives +nothing to members of non-contributory schemes and the same multiple to a +defined-benefit public-sector scheme as to an auto-enrolment minimum. + +This module draws each member's employer contribution rate instead, from the +ONS ASHE 2024 pension tables: the share of jobs in each employer contribution +band (as a percentage of full pay) by pension type and sector (Table P10, all +industries). An occupational scheme is defined benefit or defined contribution +with the probabilities ASHE's job counts give within the member's sector (Table +P2); the other employer types map one to one, and a scheme of unknown type uses +the all-types distribution. The rate is drawn uniformly within its band (the +open top band is read as 20% to 30%; the largest defined-benefit employer rates +sit just under 30%), and the contribution is that rate times the person's +employment income. Salary sacrifice stays its own column; ASHE and DWP count it +as an employer contribution, so the bound DWP employer total adds it back. +""" + +from __future__ import annotations + +from collections.abc import Mapping +from dataclasses import dataclass + +import numpy as np +import pandas as pd + +from microcosm.build.stochastic_assignment import stable_identity_uniforms + +ASHE_EMPLOYER_RATE_RESOURCE = "ashe_employer_pension_contribution_rates.json" +ASHE_EMPLOYER_RATE_PERIOD = "2024" +#: ASHE's employer contribution bands as fractions of full pay; the open top +#: band is closed at 30%. +ASHE_EMPLOYER_RATE_BANDS: tuple[tuple[str, float, float], ...] = ( + ("Under 4%", 0.0, 0.04), + ("4% to < 8%", 0.04, 0.08), + ("8% to < 10%", 0.08, 0.10), + ("10% to < 12%", 0.10, 0.12), + ("12% to < 15%", 0.12, 0.15), + ("15% to < 20%", 0.15, 0.20), + ("20% and over", 0.20, 0.30), +) +#: FRS PENPROV.STEMPPEN codes for employer schemes (FRS 2024-25 variable +#: listing) and the ASHE pension type each maps to; "occupational" splits into +#: defined benefit or defined contribution by sector. +FRS_EMPLOYER_SCHEME_TYPES: Mapping[int, str] = { + 1: "group_personal_pension", + 2: "occupational", + 3: "group_stakeholder_pension", + 4: "all", +} +#: A member of several employer schemes takes the first type in this order. +FRS_EMPLOYER_SCHEME_PRIORITY = (2, 1, 3, 4) +#: FRS JOB.JOBSECT codes (1 private, 2 public). +FRS_JOB_SECTORS: Mapping[int, str] = {1: "Private", 2: "Public"} +EMPLOYER_RATE_SEED = 0 +EMPLOYER_RATE_SALT = "employer_pension_contribution_rate" +EMPLOYER_TYPE_SALT = "employer_pension_occupational_type" +EMPLOYER_RATE_METHOD = ( + "ASHE 2024 Table P10 employer contribution band shares by pension type and " + "sector (full pay, all industries); occupational schemes split into defined " + "benefit and defined contribution by ASHE Table P2 job counts in the sector; " + "the rate is uniform within its band (top band 20% to 30%) and multiplies " + "employment income" +) + + +@dataclass(frozen=True) +class AsheEmployerRates: + """Band shares by (pension type, sector) and the occupational DB share.""" + + shares: Mapping[tuple[str, str], np.ndarray] + defined_benefit_share: Mapping[str, float] + + def distribution(self, pension_type: str, sector: str) -> np.ndarray: + for key in ((pension_type, sector), (pension_type, "all")): + if key in self.shares: + return self.shares[key] + raise ValueError( + f"ASHE has no employer rate distribution for {pension_type!r}." + ) + + +def ashe_employer_rates_from_rows( + rows: list[Mapping[str, object]], +) -> AsheEmployerRates: + """Build the rate model from vendored ASHE rows (P10 shares, P2 job counts).""" + + bands = [band for band, _, _ in ASHE_EMPLOYER_RATE_BANDS] + shares: dict[tuple[str, str], np.ndarray] = {} + collected: dict[tuple[str, str], dict[str, float]] = {} + jobs: dict[tuple[str, str], float] = {} + for row in rows: + dimensions = row.get("dimensions") or {} + concept = row.get("concept") + value = float(row["value"]) + if concept == "ons.workplace_pension_employer_contribution_band_share": + if dimensions.get("contribution_basis") != "full_pay": + continue + if dimensions.get("sic2007_section", "all") != "all": + continue + key = ( + str(dimensions["pension_type"]), + str(dimensions.get("sector", "all")), + ) + collected.setdefault(key, {})[ + str(dimensions["employer_contribution_rate_band"]) + ] = value + elif concept == "ons.workplace_pension_jobs_by_type": + if dimensions.get("sic2007_section", "all") != "all": + continue + if dimensions.get("weekly_earnings_band", "all") != "all": + continue + jobs[ + (str(dimensions["pension_type"]), str(dimensions.get("sector", "all"))) + ] = value + for key, values in collected.items(): + if set(values) != set(bands): + # ASHE suppresses some sector cells; those fall back to the type's + # all-sector distribution. + continue + vector = np.asarray([values[band] for band in bands], dtype=np.float64) + if vector.sum() <= 0.0: + continue + shares[key] = vector / vector.sum() + # ASHE publishes the all-industry bands by sector only: a type's all-sector + # distribution is its sector distributions mixed by the sector's jobs of + # that type (Table P2), the "all" type's by the sector's jobs of every type + # with an employer scheme. + scheme_types = { + pension_type + for (pension_type, _sector) in jobs + if pension_type not in ("no_pension_provision", "unknown_pension_provision") + } + for pension_type in {key[0] for key in shares}: + if (pension_type, "all") in shares: + continue + parts = [] + for sector in ("Public", "Private"): + if (pension_type, sector) not in shares: + continue + if pension_type == "all": + weight = sum(jobs.get((kind, sector), 0.0) for kind in scheme_types) + else: + weight = jobs.get((pension_type, sector), 0.0) + if weight > 0.0: + parts.append((weight, shares[(pension_type, sector)])) + if parts: + total = sum(weight for weight, _ in parts) + mixed = sum(weight * vector for weight, vector in parts) / total + shares[(pension_type, "all")] = mixed / mixed.sum() + defined_benefit_share: dict[str, float] = {} + for sector in ("Public", "Private"): + db = jobs.get(("defined_benefit", sector)) + dc = jobs.get(("defined_contribution", sector)) + if db is not None and dc is not None and db + dc > 0.0: + defined_benefit_share[sector] = db / (db + dc) + db_all = sum( + jobs.get(("defined_benefit", sector), 0.0) for sector in ("Public", "Private") + ) + dc_all = sum( + jobs.get(("defined_contribution", sector), 0.0) + for sector in ("Public", "Private") + ) + if db_all + dc_all > 0.0: + defined_benefit_share["all"] = db_all / (db_all + dc_all) + for required in ("defined_benefit", "defined_contribution", "all"): + if (required, "all") not in shares: + raise ValueError( + f"ASHE employer rates lack the {required!r} all-sector row." + ) + if "all" not in defined_benefit_share: + raise ValueError("ASHE job counts lack the DB and DC rows.") + return AsheEmployerRates(shares=shares, defined_benefit_share=defined_benefit_share) + + +def load_ashe_employer_rates() -> AsheEmployerRates: + """Read the vendored ASHE rows (refused if they lag the feed pin).""" + + from microcosm.build.uk_runtime.ledger_fact_vendoring import vendored_rows + + return ashe_employer_rates_from_rows( + vendored_rows( + ASHE_EMPLOYER_RATE_RESOURCE, period_value=ASHE_EMPLOYER_RATE_PERIOD + ) + ) + + +def employer_scheme_and_sector( + person_ids: np.ndarray, + penprov: pd.DataFrame, + job: pd.DataFrame, +) -> tuple[np.ndarray, np.ndarray]: + """Each person's employer scheme STEMPPEN code (0 if none) and job sector. + + ``penprov`` and ``job`` carry ``source_person_id`` (the raw sernum/person + identity) with ``stemppen`` and ``jobsect`` respectively; a person's sector + is that of their first job with a stated sector, "all" otherwise. + """ + + scheme = np.zeros(len(person_ids), dtype=np.int64) + codes = pd.to_numeric(penprov["stemppen"], errors="coerce").fillna(0).astype(int) + employer = penprov.loc[codes.isin(FRS_EMPLOYER_SCHEME_TYPES)].assign(code=codes) + rank = { + code: position for position, code in enumerate(FRS_EMPLOYER_SCHEME_PRIORITY) + } + if len(employer): + employer = employer.assign(rank=employer["code"].map(rank)) + best = employer.sort_values("rank").drop_duplicates("source_person_id") + lookup = best.set_index("source_person_id")["code"] + scheme = pd.Series(person_ids).map(lookup).fillna(0).astype(np.int64).to_numpy() + sectors = pd.to_numeric(job["jobsect"], errors="coerce") + stated = job.loc[sectors.isin(FRS_JOB_SECTORS)].assign( + sector=sectors.map(FRS_JOB_SECTORS) + ) + sector = np.full(len(person_ids), "all", dtype=object) + if len(stated): + first = stated.drop_duplicates("source_person_id").set_index("source_person_id") + sector = ( + pd.Series(person_ids) + .map(first["sector"]) + .fillna("all") + .to_numpy(dtype=object) + ) + return scheme, sector + + +def draw_employer_pension_contributions( + person_ids: np.ndarray, + *, + employment_income: np.ndarray, + scheme: np.ndarray, + sector: np.ndarray, + rates: AsheEmployerRates, +) -> tuple[np.ndarray, dict[str, object]]: + """Employer contributions for members of an employer scheme with earnings.""" + + income = np.asarray(employment_income, dtype=np.float64) + if not np.isfinite(income).all(): + raise ValueError("employment_income must be finite.") + scheme = np.asarray(scheme, dtype=np.int64) + members = (scheme > 0) & (income > 0.0) + type_draws = stable_identity_uniforms( + person_ids, seed=EMPLOYER_RATE_SEED, salt=EMPLOYER_TYPE_SALT + ) + rate_draws = stable_identity_uniforms( + person_ids, seed=EMPLOYER_RATE_SEED, salt=EMPLOYER_RATE_SALT + ) + rate = np.zeros(len(person_ids), dtype=np.float64) + ashe_type = np.full(len(person_ids), "", dtype=object) + edges = np.asarray([[low, high] for _, low, high in ASHE_EMPLOYER_RATE_BANDS]) + counts: dict[str, int] = {} + for index in np.flatnonzero(members): + mapped = FRS_EMPLOYER_SCHEME_TYPES[int(scheme[index])] + sector_label = str(sector[index]) + if mapped == "occupational": + db_share = rates.defined_benefit_share.get( + sector_label, rates.defined_benefit_share["all"] + ) + mapped = ( + "defined_benefit" + if type_draws[index] < db_share + else "defined_contribution" + ) + distribution = rates.distribution(mapped, sector_label) + cumulative = np.cumsum(distribution) + position = min( + int(np.searchsorted(cumulative, rate_draws[index], side="right")), + len(distribution) - 1, + ) + lower = cumulative[position - 1] if position else 0.0 + within = (rate_draws[index] - lower) / max(distribution[position], 1e-12) + low, high = edges[position] + rate[index] = low + min(max(within, 0.0), 1.0) * (high - low) + ashe_type[index] = mapped + counts[mapped] = counts.get(mapped, 0) + 1 + amounts = rate * np.where(members, income, 0.0) + receipt = { + "method": EMPLOYER_RATE_METHOD, + "members_with_earnings": int(members.sum()), + "members_by_ashe_type": dict(sorted(counts.items())), + "mean_rate_of_members": float(rate[members].mean()) if members.any() else None, + "unweighted_amount": float(amounts.sum()), + } + return amounts, receipt + + +__all__ = [ + "ASHE_EMPLOYER_RATE_BANDS", + "ASHE_EMPLOYER_RATE_RESOURCE", + "AsheEmployerRates", + "EMPLOYER_RATE_METHOD", + "FRS_EMPLOYER_SCHEME_TYPES", + "ashe_employer_rates_from_rows", + "draw_employer_pension_contributions", + "employer_scheme_and_sector", + "load_ashe_employer_rates", +] diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/frs_spine.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/frs_spine.py index f2c2f4d39..7d0ab38ba 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/frs_spine.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/frs_spine.py @@ -732,14 +732,18 @@ def _add_person_expenses( ) penprov = frs["penprov"] pension_amount = _number(penprov, "penamt") - pension_clip = float(pension_amount.quantile(0.95)) if len(pension_amount) else 0.0 + # Personal and stakeholder pension contributions as reported, no longer + # clipped at the 95th percentile of every PENPROV amount: the clip removed + # 28% of the reported amount (1.8% of rows) against HMRC's relief-at-source + # total, which SPI Table 3.8 now binds by income band; the engine caps the + # relief itself at the annual allowance (microcosm#1069 c8). pe_person["personal_pension_contributions"] = np.maximum( 0, _sum_to_entity( pension_amount[_number(penprov, "stemppen").isin((5, 6))], penprov.loc[_number(penprov, "stemppen").isin((5, 6)), "person_id"], person["person_id"], - ).clip(0, pension_clip) + ) * WEEKS_IN_YEAR, ) job = frs["job"] diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/frs_take_up.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/frs_take_up.py index 4fe2379fd..338422e6a 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/frs_take_up.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/frs_take_up.py @@ -71,10 +71,12 @@ "single": "uc_childcare_single", "couple": "uc_childcare_couple", } +# would_claim_pc is redrawn after the SPI chain by ``pension_credit_take_up``, +# whose rates are shares of the entitled units the engine finds; its stage +# gate measures them, so the terminal signal gate does not (microcosm#1069 R9). UK_TAKE_UP_SIGNAL_OUTPUTS = ( ("benunit", "would_claim_child_benefit", "child_benefit"), ("benunit", "child_benefit_opts_out", "child_benefit_opts_out_rate"), - ("benunit", "would_claim_pc", "pension_credit"), ("benunit", "would_claim_uc", "universal_credit"), ("benunit", "would_claim_tfc", "tax_free_childcare"), ("benunit", "would_claim_extended_childcare", "extended_childcare"), diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/graph.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/graph.py index c71851c4c..1ddbc1f59 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/graph.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/graph.py @@ -102,6 +102,9 @@ "spi_housing_shell", "uc_reporter_redraw", "uc_capital_coherence", + # The Pension Credit redraw rewrites ``frs_take_up``'s would_claim_pc, + # which the open-surface readers before it bind (microcosm#1069). + "pension_credit_take_up", # ``frs_education_grant_split`` rewrites the root cell # ``education_grants`` that the open-surface ``frs_legacy_proxies`` # reader already bound to. In the root version that rewrite opened a @@ -235,7 +238,8 @@ "lcfs_consumption": None, "etb_vat": None, "etb_services": None, - "frs_hmrc_spine_leaves": frozenset({("person", "employee_pension_contributions")}), + # The employer pension draw applies an ASHE rate to pay (microcosm#1069). + "frs_hmrc_spine_leaves": frozenset({("person", "employment_income")}), "spi_support_channel": None, "spi_income_band_donors": None, "hmrc_spi_income_spine": None, @@ -262,6 +266,9 @@ # Runs one temporary engine materialization over the whole frame for its # award screen, so its input surface is genuinely open. "uc_reporter_redraw": None, + # One temporary engine materialization of Pension Credit entitlement over + # the whole frame: an open surface, like the UC award screen. + "pension_credit_take_up": None, "uc_capital_coherence": frozenset( { ("person", "is_benunit_head"), @@ -759,6 +766,7 @@ def _cells( _Cell("benunit", "frs_benunit_capital", "float64"), _Cell("benunit", "would_claim_uc", "bool"), ), + "pension_credit_take_up": (_Cell("benunit", "would_claim_pc", "bool"),), "uc_deduction_attributes": ( _Cell("benunit", "uc_deduction_random_draw", "float64"), _Cell("benunit", "uc_deduction_type_random_draw", "float64"), @@ -789,6 +797,8 @@ def _cells( ( "pension_contributions_via_salary_sacrifice", "employee_pension_contributions", + # Converted records' pay drops by the sacrificed amount (microcosm#1069). + "employment_income", ), ), "student_loans": (_Cell("person", "student_loan_plan", "string"),), diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/graph_kernels.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/graph_kernels.py index 92d119613..b8e610d55 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/graph_kernels.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/graph_kernels.py @@ -45,7 +45,13 @@ from microcosm.graph.population import dtype_for_token from .. import stage_evidence -from . import bus_use_incidence, frs_hmrc_source, uc_relationships, was_wealth +from . import ( + bus_use_incidence, + frs_hmrc_source, + uc_capital_coherence, + uc_relationships, + was_wealth, +) from .national_frame import UK_NATIONAL_SCHEMA from .rowwise_geography import id_multiplier_for_values @@ -90,6 +96,7 @@ "spi_housing_shell": "spi_housing_shell", "uc_reporter_redraw": "uc_reporter_redraw", "uc_capital_coherence": "uc_capital_coherence", + "pension_credit_take_up": "pension_credit_take_up", "uc_deduction_attributes": "uc_deduction_attributes", "cgt_support_split": "cgt_support", "cgt_incidence_clone": "cgt_structure", @@ -119,6 +126,9 @@ "etb_services": (uk_engine_adapter,), "uc_reporter_redraw": (uc_relationships, uk_engine_adapter), "uc_capital_coherence": (uc_relationships,), + # The Pension Credit redraw reuses the UC stage's household-to-benefit-unit + # weight mapping and the adapter's engine materialization. + "pension_credit_take_up": (uc_capital_coherence, uk_engine_adapter), } _COMPUTE = Capabilities( @@ -390,7 +400,7 @@ def _fixture_descriptor( missing = sorted(set(_STAGE_MODULES) - set(stages)) extra = sorted(set(stages) - set(_STAGE_MODULES)) raise ValueError( - "UK parity fixture must describe the current 35-stage spine " + "UK parity fixture must describe the current 36-stage spine " f"(missing={missing}, extra={extra})." ) return descriptor, stages @@ -424,6 +434,7 @@ def _fixture_implementations(source: Path) -> Mapping[str, object]: from .frs_take_up import UKFRSTakeUpStageTransform from .lcfs_consumption import UKLCFSConsumptionStageTransform from .nts_bus_travel import UKNTSBusTravelStageTransform + from .pension_credit_take_up import UKPensionCreditTakeUpStageTransform from .regional_uprating import UKRegionalPropertyUpratingStageTransform from .salary_sacrifice import UKSalarySacrificeStageTransform from .spi_band_donors import UKSPIIncomeBandDonorStageTransform @@ -605,6 +616,9 @@ def _fixture_implementations(source: Path) -> Mapping[str, object]: "uc_capital_coherence": UKUCCapitalCoherenceStageTransform( stage=stages["uc_capital_coherence"] ), + "pension_credit_take_up": UKPensionCreditTakeUpStageTransform( + stage=stages["pension_credit_take_up"], engine=engine + ), "uc_deduction_attributes": UKUCDeductionAttributesStageTransform( stage=stages["uc_deduction_attributes"] ), @@ -720,9 +734,18 @@ def _minimal_frame(context: KernelContext) -> Frame: # KernelContext deliberately has no legacy Frame.mass_log channel. The # SPI income transform consumes only the immediately preceding support # allocation reason, whose exact current-spine record is reconstructible - # from the conserved household total and reviewed public reason. - from .spi_support import SPI_PRIOR_MASS_CHANGE_REASON + # from the conserved household total and reviewed public reason, the + # declared allocation's own sentence (microcosm#1069 c6). + from microcosm.build.country_spec import load_country_spec + from .spi_spine import uk_spi_support_mass_change_reason + + sources = load_country_spec("uk").sources + if sources is None: + raise ValueError("The committed UK country spec declares no sources.") + reason = uk_spi_support_mass_change_reason( + sources.stage_map()["spi_support_channel"] + ) total = context.weights["household"].total mass_log = ( MassChangeRecord( @@ -730,7 +753,7 @@ def _minimal_frame(context: KernelContext) -> Frame: old_total=total, new_total=total, declared_factor=1.0, - reason=SPI_PRIOR_MASS_CHANGE_REASON, + reason=reason, ), ) return Frame( diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/hmrc_source_contract.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/hmrc_source_contract.py index 608175693..0bc12ee5a 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/hmrc_source_contract.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/hmrc_source_contract.py @@ -33,6 +33,7 @@ from microcosm.build.uk_runtime.spi_income import ( DEFAULT_SPI_DONOR_SAMPLE_SIZE, SPI_DERIVED_POLICYENGINE_SOURCE_COLUMNS, + SPI_DONOR_AGE_POPULATION_RESOURCE, SPI_DONOR_DOCUMENTATION_URL, SPI_DONOR_DOI, SPI_DONOR_FILENAME, @@ -96,16 +97,19 @@ _EXPECTED_OPERATION_KINDS = ( "retain_adjudicated_frs_hmrc_leaves", - "derive", + # Employer pension contributions from ASHE rate bands (microcosm#1069 c9). + "draw_employer_pension_contributions_from_rate_bands", "stack_zero_weight_donors", "gate_zero_weight_strata", "allocate_zero_weight_prior_mass", "stack_income_band_donor_households", "verify_pinned_hmrc_source_pair", "strict_read_private_table", + "draw_spi_donor_ages_by_population", "fit_weighted_qrf_stage1", "resample_band_donor_leaves", "fit_weighted_qrf_stage2", + "zero_pension_age_reports_below_state_pension_age", "redraw_columns_from_fitted_qrf", "materialize_hmrc_income_bands_fail_closed", "classify_hmrc_income_facts_with_reviewed_fences", @@ -141,7 +145,21 @@ def assert_uk_hmrc_income_source_contract_current( failures, "artifact roles", tuple(sorted(artifacts)), - ("published_fact_surface", "qrf_donor"), + ("donor_age_populations", "published_fact_surface", "qrf_donor"), + ) + # The ONS single-year populations the donor age draw reads (microcosm#1069). + ages = artifacts.get("donor_age_populations", {}) + _expect( + failures, + "donor_age_populations.resource", + ages.get("resource"), + SPI_DONOR_AGE_POPULATION_RESOURCE, + ) + _expect( + failures, + "donor_age_populations.runtime_sha256_required", + ages.get("runtime_sha256_required"), + True, ) donor = artifacts.get("qrf_donor", {}) _expect(failures, "qrf_donor.filename", donor.get("filename"), SPI_DONOR_FILENAME) diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/hmrc_uprating.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/hmrc_uprating.py index ae884df96..08cd57454 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/hmrc_uprating.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/hmrc_uprating.py @@ -39,6 +39,7 @@ from microcosm.build.ledger_targets import ( CALENDAR_YEAR_WINDOW_WEIGHTS, + MONTHLY_WINDOW_COUNT_X_MEAN, LedgerTargetReference, TargetRegistry, ) @@ -49,11 +50,29 @@ "policyengine-uk parameter ratio between 1 January of the fact's opening " "year and 1 January of the calibration year (the SPI donor rebasing convention)" ) +#: The month DWP's annual uprating takes effect. The engine keys a tax-year +#: rate at 1 January of the year it opens (policyengine-uk moves the April +#: values to 1 January), so a month from April on is paid at that year's rate +#: and January to March at the previous year's. +UK_BENEFIT_UPRATING_MONTH = 4 +UK_ENGINE_MONTHLY_INDEX_BASIS = ( + "policyengine-uk parameter ratio between 1 January of the year whose rate " + "is paid in each window month (from April, that year; before, the previous " + "year) and 1 January of the calibration year, per month" +) +UK_MONTHLY_UPRATING_ADJUDICATION = ( + "microcosm#1069 R1 (María, 2026-09-30): the State Pension level binds the " + "calendar-2025 Stat-Xplore points, each put on the engine's 2025 rate " + "basis, so only the February point (paid at the 2024-25 rate) moves" +) #: The parameter paths a UK reference may name behind the prefix. One per SPI #: income component the family binds, each the index the engine itself uprates #: that variable with, plus the new State Pension weekly rate for the state -#: pension rows (the engine pays the tax-year rate for the whole period). +#: pension rows (the engine pays the tax-year rate for the whole period), and +#: the employer Class 1 rate for the employer NICs relief on salary sacrifice +#: (HMRC's 2024-25 relief at 13.8% restated to the rate the engine charges in +#: the calibration year, microcosm#1069 c11). UK_ENGINE_INDEX_PARAMETERS: tuple[str, ...] = ( "gov.economic_assumptions.indices.obr.average_earnings", "gov.economic_assumptions.indices.obr.per_capita.mixed_income", @@ -61,6 +80,7 @@ "gov.economic_assumptions.indices.obr.private_pension_index", "gov.economic_assumptions.indices.ons.household_interest_income", "gov.dwp.state_pension.new_state_pension.amount", + "gov.hmrc.national_insurance.class_1.rates.employer", ) UK_ENGINE_INDEX_CONCEPTS: tuple[str, ...] = tuple( f"{UK_ENGINE_PARAMETER_INDEX_PREFIX}{path}" for path in UK_ENGINE_INDEX_PARAMETERS @@ -100,6 +120,20 @@ "calibration year over the SPI fact's year, summed over the Table 2.5 bands " "the SPI band spans" ) +#: The SPI State Pension amount by band (microcosm#1069): an amount row is the +#: band's recipients times the amount each is paid, so it moves by the growth +#: its count row declares (the band's taxpayers, HMRC Table 2.5) times the +#: rate the engine pays. Moving it by the rate alone held the band's recipients +#: at the fact year's number while the count row grew them, and the two rows +#: described different populations. +UK_SPI_STATE_PENSION_AMOUNT_INDEX_CONCEPT = "hmrc.itl_2026.taxpayer_count_growth_times_new_state_pension_rate_by_total_income_band" +UK_SPI_STATE_PENSION_RATE_PARAMETER = "gov.dwp.state_pension.new_state_pension.amount" +UK_RECIPIENT_AMOUNT_GROWTH_BASIS = ( + "recipients times the amount per recipient: the band's recipients grow like its " + "taxpayers (the count row's index, {count_basis}) and the amount per recipient by " + "the pinned engine's {parameter} between 1 January of the fact's opening year and " + "1 January of the calibration year" +) UK_INCOME_UPRATING_ADJUDICATION = ( "PolicyEngine/chronicle#280 lane (María, 2026-09-22): the calibration binds at calendar " "2025; facts published by fiscal or tax year use the months to the end of " @@ -351,6 +385,16 @@ def align_hmrc_row_by_engine_index( target_year = _target_year(reference) aligned = [] for spec in registry.specs: + if reference.value_operation == MONTHLY_WINDOW_COUNT_X_MEAN: + aligned.append( + _align_monthly_count_x_mean( + spec, + parameter_path=parameter_path, + parameter_value=parameter_value, + target_year=target_year, + ) + ) + continue opening_year = _opening_year(spec, reference) _refuse_fact_after_target(spec, opening_year, target_year) if opening_year == target_year: @@ -379,6 +423,75 @@ def align_hmrc_row_by_engine_index( return TargetRegistry(aligned, country="uk") +def _engine_rate_year(month: str) -> int: + """The engine year whose 1 January value is the rate paid in ``month``.""" + + year, number = int(month[:4]), int(month[5:7]) + return year if number >= UK_BENEFIT_UPRATING_MONTH else year - 1 + + +def _align_monthly_count_x_mean( + spec: Any, + *, + parameter_path: str, + parameter_value: ParameterValue, + target_year: int, +) -> Any: + """Restate every month's mean at the calibration year's engine rate. + + A count x mean window averages points on both sides of an April uprating; + each point's mean moves by ``rate(target) / rate(paid that month)``, so + only the points paid at an earlier year's rate change (microcosm#1069 R1). + The window value moves by the count x mean weighted factor, which leaves it + exactly as compiled when every point is already at the target rate. + """ + + members = json.loads(spec.metadata["ledger_window_count_x_mean_members"]) + to_instant = f"{target_year}-01-01" + to_value = parameter_value(parameter_path, to_instant) + weighted = unweighted = 0.0 + restated = [] + for member in members: + month = str(member["month"]) + if int(month[:4]) > target_year: + raise ValueError( + f"UK target {spec.name!r}: the window month {month} falls after " + f"the calibration year {target_year}; a declared uprating never " + "moves a value backwards." + ) + from_instant = f"{_engine_rate_year(month)}-01-01" + from_value = parameter_value(parameter_path, from_instant) + factor = to_value / from_value + product = float(member["count"]) * float(member["mean"]) + weighted += product * factor + unweighted += product + restated.append( + { + **member, + "uprating_from_instant": from_instant, + "uprating_from_value": f"{from_value:.15g}", + "uprating_factor": f"{factor:.15g}", + } + ) + ratio = weighted / unweighted if unweighted else 1.0 + metadata = { + **spec.metadata, + "uprating_index": f"{UK_ENGINE_PARAMETER_INDEX_PREFIX}{parameter_path}", + "uprating_index_basis": UK_ENGINE_MONTHLY_INDEX_BASIS, + "uprating_index_parameter": parameter_path, + "uprating_index_engine": f"policyengine-uk {_engine_version()}", + "uprating_index_to_instant": to_instant, + "uprating_index_to_value": f"{to_value:.15g}", + "uprating_window_members": json.dumps( + restated, sort_keys=True, separators=(",", ":") + ), + "uprating_factor": f"{ratio:.15g}", + "ledger_value_before_alignment": f"{spec.value:.15g}", + "uprating_adjudication": UK_MONTHLY_UPRATING_ADJUDICATION, + } + return replace(spec, value=spec.value * ratio, metadata=metadata) + + def _spi_band_lower_edge(spec: Any, reference: LedgerTargetReference) -> int: key = f"{_LEDGER_FILTER_PREFIX}total_income_lower_bound" raw = str(spec.metadata.get(key) or "").replace(",", "") @@ -539,6 +652,71 @@ def align_hmrc_row_by_itl_growth( return TargetRegistry(aligned, country="uk") +def align_hmrc_amount_by_recipient_growth_and_rate( + reference: LedgerTargetReference, + registry: TargetRegistry, + *, + index_concept: str, + parameter_path: str, + parameter_value: ParameterValue = engine_parameter_value, + rows: list[Mapping[str, Any]] | None = None, +) -> TargetRegistry: + """Move an SPI amount band row by its recipients' growth and their rate. + + factor = (the band's taxpayer growth, exactly as the count row computes it) + x (the engine parameter ratio, exactly as the engine-index applier computes + it); both component receipts are written on the spec. + """ + + if reference.uprating_index != index_concept: + return registry + counted = align_hmrc_row_by_itl_growth( + replace(reference, uprating_index=UK_HMRC_TAXPAYER_GROWTH_INDEX_CONCEPT), + registry, + index_concept=UK_HMRC_TAXPAYER_GROWTH_INDEX_CONCEPT, + rows=rows, + ) + rated = align_hmrc_row_by_engine_index( + replace( + reference, + uprating_index=f"{UK_ENGINE_PARAMETER_INDEX_PREFIX}{parameter_path}", + ), + registry, + parameter_path=parameter_path, + parameter_value=parameter_value, + ) + aligned = [] + for spec, count_spec, rate_spec in zip( + registry.specs, counted.specs, rated.specs, strict=True + ): + count_factor = float(count_spec.metadata["uprating_factor"]) + rate_factor = float(rate_spec.metadata["uprating_factor"]) + factor = count_factor * rate_factor + count_basis = str(count_spec.metadata["uprating_index_basis"]) + # A fact compiled at its own year (the production-2023 parity surface) + # reads both halves as identities, which write the instants only. + rate_receipt = { + f"uprating_rate_{key}": str(rate_spec.metadata[f"uprating_index_{key}"]) + for key in ("from_instant", "to_instant", "from_value", "to_value") + if f"uprating_index_{key}" in rate_spec.metadata + } + metadata = { + **count_spec.metadata, + "uprating_index": index_concept, + "uprating_index_basis": UK_RECIPIENT_AMOUNT_GROWTH_BASIS.format( + count_basis=count_basis, parameter=parameter_path + ), + "uprating_count_factor": f"{count_factor:.15g}", + "uprating_rate_parameter": parameter_path, + **rate_receipt, + "uprating_rate_factor": f"{rate_factor:.15g}", + "uprating_factor": f"{factor:.15g}", + "ledger_value_before_alignment": f"{spec.value:.15g}", + } + aligned.append(replace(spec, value=spec.value * factor, metadata=metadata)) + return TargetRegistry(aligned, country="uk") + + def hmrc_uprating_appliers() -> dict[str, Any]: """The appliers this module contributes to ``UK_UPRATING_APPLIERS``.""" @@ -552,6 +730,11 @@ def hmrc_uprating_appliers() -> dict[str, Any]: appliers[index_concept] = partial( align_hmrc_row_by_itl_growth, index_concept=index_concept ) + appliers[UK_SPI_STATE_PENSION_AMOUNT_INDEX_CONCEPT] = partial( + align_hmrc_amount_by_recipient_growth_and_rate, + index_concept=UK_SPI_STATE_PENSION_AMOUNT_INDEX_CONCEPT, + parameter_path=UK_SPI_STATE_PENSION_RATE_PARAMETER, + ) return appliers @@ -573,6 +756,9 @@ def align_hmrc_count_row_by_taxpayer_growth( __all__ = [ "SPI_BAND_TO_ITL_BANDS", + "UK_SPI_STATE_PENSION_AMOUNT_INDEX_CONCEPT", + "UK_SPI_STATE_PENSION_RATE_PARAMETER", + "align_hmrc_amount_by_recipient_growth_and_rate", "UK_ENGINE_INDEX_CONCEPTS", "UK_ENGINE_INDEX_PARAMETERS", "UK_ENGINE_PARAMETER_INDEX_PREFIX", diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/ledger_targets.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/ledger_targets.py index 0295d73f7..6aa393034 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/ledger_targets.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/ledger_targets.py @@ -516,11 +516,13 @@ def compile_uk_target_registry( registry = validate_uc_source_month_coverage( restamped, registry, candidate_facts ) - if reference.name == "hmrc.cgt.liability_total": - cash_metadata = _cgt_cash_diagnostic_metadata(fact_rows) + if reference.name in UK_REQUIRED_TARGET_DIAGNOSTICS: + diagnostic_metadata = _attached_diagnostic_metadata( + fact_rows, reference.name + ) registry = TargetRegistry( ( - replace(row, metadata={**row.metadata, **cash_metadata}) + replace(row, metadata={**row.metadata, **diagnostic_metadata}) for row in registry.specs ), country="uk", @@ -762,43 +764,104 @@ def _assert_region_facts_resolved_at_region( return registry -def _cgt_cash_diagnostic_metadata( +#: Bound targets that carry publisher figures they replaced or sit beside, as +#: diagnostics compiled in isolation and never fitted. Each named declaration +#: in the contract's ``diagnostic_references`` must exist and attach to the +#: target that requires it; a missing or misdirected one refuses the target. +UK_REQUIRED_TARGET_DIAGNOSTICS: Mapping[str, tuple[str, ...]] = MappingProxyType( + { + "hmrc.cgt.liability_total": ("obr.capital_gains_tax",), + # microcosm#1069 R2, R4: the resident level is bound; OBR's forecast and + # DWP's forecast-table lines are kept beside it. + "dwp.state_pension.amount": ( + "obr.state_pension", + "dwp.state_pension.forecast_expenditure", + "dwp.state_pension.forecast_expenditure_paid_abroad", + ), + "dwp.state_pension.recipients": ( + "dwp.state_pension.forecast_caseload", + "dwp.state_pension.forecast_caseload_paid_abroad", + ), + # microcosm#1069 c10: DWP pays Winter Fuel to everyone and HMRC recovers + # it above GBP 35,000, where the engine withholds it; the recipient count + # sits beside the bound OBR line until payment and recovery separate. + "obr.winter_fuel_allowance": ("dwp.winter_fuel_payment.recipients",), + } +) +_DIAGNOSTIC_PERIOD_TYPES = frozenset(("fiscal_year", "tax_year", "calendar_year")) +_DIAGNOSTIC_ASSERTION_POLICIES = MappingProxyType( + {"source_projection": "allow_source_projection", "observation": "observed_only"} +) + + +def _attached_diagnostic_metadata( facts: tuple[Mapping[str, Any], ...], + target_name: str, ) -> dict[str, str]: - """Retain the original forecast without adding a cash row to fitting. + """Every diagnostic ``target_name`` requires, compiled beside it.""" - The cash period and exact Chronicle fact identity are consumer declarations, - independent of the calibration period. The normal TargetSpec metadata path - carries this receipt into both national and local registries. Unavailable - diagnostic data must not disable independently observed HMRC targets. - """ contract = json.loads( importlib_resources.files("microcosm.build.uk") .joinpath(UK_POPULATION_TARGETS_RESOURCE) .read_text(encoding="utf-8") ) + declarations = contract.get("diagnostic_references") or {} + metadata: dict[str, str] = {} + for key in UK_REQUIRED_TARGET_DIAGNOSTICS[target_name]: + declaration = declarations.get(key) + if declaration is None: + raise ValueError( + f"Invalid diagnostic declaration {key!r}: missing from the " + f"contract, which {target_name!r} requires." + ) + if declaration.get("attach_to_target") != target_name: + raise ValueError( + f"Invalid diagnostic declaration {key!r}: unexpected receiving " + f"target {declaration.get('attach_to_target')!r}." + ) + metadata.update(_diagnostic_reference_metadata(facts, key, declaration)) + return metadata + + +def _diagnostic_reference_metadata( + facts: tuple[Mapping[str, Any], ...], + key: str, + declaration: Mapping[str, Any], +) -> dict[str, str]: + """Retain an original publisher figure without adding a row to fitting. + + The figure's period and exact Chronicle fact identity are consumer + declarations, independent of the calibration period. The normal TargetSpec + metadata path carries the receipt into both national and local registries, + under the declaration's ``metadata_prefix``. Unavailable diagnostic data + must not disable the independently observed target it sits beside; a + malformed declaration is a compile error. + """ + try: - declaration = contract["diagnostic_references"]["obr.capital_gains_tax"] - if declaration["attach_to_target"] != "hmrc.cgt.liability_total": - raise ValueError("unexpected receiving target") + prefix = str(declaration["metadata_prefix"]) + unit = str(declaration["value_unit"]) reference = LedgerTargetReference(**declaration["reference"]) + if not prefix.isidentifier() or not unit.isidentifier(): + raise ValueError("metadata_prefix and value_unit must be plain keys") if not reference.ledger_fact_key: - raise ValueError("the original forecast must have an exact fact pin") + raise ValueError("the publisher figure must have an exact fact pin") if ( - reference.name != "obr.capital_gains_tax" + reference.name != key or reference.period_match_policy != "exact" - or reference.assertion_policy != "allow_source_projection" - or declaration["required_period_type"] != "fiscal_year" - or declaration["required_assertion"] != "source_projection" + or declaration["required_period_type"] not in _DIAGNOSTIC_PERIOD_TYPES + or _DIAGNOSTIC_ASSERTION_POLICIES.get(declaration["required_assertion"]) + != reference.assertion_policy ): - raise ValueError("expected an exactly dated OBR cash forecast declaration") - except (KeyError, TypeError, ValueError) as error: - raise ValueError(f"Invalid CGT cash diagnostic declaration: {error}") from error + raise ValueError("expected an exactly dated publisher-figure declaration") + receipt = { + str(name): str(value) + for name, value in (declaration.get("receipt_metadata") or {}).items() + } + except (AttributeError, KeyError, TypeError, ValueError) as error: + raise ValueError(f"Invalid diagnostic declaration {key!r}: {error}") from error - metadata = { - "cgt_cash_diagnostic_role": "diagnostic_only_not_in_fit", - "cgt_cash_reconciliation_status": "unresolved", - } + metadata = {f"{prefix}_role": "diagnostic_only_not_in_fit", **receipt} try: candidates = tuple( fact @@ -808,30 +871,28 @@ def _cgt_cash_diagnostic_metadata( == declaration["required_period_type"] and fact.get("assertion") == declaration["required_assertion"] ) - (cash,) = compile_ledger_target_references( + (figure,) = compile_ledger_target_references( candidates, [reference], country="uk" ).specs - if cash.metadata["ledger_fact_period"] != str(reference.period): - raise ValueError("forecast period does not match its declaration") + if figure.metadata["ledger_fact_period"] != str(reference.period): + raise ValueError("diagnostic period does not match its declaration") except ValueError as error: return { **metadata, - "cgt_cash_diagnostic_status": "unavailable", - "cgt_cash_diagnostic_unavailable_reason": str(error), - "cgt_cash_diagnostic_expected_fact_key": reference.ledger_fact_key, - "cgt_cash_diagnostic_expected_period": str(reference.period), - "cgt_cash_diagnostic_expected_period_type": declaration[ - "required_period_type" - ], - "cgt_cash_diagnostic_expected_assertion": declaration["required_assertion"], + f"{prefix}_status": "unavailable", + f"{prefix}_unavailable_reason": str(error), + f"{prefix}_expected_fact_key": reference.ledger_fact_key, + f"{prefix}_expected_period": str(reference.period), + f"{prefix}_expected_period_type": declaration["required_period_type"], + f"{prefix}_expected_assertion": declaration["required_assertion"], } return { **metadata, - "cgt_cash_diagnostic_status": "available", - "cgt_cash_diagnostic_value_gbp": str(cash.value), - "cgt_cash_diagnostic_period": str(cash.period), - "cgt_cash_diagnostic_source": cash.source, - **{f"cgt_cash_diagnostic_{key}": value for key, value in cash.metadata.items()}, + f"{prefix}_status": "available", + f"{prefix}_value_{unit}": str(figure.value), + f"{prefix}_period": str(figure.period), + f"{prefix}_source": figure.source, + **{f"{prefix}_{name}": value for name, value in figure.metadata.items()}, } @@ -1382,10 +1443,16 @@ def counterfactual_delta( period: int | str, ) -> np.ndarray: del period + from microcosm.build.target_materialization import counterfactual_column + entity = str(binding.get("from_entity") or "person") metric_name = str(binding.get("metric_name") or "") - if metric_name and metric_name in self.tables[entity]: - return np.asarray(self.tables[entity][metric_name], dtype=float) + # The measure resolver injects a resolved delta under the slash-free + # counterfactual column (microcosm#1069 c11); a precomputed column + # under the metric name itself is the legacy route. + for name in (counterfactual_column(binding), metric_name): + if name and name in self.tables[entity]: + return np.asarray(self.tables[entity][name], dtype=float) raise ValueError( f"frame does not carry precomputed counterfactual delta {metric_name!r}" ) diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/measure_simulation.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/measure_simulation.py index fd01af9bb..58006c9dd 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/measure_simulation.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/measure_simulation.py @@ -369,6 +369,10 @@ def __init__( if frame is None: frame, _provenance = load_uk_national_frame(source_path) self.frame = frame + self._factory = factory + self._source_path = source_path + self._counterfactuals: dict[tuple[str, str | None], Any] = {} + self._counterfactual_measures: dict[str, dict[str, Any]] = {} reserved = { str(name) for name in frame.table("person") @@ -504,8 +508,95 @@ def compute(self, entity: str, variable: str) -> tuple[np.ndarray, str]: self._uc_paid_measures_used.add(variable) return result + def counterfactual_delta( + self, binding: Mapping[str, Any], period: int | str + ) -> tuple[np.ndarray, str]: + """A binding's per-row output delta under its input substitution. + + One extra simulation per (zeroed input, folded-into) pair, from the same + source at the measurement year: the zeroed input is set to zero and its + amount added to the folded-into input (salary sacrifice returned to + pay, uk-data's recipe), and the output's delta against this resolver's + baseline comes back for the binding's entity (microcosm#1069 c11). + Banded deltas are refused: their band test compares adjusted net income + with after-allowance thresholds and ignores the Scottish bands. + """ + + self.validate_period(period) + if binding.get("band"): + raise ValueError( + "banded counterfactual measures are deferred: the band test " + "compares adjusted net income with after-allowance thresholds " + "and ignores the Scottish bands (microcosm#1069 c11)" + ) + if binding.get("kind") != "input_substitution_counterfactual": + raise ValueError(f"unsupported counterfactual kind {binding.get('kind')!r}") + zeroed = str(binding["zeroed_input"]) + folded = binding.get("folded_into") + folded = None if folded is None else str(folded) + output = str(binding["output_variable"]) + entity = str(binding.get("from_entity") or "person") + direction = str(binding.get("output_delta", "counterfactual_minus_baseline")) + if direction not in ( + "counterfactual_minus_baseline", + "baseline_minus_counterfactual", + ): + raise ValueError(f"unsupported output_delta {direction!r}") + counterfactual = self._counterfactual_simulation(zeroed, folded) + baseline_values, _ = compute_uk_measure_input( + self.frame, self.simulation, entity, output, self.year + ) + counterfactual_values, _ = compute_uk_measure_input( + self.frame, counterfactual, entity, output, self.year + ) + delta = np.asarray(counterfactual_values, dtype=float) - np.asarray( + baseline_values, dtype=float + ) + if direction == "baseline_minus_counterfactual": + delta = -delta + metric = str(binding.get("metric_name") or output) + self._counterfactual_measures[metric] = { + "entity": entity, + "zeroed_input": zeroed, + "folded_into": folded, + "output_variable": output, + "output_delta": direction, + "rows_nonzero": int(np.count_nonzero(delta)), + } + route = ( + f"policyengine-uk counterfactual: {zeroed} set to zero" + + (f" and folded into {folded}" if folded else "") + + f"; {entity}.{output} {direction}" + ) + return delta, route + + def _counterfactual_simulation(self, zeroed: str, folded: str | None) -> Any: + key = (zeroed, folded) + if key in self._counterfactuals: + return self._counterfactuals[key] + simulation = self._factory(dataset=str(self._source_path)) + amount = np.asarray(self.simulation.calculate(zeroed, self.year), dtype=float) + if not np.isfinite(amount).all(): + raise ValueError(f"{zeroed} must be finite to substitute it.") + if folded is not None: + base = np.asarray(self.simulation.calculate(folded, self.year), dtype=float) + if base.shape != amount.shape: + raise ValueError( + f"{zeroed} and {folded} must share an entity to fold one into the other." + ) + simulation.set_input(folded, self.year, base + amount) + simulation.set_input(zeroed, self.year, np.zeros_like(amount)) + self._counterfactuals[key] = simulation + return simulation + def receipt(self) -> dict[str, Any]: receipt = dict(self._receipt) + counterfactual_measures = getattr(self, "_counterfactual_measures", None) + if counterfactual_measures: + receipt["counterfactual_measures"] = { + name: dict(entry) + for name, entry in sorted(counterfactual_measures.items()) + } if self._uc_tcl_measures_used: receipt["uc_tcl_comparison_contract"] = { **uc_tcl_comparison_contract(self.year), diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/pension_credit_take_up.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/pension_credit_take_up.py new file mode 100644 index 000000000..e95767d8b --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/pension_credit_take_up.py @@ -0,0 +1,360 @@ +"""Pension Credit take-up by component on post-SPI incomes (microcosm#1069 R9). + +``frs_take_up`` draws ``would_claim_pc`` early, on FRS incomes, so the engine +simulations of the intermediate stages see a value. This stage redraws it once +the SPI income chain has set the incomes the engine assesses. One temporary +engine materialization gives each benefit unit's pre-take-up Pension Credit +entitlement; the entitled units fall into two component bands, as DWP reports +take-up: Guarantee Credit (with or without Savings Credit) and Savings Credit +only. Within a band a reporter always claims and the other entitled units claim +at the residual rate + + r = (t * E - R) / (E - R), + +with t the band's DWP caseload take-up rate, E the band's entitled units and R +the reporters among them, both weighted at the stage's household weights, so +reporters plus drawn claimants make up t of the band (or more, where reporters +alone exceed it; the receipt says so). A unit with no entitlement claims only +if it reports. The uniform draw is the ``would_claim_pc`` identity stream +``frs_take_up`` uses. +""" + +from __future__ import annotations + +from collections.abc import Mapping +from dataclasses import dataclass, field + +import numpy as np +import pandas as pd + +from microcosm.build.source_manifest import SourceStageSpec +from microcosm.build.stochastic_assignment import stable_identity_uniforms +from microcosm.build.uk_runtime.national_frame import ( + uk_household_weight_kind, + uk_national_frame, + uk_time_period, + validate_uk_national_frame, +) +from microcosm.build.uk_runtime.take_up_contract import ( + UKTakeUpContract, + load_uk_take_up_contract, +) +from microcosm.build.uk_runtime.uc_capital_coherence import ( + _household_to_benunit_weights, +) +from microcosm.frame import Frame +from microcosm.frame.rules import assert_rules_engine_country + +PENSION_CREDIT_TAKE_UP_STAGE_NAME = "pension_credit_take_up" +PENSION_CREDIT_TAKE_UP_OUTPUT = "would_claim_pc" +PENSION_CREDIT_TAKE_UP_SEED = 0 +PENSION_CREDIT_ENTITLEMENT_VARIABLES = ( + "guarantee_credit", + "savings_credit", + "is_pension_credit_eligible", +) +PENSION_CREDIT_REPORTED_ANCHOR = "pension_credit_reported_anchor" +PENSION_CREDIT_AGGREGATES = {PENSION_CREDIT_REPORTED_ANCHOR: "pension_credit_reported"} +#: The component bands, in the order DWP reports take-up, with their rules and +#: the take-up contract keys of their rates. +PENSION_CREDIT_TAKE_UP_BANDS = ( + { + "name": "guarantee_credit", + "rule": "is_pension_credit_eligible AND guarantee_credit > 0", + "rate_key": "pension_credit_guarantee_credit", + }, + { + "name": "savings_credit_only", + "rule": ( + "is_pension_credit_eligible AND guarantee_credit <= 0 " + "AND savings_credit > 0" + ), + "rate_key": "pension_credit_savings_credit_only", + }, +) +PENSION_CREDIT_RESIDUAL_RATE = "(rate * entitled - reporters) / (entitled - reporters), weighted, clipped to [0, 1]" + + +@dataclass(frozen=True) +class UKPensionCreditTakeUpResult: + """Output frame and executed-effect receipt for the Pension Credit redraw.""" + + frame: Frame + bands: tuple[Mapping[str, object], ...] + reporters_without_entitlement: Mapping[str, float] + changed_units: int + + def evidence(self) -> dict[str, object]: + return { + "stage": PENSION_CREDIT_TAKE_UP_STAGE_NAME, + "seed": PENSION_CREDIT_TAKE_UP_SEED, + "residual_rate": PENSION_CREDIT_RESIDUAL_RATE, + "bands": [dict(band) for band in self.bands], + "reporters_without_entitlement": dict(self.reporters_without_entitlement), + "changed_units": self.changed_units, + } + + +@dataclass(frozen=True) +class UKPensionCreditTakeUpStageTransform: + """Whole-stage callable for the post-SPI Pension Credit take-up redraw.""" + + stage: SourceStageSpec + engine: object + contract: UKTakeUpContract | None = None + last_result: UKPensionCreditTakeUpResult | None = field(default=None, init=False) + + def __call__(self, frame: Frame) -> Frame: + _assert_stage_parameters(self.stage) + result = redraw_pension_credit_take_up( + frame, + engine=self.engine, + contract=self.contract or load_uk_take_up_contract(), + ) + object.__setattr__(self, "last_result", result) + return result.frame + + @staticmethod + def output_columns() -> tuple[str, ...]: + return () + + def checkpoint_metadata(self) -> dict[str, object]: + if self.last_result is None: + raise RuntimeError("checkpoint metadata requires a completed stage run.") + return {"evidence": self.last_result.evidence()} + + +def redraw_pension_credit_take_up( + frame: Frame, + *, + engine: object, + contract: UKTakeUpContract, +) -> UKPensionCreditTakeUpResult: + """Redraw ``would_claim_pc`` by component band from engine entitlement.""" + + validate_uk_national_frame(frame) + assert_rules_engine_country(engine, "uk") + person = frame.table("person").copy() + benunit = frame.table("benunit").copy() + household = frame.table("household").copy() + for table, columns, label in ( + ( + person, + ("person_benunit_id", "person_household_id", "pension_credit_reported"), + "person", + ), + (benunit, ("benunit_id", PENSION_CREDIT_TAKE_UP_OUTPUT), "benunit"), + ): + missing = sorted(set(columns) - set(table.columns)) + if missing: + raise ValueError( + f"Pension Credit take-up {label} columns missing: {missing}." + ) + period = uk_time_period(frame) + materialized = engine.materialize( + frame, list(PENSION_CREDIT_ENTITLEMENT_VARIABLES), period + ) + missing = sorted(set(PENSION_CREDIT_ENTITLEMENT_VARIABLES) - set(materialized)) + if missing: + raise ValueError(f"Pension Credit take-up engine outputs missing: {missing}.") + count = len(benunit) + guarantee = _aligned(materialized["guarantee_credit"], count, "guarantee_credit") + savings = _aligned(materialized["savings_credit"], count, "savings_credit") + eligible = _aligned( + materialized["is_pension_credit_eligible"], count, "is_pension_credit_eligible" + ).astype(bool) + reporter_ids = person.loc[ + pd.to_numeric(person["pension_credit_reported"], errors="coerce").fillna(0.0) + > 0, + "person_benunit_id", + ] + reporter = benunit["benunit_id"].isin(reporter_ids).to_numpy(dtype=bool) + weights = _household_to_benunit_weights( + benunit, + person=person, + household=household, + household_weights=frame.weights_for("household").values, + ) + draws = stable_identity_uniforms( + benunit["benunit_id"].to_numpy(), + seed=PENSION_CREDIT_TAKE_UP_SEED, + salt=PENSION_CREDIT_TAKE_UP_OUTPUT, + ) + would_claim, bands = assign_component_take_up( + guarantee=guarantee, + savings=savings, + eligible=eligible, + reporter=reporter, + weights=weights, + draws=draws, + rates={ + band["rate_key"]: contract.rate(band["rate_key"]) + for band in PENSION_CREDIT_TAKE_UP_BANDS + }, + ) + entitled = eligible & ((guarantee > 0.0) | (savings > 0.0)) + outside = reporter & ~entitled + previous = benunit[PENSION_CREDIT_TAKE_UP_OUTPUT].fillna(False).to_numpy(dtype=bool) + benunit[PENSION_CREDIT_TAKE_UP_OUTPUT] = would_claim + result = uk_national_frame( + person=person, + benunit=benunit, + household=household, + time_period=period, + weight_kind=uk_household_weight_kind(frame), + household_weights=frame.weights_for("household").values, + mass_log=frame.mass_log, + ) + validate_uk_national_frame(result) + return UKPensionCreditTakeUpResult( + frame=result, + bands=bands, + reporters_without_entitlement={ + "units": int(outside.sum()), + "weighted_units": float(weights[outside].sum()), + }, + changed_units=int((previous != would_claim).sum()), + ) + + +def assign_component_take_up( + *, + guarantee: np.ndarray, + savings: np.ndarray, + eligible: np.ndarray, + reporter: np.ndarray, + weights: np.ndarray, + draws: np.ndarray, + rates: Mapping[str, float], +) -> tuple[np.ndarray, tuple[dict[str, object], ...]]: + """Reporters claim; entitled non-reporters claim at their band's residual rate.""" + + guarantee = np.asarray(guarantee, dtype=np.float64) + savings = np.asarray(savings, dtype=np.float64) + eligible = np.asarray(eligible, dtype=bool) + reporter = np.asarray(reporter, dtype=bool) + weights = np.asarray(weights, dtype=np.float64) + draws = np.asarray(draws, dtype=np.float64) + masks = { + "guarantee_credit": eligible & (guarantee > 0.0), + "savings_credit_only": eligible & (guarantee <= 0.0) & (savings > 0.0), + } + would_claim = reporter.copy() + receipts = [] + for band in PENSION_CREDIT_TAKE_UP_BANDS: + mask = masks[band["name"]] + rate = float(rates[band["rate_key"]]) + if not 0.0 <= rate <= 1.0: + raise ValueError( + f"{band['rate_key']} must be a rate in [0, 1], got {rate}." + ) + entitled = float(weights[mask].sum()) + reporting = float(weights[mask & reporter].sum()) + residual = 0.0 + if entitled > reporting: + residual = float( + np.clip( + (rate * entitled - reporting) / (entitled - reporting), 0.0, 1.0 + ) + ) + drawn = mask & ~reporter & (draws < residual) + would_claim |= drawn + realized = ( + float(weights[mask & would_claim].sum()) / entitled + if entitled > 0.0 + else None + ) + receipts.append( + { + "band": band["name"], + "rule": band["rule"], + "rate_key": band["rate_key"], + "rate": rate, + "entitled_units": int(mask.sum()), + "entitled_weighted": entitled, + "reporter_units": int((mask & reporter).sum()), + "reporter_weighted": reporting, + "residual_rate": residual, + "drawn_units": int(drawn.sum()), + "realized_take_up": realized, + "reporters_exceed_rate": bool( + entitled > 0.0 and reporting > rate * entitled + ), + } + ) + return would_claim, tuple(receipts) + + +def _aligned(values: object, expected: int, label: str) -> np.ndarray: + array = np.asarray(values) + if array.shape != (expected,): + raise ValueError(f"{label} must align to the benefit-unit table.") + if array.dtype != bool and not np.isfinite(array.astype(np.float64)).all(): + raise ValueError(f"{label} must be finite.") + return array + + +def _assert_stage_parameters(stage: SourceStageSpec) -> None: + if stage.stage != PENSION_CREDIT_TAKE_UP_STAGE_NAME: + raise ValueError( + f"Pension Credit take-up received stage {stage.stage!r}, expected " + f"{PENSION_CREDIT_TAKE_UP_STAGE_NAME!r}." + ) + kinds = [operation.kind for operation in stage.operations] + expected_kinds = [ + "materialize_rules_engine_predictors", + "aggregate_person_to_benunit", + "assign_component_take_up_residual", + ] + if kinds != expected_kinds: + raise ValueError( + f"{PENSION_CREDIT_TAKE_UP_STAGE_NAME} operation order drifted: " + f"expected {expected_kinds}, got {kinds}." + ) + materialize, aggregate, assign = stage.operations + expected = { + "materialize": { + "predictors": list(PENSION_CREDIT_ENTITLEMENT_VARIABLES), + "consumed_only": True, + }, + "aggregate": { + "method": "any_positive", + "consumed_only": True, + "aggregates": PENSION_CREDIT_AGGREGATES, + }, + "assign": { + "output": PENSION_CREDIT_TAKE_UP_OUTPUT, + "draw": PENSION_CREDIT_TAKE_UP_OUTPUT, + "seed": PENSION_CREDIT_TAKE_UP_SEED, + "anchor": PENSION_CREDIT_REPORTED_ANCHOR, + "bands": [dict(band) for band in PENSION_CREDIT_TAKE_UP_BANDS], + "weight_mapping": "household_to_benunit", + "residual_rate": PENSION_CREDIT_RESIDUAL_RATE, + }, + } + actual = { + "materialize": dict(materialize.parameters), + "aggregate": dict(aggregate.parameters), + "assign": dict(assign.parameters), + } + if actual != expected: + raise ValueError( + f"{PENSION_CREDIT_TAKE_UP_STAGE_NAME} parameters drifted: expected " + f"{expected}, got {actual}." + ) + if stage.outputs != () or stage.rewrites != (PENSION_CREDIT_TAKE_UP_OUTPUT,): + raise ValueError( + f"{PENSION_CREDIT_TAKE_UP_STAGE_NAME} must declare no new outputs and " + "exactly the would_claim_pc rewrite." + ) + + +__all__ = [ + "PENSION_CREDIT_ENTITLEMENT_VARIABLES", + "PENSION_CREDIT_TAKE_UP_BANDS", + "PENSION_CREDIT_TAKE_UP_STAGE_NAME", + "UKPensionCreditTakeUpResult", + "UKPensionCreditTakeUpStageTransform", + "assign_component_take_up", + "redraw_pension_credit_take_up", +] diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/salary_sacrifice.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/salary_sacrifice.py index 79148671b..555e4d1bc 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/salary_sacrifice.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/salary_sacrifice.py @@ -43,9 +43,9 @@ SALSAC_CONVERSION_SEED = 2024 SALSAC_CONVERSION_SALT = "salary_sacrifice_conversion" SALSAC_MASS_CHANGE_REASON = ( - "Salary-sacrifice support stage rewrites pension columns only; household " - "rows and typed household weights pass through and total household mass " - "is conserved." + "Salary-sacrifice support stage rewrites pension columns and converted " + "records' pay; household rows and typed household weights pass through and " + "total household mass is conserved." ) @@ -121,7 +121,7 @@ def __call__(self, frame: Frame) -> Frame: @staticmethod def output_columns() -> tuple[str, ...]: - return (SALSAC_OUTPUT, "employee_pension_contributions") + return (SALSAC_OUTPUT, "employee_pension_contributions", "employment_income") def checkpoint_metadata(self) -> dict[str, object]: if self.last_result is None: @@ -233,9 +233,19 @@ def impute_salary_sacrifice(frame: Frame) -> UKSalarySacrificeResult: converted = donor_pool & (draws < rate) moved_amount = float(employee[converted].sum()) final_ss[converted] = employee[converted] + # Sacrificed pay leaves the contract: the engine reads employment_income + # after sacrifice, so a converted record's pay drops by the amount that + # becomes salary sacrifice. Without this the converted contribution left + # taxable pay and NI unchanged while losing its net-pay relief + # (microcosm#1069 c9). + employment_income = employment_income.copy() + employment_income[converted] = np.maximum( + employment_income[converted] - employee[converted], 0.0 + ) employee[converted] = 0.0 person[SALSAC_OUTPUT] = final_ss person["employee_pension_contributions"] = employee + person["employment_income"] = employment_income post_headcount = float(person_weights[final_ss > 0.0].sum()) converted_mass = float(person_weights[converted].sum()) total = frame.weights_for("household").total @@ -326,7 +336,8 @@ def _assert_salary_sacrifice_stage_parameters( "rate_cap": SALSAC_RATE_CAP, "move": ( "full employee_pension_contributions to " - "pension_contributions_via_salary_sacrifice; source zeroed" + "pension_contributions_via_salary_sacrifice; source zeroed; " + "employment_income lowered by the amount sacrificed" ), "seed": SALSAC_CONVERSION_SEED, "salt": SALSAC_CONVERSION_SALT, diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_income.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_income.py index 71cea6dc6..c734c632a 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_income.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_income.py @@ -3,6 +3,7 @@ from __future__ import annotations import hashlib +import math from collections.abc import Mapping, Sequence from dataclasses import dataclass from functools import cache @@ -233,6 +234,9 @@ for output, sources in SPI_INCOME_SOURCE_COLUMNS.items() if output not in {"employment_income", "self_employment_income"} } +#: SPI 2022-23 AGERANGE codes as whole-year bands ``[low, high)``: code 6 is +#: "65 to 74" and code 7 "75 and over", drawn over 75 to 89 and the ONS +#: 90-and-over cell (ages 90 up to 91). Composite records (-1) carry no age. _SPI_AGE_RANGES = { -1: (16, 70), 1: (16, 25), @@ -240,9 +244,28 @@ 3: (35, 45), 4: (45, 55), 5: (55, 65), - 6: (65, 74), - 7: (74, 90), + 6: (65, 75), + 7: (75, 91), } +#: The vendored ONS single-year population resource the donor age draw reads. +SPI_DONOR_AGE_POPULATION_RESOURCE = "ons_single_year_age_populations.json" +#: The ONS mid-year estimate period the resource is vendored at (mid-2023, +#: the nearest estimate to the 2022-23 donor tape). +SPI_DONOR_AGE_POPULATION_PERIOD = 2023 +SPI_DONOR_AGE_DRAW_METHOD = ( + "whole-year age drawn within the AGERANGE band in proportion to the ONS " + "single-year population of the donor's sex, then a uniform fraction of a " + "year; State Pension recipients (SRP > 0) are drawn at or above State " + "Pension age, and the band's below-State-Pension-age population share is " + "drawn from its non-recipients" +) +#: Donors carry a drawn fractional age and frame people a whole-year one, so +#: the stage-1 forest is queried at the middle of each person's year of age. +#: At the whole year a person sits on any split the forest places at that +#: birthday; at State Pension age, below which no donor draws State Pension, +#: about half of the frame's 66-year-olds drew a 65-year-old donor's zero +#: State Pension leaf (microcosm#1069, c4 measurement arm). +SPI_STAGE1_QUERY_AGE_RULE = "whole-year age plus half a year" _SPI_REGION_MAP = { 1: "NORTH_EAST", 2: "NORTH_WEST", @@ -259,6 +282,240 @@ } +@dataclass(frozen=True) +class SPIDonorAgeModel: + """Single-year populations and State Pension age for the donor age draw. + + ``populations`` maps ``("MALE" | "FEMALE", whole-year age)`` to the ONS + resident population, the 90-and-over cell at age 90. A donor of unknown + sex draws on the two sexes summed. + """ + + populations: Mapping[tuple[str, int], float] + state_pension_age: int + source: str + + def __post_init__(self) -> None: + if not isinstance(self.state_pension_age, int) or self.state_pension_age <= 0: + raise ValueError("SPI donor age model needs an integer State Pension age.") + for (sex, age), value in self.populations.items(): + if sex not in {"MALE", "FEMALE"} or not isinstance(age, int): + raise ValueError( + f"SPI donor age model has an invalid population key {(sex, age)!r}." + ) + if not math.isfinite(float(value)) or float(value) < 0.0: + raise ValueError( + f"SPI donor age model population for {(sex, age)!r} must be " + "finite and non-negative." + ) + + def weights(self, sex: str, ages: range) -> np.ndarray: + """Population weights over ``ages`` for ``sex`` (both sexes if unknown).""" + + sexes = (sex,) if sex in {"MALE", "FEMALE"} else ("MALE", "FEMALE") + values = np.asarray( + [ + sum(float(self.populations.get((name, age), 0.0)) for name in sexes) + for age in ages + ], + dtype=np.float64, + ) + if values.sum() <= 0.0: + raise ValueError( + f"SPI donor age model has no population for {sex} at ages " + f"{ages.start} to {ages.stop - 1}." + ) + return values + + +def load_spi_donor_age_model(build_period: int | str) -> SPIDonorAgeModel: + """Read the vendored ONS single-year populations and the engine's SPA.""" + + from microcosm.build.uk_runtime.frs_take_up import uk_take_up_population_policy + from microcosm.build.uk_runtime.ledger_fact_vendoring import vendored_rows + + rows = vendored_rows( + SPI_DONOR_AGE_POPULATION_RESOURCE, + period_value=str(SPI_DONOR_AGE_POPULATION_PERIOD), + ) + populations: dict[tuple[str, int], float] = {} + for row in rows: + dimensions = row.get("dimensions") or {} + sex = str(dimensions.get("sex", "")).upper() + raw_age = str(dimensions.get("age", "")) + age = 90 if raw_age == "90_plus" else int(raw_age) + key = (sex, age) + if key in populations: + raise ValueError(f"{SPI_DONOR_AGE_POPULATION_RESOURCE} repeats {key!r}.") + populations[key] = float(row["value"]) + expected = {(sex, age) for sex in ("MALE", "FEMALE") for age in range(0, 91)} + if set(populations) != expected: + missing = sorted(expected - set(populations))[:5] + raise ValueError( + f"{SPI_DONOR_AGE_POPULATION_RESOURCE} must carry ages 0 to 90 for both " + f"sexes at mid-{SPI_DONOR_AGE_POPULATION_PERIOD}; missing {missing}." + ) + policy = uk_take_up_population_policy(build_period) + return SPIDonorAgeModel( + populations=populations, + state_pension_age=policy.state_pension_age, + source=( + f"{SPI_DONOR_AGE_POPULATION_RESOURCE} (ONS MYE2 mid-" + f"{SPI_DONOR_AGE_POPULATION_PERIOD}); State Pension age from " + f"{policy.source} at {policy.instant}" + ), + ) + + +def _draw_spi_donor_ages( + age_codes: np.ndarray, + sex: np.ndarray, + receives_state_pension: np.ndarray, + fact: np.ndarray, + rng: np.random.Generator, + *, + model: SPIDonorAgeModel, +) -> tuple[np.ndarray, list[dict[str, object]]]: + """Draw donor ages by ONS single-year shares, State Pension age aware. + + Within each (AGERANGE band, sex) cell, a band that straddles State Pension + age splits into a below segment and an at-or-above segment. Recipients + (``SRP > 0``) always draw from the at-or-above segment. Non-recipients + draw from the below segment with the probability that puts the band's + ONS below-segment population share of the cell's FACT mass there (capped + at one, the shortfall receipted), and otherwise from at-or-above. The + whole-year age inside a segment follows the ONS single-year populations, + and a uniform fraction of a year keeps the predictor continuous. + """ + + spa = model.state_pension_age + ages = np.empty(len(age_codes), dtype=np.float64) + receipt: list[dict[str, object]] = [] + for code in sorted(set(int(value) for value in age_codes)): + low, high = _SPI_AGE_RANGES[code] + for sex_label in ("MALE", "FEMALE", "UNKNOWN"): + cell = np.flatnonzero((age_codes == code) & (sex == sex_label)) + if cell.size == 0: + continue + recipients = receives_state_pension[cell] + segments: list[range] = [] + if low < spa < high: + segments = [range(low, spa), range(spa, high)] + else: + segments = [range(low, high)] + cell_mass = float(fact[cell].sum()) + below_share = 0.0 + p_below = 0.0 + unfilled_below_mass = 0.0 + if len(segments) == 2: + all_weights = model.weights(sex_label, range(low, high)) + below_share = float(all_weights[: spa - low].sum() / all_weights.sum()) + non_recipient_mass = float(fact[cell][~recipients].sum()) + wanted = below_share * cell_mass + if non_recipient_mass > 0.0: + p_below = min(1.0, wanted / non_recipient_mass) + unfilled_below_mass = max(0.0, wanted - non_recipient_mass) + choose_below = (~recipients) & (rng.random(cell.size) < p_below) + else: + choose_below = np.zeros(cell.size, dtype=bool) + for position, segment in enumerate(segments): + if len(segments) == 2: + members = choose_below if position == 0 else ~choose_below + else: + members = np.ones(cell.size, dtype=bool) + count = int(members.sum()) + if count == 0: + continue + weights = model.weights(sex_label, segment) + whole = rng.choice( + np.arange(segment.start, segment.stop), + size=count, + p=weights / weights.sum(), + ) + ages[cell[members]] = whole + rng.random(count) + drawn = ages[cell] + receipt.append( + { + "agerange": code, + "sex": sex_label, + "band": [low, high], + "donors": int(cell.size), + "state_pension_recipients": int(recipients.sum()), + "fact_mass": cell_mass, + "ons_below_state_pension_age_share": below_share, + "non_recipient_below_probability": p_below, + "unfilled_below_state_pension_age_mass": unfilled_below_mass, + "recipients_below_state_pension_age": int( + (recipients & (drawn < spa)).sum() + ), + } + ) + return ages, receipt + + +@dataclass(frozen=True) +class UKSPIStatePensionAgeGuard: + """Pension-age reports the income stage zeroes below State Pension age. + + ``spi_channel_columns`` are imputed on the synthetic channel (the SPI + State Pension leaf is always zeroed there before the stage-2 receipt + bridge reads it); ``base_channel_columns`` are FRS reports on the base + channel, zeroed before stage 2 trains on them (microcosm#1069, ruling R8: + zero with a receipt). + """ + + state_pension_age: int + spi_channel_columns: tuple[str, ...] + base_channel_columns: tuple[str, ...] + + def __post_init__(self) -> None: + if not isinstance(self.state_pension_age, int) or self.state_pension_age <= 0: + raise ValueError("State Pension age guard needs an integer age.") + for columns in (self.spi_channel_columns, self.base_channel_columns): + if len(set(columns)) != len(columns) or not all( + isinstance(column, str) and column for column in columns + ): + raise ValueError( + "State Pension age guard columns must be distinct names." + ) + + +def _zero_below_state_pension_age( + person: pd.DataFrame, + *, + rows: pd.Series, + columns: Sequence[str], + state_pension_age: int, + person_weights: pd.Series, + step: str, +) -> tuple[pd.DataFrame, dict[str, object]]: + """Zero ``columns`` on ``rows`` whose age is below State Pension age.""" + + below = rows.astype(bool) & person["age"].lt(state_pension_age) + removed: dict[str, dict[str, float]] = {} + for column in columns: + if column not in person.columns: + raise ValueError( + f"State Pension age guard names {column!r}, absent from the frame." + ) + values = person.loc[below, column].to_numpy(dtype=np.float64) + positive = values > 0.0 + weights = person_weights.loc[below].to_numpy(dtype=np.float64) + removed[column] = { + "rows": int(positive.sum()), + "weighted_people": float(weights[positive].sum()), + "unweighted_amount": float(values[positive].sum()), + "weighted_amount": float((values * weights)[positive].sum()), + } + person.loc[below, column] = 0.0 + return person, { + "step": step, + "state_pension_age": state_pension_age, + "rows_below_state_pension_age": int(below.sum()), + "removed": removed, + } + + @dataclass(frozen=True) class UKSPIIncomeImputationResult: """SPI-filled person table and auditable fit/source evidence.""" @@ -275,6 +532,8 @@ class UKSPIIncomeImputationResult: pension_receipt_bridge: Mapping[str, object] | None = None income_uprating: Mapping[str, object] | None = None band_donor_resample: Mapping[str, object] | None = None + donor_age_draw: Mapping[str, object] | None = None + state_pension_age_guard: tuple[Mapping[str, object], ...] = () @dataclass(frozen=True) @@ -379,13 +638,19 @@ def impute_uk_spi_income_support( condition_on_state_pension_receipt: bool = False, rebase_income_to_build_period: bool = False, band_donor_resample: Mapping[str, object] | None = None, + donor_age_model: SPIDonorAgeModel | None = None, + state_pension_age_guard: UKSPIStatePensionAgeGuard | None = None, ) -> UKSPIIncomeImputationResult: """Run strict SPI-income and FRS-only QRFs on rebuilt positive support. ``band_donor_resample`` (``lower_bounds``, ``regional_pool_minimum``, - ``seed``) gives the reserved band carriers (PolicyEngine/chronicle#280 lane) a - band-conditional draw from the full prepared tape after the stage-1 - forest draw; ``None`` leaves every synthetic adult on the forest draw. + ``seed`` and optionally ``age_pool_minimum``) gives the reserved band + carriers (PolicyEngine/chronicle#280 lane) a band-conditional draw from + the full prepared tape after the stage-1 forest draw; ``None`` leaves + every synthetic adult on the forest draw. ``donor_age_model`` draws donor + ages by ONS single-year shares, State Pension age aware, and + ``state_pension_age_guard`` zeroes pension-age reports below State Pension + age with receipts (microcosm#1069). """ if support.household_weight_kind is not WeightKind.IMPORTANCE: @@ -422,7 +687,11 @@ def impute_uk_spi_income_support( if not isinstance(donor_table, pd.DataFrame): raise TypeError("donor_table must be a pandas DataFrame.") raw_donor = donor_table.copy(deep=True) - donor = _prepare_spi_donor(raw_donor, seed=seed) + donor = _prepare_spi_donor(raw_donor, seed=seed, age_model=donor_age_model) + donor_age_draw = { + **donor.attrs.get("age_draw", {}), + "stage1_query_age": SPI_STAGE1_QUERY_AGE_RULE, + } donor_full = donor donor_fit_weights = donor["FACT"].to_numpy(dtype=np.float64) if donor_sample_size is not None: @@ -487,10 +756,9 @@ def impute_uk_spi_income_support( ) person = _seed_frs_hmrc_auxiliary_leaves(person, spi_people=spi_people) - recipient_predictors = _person_predictors( + recipient_predictors = _stage1_query_predictors( person.loc[spi_channel_people], household, - income_predictors=(), ) donor_predictors, encoded_recipient = _encode_predictor_pair( donor[["age", "gender", "region"]], @@ -557,8 +825,24 @@ def impute_uk_spi_income_support( household=household, spi_people=spi_people, uprating_factors=uprating_factors, + state_pension_age=( + None if donor_age_model is None else donor_age_model.state_pension_age + ), **dict(band_donor_resample), ) + guard_receipts: list[Mapping[str, object]] = [] + if state_pension_age_guard is not None: + # The SPI State Pension leaf decides the stage-2 receipt bridge, so it + # is zeroed below State Pension age before the bridge reads it. + person, receipt = _zero_below_state_pension_age( + person, + rows=spi_people, + columns=(SPI_HMRC_STATE_PENSION_INCOME_COLUMN,), + state_pension_age=state_pension_age_guard.state_pension_age, + person_weights=_person_household_weights(person, household), + step="spi_state_pension_leaf_after_stage1", + ) + guard_receipts.append(receipt) person = _derive_policyengine_employment_input(person, spi_people=spi_people) taxable_interest_draw = person.loc[spi_people, "savings_interest_income"].to_numpy( @@ -574,6 +858,19 @@ def impute_uk_spi_income_support( ].isin(training_household_ids) if not training_people.any(): raise ValueError("FRS-only stage has no canonical base training rows.") + if ( + state_pension_age_guard is not None + and state_pension_age_guard.base_channel_columns + ): + person, receipt = _zero_below_state_pension_age( + person, + rows=base_people, + columns=state_pension_age_guard.base_channel_columns, + state_pension_age=state_pension_age_guard.state_pension_age, + person_weights=_person_household_weights(person, household), + step="base_channel_reports_before_stage2", + ) + guard_receipts.append(receipt) income_predictors = FRS_ONLY_SPI_FILL_INCOME_PREDICTOR_COLUMNS train_predictors = _person_predictors( @@ -637,13 +934,22 @@ def impute_uk_spi_income_support( raise ValueError("FRS-only stage-2 produced negative non-negative outputs.") for column in stage2_outputs: person.loc[spi_people, column] = stage2_draws[column].to_numpy() + if ( + state_pension_age_guard is not None + and state_pension_age_guard.spi_channel_columns + ): + person, receipt = _zero_below_state_pension_age( + person, + rows=spi_people, + columns=state_pension_age_guard.spi_channel_columns, + state_pension_age=state_pension_age_guard.state_pension_age, + person_weights=_person_household_weights(person, household), + step="spi_channel_reports_after_stage2", + ) + guard_receipts.append(receipt) if base_redraw_columns: - base_predictors = _person_predictors( - person.loc[base_people], - household, - income_predictors=(), - ) + base_predictors = _stage1_query_predictors(person.loc[base_people], household) _, encoded_base = _encode_predictor_pair( donor[["age", "gender", "region"]], base_predictors, @@ -702,6 +1008,8 @@ def impute_uk_spi_income_support( pension_receipt_bridge=pension_bridge, income_uprating=income_uprating, band_donor_resample=band_donor_receipt, + donor_age_draw=donor_age_draw, + state_pension_age_guard=tuple(guard_receipts), ) @@ -709,6 +1017,16 @@ def impute_uk_spi_income_support( SPI_INCOME_BAND_LOWER_BOUND_COLUMN = "spi_income_band_donor_lower_bound" +def _spi_agerange_codes(ages: np.ndarray) -> np.ndarray: + """The SPI AGERANGE code (1 to 7) of each age; under-16s map to code 1.""" + + codes = np.ones(len(ages), dtype=np.int64) + for code in sorted(code for code in _SPI_AGE_RANGES if code > 0): + low = _SPI_AGE_RANGES[code][0] + codes[np.asarray(ages, dtype=float) >= low] = code + return codes + + def _resample_band_donor_leaves( person: pd.DataFrame, donor: pd.DataFrame, @@ -719,6 +1037,8 @@ def _resample_band_donor_leaves( lower_bounds: Sequence[int], regional_pool_minimum: int, seed: int, + age_pool_minimum: int | None = None, + state_pension_age: int | None = None, ) -> tuple[pd.DataFrame, dict[str, object]]: """Give every reserved band carrier a band-conditional tape draw. @@ -729,7 +1049,15 @@ def _resample_band_donor_leaves( year's Table 2.5 bands and the reserved weights are that year's taxpayer counts, so membership is asserted on the uprated amount, not on the tape's 2022-23 nominal one. The pool narrows to the carrier's region when - that regional pool holds at least ``regional_pool_minimum`` records. One + that regional pool holds at least ``regional_pool_minimum`` records. With + ``age_pool_minimum`` the band pool first narrows to the records in the + carrier's published SPI age band (composites, which carry none, never + age-match) when that pool holds at least ``age_pool_minimum`` records, + and the regional narrowing then applies within it (microcosm#1069). With + ``state_pension_age`` the band pool first keeps only the records whose + drawn age is on the carrier's side of State Pension age, since the + published age band 65 to 74 straddles it and a carrier at or over it must + not inherit the zero State Pension leaf of a donor drawn below it. One record is drawn FACT-weighted with replacement and all stage-1 leaves are copied from it, then uprated exactly as the forest draws were; the accounting aggregates derive after the draw as usual. Composite records @@ -741,6 +1069,14 @@ def _resample_band_donor_leaves( raise ValueError("regional_pool_minimum must be a positive integer.") if not isinstance(seed, int): raise ValueError("band donor resample seed must be an integer.") + if age_pool_minimum is not None and ( + not isinstance(age_pool_minimum, int) or age_pool_minimum <= 0 + ): + raise ValueError("age_pool_minimum must be a positive integer or None.") + if state_pension_age is not None and ( + not isinstance(state_pension_age, int) or state_pension_age <= 0 + ): + raise ValueError("state_pension_age must be a positive integer or None.") lowers = sorted(int(value) for value in lower_bounds) if not lowers or len(set(lowers)) != len(lowers): raise ValueError("band donor lower bounds must be distinct.") @@ -810,24 +1146,66 @@ def _resample_band_donor_leaves( f"lies in the band from {lower}." ) pools[lower] = pool + if age_pool_minimum is not None and "agerange" not in donor.columns: + raise ValueError("age-band pooling needs the prepared donor's agerange column.") + donor_agerange = ( + donor["agerange"].to_numpy(dtype=np.int64) + if age_pool_minimum is not None + else None + ) + # Ages are read only when age pooling is declared; a frame without it + # keeps the income-band and regional pools unchanged. + carrier_agerange = ( + _spi_agerange_codes(carrier_rows["age"].to_numpy(dtype=float)) + if donor_agerange is not None + else np.zeros(len(carrier_rows), dtype=np.int64) + ) + if state_pension_age is not None and "age" not in donor.columns: + raise ValueError("State Pension age pooling needs the prepared donor's age.") + donor_pension_age = ( + donor["age"].to_numpy(dtype=float) >= state_pension_age + if state_pension_age is not None + else None + ) + carrier_pension_age = ( + carrier_rows["age"].to_numpy(dtype=float) >= state_pension_age + if state_pension_age is not None + else np.zeros(len(carrier_rows), dtype=bool) + ) rng = np.random.default_rng(seed) drawn = np.empty(len(carrier_rows), dtype=np.int64) matched = np.zeros(len(carrier_rows), dtype=bool) - regional_cache: dict[tuple[int, str], np.ndarray] = {} - for index, (band, region) in enumerate(zip(bands, regions, strict=True)): + age_matched = np.zeros(len(carrier_rows), dtype=bool) + side_matched = np.zeros(len(carrier_rows), dtype=bool) + pool_cache: dict[ + tuple[int, str, int, bool], tuple[np.ndarray, bool, bool, bool] + ] = {} + for index, (band, region, code, pension_age) in enumerate( + zip(bands, regions, carrier_agerange, carrier_pension_age, strict=True) + ): lower = int(band) - key = (lower, region) - if key not in regional_cache: - national = pools[lower] - regional = national[donor_region[national] == region] - regional_cache[key] = ( - regional if regional.size >= regional_pool_minimum else national - ) - regional_cache[(lower, region, "matched")] = ( # type: ignore[index] - regional.size >= regional_pool_minimum + key = (lower, region, int(code), bool(pension_age)) + if key not in pool_cache: + base = pools[lower] + base_is_sided = False + if donor_pension_age is not None: + sided = base[donor_pension_age[base] == bool(pension_age)] + if sided.size: + base, base_is_sided = sided, True + base_is_aged = False + if donor_agerange is not None: + aged = base[donor_agerange[base] == int(code)] + if aged.size >= age_pool_minimum: + base, base_is_aged = aged, True + regional = base[donor_region[base] == region] + regional_ok = regional.size >= regional_pool_minimum + pool_cache[key] = ( + regional if regional_ok else base, + regional_ok, + base_is_aged, + base_is_sided, ) - pool = regional_cache[key] - matched[index] = bool(regional_cache[(lower, region, "matched")]) # type: ignore[index] + pool, matched[index], age_matched[index], side_matched[index] = pool_cache[key] weights = fact[pool] drawn[index] = int(rng.choice(pool, p=weights / weights.sum())) leaves = leaf_values[drawn] * factors @@ -857,6 +1235,8 @@ def _resample_band_donor_leaves( "pool_composite_records": int(composite[pool].sum()), "pool_weighted_taxpayers": float(fact[pool].sum()), "regional_matched_carriers": int(matched[mask].sum()), + "age_matched_carriers": int(age_matched[mask].sum()), + "state_pension_age_matched_carriers": int(side_matched[mask].sum()), "realized_min_total_income": ( float(realized.min()) if realized.size else None ), @@ -876,6 +1256,8 @@ def _resample_band_donor_leaves( "plus the published remainder held nominal" ), "regional_pool_minimum": regional_pool_minimum, + "age_pool_minimum": age_pool_minimum, + "state_pension_age": state_pension_age, "seed": seed, "weighting": "FACT", "with_replacement": True, @@ -964,17 +1346,34 @@ def _initialize_frs_channel_columns( return result -def prepare_spi_donor_table(raw: pd.DataFrame, *, seed: int) -> pd.DataFrame: +def prepare_spi_donor_table( + raw: pd.DataFrame, + *, + seed: int, + age_model: SPIDonorAgeModel | None = None, +) -> pd.DataFrame: """Prepare a raw SPI 2022-23 tape exactly as the income stage does. The band-donor stage shares this preparation so its propensity table and the income stage's band pools read the same ages, regions and leaves. """ - return _prepare_spi_donor(raw, seed=seed) + return _prepare_spi_donor(raw, seed=seed, age_model=age_model) + +def _prepare_spi_donor( + raw: pd.DataFrame, + *, + seed: int, + age_model: SPIDonorAgeModel | None = None, +) -> pd.DataFrame: + """Prepare the donor tape; ``age_model`` draws ages by ONS shares. + + Without a model (synthetic tapes that ship no vendored population + resource) each donor's age is uniform within its AGERANGE band; the + production stages always pass the model the manifest declares. + """ -def _prepare_spi_donor(raw: pd.DataFrame, *, seed: int) -> pd.DataFrame: _require_columns(raw, SPI_DONOR_REQUIRED_COLUMNS, label="SPI 2022-23 donor") numeric = pd.DataFrame( { @@ -993,15 +1392,24 @@ def _prepare_spi_donor(raw: pd.DataFrame, *, seed: int) -> pd.DataFrame: if unknown_age: raise ValueError(f"SPI 2022-23 has unknown AGERANGE code(s): {unknown_age}.") rng = np.random.default_rng(seed) - bounds = np.asarray([_SPI_AGE_RANGES[code] for code in age_codes]) + gender = np.select((sex == 1, sex == 2), ("MALE", "FEMALE"), default="UNKNOWN") + age_draw_receipt: list[dict[str, object]] | None = None + if age_model is None: + bounds = np.asarray([_SPI_AGE_RANGES[code] for code in age_codes]) + ages = bounds[:, 0] + rng.random(len(raw)) * (bounds[:, 1] - bounds[:, 0]) + else: + ages, age_draw_receipt = _draw_spi_donor_ages( + age_codes.to_numpy(dtype=np.int64), + np.asarray(gender, dtype=object), + numeric["SRP"].to_numpy(dtype=np.float64) > 0.0, + numeric["FACT"].to_numpy(dtype=np.float64), + rng, + model=age_model, + ) donor = pd.DataFrame( { - "age": bounds[:, 0] + rng.random(len(raw)) * (bounds[:, 1] - bounds[:, 0]), - "gender": np.select( - (sex == 1, sex == 2), - ("MALE", "FEMALE"), - default="UNKNOWN", - ), + "age": ages, + "gender": gender, "region": numeric["GORCODE"] .astype(int) .map(_SPI_REGION_MAP) @@ -1024,6 +1432,21 @@ def _prepare_spi_donor(raw: pd.DataFrame, *, seed: int) -> pd.DataFrame: # they are never QRF inputs or outputs. donor["total_income"] = numeric["TI"].to_numpy(dtype=float) donor["is_composite"] = numeric["AGERANGE"].astype(int).eq(-1).to_numpy() + # The published age band travels with the record so band pools can match + # a carrier's age band; composites (-1) have none and never age-match. + donor["agerange"] = age_codes.to_numpy(dtype=np.int64) + donor.attrs["age_draw"] = { + "method": ( + SPI_DONOR_AGE_DRAW_METHOD + if age_model is not None + else "uniform within the AGERANGE band (no population model)" + ), + "source": None if age_model is None else age_model.source, + "state_pension_age": ( + None if age_model is None else age_model.state_pension_age + ), + "cells": age_draw_receipt or [], + } _require_finite_numeric( donor[["age", "FACT", *SPI_INCOME_QRF_OUTPUT_COLUMNS]], label="SPI 2022-23 derived donor", @@ -1296,6 +1719,17 @@ def _person_predictors( return result +def _stage1_query_predictors( + person: pd.DataFrame, + household: pd.DataFrame, +) -> pd.DataFrame: + """Stage-1 query predictors: age at the middle of the year of age.""" + + predictors = _person_predictors(person, household, income_predictors=()) + predictors["age"] = np.floor(predictors["age"].to_numpy(dtype=np.float64)) + 0.5 + return predictors + + def _encode_predictor_pair( train: pd.DataFrame, target: pd.DataFrame, diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_spine.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_spine.py index 3fcefa253..85d5c6753 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_spine.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_spine.py @@ -12,14 +12,21 @@ from microcosm.build.gates import FitWeightRecord from microcosm.build.source_manifest import SourceStageSpec +from microcosm.build.uk_runtime.employer_pension_contributions import ( + draw_employer_pension_contributions, + employer_scheme_and_sector, + load_ashe_employer_rates, +) from microcosm.build.uk_runtime.frs_hmrc_source import ( FRS_HMRC_INCPBEN_COLUMN, FRS_HMRC_PAY_COLUMN, FRS_HMRC_RETAINED_LEAF_COLUMNS, FRS_HMRC_UBISJA_COLUMN, _materialize_source_leaves, + _raw_source_person_ids, _read_raw_frs_table, ) +from microcosm.build.uk_runtime.frs_take_up import uk_take_up_population_policy from microcosm.build.uk_runtime.hmrc_income import ( HMRCIncomeTargetSet, materialize_hmrc_spi_income_band_targets, @@ -48,14 +55,19 @@ ) from microcosm.build.uk_runtime.spi_income import ( DEFAULT_SPI_DONOR_SAMPLE_SIZE, + SPI_DONOR_AGE_DRAW_METHOD, + SPI_DONOR_AGE_POPULATION_PERIOD, + SPI_DONOR_AGE_POPULATION_RESOURCE, SPI_DONOR_INCOME_YEAR, SPI_INCOME_UPRATING_VARIABLES, SPI_MINIMUM_RECIPIENT_AGE, SPI_SOURCE_TI_FORMULA, SPI_STAGE2_REVIEWED_ABSENT_OUTPUTS, UKSPIIncomeImputationResult, + UKSPIStatePensionAgeGuard, assert_frs_hmrc_auxiliary_crosswalk_available, impute_uk_spi_income_support, + load_spi_donor_age_model, verify_spi_donor_identity, ) from microcosm.build.uk_runtime.spi_support import ( @@ -81,6 +93,9 @@ support_clone_index_column, support_source_id_column, ) +from microcosm.build.uk_runtime.spi_support import ( + _spi_prior_mass_change_reason as _support_mass_change_reason, +) from microcosm.build.uk_runtime.terminal_gates import ( UKZeroWeightStratumDeclaration, ) @@ -93,9 +108,38 @@ #: The reserved band carriers' pool: the full prepared tape by published band. SPI_SPINE_BAND_DONOR_POOL = ( "full prepared donor tape by published total income band (TEI + TII), " - "narrowed to the carrier's region where that pool holds the minimum" + "narrowed to the carrier's SPI age band where that pool holds the age " + "minimum (composites never age-match), then to the carrier's region where " + "that pool holds the regional minimum" ) SPI_SPINE_BAND_DONOR_REGIONAL_POOL_MINIMUM = 20 +SPI_SPINE_BAND_DONOR_AGE_POOL_MINIMUM = 20 +SPI_SPINE_STATE_PENSION_AGE_SOURCE = ( + "policyengine-uk gov.dwp.state_pension.age at the build instant" +) +#: Reviewed declaration of the donor age draw (microcosm#1069, WP2 c5). +SPI_SPINE_DONOR_AGE_DRAW: Mapping[str, object] = { + "artifact_role": "qrf_donor", + "resource": SPI_DONOR_AGE_POPULATION_RESOURCE, + "population_period": SPI_DONOR_AGE_POPULATION_PERIOD, + "method": SPI_DONOR_AGE_DRAW_METHOD, + "state_pension_age": SPI_SPINE_STATE_PENSION_AGE_SOURCE, +} +#: Reviewed declaration of the State Pension age guard (ruling R8: zero with +#: a receipt). The SPI State Pension leaf is zeroed before the stage-2 receipt +#: bridge; imputed synthetic-channel reports after stage 2; the base +#: channel's State Pension reports before stage 2 trains on them. +SPI_SPINE_STATE_PENSION_AGE_GUARD: Mapping[str, object] = { + "spi_state_pension_leaf": SPI_HMRC_STATE_PENSION_INCOME_COLUMN, + "spi_channel_columns": [ + "state_pension_reported", + "pension_credit_reported", + "winter_fuel_allowance_reported", + ], + "base_channel_columns": ["state_pension_reported"], + "state_pension_age": SPI_SPINE_STATE_PENSION_AGE_SOURCE, + "receipt": "rows, weighted people and amounts removed per column and step", +} UK_FRS_HMRC_SPINE_LEAF_OUTPUT_COLUMNS = ( *FRS_HMRC_RETAINED_LEAF_COLUMNS, @@ -204,6 +248,15 @@ SPI_SPINE_BASE_REDRAW_COLUMNS = ("dividend_income",) SPI_SPINE_SUPPORT_CHANNELS = {"base": "frs", "synthetic": SPI_SYNTHETIC_SUPPORT_CHANNEL} SPI_SPINE_PRECLONE_GATE_NAME = "e7_spi_synthetic_preclone" +#: The reviewed SPI-channel prior share of households with a member at or over +#: State Pension age, and the stratum rule the manifest declares beside it +#: (microcosm#1069 c6). The channel's households are drawn unweighted with one +#: weight per region, so a region-only allocation gave the channel more +#: pension-age mass than the FRS design gives pension-age households, every +#: adult of it on a taxpayer's income. 0.2 (ruled 2026-10-02 over the measured +#: 0.5) keeps the low-income pensioners the benefit caseloads need in the prior. +SPI_SPINE_PENSION_AGE_PRIOR_MASS_SHARE = 0.2 +SPI_SPINE_PENSION_AGE_STRATUM = "any_member_at_or_over_state_pension_age" SPI_SPINE_EFFECTIVE_MASS_COLUMNS = ("gift_aid", "charitable_investment_gifts") @@ -212,13 +265,19 @@ class UKFRSHMRCSpineLeavesResult: frame: Frame source_signal_rows: dict[str, int] structural_zero_columns: tuple[str, ...] + employer_pension_contributions: Mapping[str, object] | None = None def evidence(self) -> dict[str, object]: - return { + evidence: dict[str, object] = { "stage": UK_FRS_HMRC_SPINE_LEAVES_STAGE_NAME, "source_signal_rows": dict(self.source_signal_rows), "structural_zero_columns": list(self.structural_zero_columns), } + if self.employer_pension_contributions is not None: + evidence["employer_pension_contributions"] = dict( + self.employer_pension_contributions + ) + return evidence @dataclass(frozen=True) @@ -252,6 +311,8 @@ def evidence(self) -> dict[str, object]: "pension_receipt_bridge": self.imputation.pension_receipt_bridge, "income_uprating": self.imputation.income_uprating, "band_donor_resample": self.imputation.band_donor_resample, + "donor_age_draw": self.imputation.donor_age_draw, + "state_pension_age_guard": list(self.imputation.state_pension_age_guard), "targets": { "count": len(self.source_targets.targets), "classification": dict(self.replay_report.summary), @@ -294,7 +355,9 @@ def __init__( def __call__(self, frame: Frame) -> Frame: validate_uk_national_frame(frame) - artifacts = _artifact_by_table(self.stage, expected=("adult", "benefits")) + artifacts = _artifact_by_table( + self.stage, expected=("adult", "benefits", "job", "penprov") + ) adult, adult_identity = _read_raw_frs_table( self.frs_raw_dir / str(artifacts["adult"]["locator"]), expected_filename="adult.tab", @@ -307,10 +370,26 @@ def __call__(self, frame: Frame) -> Frame: source_vintage=str(artifacts["benefits"].get("vintage", "unspecified")), required_columns=("sernum", "person", "benefit", "benamt", "var2"), ) + penprov, penprov_identity = _read_raw_frs_table( + self.frs_raw_dir / str(artifacts["penprov"]["locator"]), + expected_filename="penprov.tab", + source_vintage=str(artifacts["penprov"].get("vintage", "unspecified")), + required_columns=("sernum", "person", "stemppen"), + ) + job, job_identity = _read_raw_frs_table( + self.frs_raw_dir / str(artifacts["job"]["locator"]), + expected_filename="job.tab", + source_vintage=str(artifacts["job"].get("vintage", "unspecified")), + required_columns=("sernum", "person", "jobsect"), + ) _assert_identity_matches_artifact(adult_identity.evidence(), artifacts["adult"]) _assert_identity_matches_artifact( benefits_identity.evidence(), artifacts["benefits"] ) + _assert_identity_matches_artifact( + penprov_identity.evidence(), artifacts["penprov"] + ) + _assert_identity_matches_artifact(job_identity.evidence(), artifacts["job"]) source_leaves = _materialize_source_leaves(adult, benefits) person = frame.table("person").copy() missing_ids = sorted(set(source_leaves.index) - set(person["person_id"])) @@ -329,21 +408,33 @@ def __call__(self, frame: Frame) -> Frame: aligned = source_leaves.reindex(person["person_id"], fill_value=0.0) for column in FRS_HMRC_RETAINED_LEAF_COLUMNS: person[column] = aligned[column].to_numpy(dtype=float) - if "employee_pension_contributions" not in person: + # Employer contributions: each member of an employer scheme draws an + # ASHE contribution rate for their scheme type and sector, applied to + # their pay (microcosm#1069 R6), replacing the incumbent's three times + # the employee contribution. + if "employment_income" not in person: raise ValueError( - "FRS HMRC spine leaves require employee_pension_contributions " - "to derive employer pension contributions." + "FRS HMRC spine leaves require employment_income to draw employer " + "pension contributions." ) - employee = pd.to_numeric( - person["employee_pension_contributions"], errors="coerce" + pay = pd.to_numeric(person["employment_income"], errors="coerce") + if pay.isna().any(): + raise ValueError("employment_income must be finite.") + scheme, sector = employer_scheme_and_sector( + person["person_id"].to_numpy(), + penprov.assign( + source_person_id=_raw_source_person_ids(penprov, label="PENPROV") + ), + job.assign(source_person_id=_raw_source_person_ids(job, label="JOB")), ) - if employee.isna().any() or (employee < 0.0).any(): - raise ValueError( - "employee_pension_contributions must be finite and non-negative." - ) - person[EMPLOYER_PENSION_CONTRIBUTIONS_COLUMN] = 3.0 * employee.to_numpy( - dtype=float + employer_amounts, employer_receipt = draw_employer_pension_contributions( + person["person_id"].to_numpy(), + employment_income=pay.to_numpy(dtype=float), + scheme=scheme, + sector=sector, + rates=load_ashe_employer_rates(), ) + person[EMPLOYER_PENSION_CONTRIBUTIONS_COLUMN] = employer_amounts result_frame = uk_national_frame( person=person, benunit=frame.table("benunit"), @@ -364,6 +455,7 @@ def __call__(self, frame: Frame) -> Frame: structural_zero_columns=tuple( column for column, rows in source_signal_rows.items() if rows == 0 ), + employer_pension_contributions=employer_receipt, ) object.__setattr__(self, "last_result", result) return result.frame @@ -386,18 +478,29 @@ class UKSPISupportChannelStageTransform: # by the survey-side sample fraction so the prior-mass pairing holds at # every rung (f100 keeps the declared count exactly). sample_fraction: float = 1.0 + # The engine's State Pension age at the build instant; None reads it from + # policyengine-uk (tests without the engine pass it). + state_pension_age: int | None = None # Populated only by a live run; resume paths must re-run or skip evidence. last_result: UKSPISupportResult | None = field(default=None, init=False) def __call__(self, frame: Frame) -> Frame: validate_uk_national_frame(frame) tables = engine_tables(frame) - count, share, strata, declarations = _support_stage_parameters( - self.stage, - seed=self.seed, + count, share, strata, declarations, pension_age_share = ( + _support_stage_parameters(self.stage, seed=self.seed) ) if self.sample_fraction != 1.0 and count is not None: count = max(1, int(round(count * self.sample_fraction))) + state_pension_age = None + if pension_age_share is not None: + state_pension_age = ( + self.state_pension_age + if self.state_pension_age is not None + else uk_take_up_population_policy( + uk_time_period(frame) + ).state_pension_age + ) result = build_uk_spi_support_channel( tables["person"], tables["benunit"], @@ -410,6 +513,8 @@ def __call__(self, frame: Frame) -> Frame: input_weight_kind=uk_household_weight_kind(frame), mass_log=frame.mass_log, zero_weight_declarations=declarations, + pension_age_share=pension_age_share, + state_pension_age=state_pension_age, ) if result.household_weight_kind is not WeightKind.IMPORTANCE: got = ( @@ -448,6 +553,15 @@ def checkpoint_metadata(self) -> dict[str, object]: "stage": "spi_support_channel", "spi_households": self.last_result.n_spi_households, "spi_prior_mass_share": self.last_result.spi_prior_mass_share, + "pension_age_spi_prior_mass_share": ( + self.last_result.pension_age_spi_prior_mass_share + ), + "state_pension_age": self.last_result.state_pension_age, + "pension_age_allocation": ( + None + if self.last_result.pension_age_allocation is None + else dict(self.last_result.pension_age_allocation) + ), "household_weight_kind": ( self.last_result.household_weight_kind.value if self.last_result.household_weight_kind is not None @@ -549,8 +663,35 @@ def __call__(self, frame: Frame) -> Frame: resample_op.parameters["regional_pool_minimum"] ), "seed": int(resample_op.parameters["seed"]), + **( + { + "age_pool_minimum": int( + resample_op.parameters["age_pool_minimum"] + ) + } + if "age_pool_minimum" in resample_op.parameters + else {} + ), } ) + age_op = _optional_operation(self.stage, "draw_spi_donor_ages_by_population") + guard_op = _optional_operation( + self.stage, "zero_pension_age_reports_below_state_pension_age" + ) + donor_age_model = ( + load_spi_donor_age_model(uk_time_period(frame)) + if age_op is not None or guard_op is not None + else None + ) + state_pension_age_guard = ( + None + if guard_op is None or donor_age_model is None + else UKSPIStatePensionAgeGuard( + state_pension_age=donor_age_model.state_pension_age, + spi_channel_columns=tuple(guard_op.parameters["spi_channel_columns"]), + base_channel_columns=tuple(guard_op.parameters["base_channel_columns"]), + ) + ) imputation = impute_uk_spi_income_support( support, self.spi_tab_path, @@ -574,6 +715,8 @@ def __call__(self, frame: Frame) -> Frame: ] ), band_donor_resample=band_donor_resample, + donor_age_model=donor_age_model if age_op is not None else None, + state_pension_age_guard=state_pension_age_guard, ) result_frame = uk_national_frame( person=imputation.person, @@ -828,7 +971,13 @@ def _support_stage_parameters( stage: SourceStageSpec, *, seed: int, -) -> tuple[int, float, tuple[str, ...], tuple[UKZeroWeightStratumDeclaration, ...]]: +) -> tuple[ + int, + float, + tuple[str, ...], + tuple[UKZeroWeightStratumDeclaration, ...], + float | None, +]: stack = _operation(stage, "stack_zero_weight_donors") gate = _operation(stage, "gate_zero_weight_strata") allocation = _operation(stage, "allocate_zero_weight_prior_mass") @@ -853,6 +1002,22 @@ def _support_stage_parameters( strata = tuple(allocation.parameters.get("strata", ())) if strata != ("region",): raise ValueError("SPI support spine allocation must use strata ['region'].") + pension_age_share = allocation.parameters.get("pension_age_share") + if pension_age_share is not None: + if pension_age_share != SPI_SPINE_PENSION_AGE_PRIOR_MASS_SHARE: + raise ValueError( + "SPI support pension-age prior-mass share drifted from " + f"{SPI_SPINE_PENSION_AGE_PRIOR_MASS_SHARE}." + ) + if allocation.parameters.get("pension_age_stratum") != ( + SPI_SPINE_PENSION_AGE_STRATUM + ): + raise ValueError( + "SPI support pension-age stratum must be " + f"{SPI_SPINE_PENSION_AGE_STRATUM!r}." + ) + elif "pension_age_stratum" in allocation.parameters: + raise ValueError("SPI support pension-age stratum declared without a share.") declarations = _coerce_declarations(gate.parameters.get("declarations", ())) if len(declarations) != 1: raise ValueError("SPI support gate must declare exactly one pre-clone stratum.") @@ -871,6 +1036,26 @@ def _support_stage_parameters( float(allocation.parameters["share"]), strata, declarations, + None if pension_age_share is None else float(pension_age_share), + ) + + +def uk_spi_support_mass_change_reason(stage: SourceStageSpec) -> str: + """The reason the declared SPI support allocation writes on its MassChangeRecord. + + Read from the manifest's shares, so the readers that reconstruct or require + the record (the SPI income stage's graph kernel and the release-input + coverage manifest) carry the stratified sentence once a pension-age share is + declared (microcosm#1069 c6). + """ + + allocation = _operation(stage, "allocate_zero_weight_prior_mass") + pension_age_share = allocation.parameters.get("pension_age_share") + return _support_mass_change_reason( + float(allocation.parameters["share"]), + pension_age_share=( + None if pension_age_share is None else float(pension_age_share) + ), ) @@ -956,6 +1141,7 @@ def _assert_income_stage_parameters( "band_lower_bounds": list(SPI_INCOME_BAND_DONOR_LOWER_BOUNDS), "pool": SPI_SPINE_BAND_DONOR_POOL, "regional_pool_minimum": SPI_SPINE_BAND_DONOR_REGIONAL_POOL_MINIMUM, + "age_pool_minimum": SPI_SPINE_BAND_DONOR_AGE_POOL_MINIMUM, "weighting": "FACT", "with_replacement": True, "outputs": "stage-1 outputs, uprated as the stage-1 draws", @@ -972,6 +1158,27 @@ def _assert_income_stage_parameters( "SPI income resample_band_donor_leaves declaration drifted from " f"the reviewed mapping on parameter(s) {drifted}." ) + for kind, reviewed in ( + ("draw_spi_donor_ages_by_population", SPI_SPINE_DONOR_AGE_DRAW), + ( + "zero_pension_age_reports_below_state_pension_age", + SPI_SPINE_STATE_PENSION_AGE_GUARD, + ), + ): + operation = _optional_operation(stage, kind) + if operation is None: + continue + actual = dict(operation.parameters) + if actual != dict(reviewed): + drifted = sorted( + key + for key in {*actual, *reviewed} + if actual.get(key) != reviewed.get(key) + ) + raise ValueError( + f"SPI income {kind} declaration drifted from the reviewed mapping " + f"on parameter(s) {drifted}." + ) def _operation(stage: SourceStageSpec, kind: str): @@ -1054,4 +1261,5 @@ def _coerce_declarations( "UKSPIIncomeSpineResult", "UKSPIIncomeSpineStageTransform", "UKSPISupportChannelStageTransform", + "uk_spi_support_mass_change_reason", ] diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_support.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_support.py index d34949cbd..6299ea52e 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_support.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_support.py @@ -10,7 +10,7 @@ from __future__ import annotations from collections.abc import Mapping, Sequence -from dataclasses import dataclass +from dataclasses import dataclass, replace from typing import Any import numpy as np @@ -45,6 +45,10 @@ "Allocate 50% of certified UK national household prior mass to the " "rebuilt 2022-23 SPI support channel; total national mass is conserved." ) +#: The allocation stratum that separates households with a member at or over +#: State Pension age (microcosm#1069). It is derived for the allocation only and +#: never written to the frame. +SPI_PENSION_AGE_STRATUM_COLUMN = "household_has_state_pension_age_member" SPI_INCOME_COMPONENT_COLUMNS = ( "employment_income", @@ -190,6 +194,9 @@ class UKSPISupportResult: mass_log: tuple[MassChangeRecord, ...] = () replaced_spi_households: int = 0 spi_prior_mass_share: float = 0.0 + pension_age_spi_prior_mass_share: float | None = None + state_pension_age: int | None = None + pension_age_allocation: Mapping[str, float] | None = None @property def n_spi_households(self) -> int: @@ -458,8 +465,19 @@ def build_uk_spi_support_channel( zero_weight_declarations: ( Sequence[UKZeroWeightStratumDeclaration] | Sequence[Mapping[str, Any]] ) = (), + pension_age_share: float | None = None, + state_pension_age: int | None = None, ) -> UKSPISupportResult: - """Stack the E7 SPI support channel and allocate prior mass by stratum.""" + """Stack the E7 SPI support channel and allocate prior mass by stratum. + + With ``pension_age_share`` the strata also split households with a member + at or over ``state_pension_age`` from the rest, and the SPI channel takes + that share of the pension-age strata's mass (``spi_prior_mass_share`` of + the others). Every adult in an SPI household carries a taxpayer's income, + and the channel's households are drawn unweighted with one weight per + region, so without the split the channel holds more pension-age mass than + the FRS design gives pension-age households (microcosm#1069). + """ if not isinstance(input_weight_kind, WeightKind): raise TypeError("input_weight_kind must be a WeightKind.") @@ -475,6 +493,19 @@ def build_uk_spi_support_channel( stratum_columns = tuple(str(column) for column in strata_columns) if not stratum_columns or any(not column for column in stratum_columns): raise ValueError("strata_columns must contain non-empty column names.") + if pension_age_share is not None: + pension_share = float(pension_age_share) + if not np.isfinite(pension_share) or not 0.0 < pension_share < 1.0: + raise ValueError("pension_age_share must be finite and in (0, 1).") + if not isinstance(state_pension_age, int) or state_pension_age <= 0: + raise ValueError( + "pension_age_share needs a positive integer state_pension_age." + ) + if SPI_PENSION_AGE_STRATUM_COLUMN in stratum_columns: + raise ValueError( + f"{SPI_PENSION_AGE_STRATUM_COLUMN} is derived by the allocation; " + "do not pass it as a stratum column." + ) stacked = create_uk_spi_support_tables( person=person, @@ -495,15 +526,51 @@ def build_uk_spi_support_channel( "UK SPI support pre-clone zero-weight gate failed: " f"{list(gate.failures)}." ) - return _allocate_spi_prior_mass( + if pension_age_share is None: + return _allocate_spi_prior_mass( + stacked, + spi_prior_mass_share=share, + input_weight_kind=input_weight_kind, + mass_log=mass_log, + strata_columns=stratum_columns, + ) + pension_age = _households_with_member_at_or_over( + stacked.person, stacked.household, age=int(state_pension_age) + ) + flagged = replace( stacked, + household=stacked.household.assign( + **{SPI_PENSION_AGE_STRATUM_COLUMN: pension_age} + ), + ) + allocated = _allocate_spi_prior_mass( + flagged, spi_prior_mass_share=share, input_weight_kind=input_weight_kind, mass_log=mass_log, - strata_columns=stratum_columns, + strata_columns=(*stratum_columns, SPI_PENSION_AGE_STRATUM_COLUMN), + pension_age_share=float(pension_age_share), + ) + return replace( + allocated, + household=allocated.household.drop(columns=[SPI_PENSION_AGE_STRATUM_COLUMN]), + state_pension_age=int(state_pension_age), ) +def _households_with_member_at_or_over( + person: pd.DataFrame, household: pd.DataFrame, *, age: int +) -> np.ndarray: + """True where a household has a member aged ``age`` or over.""" + + _require_columns(person, ("person_household_id", "age"), label="person") + ages = pd.to_numeric(person["age"], errors="coerce") + if ages.isna().any(): + raise ValueError("person.age must be numeric to form the pension-age strata.") + members = set(person.loc[ages.ge(age), "person_household_id"]) + return household["household_id"].isin(members).to_numpy(dtype=bool) + + def fill_support_channel_from_source( frame: pd.DataFrame, donor: pd.DataFrame, @@ -579,7 +646,8 @@ def fill_support_channel_from_source( def _coerce_zero_weight_declarations( - declarations: Sequence[UKZeroWeightStratumDeclaration] | Sequence[Mapping[str, Any]], + declarations: Sequence[UKZeroWeightStratumDeclaration] + | Sequence[Mapping[str, Any]], ) -> tuple[UKZeroWeightStratumDeclaration, ...]: materialized: list[UKZeroWeightStratumDeclaration] = [] for declaration in declarations: @@ -779,6 +847,7 @@ def _allocate_spi_prior_mass( input_weight_kind: WeightKind, mass_log: tuple[MassChangeRecord, ...], strata_columns: tuple[str, ...], + pension_age_share: float | None = None, ) -> UKSPISupportResult: household = result.household.copy() channels = household[support_channel_column("household")] @@ -803,11 +872,9 @@ def _allocate_spi_prior_mass( dropna=False, ) stratum_base_mass = grouped["_base_mass"].transform("sum").to_numpy(dtype=float) - stratum_spi_count = grouped["_spi_count"].transform("sum").to_numpy( - dtype=np.int64 - ) - unrepresented_base = base_mask & (stratum_base_mass > 0.0) & ( - stratum_spi_count == 0 + stratum_spi_count = grouped["_spi_count"].transform("sum").to_numpy(dtype=np.int64) + unrepresented_base = ( + base_mask & (stratum_base_mass > 0.0) & (stratum_spi_count == 0) ) if unrepresented_base.any(): examples = ( @@ -831,11 +898,23 @@ def _allocate_spi_prior_mass( "mass and a positive support quota." ) + pension_age = ( + household[SPI_PENSION_AGE_STRATUM_COLUMN].to_numpy(dtype=bool) + if pension_age_share is not None + else np.zeros(len(household), dtype=bool) + ) + household_share = np.where( + pension_age, + spi_prior_mass_share if pension_age_share is None else pension_age_share, + spi_prior_mass_share, + ) final_weights = np.zeros_like(pre_weights) - final_weights[base_mask] = pre_weights[base_mask] * (1.0 - spi_prior_mass_share) + final_weights[base_mask] = pre_weights[base_mask] * ( + 1.0 - household_share[base_mask] + ) final_weights[spi_mask] = ( stratum_base_mass[spi_mask] - * spi_prior_mass_share + * household_share[spi_mask] / stratum_spi_count[spi_mask] ) @@ -859,8 +938,21 @@ def _allocate_spi_prior_mass( old_total=old_total, new_total=allocated_weights.total, declared_factor=1.0, - reason=_spi_prior_mass_change_reason(spi_prior_mass_share), + reason=_spi_prior_mass_change_reason( + spi_prior_mass_share, pension_age_share=pension_age_share + ), ) + pension_age_allocation = None + if pension_age_share is not None: + final = allocated_weights.values + pension_age_allocation = { + "pension_age_households": int((pension_age & base_mask).sum()), + "pension_age_spi_households": int((pension_age & spi_mask).sum()), + "pension_age_prior_mass": float(pre_weights[pension_age].sum()), + "pension_age_spi_mass": float(final[pension_age & spi_mask].sum()), + "other_prior_mass": float(pre_weights[~pension_age].sum()), + "other_spi_mass": float(final[~pension_age & spi_mask].sum()), + } return UKSPISupportResult( person=result.person, benunit=result.benunit, @@ -870,6 +962,8 @@ def _allocate_spi_prior_mass( household_weight_kind=WeightKind.IMPORTANCE, mass_log=(*mass_log, allocation_record), spi_prior_mass_share=spi_prior_mass_share, + pension_age_spi_prior_mass_share=pension_age_share, + pension_age_allocation=pension_age_allocation, ) @@ -996,7 +1090,17 @@ def _positive_float_from_bits(bits: int) -> float: return float(np.asarray(bits, dtype=np.uint64).view(np.float64)) -def _spi_prior_mass_change_reason(share: float) -> str: +def _spi_prior_mass_change_reason( + share: float, *, pension_age_share: float | None = None +) -> str: + if pension_age_share is not None: + return ( + f"Allocate {share:.12g} of certified UK national household prior mass " + "in households without, and " + f"{pension_age_share:.12g} in households with, a member at or over " + "State Pension age to the rebuilt 2022-23 SPI support channel; total " + "national mass is conserved." + ) if np.isclose(share, DEFAULT_SPI_PRIOR_MASS_SHARE, rtol=0.0, atol=0.0): return SPI_PRIOR_MASS_CHANGE_REASON return ( @@ -1177,6 +1281,7 @@ def _require_entity(entity: str) -> str: "SPI_HMRC_UNEMPLOYMENT_BENEFIT_INCOME_COLUMN", "SPI_INCOME_IMPUTATION_COLUMNS", "SPI_INCOME_QRF_OUTPUT_COLUMNS", + "SPI_PENSION_AGE_STRATUM_COLUMN", "SPI_PRIOR_MASS_CHANGE_REASON", "SPI_REPLACEMENT_STRATA_COLUMNS", "UKSPISupportResult", diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/spine_build.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/spine_build.py index f5bce9bc2..523a1f226 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/spine_build.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/spine_build.py @@ -125,6 +125,9 @@ UK_SAMPLE_SEED_DEFAULT, ) from microcosm.build.uk_runtime.nts_bus_travel import UKNTSBusTravelStageTransform +from microcosm.build.uk_runtime.pension_credit_take_up import ( + UKPensionCreditTakeUpStageTransform, +) from microcosm.build.uk_runtime.regional_uprating import ( UKRegionalPropertyUpratingStageTransform, ) @@ -1520,6 +1523,11 @@ def prepare_uk_spine_execution( implementations["uc_capital_coherence"] = UKUCCapitalCoherenceStageTransform( stage=stages_by_name["uc_capital_coherence"] ) + if "pension_credit_take_up" in stage_names: + implementations["pension_credit_take_up"] = UKPensionCreditTakeUpStageTransform( + stage=stages_by_name["pension_credit_take_up"], + engine=engine, + ) if "uc_deduction_attributes" in stage_names: implementations["uc_deduction_attributes"] = ( UKUCDeductionAttributesStageTransform( diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/stage_health.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/stage_health.py index 53d7cb8e6..c1d65504d 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/stage_health.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/stage_health.py @@ -43,6 +43,8 @@ def uk_stage_health_gate( return _spi_support_channel_gate(stage, evidence, parameters) if check == "spi_income_spine": return _spi_income_spine_gate(stage, evidence, parameters) + if check == "pension_credit_take_up": + return _pension_credit_take_up_gate(stage, evidence, parameters) if check == "source_signal": return _source_signal_gate(stage, evidence, parameters) if check == "age_tail_targets": @@ -751,22 +753,102 @@ def _spi_support_channel_gate( evidence.get("spi_prior_mass_share"), label=f"{stage}.spi_prior_mass_share" ) failures = [] - if abs(share - expected_share) > _finite_number( + tolerance = _finite_number( parameters.get("absolute_tolerance", 0.0), label=f"{stage}.absolute_tolerance" - ): + ) + if abs(share - expected_share) > tolerance: failures.append( f"{stage}: spi_prior_mass_share {share} != declared {expected_share}." ) + details = { + "spi_prior_mass_share": share, + "spi_households": evidence.get("spi_households"), + } + if "pension_age_spi_prior_mass_share" in parameters: + # microcosm#1069 c6: the channel takes its own share of the strata of + # households with a member at or over State Pension age. + expected_pension_share = _finite_number( + parameters["pension_age_spi_prior_mass_share"], + label=f"{stage}.pension_age_spi_prior_mass_share", + ) + pension_share = evidence.get("pension_age_spi_prior_mass_share") + details["pension_age_spi_prior_mass_share"] = pension_share + if pension_share is None: + failures.append( + f"{stage}: the receipt carries no pension_age_spi_prior_mass_share." + ) + elif ( + abs( + _finite_number( + pension_share, label=f"{stage}.pension_age_spi_prior_mass_share" + ) + - expected_pension_share + ) + > tolerance + ): + failures.append( + f"{stage}: pension_age_spi_prior_mass_share {pension_share} != " + f"declared {expected_pension_share}." + ) if evidence.get("household_weight_kind") != parameters.get("household_weight_kind"): failures.append(f"{stage}: household_weight_kind drifted.") if int(evidence.get("spi_households", 0)) < int( parameters["minimum_spi_households"] ): failures.append(f"{stage}: spi_households below declared minimum.") - details = { - "spi_prior_mass_share": share, - "spi_households": evidence.get("spi_households"), - } + return ( + _fail(stage, check, failures, details) + if failures + else _pass(stage, check, details) + ) + + +def _pension_credit_take_up_gate( + stage: str, + evidence: Mapping[str, object], + parameters: Mapping[str, object], +) -> GateResult: + """Each component band realizes its DWP take-up rate (microcosm#1069 R9). + + A band whose reporters alone exceed the rate realizes their share instead; + the receipt flags it and the gate requires the realized share to be at + least the rate there. + """ + + check = "pension_credit_take_up" + tolerance = _finite_number( + parameters["maximum_take_up_deviation"], + label=f"{stage}.maximum_take_up_deviation", + ) + minimum_units = int(parameters["minimum_entitled_units"]) + bands = evidence.get("bands") + failures: list[str] = [] + details: dict[str, object] = {} + if not isinstance(bands, list) or not bands: + failures.append(f"{stage}: the receipt carries no take-up bands.") + bands = [] + for band in bands: + band = _mapping(band, label=f"{stage}.bands[]") + name = str(band.get("band")) + rate = _finite_number(band.get("rate"), label=f"{stage}.{name}.rate") + units = int(band.get("entitled_units", 0)) + realized = band.get("realized_take_up") + details[name] = {"rate": rate, "realized_take_up": realized, "units": units} + if units < minimum_units or realized is None: + failures.append(f"{stage}: band {name} has {units} entitled units.") + continue + realized = _finite_number(realized, label=f"{stage}.{name}.realized_take_up") + if band.get("reporters_exceed_rate") is True: + if realized + 1e-12 < rate: + failures.append( + f"{stage}: band {name} reporters exceed the rate but realize " + f"{realized:.4f} < {rate:.4f}." + ) + elif abs(realized - rate) > tolerance: + failures.append( + f"{stage}: band {name} realizes take-up {realized:.4f} against the " + f"rate {rate:.4f} (tolerance {tolerance})." + ) return ( _fail(stage, check, failures, details) if failures diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/uc_source_periods.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/uc_source_periods.py index d647964c3..5996058d4 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/uc_source_periods.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/uc_source_periods.py @@ -16,6 +16,7 @@ from typing import Any from microcosm.build.ledger_targets import ( + MONTHLY_WINDOW_COUNT_X_MEAN, MONTHLY_WINDOW_OPERATIONS, LedgerTargetReference, ) @@ -27,9 +28,23 @@ # Housing Benefit caseload rows bound on the same calendar-2025 window, and # since the PolicyEngine/chronicle#280 lane the three ESA caseload rows, bound on the four # quarterly points DWP publishes inside calendar 2025 (February, May, August, -# November) from the payment-type cube (chronicle#282). +# November) from the payment-type cube (chronicle#282). Since microcosm#1069 +# the State Pension, Pension Credit and Attendance Allowance Stat-Xplore cubes +# bind on the same four calendar-2025 points (PolicyEngine/chronicle#302 via +# #305). SOURCE_MONTH_FAMILIES = frozenset( - {"dwp_universal_credit", "dwp_housing_benefit", "dwp_legacy_benefits"} + { + "dwp_universal_credit", + "dwp_housing_benefit", + "dwp_legacy_benefits", + "dwp_state_pension", + "dwp_pension_credit", + "dwp_attendance_allowance", + } +) +#: Operations over an explicit month list; they may cross calendar years. +_EXPLICIT_WINDOW_OPERATIONS = frozenset( + {*MONTHLY_WINDOW_OPERATIONS, MONTHLY_WINDOW_COUNT_X_MEAN} ) @@ -50,7 +65,7 @@ def uc_source_month_metadata( if not valid: raise ValueError("UK UC source_months must be a non-empty YYYY-MM list.") if months != sorted(set(months)) or ( - value_operation not in MONTHLY_WINDOW_OPERATIONS + value_operation not in _EXPLICIT_WINDOW_OPERATIONS and len({month[:4] for month in months}) != 1 ): raise ValueError( @@ -74,7 +89,7 @@ def validate_uc_source_month_coverage( or reference.value_operation not in { "calendar_year_average", - *MONTHLY_WINDOW_OPERATIONS, + *_EXPLICIT_WINDOW_OPERATIONS, } ): raise ValueError( @@ -88,14 +103,16 @@ def validate_uc_source_month_coverage( "UK UC source-month coverage metadata is invalid JSON." ) from error uc_source_month_metadata(expected, value_operation=reference.value_operation) - is_window = reference.value_operation in MONTHLY_WINDOW_OPERATIONS + is_window = reference.value_operation in _EXPLICIT_WINDOW_OPERATIONS if is_window and expected != reference.ledger_selector.get("period_value"): raise ValueError( "UK UC source-month coverage metadata must equal the declared source window." ) + # A count x mean window resolves its count and its mean in every month. cells_per_month = ( len(reference.value_operands) - if reference.value_operation == "monthly_window_sum_average" + if reference.value_operation + in {"monthly_window_sum_average", MONTHLY_WINDOW_COUNT_X_MEAN} else 1 ) @@ -158,6 +175,8 @@ def validate_uc_source_month_coverage( "uk_uc_source_period_basis": ( "mean_of_declared_monthly_cell_sums" if reference.value_operation == "monthly_window_sum_average" + else "mean_of_declared_monthly_count_x_mean" + if reference.value_operation == MONTHLY_WINDOW_COUNT_X_MEAN else "mean_of_declared_months" ), }, diff --git a/packages/microcosm-build/tests/engine/uk/test_uk_salary_sacrifice_counterfactual.py b/packages/microcosm-build/tests/engine/uk/test_uk_salary_sacrifice_counterfactual.py new file mode 100644 index 000000000..8b3194d3f --- /dev/null +++ b/packages/microcosm-build/tests/engine/uk/test_uk_salary_sacrifice_counterfactual.py @@ -0,0 +1,87 @@ +"""The live counterfactual route against the real engine (microcosm#1069 c11).""" + +from __future__ import annotations + +import numpy as np +import pandas as pd + +from microcosm.build.uk_runtime.measure_simulation import UKMeasureResolver +from microcosm.build.uk_runtime.national_frame import uk_national_frame +from microcosm.frame import WeightKind + + +def _frame(): + ids = np.arange(3, dtype=np.int64) + return uk_national_frame( + person=pd.DataFrame( + { + "person_id": ids, + "person_benunit_id": ids, + "person_household_id": ids, + "age": [40, 40, 40], + "employment_income": [40_000.0, 30_000.0, 0.0], + "pension_contributions_via_salary_sacrifice": [3_000.0, 0.0, 0.0], + } + ), + benunit=pd.DataFrame({"benunit_id": ids}), + household=pd.DataFrame( + { + "household_id": ids, + "household_weight": [1.0, 1.0, 1.0], + "region": "LONDON", + "council_tax": 0.0, + "rent": 0.0, + "tenure_type": "OWNED_OUTRIGHT", + } + ), + time_period="2024", + weight_kind=WeightKind.DESIGN, + ) + + +def _relief_binding(output: str) -> dict: + return { + "metric_name": f"hmrc/salary_sacrifice_{output}_relief", + "kind": "input_substitution_counterfactual", + "zeroed_input": "pension_contributions_via_salary_sacrifice", + "folded_into": "employment_income", + "output_delta": "counterfactual_minus_baseline", + "output_variable": output, + "from_entity": "person", + } + + +def test_returned_sacrifice_is_taxed_at_the_basic_rate_and_main_nics_rates(tmp_path): + resolver = UKMeasureResolver( + simulation_source=None, frame=_frame(), scratch_dir=tmp_path, year=2025 + ) + sacrificed = np.asarray( + resolver.simulation.calculate( + "pension_contributions_via_salary_sacrifice", 2025 + ), + dtype=float, + ) + pay = np.asarray(resolver.simulation.calculate("employment_income", 2025)) + # The returned pay stays inside the 2025-26 basic-rate band and below the + # NICs upper earnings limit, so the relief is linear in the sacrifice. + assert sacrificed[0] > 0.0 and pay[0] + sacrificed[0] < 50_270.0 + + income_tax, route = resolver.counterfactual_delta( + _relief_binding("income_tax"), 2025 + ) + employee, _ = resolver.counterfactual_delta(_relief_binding("ni_employee"), 2025) + employer, _ = resolver.counterfactual_delta(_relief_binding("ni_employer"), 2025) + + # Hand-computed at the 2025-26 rates: 20% income tax, 8% employee and 15% + # employer NICs on the sacrificed pay; nobody else moves. + expected = np.array([sacrificed[0], 0.0, 0.0]) + np.testing.assert_allclose(income_tax, 0.20 * expected, atol=0.01) + np.testing.assert_allclose(employee, 0.08 * expected, atol=0.01) + np.testing.assert_allclose(employer, 0.15 * expected, atol=0.01) + assert "folded into employment_income" in route + measures = resolver.receipt()["counterfactual_measures"] + assert set(measures) == { + "hmrc/salary_sacrifice_income_tax_relief", + "hmrc/salary_sacrifice_ni_employee_relief", + "hmrc/salary_sacrifice_ni_employer_relief", + } diff --git a/packages/microcosm-build/tests/engine/uk/test_uk_spi_state_pension_age.py b/packages/microcosm-build/tests/engine/uk/test_uk_spi_state_pension_age.py new file mode 100644 index 000000000..e89159bcb --- /dev/null +++ b/packages/microcosm-build/tests/engine/uk/test_uk_spi_state_pension_age.py @@ -0,0 +1,101 @@ +"""State Pension age coherence of the SPI income stage with the engine's SPA (microcosm#1069).""" + +# ruff: noqa: F403, F405 +from microcosm.build.uk_runtime.frs_take_up import uk_take_up_population_policy +from microcosm.build.uk_runtime.spi_income import ( + SPI_DONOR_AGE_POPULATION_RESOURCE, + UKSPIStatePensionAgeGuard, + load_spi_donor_age_model, +) +from test_support.microcosm_build.uk_spi_income import * + +_SPI_PENSION_AGE_COLUMNS = ( + "state_pension_reported", + "pension_credit_reported", + "winter_fuel_allowance_reported", +) + + +def test_donor_age_model_binds_the_vendored_ons_rows_and_the_engine_spa() -> None: + model = load_spi_donor_age_model(2025) + + assert ( + model.state_pension_age == uk_take_up_population_policy(2025).state_pension_age + ) + assert set(model.populations) == { + (sex, age) for sex in ("MALE", "FEMALE") for age in range(0, 91) + } + # ONS mid-2023 UK resident population, every age summed. + assert sum(model.populations.values()) == 68_265_209.0 + assert SPI_DONOR_AGE_POPULATION_RESOURCE in model.source + + +def test_spi_imputation_leaves_no_pension_age_reports_below_the_engine_spa( + monkeypatch, tmp_path +) -> None: + support = _dead_support() + donor_path = tmp_path / SPI_DONOR_FILENAME + _write_donor(donor_path) + monkeypatch.setattr(spi_income, "QRF", _FakeQRF) + _bypass_reviewed_donor_identity(monkeypatch) + model = load_spi_donor_age_model(2025) + guard = UKSPIStatePensionAgeGuard( + state_pension_age=model.state_pension_age, + spi_channel_columns=_SPI_PENSION_AGE_COLUMNS, + base_channel_columns=("state_pension_reported",), + ) + + unguarded = impute_uk_spi_income_support( + support, donor_path, seed=9, n_estimators=3, donor_sample_size=None + ) + guarded = impute_uk_spi_income_support( + support, + donor_path, + seed=9, + n_estimators=3, + donor_sample_size=None, + donor_age_model=model, + state_pension_age_guard=guard, + ) + + channel = support_channel_column("person") + below = guarded.person["age"].lt(model.state_pension_age) + spi_below = below & guarded.person[channel].eq("spi") + # Every fixture person is below State Pension age, and the fake forest + # draws a positive report for each of them without the guard. + assert below.all() + assert spi_below.any() + assert ( + unguarded.person.loc[spi_below, list(_SPI_PENSION_AGE_COLUMNS)] + .gt(0) + .all() + .all() + ) + assert guarded.person.loc[below, "state_pension_reported"].eq(0).all() + assert ( + guarded.person.loc[spi_below, list(_SPI_PENSION_AGE_COLUMNS)].eq(0).all().all() + ) + assert ( + guarded.person.loc[spi_below, spi_income.SPI_HMRC_STATE_PENSION_INCOME_COLUMN] + .eq(0) + .all() + ) + # Base-channel Pension Credit and Winter Fuel reports are FRS responses the + # guard does not own. + base = ~guarded.person[channel].eq("spi") + pd.testing.assert_frame_equal( + guarded.person.loc[ + base, ["pension_credit_reported", "winter_fuel_allowance_reported"] + ], + unguarded.person.loc[ + base, ["pension_credit_reported", "winter_fuel_allowance_reported"] + ], + ) + assert [receipt["step"] for receipt in guarded.state_pension_age_guard] == [ + "spi_state_pension_leaf_after_stage1", + "base_channel_reports_before_stage2", + "spi_channel_reports_after_stage2", + ] + assert guarded.donor_age_draw["state_pension_age"] == model.state_pension_age + assert unguarded.state_pension_age_guard == () + assert unguarded.donor_age_draw["cells"] == [] diff --git a/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py b/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py index 8119fac95..9b99b5882 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py @@ -943,6 +943,8 @@ def test_spi_spine_adds_no_country_package_resources(self) -> None: "dwp_uc_deduction_distributions.json", "nhs_consumption_by_age_gender.json", "ons_age_tail_band_populations.json", + "ashe_employer_pension_contribution_rates.json", + "ons_single_year_age_populations.json", "lcfs_consumption_support_bounds.json", "etb_vat_support_bounds.json", "etb_services_support_bounds.json", @@ -1007,9 +1009,10 @@ def test_uk_source_manifest_contains_only_canonical_spine_stages(self) -> None: # #685, frs_relationships #791, hmrc_cgt_asset_type_spine #725, # cgt_incidence_anchor #970, nts_bus_travel #930, then # spi_income_band_donors (PolicyEngine/chronicle#280 lane), the SPI - # housing shell (#1012) and was_lisa (#1003) as the newest); the - # frs_hmrc_retained_leaves / hmrc_spi_income pair is retired (#901). - assert len(spec.sources.stages) == 35 + # housing shell (#1012), was_lisa (#1003) and pension_credit_take_up + # (microcosm#1069) as the newest); the frs_hmrc_retained_leaves / + # hmrc_spi_income pair is retired (#901). + assert len(spec.sources.stages) == 36 assert not {"frs_hmrc_retained_leaves", "hmrc_spi_income"}.intersection( stage.stage for stage in spec.sources.stages ) @@ -1062,6 +1065,8 @@ def test_uk_package_loads(self) -> None: "dwp_uc_deduction_distributions.json", "nhs_consumption_by_age_gender.json", "ons_age_tail_band_populations.json", + "ashe_employer_pension_contribution_rates.json", + "ons_single_year_age_populations.json", "lcfs_consumption_support_bounds.json", "etb_vat_support_bounds.json", "etb_services_support_bounds.json", @@ -1123,7 +1128,7 @@ def test_uk_target_references_accept_regenerated_contract_fields(self) -> None: references = {reference.name: reference for reference in spec.target_references} assert ( - len(references) == 1152 + len(references) == 1230 ) # PolicyEngine/chronicle#280 lane: 705 + 33 HMRC liabilities rows (Table 2.5, three # measures by eleven bands) + 26 SPI savings-interest rows (two measures by # thirteen bands) + 360 SPI Table 3.11 region-tier rows (three measures by @@ -1133,7 +1138,15 @@ def test_uk_target_references_accept_regenerated_contract_fields(self) -> None: # cells and Wales gains ten country rows (bands A-I + total); # microcosm#725/#467: 24 CGT age-band rows, 24 region-tier cells and # 24 size-of-gain rows; microcosm#1014: 16 Table 4.1 BADR/IR band rows - # and 12 Table 3 taxable-income margin rows + # and 12 Table 3 taxable-income margin rows; microcosm#1069: 60 State + # Pension rows (4 levels, 14 age-by-sex cells, 22 area cells, 20 bands) + # less the OBR State Pension line, now a diagnostic, and the signed-out + # empty new State Pension £40-£60 band; 14 Pension Credit caseload rows + # (Great Britain total, six type-by-partner cells, six age bands, NI); + # the DWP employer contribution total, less the salary-sacrifice users + # total (the Table 3.8 rows and the DWP employee total left the fit); two + # Attendance Allowance and three pension-age Housing Benefit rows; the + # income-tax relief total on salary sacrifice in place of the amount row assert references["obr.esa"].value_operation == "calendar_year_window" assert references["dwp.uc.households"].value_operation == ( "monthly_window_sum_average" @@ -1380,6 +1393,7 @@ def test_declares_the_full_june_battery(self, manifest) -> None: "uk_stage_frs_hmrc_spine_leaves_signal", "uk_stage_spi_support_channel_mass", "uk_stage_hmrc_spi_income_spine_identity", + "uk_stage_pension_credit_take_up", "uk_stage_cgt_incidence_clone_mass", "uk_stage_cgt_support_split_mass", "uk_stage_spi_income_band_donors_support", @@ -1482,6 +1496,7 @@ def test_strict_absent_evidence_entries_are_declared(self, manifest) -> None: "uk_stage_frs_hmrc_spine_leaves_signal", "uk_stage_spi_support_channel_mass", "uk_stage_hmrc_spi_income_spine_identity", + "uk_stage_pension_credit_take_up", "uk_stage_cgt_incidence_clone_mass", "uk_stage_cgt_support_split_mass", "uk_stage_spi_income_band_donors_support", diff --git a/packages/microcosm-build/tests/engine_free/shared/test_ledger_monthly_count_x_mean.py b/packages/microcosm-build/tests/engine_free/shared/test_ledger_monthly_count_x_mean.py new file mode 100644 index 000000000..7e896817d --- /dev/null +++ b/packages/microcosm-build/tests/engine_free/shared/test_ledger_monthly_count_x_mean.py @@ -0,0 +1,303 @@ +"""The monthly count x mean window and DWP's half-open amount bands (microcosm#1069).""" + +import json +from types import SimpleNamespace + +import pytest + +from microcosm.build.ledger_targets import ( + MONTHLY_WINDOW_COUNT_X_MEAN, + LedgerTargetReference, + compile_ledger_target_references, +) +from microcosm.build.target_materialization import ( + _band_bounds, + _band_label_upper_edge, + _band_lower_edge, +) +from test_support.microcosm_build.ledger_monthly_count_x_mean import ( + COUNT, + MEAN, + MONTHS, + statx_fact, + statx_window, + window_reference, +) + + +def test_window_averages_count_times_mean_times_the_period_factor() -> None: + counts = (12_000_000, 12_050_000, 12_100_000, 12_150_000) + means = (221.0, 230.0, 230.5, 231.0) + + registry = compile_ledger_target_references( + list(reversed(statx_window(counts, means))), [window_reference()], country="uk" + ) + + (spec,) = registry.specs + expected = sum(c * m * 52 for c, m in zip(counts, means, strict=True)) / 4 + assert spec.value == pytest.approx(expected) + assert spec.metadata["ledger_value_operation"] == MONTHLY_WINDOW_COUNT_X_MEAN + assert spec.metadata["ledger_member_fact_count"] == "8" + assert spec.metadata["ledger_window_count_x_mean_period_factor"] == "52" + assert spec.metadata["ledger_window_count_x_mean_count_concept"] == COUNT + assert spec.metadata["ledger_window_count_x_mean_mean_concept"] == MEAN + assert spec.metadata["ledger_measure_unit"] == "gbp_per_week x 52" + members = json.loads(spec.metadata["ledger_window_count_x_mean_members"]) + assert [member["month"] for member in members] == list(MONTHS) + assert float(members[0]["count"]) == counts[0] + assert float(members[0]["mean"]) == means[0] + assert spec.metadata["ledger_source_release_key"] == "stat_xplore_2026_09_29" + + +def test_window_refuses_a_month_without_its_mean() -> None: + facts = statx_window((1.0,) * 4, (2.0,) * 4) + facts = [ + fact + for fact in facts + if not (fact["period"]["value"] == "2025-08" and "mean" in str(fact["label"])) + ] + + with pytest.raises(ValueError, match=r"missing \['2025-08 mean'\]"): + compile_ledger_target_references(facts, [window_reference()], country="uk") + + +def test_window_refuses_a_count_and_mean_from_different_cells() -> None: + facts = statx_window((1.0,) * 4, (2.0,) * 4) + # Every mean describes another group, so each role is one clean series + # and only the pairing can catch it. + for fact in facts[1::2]: + fact["layout"]["groupby_value_id"] = "new_state_pension" + + with pytest.raises(ValueError, match="different published cells in 2025-02"): + compile_ledger_target_references(facts, [window_reference()], country="uk") + + +def test_window_refuses_a_role_that_changes_series_inside_the_window() -> None: + facts = statx_window((1.0,) * 4, (2.0,) * 4) + facts[3]["layout"]["groupby_value_id"] = "new_state_pension" + + with pytest.raises(ValueError, match="more than one series for a role"): + compile_ledger_target_references(facts, [window_reference()], country="uk") + + +def test_window_refuses_members_from_two_publications() -> None: + facts = statx_window((1.0,) * 4, (2.0,) * 4) + facts[-1]["source"]["source_sha256"] = "b" * 64 + + with pytest.raises(ValueError, match="one publication"): + compile_ledger_target_references(facts, [window_reference()], country="uk") + + +def test_window_refuses_a_selected_fact_of_neither_concept() -> None: + reference = window_reference( + value_operands=( + {"role": "count", "concept": "dwp.pension_credit_benefit_units"}, + {"role": "mean", "concept": MEAN, "period_factor": 52}, + ) + ) + + with pytest.raises(ValueError, match="neither operand's"): + compile_ledger_target_references( + statx_window((1.0,) * 4, (2.0,) * 4), [reference], country="uk" + ) + + +def test_window_refuses_a_count_fact_published_as_a_mean() -> None: + facts = statx_window((1.0,) * 4, (2.0,) * 4) + for fact in facts[0::2]: + fact["aggregation"] = {"method": "mean"} + + with pytest.raises(ValueError, match="unsupported aggregation"): + compile_ledger_target_references(facts, [window_reference()], country="uk") + + +@pytest.mark.parametrize( + ("operands", "match"), + [ + ( + ( + {"role": "mean", "concept": MEAN}, + {"role": "count", "concept": COUNT}, + ), + "exactly ordered count/mean", + ), + ( + ( + {"role": "count", "concept": COUNT}, + {"role": "mean", "concept": COUNT}, + ), + "different concepts", + ), + ( + ( + {"role": "count", "concept": COUNT, "period_factor": 52}, + {"role": "mean", "concept": MEAN}, + ), + "takes only", + ), + ( + ( + {"role": "count", "concept": COUNT}, + {"role": "mean", "concept": MEAN, "period_factor": 0}, + ), + "finite positive", + ), + ( + ( + {"role": "count", "concept": COUNT}, + {"role": "mean", "concept": MEAN, "period_factor": True}, + ), + "finite positive", + ), + ( + ({"role": "count", "concept": COUNT}, {"role": "mean", "concept": ""}), + "must name its concept", + ), + ], +) +def test_window_operands_are_validated_on_thewindow_reference(operands, match) -> None: + with pytest.raises(ValueError, match=match): + window_reference(value_operands=operands) + + +def _band_spec(label: str) -> SimpleNamespace: + return SimpleNamespace( + measure="dwp/state_pension/recipients_by_amount", + metadata={"ledger_filter_grouped_amount_of_benefit": label}, + ) + + +@pytest.mark.parametrize( + ("label", "lower", "upper"), + [ + ("Under £20.00", 0.0, 1_040.0), + ("£20.00 to under £40.00", 1_040.0, 2_080.0), + ("£300.00 and over", 15_600.0, None), + ("£500.01 to £600.00", 26_000.52, None), + ("Under 25", None, None), + ("Nil payment", None, None), + ("all", None, None), + ], +) +def test_half_open_amount_labels_publish_their_own_upper_edge( + label, lower, upper +) -> None: + binding = {"groupby_variable": "state_pension", "band_period_factor": 52} + + assert _band_lower_edge(_band_spec(label), binding) == ( + pytest.approx(lower) if lower is not None else None + ) + assert _band_label_upper_edge(_band_spec(label), binding) == ( + pytest.approx(upper) if upper is not None else None + ) + + +def test_a_half_open_band_keeps_its_published_edge_when_a_sibling_is_missing() -> None: + binding = {"groupby_variable": "state_pension", "band_period_factor": 52} + # The £40 to £60 band is not bound, so the sibling rule would stretch the + # £20 to £40 band up to £60. + edges = [0.0, 1_040.0, 3_120.0] + + assert _band_bounds(_band_spec("£20.00 to under £40.00"), binding, edges) == ( + pytest.approx(1_040.0), + pytest.approx(2_080.0), + ) + assert _band_bounds(_band_spec("Under £20.00"), binding, edges) == ( + 0.0, + pytest.approx(1_040.0), + ) + + +def test_window_requires_the_source_window_period_policy() -> None: + # Its months are declared, like the single-series windows, so the target + # period never re-selects them (and never holds them for uprating). + with pytest.raises(ValueError, match="paired source_window period policy"): + window_reference(period_match_policy="latest_not_after") + + +def _single_age_fact(month: str, age: int, value: float) -> dict[str, object]: + fact = statx_fact(month, "count", value, group="new_state_pension") + fact["aggregate_fact_key"] = f"{fact['aggregate_fact_key']}-{age}" + fact["semantic_fact_key"] = f"{fact['semantic_fact_key']}-{age}" + fact["dimensions"] = { + "age_bands_and_single_year": age, + "category_of_pension": "New State Pension", + } + fact["universe_constraints"] = { + "domain": "social_security", + "constraints": [ + {"variable": "age", "operator": ">=", "value": age, "unit": "years"}, + {"variable": "age", "operator": "<", "value": age + 1, "unit": "years"}, + { + "variable": "age_bands_and_single_year", + "operator": "==", + "value": age, + }, + { + "variable": "category_of_pension", + "operator": "==", + "value": "New State Pension", + }, + ], + } + return fact + + +def _single_age_window(**overrides) -> LedgerTargetReference: + return LedgerTargetReference( + name="dwp/state_pension/recipients_66_67", + ledger_selector={ + "source_name": "dwp", + "source_concept": "dwp.state_pension_caseload", + "dimension_values": { + "age_bands_and_single_year": [66, 67], + "category_of_pension": "New State Pension", + }, + "period_type": "month", + "period_value": list(MONTHS), + }, + value_operation="monthly_window_sum_average", + value_operands=tuple( + { + "dimension_values": { + "age_bands_and_single_year": age, + "category_of_pension": "New State Pension", + } + } + for age in (66, 67) + ), + period_match_policy="source_window", + entity="person", + measure="person_count", + period=2025, + family="dwp_state_pension", + **overrides, + ) + + +def test_a_sum_window_over_single_years_accepts_each_cells_published_age_edges() -> ( + None +): + facts = [ + _single_age_fact(month, age, value) + for month in MONTHS + for age, value in ((66, 100.0), (67, 50.0)) + ] + + (spec,) = compile_ledger_target_references( + facts, [_single_age_window()], country="uk" + ).specs + + assert spec.value == 150.0 + + +def test_a_sum_window_still_refuses_cells_from_different_universes() -> None: + facts = [_single_age_fact(month, age, 1.0) for month in MONTHS for age in (66, 67)] + for fact in facts: + if fact["dimensions"]["age_bands_and_single_year"] == 67: + fact["universe_constraints"]["constraints"].append( + {"variable": "residence", "operator": "==", "value": "abroad"} + ) + + with pytest.raises(ValueError, match="cells must share source publication"): + compile_ledger_target_references(facts, [_single_age_window()], country="uk") diff --git a/packages/microcosm-build/tests/engine_free/shared/test_spec_only_country_packages.py b/packages/microcosm-build/tests/engine_free/shared/test_spec_only_country_packages.py index 3f18c1687..d8415b236 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_spec_only_country_packages.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_spec_only_country_packages.py @@ -315,9 +315,10 @@ def _is_compiler_identity_field(*, key: str, value: object, location: str) -> bo ) # A Ledger fact identity (``ledger.aggregate_fact.v2:``) is content # addressing data, never an entrypoint; the colon separates the key kind - # from its digest and the digest can happen to start with a letter. + # from its digest and the digest can happen to start with a letter. A + # diagnostic reference pins the same identity as its ``ledger_fact_key``. ledger_fact_identity = ( - key == "aggregate_fact_key" + key in {"aggregate_fact_key", "ledger_fact_key"} and isinstance(value, str) and re.fullmatch(r"ledger\.[a-z_]+\.v\d+:[0-9a-f]{24}", value) is not None ) diff --git a/packages/microcosm-build/tests/engine_free/shared/test_target_materialization.py b/packages/microcosm-build/tests/engine_free/shared/test_target_materialization.py index 6aa8dbe16..2bb3d6d8a 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_target_materialization.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_target_materialization.py @@ -8,6 +8,7 @@ BandEdgeCoverageError, MeasureResolutionError, assert_calibration_input_finite, + counterfactual_column, materialize_target_bindings, resolve_target_measures, ) @@ -1319,3 +1320,84 @@ def test_filter_aware_provider_without_filters_is_unchanged(): np.testing.assert_array_equal( adapter.tables["person"]["cgt_taxpayer_measure"], [0.0, 0.0, 1.0] ) + + +# microcosm#1069 c11: counterfactual measures resolve through the provider. +class CounterfactualAdapter(ResolutionAdapter): + def counterfactual_delta(self, binding, period): + column = counterfactual_column(binding) + if column in self.tables["person"]: + return np.asarray(self.tables["person"][column]) + raise ValueError( + "frame does not carry precomputed counterfactual delta " + f"{binding['metric_name']!r}" + ) + + +_RELIEF_BINDING = { + "metric_name": "hmrc/relief", + "kind": "input_substitution_counterfactual", + "zeroed_input": "salary_sacrifice", + "folded_into": "pay", + "output_variable": "tax", + "output_delta": "counterfactual_minus_baseline", + "from_entity": "person", +} + + +class CounterfactualProvider: + contract_targets = {"relief": {"bindings": {"policyengine": _RELIEF_BINDING}}} + + def __init__(self): + self.calls = [] + + def knows(self, entity, variable): + return False + + def compute(self, entity, variable): + raise AssertionError("a counterfactual measure is not a column compute") + + def counterfactual_delta(self, binding, period): + self.calls.append((binding["metric_name"], period)) + return np.array([0.0, 30.0, 60.0]), "stub counterfactual" + + +def test_counterfactual_column_is_slash_free(): + assert ( + counterfactual_column( + {"metric_name": "hmrc/salary_sacrifice_employer_nics_relief"} + ) + == "counterfactual_delta__hmrc_salary_sacrifice_employer_nics_relief" + ) + + +def test_resolve_target_measures_routes_counterfactual_deltas_through_the_provider(): + provider = CounterfactualProvider() + + resolution = resolve_target_measures( + lambda: CounterfactualAdapter(_resolution_source()), + _resolution_registry("relief"), + provider, + period=2025, + ) + + key = ("person", "counterfactual_delta__hmrc_relief") + assert set(resolution.measure_inputs) == {key} + np.testing.assert_array_equal(resolution.measure_inputs[key], [0.0, 30.0, 60.0]) + assert provider.calls == [("hmrc/relief", 2025)] + assert resolution.receipt["attached"] == { + "person.counterfactual_delta__hmrc_relief": "stub counterfactual" + } + + +def test_counterfactual_skips_refuse_without_a_provider_route(): + class NoRouteProvider(StubMeasureProvider): + contract_targets = CounterfactualProvider.contract_targets + + with pytest.raises(MeasureResolutionError, match="counterfactual target measure"): + resolve_target_measures( + lambda: CounterfactualAdapter(_resolution_source()), + _resolution_registry("relief"), + NoRouteProvider(), + period=2025, + ) diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_cgt_targets.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_cgt_targets.py index 04b6de8cb..b5b57c52c 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_cgt_targets.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_cgt_targets.py @@ -344,7 +344,8 @@ def test_malformed_cash_declaration_remains_a_compile_error( compilation = compile_cgt(_facts(), target_period=2025) assert "hmrc.cgt.liability_total" not in {r.name for r in compilation.registry} assert any( - "cash diagnostic declaration" in r["reason"] for r in compilation.unsupported + "diagnostic declaration 'obr.capital_gains_tax'" in r["reason"] + for r in compilation.unsupported ) diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_chronicle_feed.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_chronicle_feed.py index 290f667ca..b4fd40ddc 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_chronicle_feed.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_chronicle_feed.py @@ -15,14 +15,14 @@ def test_national_feed_records_the_complete_merged_source_artifact(): pin = load_uk_chronicle_feed() resource = files("microcosm.build.uk").joinpath("chronicle_feed.json") raw = resource.read_bytes() - assert pin.source_commit == "505e0e72aa7c82b96dc06941d84fa797a629161c" + assert pin.source_commit == "825406f98913ab7324c834c3642804e9317a2256" assert pin.source_repo == "PolicyEngine/chronicle" - assert pin.fact_row_count == 287150 + assert pin.fact_row_count == 344402 assert pin.facts_sha256 == ( - "4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9" + "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d" ) assert pin.manifest_sha256 == ( - "3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7" + "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" ) assert pin.artifact_schema_version == "policyengine_ledger.consumer_artifact.v2" assert pin.consumer_fact_schema_versions == ("chronicle.consumer_fact.v4",) diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_employer_pension_contributions.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_employer_pension_contributions.py new file mode 100644 index 000000000..21524e135 --- /dev/null +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_employer_pension_contributions.py @@ -0,0 +1,152 @@ +"""Employer pension contributions from ASHE rate bands (microcosm#1069 c9, R6).""" + +from __future__ import annotations + +import numpy as np +import pandas as pd +import pytest + +from microcosm.build.uk_runtime.employer_pension_contributions import ( + ASHE_EMPLOYER_RATE_BANDS, + ashe_employer_rates_from_rows, + draw_employer_pension_contributions, + employer_scheme_and_sector, + load_ashe_employer_rates, +) + +BANDS = [band for band, _, _ in ASHE_EMPLOYER_RATE_BANDS] + + +def _share_rows(pension_type: str, sector: str, shares: list[float]) -> list[dict]: + dimensions = {"contribution_basis": "full_pay", "pension_type": pension_type} + if sector != "all": + dimensions.update( + { + "sector": sector, + "sic2007_section": "all", + "sic2007_summary_category": "all", + } + ) + return [ + { + "concept": "ons.workplace_pension_employer_contribution_band_share", + "dimensions": {**dimensions, "employer_contribution_rate_band": band}, + "value": share, + } + for band, share in zip(BANDS, shares, strict=True) + ] + + +def _job_rows(sector: str, db: float, dc: float) -> list[dict]: + return [ + { + "concept": "ons.workplace_pension_jobs_by_type", + "dimensions": { + "pension_type": pension_type, + "sector": sector, + "sic2007_section": "all", + "sic2007_summary_category": "all", + "weekly_earnings_band": "all", + }, + "value": jobs, + } + for pension_type, jobs in ( + ("defined_benefit", db), + ("defined_contribution", dc), + ) + ] + + +def _rates(): + rows = [ + # Defined benefit: everything at 20% and over; defined contribution and + # the all-types row: everything under 4%. + *_share_rows("defined_benefit", "all", [0, 0, 0, 0, 0, 0, 100]), + *_share_rows("defined_contribution", "all", [100, 0, 0, 0, 0, 0, 0]), + *_share_rows("group_personal_pension", "all", [0, 100, 0, 0, 0, 0, 0]), + *_share_rows("group_stakeholder_pension", "all", [0, 0, 100, 0, 0, 0, 0]), + *_share_rows("all", "all", [100, 0, 0, 0, 0, 0, 0]), + *_job_rows("Public", 90.0, 10.0), + *_job_rows("Private", 10.0, 90.0), + *_job_rows("all", 50.0, 50.0), + ] + return ashe_employer_rates_from_rows(rows) + + +def test_rates_normalise_the_band_shares_and_split_occupational_by_sector() -> None: + rates = _rates() + + np.testing.assert_allclose(rates.distribution("defined_benefit", "Public")[-1], 1.0) + assert rates.defined_benefit_share == {"Public": 0.9, "Private": 0.1, "all": 0.5} + + +def test_each_member_draws_a_rate_inside_their_band() -> None: + rates = _rates() + count = 4_000 + ids = np.arange(1, count + 1) + scheme = np.tile([1, 2, 3, 4, 0], count // 5) + sector = np.tile(["Public", "Private"], count // 2).astype(object) + income = np.full(count, 30_000.0) + + amounts, receipt = draw_employer_pension_contributions( + ids, employment_income=income, scheme=scheme, sector=sector, rates=rates + ) + + rate = amounts / income + assert (amounts[scheme == 0] == 0.0).all() + # Group personal pensions sit in 4% to < 8%. + gpp = rate[scheme == 1] + assert ((gpp >= 0.04) & (gpp < 0.08)).all() + # Public-sector occupational members are mostly defined benefit (20% to 30%). + public_occupational = rate[(scheme == 2) & (sector == "Public")] + assert ( + (public_occupational >= 0.2) & (public_occupational <= 0.3) + ).mean() == pytest.approx(0.9, abs=0.05) + private_occupational = rate[(scheme == 2) & (sector == "Private")] + assert (private_occupational < 0.04).mean() == pytest.approx(0.9, abs=0.05) + stakeholder = rate[scheme == 3] + assert ((stakeholder >= 0.08) & (stakeholder < 0.10)).all() + assert receipt["members_with_earnings"] == int((scheme > 0).sum()) + + +def test_a_pension_type_without_any_ashe_row_is_refused() -> None: + with pytest.raises(ValueError, match="no employer rate distribution"): + _rates().distribution("group_self_invested_personal_pension", "Private") + + +def test_members_without_earnings_get_no_employer_contribution() -> None: + amounts, receipt = draw_employer_pension_contributions( + np.asarray([1, 2]), + employment_income=np.asarray([0.0, 20_000.0]), + scheme=np.asarray([2, 1]), + sector=np.asarray(["Public", "Private"], dtype=object), + rates=_rates(), + ) + assert amounts[0] == 0.0 + assert receipt["members_with_earnings"] == 1 + + +def test_scheme_priority_and_first_stated_sector() -> None: + penprov = pd.DataFrame({"source_person_id": [1, 1, 2, 3], "stemppen": [1, 2, 5, 4]}) + job = pd.DataFrame({"source_person_id": [1, 1, 3], "jobsect": [-1, 2, 1]}) + + scheme, sector = employer_scheme_and_sector(np.asarray([1, 2, 3, 4]), penprov, job) + + # Person 1 is in a group personal and an occupational scheme: occupational + # wins. Person 2 has only a personal pension (no employer scheme). + assert scheme.tolist() == [2, 0, 4, 0] + assert sector.tolist() == ["Public", "all", "Private", "all"] + + +def test_vendored_rates_load_from_the_pinned_feed() -> None: + rates = load_ashe_employer_rates() + + for pension_type in ( + "defined_benefit", + "defined_contribution", + "group_personal_pension", + ): + assert rates.distribution(pension_type, "all").sum() == pytest.approx(1.0) + assert ( + rates.defined_benefit_share["Public"] > rates.defined_benefit_share["Private"] + ) diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_frs_spine.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_frs_spine.py index f9cf9ef37..ce94fbd8d 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_frs_spine.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_frs_spine.py @@ -1073,8 +1073,10 @@ def test_direct_person_mapping_values_are_ported(tmp_path: Path) -> None: assert adult["council_tax_benefit_reported"] == pytest.approx(WEEKS_IN_YEAR) assert adult["maintenance_expenses"] == pytest.approx(2 * WEEKS_IN_YEAR) assert adult["childcare_expenses"] == pytest.approx(5 * WEEKS_IN_YEAR) + # Reported personal and stakeholder amounts, no longer clipped at the 95th + # percentile of every PENPROV amount (microcosm#1069 c8). assert adult["personal_pension_contributions"] == pytest.approx( - 95.2 * WEEKS_IN_YEAR + 104.0 * WEEKS_IN_YEAR ) assert adult["employee_pension_contributions"] == pytest.approx(2 * WEEKS_IN_YEAR) assert adult["pension_contributions_via_salary_sacrifice"] == pytest.approx( diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_full_targets.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_full_targets.py index 981bdad5a..611cbeaee 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_full_targets.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_full_targets.py @@ -187,26 +187,26 @@ def test_wrong_fact_count_refuses_before_either_compiler(prepared): def test_current_national_and_local_pins_share_one_reviewed_identity(): # main (#904) reads one committed pin, ``uk/chronicle_feed.json``, for the # national feed and the local census; the full build checks they agree. - # The identity is the 505e0e7 feed re-pinned by microcosm#1045 (Chronicle - # #287/#288, the HMRC CGT Table 4 facts). + # The identity is the 825406f feed re-pinned by microcosm#1069 + # (PolicyEngine/chronicle#302 via #305, the UK pension facts). national = runtime.load_uk_chronicle_feed() local = runtime.load_uk_local_chronicle_pin() assert ( national.facts_sha256 == local["facts_sha256"] - == ("4a45c543553617d606ebf8ea11254b48c1e6e115c97840dd8757beafbac035d9") + == ("28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d") ) assert ( national.manifest_sha256 == local["manifest_sha256"] - == ("3dc9ed05ba00d30609c295cb7d34ebcd98476778bebf1da9a1e7f2e64b97caf7") + == ("6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119") ) assert ( national.source_commit == local["source_commit"] - == "505e0e72aa7c82b96dc06941d84fa797a629161c" + == "825406f98913ab7324c834c3642804e9317a2256" ) - assert national.fact_row_count == local["fact_row_count"] == 287150 + assert national.fact_row_count == local["fact_row_count"] == 344402 def test_chronicle_source_codec_validates_directory_manifest(tmp_path): diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_graph.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_graph.py index 1a618726c..32cccf01b 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_graph.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_graph.py @@ -44,10 +44,11 @@ def test_uk_spine_graph_contains_every_manifest_stage() -> None: # #791 frs_relationships, #725 hmrc_cgt_asset_type_spine, #970 # cgt_incidence_anchor, #930 nts_bus_travel and the income-anchor lane's # (PolicyEngine/chronicle#280) spi_income_band_donors stages, the #1012 - # spi_housing_shell and the #1003 was_lisa; the frs_hmrc_retained_leaves / - # hmrc_spi_income certified-pair alternatives are retired (#901), so the - # manifest roster is the graph roster. - assert len(expected) == 35 + # spi_housing_shell, the #1003 was_lisa and the microcosm#1069 + # pension_credit_take_up; the frs_hmrc_retained_leaves / hmrc_spi_income + # certified-pair alternatives are retired (#901), so the manifest roster is + # the graph roster. + assert len(expected) == 36 assert {"frs_hmrc_retained_leaves", "hmrc_spi_income"}.isdisjoint(expected) assert set(expected) <= ids assert {"frs_hmrc_retained_leaves", "hmrc_spi_income"}.isdisjoint(ids) diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_hmrc_uprating.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_hmrc_uprating.py index 09ac7e49e..91827cd62 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_hmrc_uprating.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_hmrc_uprating.py @@ -11,9 +11,10 @@ def test_every_declared_engine_index_and_the_count_index_have_an_applier() -> No UK_HMRC_TAXPAYER_GROWTH_INDEX_CONCEPT, "hmrc.itl_2026.total_income_growth_by_total_income_band", "hmrc.itl_2026.total_tax_growth_by_total_income_band", + UK_SPI_STATE_PENSION_AMOUNT_INDEX_CONCEPT, } assert set(appliers) <= set(UK_UPRATING_APPLIERS) - assert len(UK_ENGINE_INDEX_PARAMETERS) == 6 + assert len(UK_ENGINE_INDEX_PARAMETERS) == 7 def test_engine_index_moves_the_amount_by_the_parameter_ratio_and_receipts_it() -> None: registry = TargetRegistry( @@ -228,3 +229,77 @@ def test_a_regional_open_top_band_sums_every_table_2_5_band_above_it() -> None: assert spec.metadata["uprating_index_itl_bands"] == ( "200000-500000;500000-1000000;1000000-2000000;2000000-inf" ) + +def test_state_pension_amount_moves_with_its_count_rows_recipients_and_the_rate() -> ( + None +): + """microcosm#1069: amount = recipients (the count row's growth) x the rate.""" + + registry = TargetRegistry( + ( + _spec( + name="hmrc/state_pension_income_band_40_000_to_50_000@2025", + value=6.0e9, + lower_bound=40_000, + ), + ), + country="uk", + ) + + def rate(path: str, instant: str) -> float: + assert path == UK_SPI_STATE_PENSION_RATE_PARAMETER + return {"2023-01-01": 200.0, "2025-01-01": 230.0}[instant] + + (spec,) = align_hmrc_amount_by_recipient_growth_and_rate( + _reference(UK_SPI_STATE_PENSION_AMOUNT_INDEX_CONCEPT), + registry, + index_concept=UK_SPI_STATE_PENSION_AMOUNT_INDEX_CONCEPT, + parameter_path=UK_SPI_STATE_PENSION_RATE_PARAMETER, + parameter_value=rate, + rows=_count_rows(), + ).specs + + # The count row's factor for the band (the 30-50k Table 2.5 band's window + # over 2023) times the rate ratio: the mean per recipient moves by the rate. + (count,) = align_hmrc_count_row_by_taxpayer_growth( + _reference(UK_HMRC_TAXPAYER_GROWTH_INDEX_CONCEPT), + registry, + count_rows=_count_rows(), + ).specs + count_factor = float(count.metadata["uprating_factor"]) + assert count_factor == pytest.approx(1.175) + assert spec.value == pytest.approx(6.0e9 * 1.175 * 1.15) + assert spec.metadata["uprating_index"] == UK_SPI_STATE_PENSION_AMOUNT_INDEX_CONCEPT + assert float(spec.metadata["uprating_count_factor"]) == pytest.approx(1.175) + assert float(spec.metadata["uprating_rate_factor"]) == pytest.approx(1.15) + assert ( + spec.metadata["uprating_rate_parameter"] == UK_SPI_STATE_PENSION_RATE_PARAMETER + ) + assert spec.metadata["uprating_index_itl_bands"] == "30000-50000" + assert spec.metadata["ledger_value_before_alignment"] == "6000000000" + # Another index passes through untouched. + assert ( + align_hmrc_amount_by_recipient_growth_and_rate( + _reference(EARNINGS_INDEX), + registry, + index_concept=UK_SPI_STATE_PENSION_AMOUNT_INDEX_CONCEPT, + parameter_path=UK_SPI_STATE_PENSION_RATE_PARAMETER, + parameter_value=rate, + rows=_count_rows(), + ) + is registry + ) + # Compiled at its own year (the production-2023 parity surface), the row + # stays as published with a complete receipt rather than dropping out. + (own_year,) = align_hmrc_amount_by_recipient_growth_and_rate( + _reference(UK_SPI_STATE_PENSION_AMOUNT_INDEX_CONCEPT, period=2023), + registry, + index_concept=UK_SPI_STATE_PENSION_AMOUNT_INDEX_CONCEPT, + parameter_path=UK_SPI_STATE_PENSION_RATE_PARAMETER, + parameter_value=rate, + rows=_count_rows(), + ).specs + assert own_year.value == 6.0e9 + assert own_year.metadata["uprating_factor"] == "1" + assert own_year.metadata["uprating_rate_from_instant"] == "2023-01-01" + assert "uprating_rate_from_value" not in own_year.metadata diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_measure_simulation.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_measure_simulation.py index a9539c403..77d9f0a5f 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_measure_simulation.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_measure_simulation.py @@ -570,7 +570,10 @@ def test_exclusion_applier_warns_within_week_of_expiry(): #: a drifting count is a register change that must be re-adjudicated, #: never absorbed. _PACKAGED_EXCLUSION_CENSUS = { - "hmrc.salary_sacrifice.": 5, + # microcosm#1069 c11: the live counterfactual route binds the two NICs + # relief rows and the income-tax relief total; the three rate bands wait + # for the band-test fix. + "hmrc.salary_sacrifice.": 3, "_1_000_000_to_inf": 10, "slc.": 5, "dwp/uc_payment_dist/": 17, @@ -632,7 +635,7 @@ def test_exclusion_applier_warns_within_week_of_expiry(): def test_packaged_exclusions_load(): exclusions = load_uk_calibration_measure_exclusions() names = [entry["name"] for entry in exclusions] - assert len(names) == len(set(names)) == 62 + assert len(names) == len(set(names)) == 60 band_h_region_cells = [ entry for entry in exclusions @@ -941,3 +944,97 @@ def test_cgt_taxable_income_nets_the_allowances_the_engine_formula_nets(): # them too; an allowance above income floors at 0. [0.0, 17_430.0, 47_430.0, 7_430.0, 57_430.0, 0.0], ) + + +# microcosm#1069 c11: the live counterfactual route (salary sacrifice returned to pay). +class _TaxSimulation: + """A stub engine whose tax and NI follow the pay and salary-sacrifice inputs.""" + + created = 0 + + def __init__(self, *, dataset): + type(self).created += 1 + self.inputs = { + "employment_income": np.array([30_000.0, 50_000.0, 0.0]), + "pension_contributions_via_salary_sacrifice": np.array([3_000.0, 0.0, 0.0]), + } + names = (*self.inputs, "income_tax", "ni_employee") + self.tax_benefit_system = SimpleNamespace( + variables={ + name: SimpleNamespace( + entity=SimpleNamespace(key="person"), value_type=float + ) + for name in names + } + ) + + def set_input(self, variable, year, values): + self.inputs[variable] = np.asarray(values, dtype=float) + + def calculate(self, variable, year, map_to=None): + if variable in self.inputs: + return self.inputs[variable] + taxable = np.maximum(self.inputs["employment_income"] - 12_570.0, 0.0) + return {"income_tax": 0.2 * taxable, "ni_employee": 0.08 * taxable}[variable] + + +def _relief_binding(output, **extra): + return { + "metric_name": f"hmrc/salary_sacrifice_{output}_relief", + "kind": "input_substitution_counterfactual", + "zeroed_input": "pension_contributions_via_salary_sacrifice", + "folded_into": "employment_income", + "output_delta": "counterfactual_minus_baseline", + "output_variable": output, + "from_entity": "person", + **extra, + } + + +def test_counterfactual_delta_returns_the_sacrificed_pay_relief(monkeypatch, tmp_path): + _TaxSimulation.created = 0 + monkeypatch.setitem( + sys.modules, + "policyengine_uk", + SimpleNamespace(__version__="9.9.9", Microsimulation=_TaxSimulation), + ) + resolver = UKMeasureResolver( + simulation_source=tmp_path / "input.h5", + scratch_dir=tmp_path, + year=2025, + frame=FrameStub(), + ) + + tax, route = resolver.counterfactual_delta(_relief_binding("income_tax"), 2025) + ni, _ = resolver.counterfactual_delta(_relief_binding("ni_employee"), 2025) + + # £3,000 of sacrificed pay returned to the first person: 20% income tax and + # 8% NI on it; nobody else moves. + np.testing.assert_allclose(tax, [600.0, 0.0, 0.0]) + np.testing.assert_allclose(ni, [240.0, 0.0, 0.0]) + assert "folded into employment_income" in route + # One baseline and one counterfactual simulation serve both bindings. + assert _TaxSimulation.created == 2 + measures = resolver.receipt()["counterfactual_measures"] + assert measures["hmrc/salary_sacrifice_income_tax_relief"]["rows_nonzero"] == 1 + + +def test_counterfactual_delta_refuses_bands_and_other_periods(monkeypatch, tmp_path): + monkeypatch.setitem( + sys.modules, + "policyengine_uk", + SimpleNamespace(__version__="9.9.9", Microsimulation=_TaxSimulation), + ) + resolver = UKMeasureResolver( + simulation_source=tmp_path / "input.h5", + scratch_dir=tmp_path, + year=2025, + frame=FrameStub(), + ) + with pytest.raises(ValueError, match="banded counterfactual measures are deferred"): + resolver.counterfactual_delta( + _relief_binding("income_tax", band={"variable": "adjusted_net_income"}), + 2025, + ) + with pytest.raises(ValueError, match="does not match target period"): + resolver.counterfactual_delta(_relief_binding("income_tax"), 2024) diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_national_calibration.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_national_calibration.py index 2fe9d8e70..d1ed33339 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_national_calibration.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_national_calibration.py @@ -53,7 +53,7 @@ from microcosm.calibrate.artifacts import decode_problem from microcosm.frame import EntitySchema, Frame, MassChange, WeightKind, Weights -ACTIVE_REFERENCE_COUNT = 1152 +ACTIVE_REFERENCE_COUNT = 1230 def _uc_reference(**overrides) -> LedgerTargetReference: diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_pension_age_benefit_targets.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_pension_age_benefit_targets.py new file mode 100644 index 000000000..9f9957ac8 --- /dev/null +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_pension_age_benefit_targets.py @@ -0,0 +1,131 @@ +"""The pension-age benefit caseloads and the Winter Fuel diagnostic (microcosm#1069 c10).""" + +from __future__ import annotations + +import json +import os +from pathlib import Path + +import pytest + +from microcosm.build.uk_runtime.local_targets import load_uk_population_contract +from test_support.paths import paths_for + +_TEST_PATHS = paths_for("microcosm-build") +STABLE_UK_FACT_FEED_NAME = ".codex-work/consumer_facts_uk.jsonl" +QUARTERS = ["2025-02", "2025-05", "2025-08", "2025-11"] +MONTHS = [f"2025-{month:02d}" for month in range(1, 13)] + + +def _targets() -> dict[str, dict]: + contract = load_uk_population_contract() + return {target["target_id"]: target for target in contract["targets"]} + + +def test_attendance_allowance_binds_england_and_wales_only() -> None: + targets = _targets() + attendance = { + name: target + for name, target in targets.items() + if name.startswith("dwp.attendance_allowance.") + } + # Scotland's caseload moves to Pension Age Disability Payment through + # 2025, which the engine does not model, so it is not bound. + assert set(attendance) == { + "dwp.attendance_allowance.recipients_england", + "dwp.attendance_allowance.recipients_wales", + } + for country, target in ( + ("ENGLAND", attendance["dwp.attendance_allowance.recipients_england"]), + ("WALES", attendance["dwp.attendance_allowance.recipients_wales"]), + ): + assert target["family"] == "dwp_attendance_allowance" + assert target["value_operation"] == "monthly_window_average" + assert target["measurement"]["source_months"] == QUARTERS + selector = target["ledger_selector"] + assert selector["source_measure_id"] == "total_cases_with_entitlement" + assert selector["period_value"] == QUARTERS + assert set(selector["dimension_values"].values()) == {"all"} + binding = target["bindings"]["policyengine"] + assert binding["filters"] == [ + {"variable": "attendance_allowance", "operator": ">", "value": 0} + ] + (condition,) = binding["household_conditions"] + assert (condition["variable"], condition["value"]) == ("country", country) + + +def test_pension_age_housing_benefit_reads_the_detail_tenure_cells() -> None: + targets = _targets() + expected = { + "dwp.hb.households_pension_age": ("all", "total_claimants"), + "dwp.hb.households_pension_age_social_rented": ( + "Social Rented Sector", + "claimants", + ), + "dwp.hb.households_pension_age_private_rented": ( + "Private Rented Sector", + "claimants", + ), + } + for name, (tenure, measure) in expected.items(): + target = targets[name] + selector = target["ledger_selector"] + assert selector["dimension_values"] == { + "client_type": "Pension age", + "private_or_social_rented": tenure, + } + # Stat-Xplore publishes the pension-age tenure cells as detail rows; + # only the all-tenure row is a total. + assert selector["source_measure_id"] == measure + assert selector["period_value"] == MONTHS + assert target["family"] == "dwp_housing_benefit" + filters = target["bindings"]["policyengine"]["filters"] + assert {"variable": "eldest_adult_age", "operator": ">=", "value": 66} in ( + filters + ) + + +def test_winter_fuel_recipients_are_a_diagnostic_never_a_target() -> None: + contract = load_uk_population_contract() + assert "dwp.winter_fuel_payment.recipients" not in { + target["target_id"] for target in contract["targets"] + } + declaration = contract["diagnostic_references"][ + "dwp.winter_fuel_payment.recipients" + ] + assert declaration["attach_to_target"] == "obr.winter_fuel_allowance" + selector = declaration["reference"]["ledger_selector"] + # DWP publishes England and Wales; Scotland pays its own winter heating + # payment from winter 2025/26. + assert selector["geography_id"] == "K04000001" + assert declaration["reference"]["ledger_fact_key"] + + +def test_winter_fuel_diagnostic_carries_the_published_count() -> None: + """Feed-gated: the diagnostic resolves the winter 2025/26 figure.""" + + from microcosm.build.uk_runtime.ledger_targets import ( + _attached_diagnostic_metadata, + ) + + root = _TEST_PATHS.repository + configured = os.environ.get("CHRONICLE_UK_FACTS") + feed = Path(configured) if configured else root / STABLE_UK_FACT_FEED_NAME + if feed.is_dir(): + feed = feed / "consumer_facts.jsonl" + if not feed.is_file(): + pytest.skip("pinned UK Chronicle consumer feed is not present") + with feed.open(encoding="utf-8") as handle: + facts = tuple( + json.loads(line) + for line in handle + if "winter_fuel_payment_beneficiaries" in line + ) + + metadata = _attached_diagnostic_metadata(facts, "obr.winter_fuel_allowance") + + prefix = "dwp_winter_fuel_recipients_diagnostic" + assert metadata[f"{prefix}_role"] == "diagnostic_only_not_in_fit" + assert metadata[f"{prefix}_status"] == "available" + assert float(metadata[f"{prefix}_value_count"]) == 11_003_237 + assert metadata[f"{prefix}_ledger_geography_id"] == "K04000001" diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_pension_credit_take_up.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_pension_credit_take_up.py new file mode 100644 index 000000000..26b096dde --- /dev/null +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_pension_credit_take_up.py @@ -0,0 +1,239 @@ +"""Pension Credit take-up by component after the SPI chain (microcosm#1069 R9).""" + +from __future__ import annotations + +from dataclasses import replace + +import numpy as np +import pandas as pd +import pytest + +from microcosm.build.country_spec import load_country_spec +from microcosm.build.source_manifest import SourceStageSpec +from microcosm.build.uk_runtime.frs_take_up import UK_TAKE_UP_SIGNAL_OUTPUTS +from microcosm.build.uk_runtime.national_frame import uk_national_frame +from microcosm.build.uk_runtime.pension_credit_take_up import ( + PENSION_CREDIT_ENTITLEMENT_VARIABLES, + PENSION_CREDIT_TAKE_UP_STAGE_NAME, + UKPensionCreditTakeUpStageTransform, + _assert_stage_parameters, + assign_component_take_up, + redraw_pension_credit_take_up, +) +from microcosm.build.uk_runtime.take_up_contract import load_uk_take_up_contract +from microcosm.frame import WeightKind + +RATES = { + "pension_credit_guarantee_credit": 0.69, + "pension_credit_savings_credit_only": 0.37, +} + + +def _stage() -> SourceStageSpec: + spec = load_country_spec("uk") + assert spec.sources is not None + return spec.sources.stage_map()[PENSION_CREDIT_TAKE_UP_STAGE_NAME] + + +def _population(count: int = 30_000, *, gc_reporter_share: float = 0.1): + rng = np.random.default_rng(5) + band = np.repeat(["gc", "sc", "none"], count // 3) + guarantee = np.where(band == "gc", 50.0, 0.0) + savings = np.where(band == "sc", 20.0, 0.0) + eligible = band != "none" + reporter = np.where( + band == "gc", + rng.random(len(band)) < gc_reporter_share, + rng.random(len(band)) < 0.05, + ) + return guarantee, savings, eligible, reporter, rng.random(len(band)), band + + +def test_each_component_band_claims_at_its_rate_with_reporters_first() -> None: + guarantee, savings, eligible, reporter, draws, band = _population() + weights = np.ones(len(band)) + + would_claim, receipts = assign_component_take_up( + guarantee=guarantee, + savings=savings, + eligible=eligible, + reporter=reporter, + weights=weights, + draws=draws, + rates=RATES, + ) + + assert would_claim[reporter].all() + assert not would_claim[(band == "none") & ~reporter].any() + by_band = {receipt["band"]: receipt for receipt in receipts} + for name, mask, rate in ( + ("guarantee_credit", band == "gc", 0.69), + ("savings_credit_only", band == "sc", 0.37), + ): + receipt = by_band[name] + entitled, reporting = mask.sum(), (mask & reporter).sum() + assert receipt["residual_rate"] == pytest.approx( + (rate * entitled - reporting) / (entitled - reporting) + ) + assert receipt["realized_take_up"] == pytest.approx(rate, abs=0.03) + assert receipt["reporters_exceed_rate"] is False + + +def test_reporters_above_the_rate_leave_no_residual_draw() -> None: + guarantee, savings, eligible, reporter, draws, band = _population( + gc_reporter_share=0.8 + ) + + would_claim, receipts = assign_component_take_up( + guarantee=guarantee, + savings=savings, + eligible=eligible, + reporter=reporter, + weights=np.ones(len(band)), + draws=draws, + rates=RATES, + ) + + gc = receipts[0] + assert gc["band"] == "guarantee_credit" + assert gc["residual_rate"] == 0.0 + assert gc["drawn_units"] == 0 + assert gc["reporters_exceed_rate"] is True + gc_mask = band == "gc" + assert (would_claim[gc_mask] == reporter[gc_mask]).all() + + +def test_the_residual_is_weighted() -> None: + # Two entitled Guarantee Credit units: a reporter of weight 1 and a + # non-reporter of weight 3, so r = (0.5 * 4 - 1) / (4 - 1) = 1 / 3. + _, receipts = assign_component_take_up( + guarantee=np.asarray([10.0, 10.0]), + savings=np.zeros(2), + eligible=np.asarray([True, True]), + reporter=np.asarray([True, False]), + weights=np.asarray([1.0, 3.0]), + draws=np.asarray([0.9, 0.9]), + rates={**RATES, "pension_credit_guarantee_credit": 0.5}, + ) + assert receipts[0]["residual_rate"] == pytest.approx(1 / 3) + + +class _StubEngine: + country = "uk" + + def __init__(self) -> None: + self.calls: list[tuple[tuple[str, ...], str]] = [] + + def materialize(self, frame, variables, period): + self.calls.append((tuple(variables), str(period))) + benunit = frame.table("benunit") + ids = benunit["benunit_id"].to_numpy() + # 1: Guarantee Credit; 2: Savings Credit only; 3: not entitled. + return { + "guarantee_credit": np.where(ids == 1, 40.0, 0.0), + "savings_credit": np.where(ids == 2, 15.0, 0.0), + "is_pension_credit_eligible": ids != 3, + } + + +def _frame(): + person = pd.DataFrame( + { + "person_id": [11, 21, 31], + "person_benunit_id": [1, 2, 3], + "person_household_id": [1, 2, 3], + "age": [80, 78, 70], + "pension_credit_reported": [0.0, 0.0, 500.0], + } + ) + benunit = pd.DataFrame( + {"benunit_id": [1, 2, 3], "would_claim_pc": [True, True, False]} + ) + household = pd.DataFrame({"household_id": [1, 2, 3], "region": ["WALES"] * 3}) + return uk_national_frame( + person=person, + benunit=benunit, + household=household, + household_weights=np.asarray([10.0, 10.0, 10.0]), + weight_kind=WeightKind.IMPORTANCE, + time_period="2024", + ) + + +def test_redraw_reads_engine_entitlement_once_and_rewrites_only_would_claim_pc() -> ( + None +): + engine = _StubEngine() + frame = _frame() + + result = redraw_pension_credit_take_up( + frame, engine=engine, contract=load_uk_take_up_contract() + ) + + assert engine.calls == [(PENSION_CREDIT_ENTITLEMENT_VARIABLES, "2024")] + after = result.frame.table("benunit") + # Unit 3 reports Pension Credit the engine finds it is not entitled to: it + # keeps claiming, and the receipt counts it. + assert bool(after.loc[after["benunit_id"] == 3, "would_claim_pc"].iloc[0]) + assert result.reporters_without_entitlement == { + "units": 1, + "weighted_units": 10.0, + } + for entity in ("person", "household"): + pd.testing.assert_frame_equal( + result.frame.table(entity), frame.table(entity), check_exact=True + ) + pd.testing.assert_frame_equal( + after.drop(columns=["would_claim_pc"]), + frame.table("benunit").drop(columns=["would_claim_pc"]), + ) + for name in PENSION_CREDIT_ENTITLEMENT_VARIABLES: + assert name not in after + evidence = result.evidence() + assert [band["band"] for band in evidence["bands"]] == [ + "guarantee_credit", + "savings_credit_only", + ] + assert evidence["bands"][0]["entitled_units"] == 1 + + +def test_committed_manifest_declares_the_stage_and_its_rewrite() -> None: + stage = _stage() + + assert stage.grain == "benunit" + assert stage.outputs == () + assert stage.rewrites == ("would_claim_pc",) + _assert_stage_parameters(stage) + transform = UKPensionCreditTakeUpStageTransform(stage=stage, engine=_StubEngine()) + transform(_frame()) + assert transform.checkpoint_metadata()["evidence"]["stage"] == ( + PENSION_CREDIT_TAKE_UP_STAGE_NAME + ) + + +def test_stage_parameters_refuse_a_drifted_band() -> None: + stage = _stage() + operations = [] + for operation in stage.operations: + payload = {"kind": operation.kind, **dict(operation.parameters)} + if operation.kind == "assign_component_take_up_residual": + bands = [dict(band) for band in payload["bands"]] + bands[1]["rate_key"] = "pension_credit" + payload["bands"] = bands + operations.append(payload) + drifted = SourceStageSpec.from_mapping({**stage.__dict__, "operations": operations}) + with pytest.raises(ValueError, match="parameters drifted"): + _assert_stage_parameters(drifted) + with pytest.raises(ValueError, match="expected 'pension_credit_take_up'"): + _assert_stage_parameters(replace(stage, stage="frs_take_up")) + + +def test_contract_carries_the_fye2024_component_rates() -> None: + contract = load_uk_take_up_contract() + + assert contract.rate("pension_credit_guarantee_credit") == 0.69 + assert contract.rate("pension_credit_savings_credit_only") == 0.37 + + +def test_terminal_signal_gate_leaves_would_claim_pc_to_the_stage_gate() -> None: + assert all(output != "would_claim_pc" for _, output, _ in UK_TAKE_UP_SIGNAL_OUTPUTS) diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_pension_credit_targets.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_pension_credit_targets.py new file mode 100644 index 000000000..10aa10195 --- /dev/null +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_pension_credit_targets.py @@ -0,0 +1,175 @@ +"""The Pension Credit caseload target rows (microcosm#1069 c7).""" + +from __future__ import annotations + +import hashlib +import json +import os +from pathlib import Path + +import pytest + +from microcosm.build.country_spec import load_country_spec +from microcosm.build.ledger_targets import compile_ledger_target_references +from microcosm.build.uk_runtime.chronicle_feed import load_uk_chronicle_feed +from microcosm.build.uk_runtime.local_targets import load_uk_population_contract +from test_support.paths import paths_for + +_TEST_PATHS = paths_for("microcosm-build") +STABLE_UK_FACT_FEED_NAME = ".codex-work/consumer_facts_uk.jsonl" +PUBLISHER_TYPES = { + "Guarantee Credit only": ("guarantee_credit", ">", "savings_credit", "<="), + "Savings Credit only": ("guarantee_credit", "<=", "savings_credit", ">"), + "Both Guarantee and Savings Credit": ( + "guarantee_credit", + ">", + "savings_credit", + ">", + ), +} +PARTNERS = {"Has a partner": "COUPLE", "Has no partner": "SINGLE"} +GB_REGIONS = { + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND", +} + + +def _targets() -> list[dict]: + return [ + target + for target in load_uk_population_contract()["targets"] + if target["family"] == "dwp_pension_credit" + ] + + +def _references() -> list: + return [ + reference + for reference in load_country_spec("uk").target_references + if reference.family == "dwp_pension_credit" + ] + + +def _predicates(binding: dict, variable: str) -> list[tuple[str, object]]: + return [ + ( + predicate.get("operator", "=="), + predicate.get("value", predicate.get("equals")), + ) + for predicate in binding["filters"] + if predicate["variable"] == variable + ] + + +def test_the_pension_credit_family_is_14_caseload_rows() -> None: + targets = _targets() + + assert len(targets) == 14 + assert len(_references()) == 14 + assert {target["category_id"] for target in targets} == { + "dwp.pension_credit", + "dfc_ni.pension_credit", + } + for target in targets: + assert target["value_operation"] == "monthly_window_average" + assert target["period_match_policy"] == "source_window" + assert target["measurement"]["source_months"] == [ + "2025-02", + "2025-05", + "2025-08", + "2025-11", + ] + binding = target["bindings"]["policyengine"] + assert (binding["from_entity"], binding["value_variable"]) == ( + "benunit", + "benunit_count", + ) + assert ("<", 0) not in _predicates(binding, "pension_credit") + assert _predicates(binding, "pension_credit") == [(">", 0)] + + +def test_every_row_binds_the_cell_its_selector_names() -> None: + for target in _targets(): + binding = target["bindings"]["policyengine"] + (condition,) = binding["household_conditions"] + assert condition["map_to"] == "benunit" + if target["target_id"].startswith("dfc_ni."): + assert condition["value"] == "NORTHERN_IRELAND" + continue + assert set(condition["value"]) == GB_REGIONS + cells = target["ledger_selector"]["dimension_values"] + publisher_type = cells["type_of_pension_credit"] + if publisher_type != "all": + gc, gc_operator, sc, sc_operator = PUBLISHER_TYPES[publisher_type] + assert _predicates(binding, gc) == [(gc_operator, 0)] + assert _predicates(binding, sc) == [(sc_operator, 0)] + assert _predicates(binding, "relation_type") == [ + ("==", PARTNERS[cells["partner_indicator"]]) + ] + age = cells["age_bands_and_single_year"] + if age != "all": + low = [ + value + for op, value in _predicates(binding, "eldest_adult_age") + if op == ">=" + ] + high = [ + value + for op, value in _predicates(binding, "eldest_adult_age") + if op == "<=" + ] + if age == "90 and over": + assert (low, high) == ([90], []) + else: + first, last = (int(part) for part in age.split("-")) + assert (low, high) == ([first], [last]) + + +def _pension_credit_facts() -> list[dict]: + """The pinned feed's Pension Credit facts, or skip (the artifact is untracked).""" + + root = _TEST_PATHS.repository + configured = os.environ.get("CHRONICLE_UK_FACTS") + feed = Path(configured) if configured else root / STABLE_UK_FACT_FEED_NAME + if feed.is_dir(): + feed = feed / "consumer_facts.jsonl" + if not feed.is_file(): + pytest.skip("pinned UK Chronicle consumer feed is not present") + assert hashlib.sha256(feed.read_bytes()).hexdigest() == ( + load_uk_chronicle_feed().facts_sha256 + ) + with feed.open(encoding="utf-8") as handle: + return [json.loads(line) for line in handle if "pension_credit" in line] + + +def test_the_cells_partition_the_great_britain_caseload() -> None: + """Feed-gated: type-by-partner and age cells each sum to the GB caseload.""" + + compiled = compile_ledger_target_references( + _pension_credit_facts(), _references(), country="uk" + ) + values = {spec.name.split("@")[0]: spec.value for spec in compiled.specs} + total = values["dwp.pension_credit.benefit_units"] + cells = sum( + value for name, value in values.items() if name.endswith(("_couple", "_single")) + ) + ages = sum( + value + for name, value in values.items() + if name.rsplit("_", 2)[-2:][0].isdigit() and not name.startswith("dfc_ni.") + ) + + # DWP publishes no claims of unknown age in 2025. + assert total == pytest.approx(1_390_586.25) + assert cells == pytest.approx(total, abs=10) + assert ages == pytest.approx(total, abs=10) + assert 10_000 < values["dfc_ni.pension_credit.benefit_units"] < 100_000 diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_pension_window_consumers.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_pension_window_consumers.py new file mode 100644 index 000000000..6d2c4a758 --- /dev/null +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_pension_window_consumers.py @@ -0,0 +1,146 @@ +"""UK consumers of the pension count x mean window (microcosm#1069, c2).""" + +import json + +import pytest + +from microcosm.build.ledger_targets import ( + MONTHLY_WINDOW_COUNT_X_MEAN, + compile_ledger_target_references, +) +from microcosm.build.uk_runtime.hmrc_uprating import ( + UK_ENGINE_PARAMETER_INDEX_PREFIX, + align_hmrc_row_by_engine_index, +) +from microcosm.build.uk_runtime.uc_source_periods import ( + EXPECTED_SOURCE_MONTHS, + SOURCE_MONTH_FAMILIES, + uc_source_month_metadata, + validate_uc_source_month_coverage, +) +from test_support.microcosm_build.ledger_monthly_count_x_mean import ( + MONTHS, + statx_window, + window_reference, +) +from tools.generate_uk_target_references import _geography_id_for_target + +NSP = "gov.dwp.state_pension.new_state_pension.amount" +NSP_INDEX = f"{UK_ENGINE_PARAMETER_INDEX_PREFIX}{NSP}" +# The engine keys each tax year's weekly rate at 1 January of the year it +# opens: 221.20 for 2024-25 and 230.25 for 2025-26. +RATES = {"2024-01-01": 221.20, "2025-01-01": 230.25} +COUNTS = (12_000_000.0, 12_050_000.0, 12_100_000.0, 12_150_000.0) +MEANS = (221.0, 230.0, 230.5, 231.0) + + +def _rate(path: str, instant: str) -> float: + assert path == NSP + return RATES[instant] + + +def _compiled(**overrides): + reference = window_reference(uprating_index=NSP_INDEX, **overrides) + registry = compile_ledger_target_references( + statx_window(COUNTS, MEANS), [reference], country="uk" + ) + return reference, registry + + +def test_each_window_month_moves_to_the_rate_the_engine_pays_in_2025() -> None: + reference, compiled = _compiled() + + (spec,) = align_hmrc_row_by_engine_index( + reference, compiled, parameter_path=NSP, parameter_value=_rate + ).specs + + # Only February is paid at the 2024-25 rate; May onwards already at 2025-26. + factors = (230.25 / 221.20, 1.0, 1.0, 1.0) + expected = ( + sum( + count * mean * 52 * factor + for count, mean, factor in zip(COUNTS, MEANS, factors, strict=True) + ) + / 4 + ) + assert spec.value == pytest.approx(expected, rel=1e-12) + members = json.loads(spec.metadata["uprating_window_members"]) + assert [member["uprating_from_instant"] for member in members] == [ + "2024-01-01", + "2025-01-01", + "2025-01-01", + "2025-01-01", + ] + assert float(members[0]["uprating_factor"]) == pytest.approx(factors[0]) + assert spec.metadata["uprating_index_to_instant"] == "2025-01-01" + assert spec.metadata["ledger_value_before_alignment"] == ( + f"{compiled.specs[0].value:.15g}" + ) + assert "R1" in spec.metadata["uprating_adjudication"] + + +def test_a_window_already_at_the_target_rate_is_unchanged() -> None: + reference, compiled = _compiled() + flat = {"2024-01-01": 230.25, "2025-01-01": 230.25} + + (spec,) = align_hmrc_row_by_engine_index( + reference, + compiled, + parameter_path=NSP, + parameter_value=lambda _path, instant: flat[instant], + ).specs + + assert spec.value == compiled.specs[0].value + assert spec.metadata["uprating_factor"] == "1" + + +def test_a_window_month_after_the_calibration_year_is_refused() -> None: + _, compiled = _compiled() + + with pytest.raises(ValueError, match="never moves a value backwards"): + align_hmrc_row_by_engine_index( + window_reference(uprating_index=NSP_INDEX, period=2024), + compiled, + parameter_path=NSP, + parameter_value=_rate, + ) + + +def test_the_pension_families_declare_their_source_months() -> None: + assert { + "dwp_state_pension", + "dwp_pension_credit", + "dwp_attendance_allowance", + } <= SOURCE_MONTH_FAMILIES + metadata = uc_source_month_metadata( + list(MONTHS), value_operation=MONTHLY_WINDOW_COUNT_X_MEAN + ) + reference = window_reference(metadata=metadata) + facts = statx_window(COUNTS, MEANS) + registry = compile_ledger_target_references(facts, [reference], country="uk") + + (spec,) = validate_uc_source_month_coverage(reference, registry, facts).specs + + # Each month resolves its count and its mean. + assert spec.metadata["uk_uc_source_month_count"] == "4" + assert spec.metadata["uk_uc_source_period_basis"] == ( + "mean_of_declared_monthly_count_x_mean" + ) + assert json.loads(spec.metadata[EXPECTED_SOURCE_MONTHS]) == list(MONTHS) + + +@pytest.mark.parametrize( + ("target_id", "geography_id"), + [ + ("dfc_ni.state_pension.recipients", "N92000002"), + ("dfc_ni.pension_credit.benefit_units", "N92000002"), + ("dwp.winter_fuel_payment.recipients", "K04000001"), + ("dwp.state_pension.recipients", "K03000001"), + ], +) +def test_pension_targets_pin_their_publishers_geography( + target_id: str, geography_id: str +) -> None: + target = {"target_id": target_id, "ledger_selector": {}} + + assert _geography_id_for_target(target) == geography_id diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_population_targets.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_population_targets.py index 95cb37a9c..49fe9fd5f 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_population_targets.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_population_targets.py @@ -176,6 +176,7 @@ def test_uk_population_targets_shape_order_and_registry_accounting() -> None: "calendar_year_average", "monthly_window_average", "monthly_window_sum_average", + "monthly_window_count_x_mean", "linear_combination", "scaled_by_ratio", "calendar_year_window", @@ -185,7 +186,16 @@ def test_uk_population_targets_shape_order_and_registry_accounting() -> None: "operation": "sum", "assertion_policy": "observed_only", } - assert len(resource["targets"]) == 346 + # 26 State Pension targets since microcosm#1069 c3; the OBR State Pension + # line became a diagnostic in c4; 14 Pension Credit caseload targets in c7; + # four SPI pension contribution band targets in c8; c9 adds the DWP employer + # and employee contribution totals and the salary-sacrifice amount and drops + # the salary-sacrifice users total; c10 adds two Attendance Allowance and + # three pension-age Housing Benefit caseload targets; the four Table 3.8 + # contribution targets and the DWP employee total leave the fit again (their + # relief-mechanism and gross definitions do not match the engine's columns; + # microcosm#1069 c9 arm). + assert len(resource["targets"]) == 391 providers = resource["hierarchy"]["providers"] categories = resource["hierarchy"]["categories"] @@ -199,10 +209,10 @@ def test_uk_population_targets_shape_order_and_registry_accounting() -> None: target_ids = [target["target_id"] for target in resource["targets"]] registry_scope = resource["registry_parity"]["scope_target_ids"] profile_scope = resource["profile_parity"]["scope_target_ids"] - assert len(registry_scope) == 295 + assert len(registry_scope) == 340 assert len(profile_scope) == 51 - assert target_ids[:295] == registry_scope - assert target_ids[295:] == profile_scope + assert target_ids[:340] == registry_scope + assert target_ids[340:] == profile_scope parity = resource["registry_parity"] assert parity["pinned_ref"] == "12a1e028afeef08d8b2d74ee03fd9de3a78b2dd3" @@ -215,8 +225,8 @@ def test_uk_population_targets_shape_order_and_registry_accounting() -> None: assert set(mapped_target_ids).isdisjoint(unmapped_declarations) assert mapped_target_ids | set(unmapped_declarations) == set(registry_scope) assert all(reason for reason in unmapped_declarations.values()) - assert len(mapped_target_ids) == 194 - assert len(unmapped_declarations) == 101 + assert len(mapped_target_ids) == 192 + assert len(unmapped_declarations) == 148 suppressed_ancestors = parity["suppressed_ancestors"] assert len(suppressed_ancestors) == 5 assert set(suppressed_ancestors).isdisjoint(parity["mapped"]) @@ -335,7 +345,7 @@ def test_uk_population_targets_have_unique_target_ids() -> None: resource = _load() target_ids = [target["target_id"] for target in resource["targets"]] - assert len(target_ids) == 346 + assert len(target_ids) == 391 assert len(target_ids) == len(set(target_ids)) @@ -803,7 +813,7 @@ def test_uc_payment_bands_share_administrative_family_but_keep_source_window() - def test_paid_joint_diagnostics_do_not_add_active_targets() -> None: targets = _load()["targets"] - assert len(targets) == 346 + assert len(targets) == 391 assert not any( f.get("variable") == "uc_calibration_child_entitlement" for target in targets diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_release_input_coverage_manifest.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_release_input_coverage_manifest.py index 3491f7748..029f04514 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_release_input_coverage_manifest.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_release_input_coverage_manifest.py @@ -160,9 +160,13 @@ def test_hmrc_stage_is_required_while_the_208_fact_replay_remains_fenced() -> No "spi_support_channel", "spi_income_band_donors", ] + # The declared allocation's own sentence: a pension-age share is declared + # since microcosm#1069 c6. assert family["required_mass_change_reason"] == ( - "Allocate 50% of certified UK national household prior mass to the " - "rebuilt 2022-23 SPI support channel; total national mass is conserved." + "Allocate 0.5 of certified UK national household prior mass in " + "households without, and 0.2 in households with, a member at or over " + "State Pension age to the rebuilt 2022-23 SPI support channel; total " + "national mass is conserved." ) assert family["input_weight_kind"] == "importance" assert family["output_weight_kind"] == "importance" diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_salary_sacrifice.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_salary_sacrifice.py index 3dc1e4c7c..9747dbee0 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_salary_sacrifice.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_salary_sacrifice.py @@ -159,6 +159,13 @@ def test_conversion_moves_full_pension_zeros_source_and_records_cap( assert result.moved_amount == pytest.approx( person.loc[converted, SALSAC_OUTPUT].sum() ) + # Sacrificed pay leaves employment_income (microcosm#1069 c9); records the + # stage does not convert keep their reported pay. + np.testing.assert_allclose( + person.loc[converted, "employment_income"], + 30_000.0 - person.loc[converted, SALSAC_OUTPUT], + ) + assert (person.loc[~converted, "employment_income"] == 30_000.0).all() evidence = result.evidence()["headcount_receipt"] assert evidence["target"] == SALSAC_STAGE_TARGET assert evidence["converted_rows"] == result.converted_rows diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_source_stages.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_source_stages.py index 5dd10c127..f3da2e590 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_source_stages.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_source_stages.py @@ -66,6 +66,9 @@ UC_COHERENCE_STAGE_NAMES = [ "uc_capital_coherence", ] +PENSION_CREDIT_TAKE_UP_STAGE_NAMES = [ + "pension_credit_take_up", +] E9_STAGE_NAMES = [ "uc_deduction_attributes", ] @@ -91,6 +94,7 @@ *E6_STAGE_NAMES, *UC_REPORTER_REDRAW_STAGE_NAMES, *UC_COHERENCE_STAGE_NAMES, + *PENSION_CREDIT_TAKE_UP_STAGE_NAMES, *E9_STAGE_NAMES, *E8_STAGE_NAMES, ] @@ -159,6 +163,7 @@ def test_e5_and_e6_follow_e7_and_precede_the_uc_rewrites(self) -> None: *E6_STAGE_NAMES, *UC_REPORTER_REDRAW_STAGE_NAMES, *UC_COHERENCE_STAGE_NAMES, + *PENSION_CREDIT_TAKE_UP_STAGE_NAMES, *E9_STAGE_NAMES, ] @@ -230,6 +235,7 @@ def test_country_stage_plan_assembles_spine_plan(self) -> None: "spi_housing_shell": _identity, "uc_reporter_redraw": _identity, "uc_capital_coherence": _identity, + "pension_credit_take_up": _identity, "uc_deduction_attributes": _identity, "cgt_support_split": _identity, "cgt_incidence_clone": _identity, @@ -462,6 +468,7 @@ def test_e8_outputs_and_rewrites_are_backed_by_runtime_constants(self) -> None: assert stages["salary_sacrifice"].outputs == ( SALSAC_OUTPUT, "employee_pension_contributions", + "employment_income", ) assert stages["student_loans"].outputs == ("student_loan_plan",) @@ -615,7 +622,7 @@ def test_e3_operation_kinds_are_declared_in_order(self) -> None: ] assert [op.kind for op in stages["frs_hmrc_spine_leaves"].operations] == [ "retain_adjudicated_frs_hmrc_leaves", - "derive", + "draw_employer_pension_contributions_from_rate_bands", ] assert [op.kind for op in stages["spi_support_channel"].operations] == [ "stack_zero_weight_donors", @@ -625,9 +632,11 @@ def test_e3_operation_kinds_are_declared_in_order(self) -> None: assert [op.kind for op in stages["hmrc_spi_income_spine"].operations] == [ "verify_pinned_hmrc_source_pair", "strict_read_private_table", + "draw_spi_donor_ages_by_population", "fit_weighted_qrf_stage1", "resample_band_donor_leaves", "fit_weighted_qrf_stage2", + "zero_pension_age_reports_below_state_pension_age", "redraw_columns_from_fitted_qrf", "materialize_hmrc_income_bands_fail_closed", "classify_hmrc_income_facts_with_reviewed_fences", @@ -912,10 +921,15 @@ def test_e7_declared_seed_lockstep(self) -> None: stages = {stage.stage: stage for stage in spec.sources.stages} assert stages["spi_support_channel"].operations[0].parameters["seed"] == 42 - assert stages["hmrc_spi_income_spine"].operations[2].parameters["seed"] == 42 + assert stages["hmrc_spi_income_spine"].operations[3].parameters["seed"] == 42 # The reserved carriers' resample draws at stage seed + 2 (PolicyEngine/chronicle#280 lane). - assert stages["hmrc_spi_income_spine"].operations[3].parameters["seed"] == 44 - assert stages["hmrc_spi_income_spine"].operations[4].parameters["seed"] == 43 + assert stages["hmrc_spi_income_spine"].operations[4].parameters["seed"] == 44 + assert stages["hmrc_spi_income_spine"].operations[5].parameters["seed"] == 43 + # The donor age draw and the State Pension age guard take no seed of + # their own: ages draw on the stage-1 seed, the guard is deterministic + # (microcosm#1069). + assert "seed" not in stages["hmrc_spi_income_spine"].operations[2].parameters + assert "seed" not in stages["hmrc_spi_income_spine"].operations[6].parameters assert stages["spi_income_band_donors"].operations[0].parameters["seed"] == 3 assert stages["uc_reporter_redraw"].operations[3].parameters["seed"] == 44 assert stages["uc_capital_coherence"].operations[1].parameters["seed"] == 0 diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_pension_age.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_pension_age.py new file mode 100644 index 000000000..e940dbe94 --- /dev/null +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_pension_age.py @@ -0,0 +1,401 @@ +"""State Pension age coherence of the SPI income stage (microcosm#1069, WP2 c5).""" + +from __future__ import annotations + +import numpy as np +import pandas as pd +import pytest + +from microcosm.build.uk_runtime import spi_income +from microcosm.build.uk_runtime.spi_income import ( + SPIDonorAgeModel, + UKSPIStatePensionAgeGuard, +) + + +def _flat_model(state_pension_age: int = 66) -> SPIDonorAgeModel: + populations = { + (sex, age): 100.0 for sex in ("MALE", "FEMALE") for age in range(0, 91) + } + return SPIDonorAgeModel( + populations=populations, + state_pension_age=state_pension_age, + source="fixture", + ) + + +def test_spi_age_bands_follow_the_published_agerange_edges() -> None: + # Code 6 is "65 to 74" and code 7 "75 and over": a 74-year-old belongs to + # band 6, which the old [65, 74) edge excluded. + assert spi_income._SPI_AGE_RANGES[6] == (65, 75) + assert spi_income._SPI_AGE_RANGES[7][0] == 75 + codes = spi_income._spi_agerange_codes(np.asarray([16.0, 64.9, 65.0, 74.5, 75.0])) + assert codes.tolist() == [1, 5, 6, 6, 7] + + +def test_recipients_in_the_band_straddling_state_pension_age_draw_at_or_above_it() -> ( + None +): + count = 4_000 + rng = np.random.default_rng(3) + codes = np.full(count, 6) + sex = np.asarray(["MALE", "FEMALE"] * (count // 2), dtype=object) + receives = rng.random(count) < 0.8 + fact = np.ones(count) + + ages, receipt = spi_income._draw_spi_donor_ages( + codes, sex, receives, fact, np.random.default_rng(1), model=_flat_model() + ) + + assert ((ages >= 65.0) & (ages < 75.0)).all() + assert (ages[receives] >= 66.0).all() + # A flat population puts one tenth of the band at 65; non-recipients supply + # all of it. + below = ages < 66.0 + assert below.sum() / count == pytest.approx(0.1, abs=0.02) + assert not (below & receives).any() + cells = {(row["agerange"], row["sex"]): row for row in receipt} + assert cells[(6, "MALE")]["ons_below_state_pension_age_share"] == pytest.approx(0.1) + assert cells[(6, "MALE")]["recipients_below_state_pension_age"] == 0 + + +def test_an_infeasible_below_age_share_is_receipted_not_forced() -> None: + codes = np.full(10, 6) + sex = np.asarray(["MALE"] * 10, dtype=object) + receives = np.asarray([True] * 10) + ages, receipt = spi_income._draw_spi_donor_ages( + codes, + sex, + receives, + np.ones(10), + np.random.default_rng(0), + model=_flat_model(), + ) + + assert (ages >= 66.0).all() + (cell,) = receipt + assert cell["non_recipient_below_probability"] == 0.0 + assert cell["unfilled_below_state_pension_age_mass"] == pytest.approx(1.0) + + +def test_single_year_shares_follow_the_population_within_a_band() -> None: + populations = { + (sex, age): (900.0 if age == 80 else 1.0) + for sex in ("MALE", "FEMALE") + for age in range(0, 91) + } + model = SPIDonorAgeModel( + populations=populations, state_pension_age=66, source="fixture" + ) + ages, _ = spi_income._draw_spi_donor_ages( + np.full(2_000, 7), + np.asarray(["FEMALE"] * 2_000, dtype=object), + np.ones(2_000, dtype=bool), + np.ones(2_000), + np.random.default_rng(2), + model=model, + ) + + assert (np.floor(ages) == 80).mean() > 0.9 + + +def test_unknown_sex_draws_on_both_sexes() -> None: + model = _flat_model() + both = model.weights("UNKNOWN", range(65, 70)) + male = model.weights("MALE", range(65, 70)) + np.testing.assert_array_equal(both, 2 * male) + + +def test_age_model_refuses_invalid_keys_and_values() -> None: + with pytest.raises(ValueError, match="invalid population key"): + SPIDonorAgeModel( + populations={("OTHER", 1): 1.0}, state_pension_age=66, source="x" + ) + with pytest.raises(ValueError, match="finite and non-negative"): + SPIDonorAgeModel( + populations={("MALE", 1): -1.0}, state_pension_age=66, source="x" + ) + with pytest.raises(ValueError, match="integer State Pension age"): + SPIDonorAgeModel(populations={}, state_pension_age=0, source="x") + + +def test_zeroing_below_state_pension_age_receipts_what_it_removes() -> None: + person = pd.DataFrame( + { + "age": [65, 66, 40, 70], + "state_pension_reported": [9_000.0, 11_000.0, 500.0, 12_000.0], + "pension_credit_reported": [300.0, 0.0, 0.0, 400.0], + }, + index=[1, 2, 3, 4], + ) + rows = pd.Series([True, True, False, True], index=person.index) + weights = pd.Series([10.0, 20.0, 30.0, 40.0], index=person.index) + + result, receipt = spi_income._zero_below_state_pension_age( + person.copy(), + rows=rows, + columns=("state_pension_reported", "pension_credit_reported"), + state_pension_age=66, + person_weights=weights, + step="fixture", + ) + + assert result["state_pension_reported"].tolist() == [0.0, 11_000.0, 500.0, 12_000.0] + assert result["pension_credit_reported"].tolist() == [0.0, 0.0, 0.0, 400.0] + removed = receipt["removed"]["state_pension_reported"] + assert removed == { + "rows": 1, + "weighted_people": 10.0, + "unweighted_amount": 9_000.0, + "weighted_amount": 90_000.0, + } + assert receipt["rows_below_state_pension_age"] == 1 + + +def test_zeroing_refuses_a_column_absent_from_the_frame() -> None: + person = pd.DataFrame({"age": [65]}) + with pytest.raises(ValueError, match="absent from the frame"): + spi_income._zero_below_state_pension_age( + person, + rows=pd.Series([True]), + columns=("state_pension_reported",), + state_pension_age=66, + person_weights=pd.Series([1.0]), + step="fixture", + ) + + +def test_guard_refuses_duplicate_columns() -> None: + with pytest.raises(ValueError, match="distinct names"): + UKSPIStatePensionAgeGuard( + state_pension_age=66, + spi_channel_columns=("a", "a"), + base_channel_columns=(), + ) + + +def _band_resample_inputs(carrier_age: float): + columns = list(spi_income.SPI_INCOME_QRF_OUTPUT_COLUMNS) + rows = 60 + donor = pd.DataFrame(0.0, index=range(rows), columns=columns) + # Every donor sits in the GBP 200,000 band; the first 30 are aged 40 to + # 44 (code 3), the rest 75 and over (code 7) with State Pension. + donor["employment_income"] = 250_000.0 + donor["total_income"] = 250_000.0 + donor["is_composite"] = False + donor["region"] = "LONDON" + donor["FACT"] = 1.0 + donor["agerange"] = [3] * 30 + [7] * 30 + donor.loc[30:, spi_income.SPI_HMRC_STATE_PENSION_INCOME_COLUMN] = 10_000.0 + person = pd.DataFrame( + { + "person_household_id": [1], + "age": [carrier_age], + spi_income.SPI_INCOME_BAND_CARRIER_COLUMN: [True], + } + ) + for column in columns: + person[column] = 0.0 + household = pd.DataFrame( + { + "household_id": [1], + "region": ["LONDON"], + spi_income.SPI_INCOME_BAND_LOWER_BOUND_COLUMN: [200_000.0], + } + ) + return person, donor, household + + +@pytest.mark.parametrize("seed", range(5)) +def test_band_carriers_draw_from_their_own_age_band_when_the_pool_allows( + seed: int, +) -> None: + person, donor, household = _band_resample_inputs(carrier_age=42.0) + factors = dict.fromkeys(spi_income.SPI_INCOME_QRF_OUTPUT_COLUMNS, 1.0) + + result, receipt = spi_income._resample_band_donor_leaves( + person, + donor, + household=household, + spi_people=pd.Series([True]), + uprating_factors=factors, + lower_bounds=(200_000,), + regional_pool_minimum=5, + seed=seed, + age_pool_minimum=10, + ) + + # The carrier is 42, so it never inherits a 75-and-over record's State + # Pension leaf. + assert result.loc[0, spi_income.SPI_HMRC_STATE_PENSION_INCOME_COLUMN] == 0.0 + assert receipt["bands"][0]["age_matched_carriers"] == 1 + assert receipt["age_pool_minimum"] == 10 + + +def test_band_carriers_fall_back_to_the_band_pool_when_the_age_pool_is_thin() -> None: + person, donor, household = _band_resample_inputs(carrier_age=42.0) + factors = dict.fromkeys(spi_income.SPI_INCOME_QRF_OUTPUT_COLUMNS, 1.0) + + _, receipt = spi_income._resample_band_donor_leaves( + person, + donor, + household=household, + spi_people=pd.Series([True]), + uprating_factors=factors, + lower_bounds=(200_000,), + regional_pool_minimum=5, + seed=0, + age_pool_minimum=31, + ) + + assert receipt["bands"][0]["age_matched_carriers"] == 0 + + +def test_band_resample_without_age_pooling_keeps_the_legacy_pools() -> None: + person, donor, household = _band_resample_inputs(carrier_age=42.0) + factors = dict.fromkeys(spi_income.SPI_INCOME_QRF_OUTPUT_COLUMNS, 1.0) + + _, receipt = spi_income._resample_band_donor_leaves( + person, + donor.drop(columns=["agerange"]), + household=household, + spi_people=pd.Series([True]), + uprating_factors=factors, + lower_bounds=(200_000,), + regional_pool_minimum=5, + seed=0, + ) + + assert receipt["age_pool_minimum"] is None + assert receipt["bands"][0]["age_matched_carriers"] == 0 + + +def test_stage1_queries_sit_at_the_middle_of_the_year_of_age() -> None: + person = pd.DataFrame( + { + "person_household_id": [1, 1, 2], + "age": [65, 66, 74], + "gender": ["MALE", "FEMALE", "MALE"], + } + ) + household = pd.DataFrame({"household_id": [1, 2], "region": ["LONDON", "WALES"]}) + + predictors = spi_income._stage1_query_predictors(person, household) + + assert predictors["age"].tolist() == [65.5, 66.5, 74.5] + assert predictors["region"].tolist() == ["LONDON", "LONDON", "WALES"] + + +def test_whole_year_frame_ages_draw_state_pension_from_their_own_year() -> None: + # Donors carry a fractional age and State Pension from 66.0. A frame + # person aged 66 queried at the whole year sits on the forest's split at + # that birthday; at the middle of the year every 66-year-old draws from + # the donors who have reached State Pension age (microcosm#1069). + from microcosm.frame import WeightKind + + rng = np.random.default_rng(0) + count = 4_000 + ages = rng.integers(60, 75, size=count) + rng.random(count) + donor = pd.DataFrame( + { + "age": ages, + "gender": np.where(rng.random(count) < 0.5, "MALE", "FEMALE"), + "region": "LONDON", + } + ) + targets = pd.DataFrame( + { + spi_income.SPI_HMRC_STATE_PENSION_INCOME_COLUMN: np.where( + ages >= 66.0, 9_000.0 + 1_500.0 * rng.random(count), 0.0 + ), + "employment_income": np.where(ages < 66.0, 25_000.0, 4_000.0) + * rng.random(count), + } + ) + person = pd.DataFrame( + { + "person_household_id": np.ones(900, dtype=int), + "age": np.repeat([65, 66, 67], 300), + "gender": "MALE", + } + ) + household = pd.DataFrame({"household_id": [1], "region": ["LONDON"]}) + encoded_donor, encoded_query = spi_income._encode_predictor_pair( + donor, spi_income._stage1_query_predictors(person, household) + ) + frame = spi_income._person_fit_frame( + predictors=encoded_donor, + targets=targets, + weights=np.ones(count), + weight_kind=WeightKind.DESIGN, + ) + forest = spi_income._qrf_class()(n_estimators=50, seed=42).fit( + frame, + list(encoded_donor.columns), + list(targets.columns), + weights="design", + ) + + draws = forest.predict(encoded_query) + + receives = draws[spi_income.SPI_HMRC_STATE_PENSION_INCOME_COLUMN].to_numpy() > 0.0 + by_age = { + age: receives[person["age"].to_numpy() == age].mean() for age in (65, 66, 67) + } + assert by_age == {65: 0.0, 66: 1.0, 67: 1.0} + + +def _pension_age_band_inputs(carrier_age: float): + person, donor, household = _band_resample_inputs(carrier_age=carrier_age) + # Every donor sits in the 65 to 74 band: the first 30 drawn at 65 without + # State Pension, the rest at 66 to 74 with it. + donor["agerange"] = 6 + donor["age"] = [65.5] * 30 + [70.0] * 30 + donor[spi_income.SPI_HMRC_STATE_PENSION_INCOME_COLUMN] = [0.0] * 30 + [ + 10_000.0 + ] * 30 + return person, donor, household + + +@pytest.mark.parametrize("seed", range(5)) +@pytest.mark.parametrize(("carrier_age", "receives"), [(66.0, True), (65.0, False)]) +def test_band_carriers_draw_donors_on_their_side_of_state_pension_age( + seed: int, carrier_age: float, receives: bool +) -> None: + person, donor, household = _pension_age_band_inputs(carrier_age) + factors = dict.fromkeys(spi_income.SPI_INCOME_QRF_OUTPUT_COLUMNS, 1.0) + + result, receipt = spi_income._resample_band_donor_leaves( + person, + donor, + household=household, + spi_people=pd.Series([True]), + uprating_factors=factors, + lower_bounds=(200_000,), + regional_pool_minimum=5, + seed=seed, + age_pool_minimum=10, + state_pension_age=66, + ) + + drawn = result.loc[0, spi_income.SPI_HMRC_STATE_PENSION_INCOME_COLUMN] + assert bool(drawn > 0.0) is receives + assert receipt["state_pension_age"] == 66 + assert receipt["bands"][0]["state_pension_age_matched_carriers"] == 1 + + +def test_band_resample_refuses_state_pension_age_pooling_without_donor_ages() -> None: + person, donor, household = _band_resample_inputs(carrier_age=66.0) + factors = dict.fromkeys(spi_income.SPI_INCOME_QRF_OUTPUT_COLUMNS, 1.0) + with pytest.raises(ValueError, match="needs the prepared donor's age"): + spi_income._resample_band_donor_leaves( + person, + donor, + household=household, + spi_people=pd.Series([True]), + uprating_factors=factors, + lower_bounds=(200_000,), + regional_pool_minimum=5, + seed=0, + state_pension_age=66, + ) diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_spine.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_spine.py index 8eede42fa..bdadfd4e4 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_spine.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_spine.py @@ -23,10 +23,12 @@ FRS_ONLY_SPI_FILL_PERSON_COLUMNS, SPI_DONOR_REQUIRED_COLUMNS, SPI_INCOME_QRF_OUTPUT_COLUMNS, + SPIDonorAgeModel, impute_uk_spi_income_support, ) from microcosm.build.uk_runtime.spi_spine import ( EMPLOYER_PENSION_CONTRIBUTIONS_COLUMN, + SPI_SPINE_PENSION_AGE_PRIOR_MASS_SHARE, UKFRSHMRCSpineLeavesStageTransform, UKSPIIncomeSpineStageTransform, UKSPISupportChannelStageTransform, @@ -114,10 +116,18 @@ def _leaves_stage( "var2": [0, 0, 0], } ) + # Person 1001 (sernum 1) is in a public-sector occupational scheme; person + # 2001 (sernum 2) has only a personal pension, no employer scheme. + penprov = pd.DataFrame({"sernum": [1, 2], "person": [1, 1], "stemppen": [2, 5]}) + job = pd.DataFrame({"sernum": [1, 2], "person": [1, 1], "jobsect": [2, 1]}) adult_path = tmp_path / "adult.tab" benefits_path = tmp_path / "benefits.tab" + penprov_path = tmp_path / "penprov.tab" + job_path = tmp_path / "job.tab" adult.to_csv(adult_path, sep="\t", index=False) benefits.to_csv(benefits_path, sep="\t", index=False) + penprov.to_csv(penprov_path, sep="\t", index=False) + job.to_csv(job_path, sep="\t", index=False) def artifact(path: Path, table: str) -> dict[str, object]: import hashlib @@ -142,11 +152,13 @@ def artifact(path: Path, table: str) -> dict[str, object]: "artifacts": [ artifact(adult_path, "adult"), artifact(benefits_path, "benefits"), + artifact(penprov_path, "penprov"), + artifact(job_path, "job"), ], "operations": [ {"kind": "retain_adjudicated_frs_hmrc_leaves"}, { - "kind": "derive", + "kind": "draw_employer_pension_contributions_from_rate_bands", "output": EMPLOYER_PENSION_CONTRIBUTIONS_COLUMN, }, ], @@ -178,7 +190,14 @@ def test_spine_leaves_align_by_raw_person_id_not_position(tmp_path: Path) -> Non assert person["hmrc_spi_incapacity_benefit_income"].tolist() == pytest.approx( [2.0 * 365.25 / 7.0, 0.0] ) - assert person[EMPLOYER_PENSION_CONTRIBUTIONS_COLUMN].tolist() == [9.0, 6.0] + # Employer contributions come from an ASHE rate draw on pay (microcosm#1069 + # c9): person 2001 has no employer scheme; person 1001's public-sector + # occupational scheme pays between 0% and 30% of their 10 of pay. + employer = person[EMPLOYER_PENSION_CONTRIBUTIONS_COLUMN].tolist() + assert employer[0] == 0.0 + assert 0.0 <= employer[1] <= 3.0 + evidence = transform.last_result.evidence()["employer_pension_contributions"] + assert evidence["members_with_earnings"] == 1 def test_spine_leaves_fail_closed_on_unknown_raw_person(tmp_path: Path) -> None: @@ -544,9 +563,25 @@ def uprating_factors(year): ) monkeypatch.setattr(spi_income, "_spi_income_uprating_factors", uprating_factors) + # State Pension age is an engine read; the engine lane covers the real + # model (tests/engine/uk/test_uk_spi_state_pension_age.py). + monkeypatch.setattr( + spi_spine, + "load_spi_donor_age_model", + lambda _build_period: SPIDonorAgeModel( + populations={ + (sex, age): 1.0 for sex in ("MALE", "FEMALE") for age in range(0, 91) + }, + state_pension_age=66, + source="engine-free fixture", + ), + ) support_frame = UKSPISupportChannelStageTransform( stage=_committed_stage("spi_support_channel"), sample_fraction=0.0002, + # The pension-age allocation stratum (microcosm#1069 c6) reads State + # Pension age from the engine unless the test passes it. + state_pension_age=66, )(_base_frame(time_period=HMRC_SPI_BUILD_PERIOD)) income_stage = _with_mutated_operation( _committed_stage("hmrc_spi_income_spine"), @@ -686,13 +721,48 @@ def test_income_stage_parameters_refuse_stage2_output_drift() -> None: def test_support_stage_parameters_accept_the_committed_manifest() -> None: - count, share, strata, declarations = _support_stage_parameters( + count, share, strata, declarations, pension_age_share = _support_stage_parameters( _committed_stage("spi_support_channel"), seed=42 ) assert count == 10000 assert share == 0.5 assert strata == ("region",) assert len(declarations) == 1 + assert pension_age_share == SPI_SPINE_PENSION_AGE_PRIOR_MASS_SHARE + + +@pytest.mark.parametrize( + ("changes", "message"), + [ + ({"pension_age_share": 0.31}, "pension-age prior-mass share drifted"), + ( + {"pension_age_stratum": "household_head_at_state_pension_age"}, + "stratum must", + ), + ( + {"pension_age_share": None}, + "pension-age stratum declared without a share", + ), + ], +) +def test_support_stage_parameters_refuse_pension_age_drift( + changes: dict, message: str +) -> None: + committed = _committed_stage("spi_support_channel") + operations = [] + for operation in committed.operations: + payload = {"kind": operation.kind, **dict(operation.parameters)} + if operation.kind == "allocate_zero_weight_prior_mass": + payload.update(changes) + payload = { + key: value for key, value in payload.items() if value is not None + } + operations.append(payload) + stage = SourceStageSpec.from_mapping( + {**committed.__dict__, "operations": operations} + ) + with pytest.raises(ValueError, match=message): + _support_stage_parameters(stage, seed=42) def test_support_transform_refuses_missing_builder_weight_kind(monkeypatch) -> None: @@ -713,7 +783,7 @@ def _stub_builder(*_args, **_kwargs) -> UKSPISupportResult: _stub_builder, ) transform = UKSPISupportChannelStageTransform( - stage=_committed_stage("spi_support_channel") + stage=_committed_stage("spi_support_channel"), state_pension_age=66 ) with pytest.raises(ValueError, match="importance household weights"): @@ -734,3 +804,30 @@ def test_support_stage_parameters_refuse_gate_declaration_drift() -> None: ) with pytest.raises(ValueError, match="gate declaration drifted"): _support_stage_parameters(stage, seed=42) + + +def test_readers_of_the_support_record_take_the_declared_allocation_reason() -> None: + """microcosm#1069 c6: the stratified sentence, not the 50% constant.""" + + from microcosm.build.country_spec import load_country_spec + from microcosm.build.uk_runtime.release_input_coverage import ( + load_uk_release_input_coverage_manifest, + ) + from microcosm.build.uk_runtime.spi_spine import ( + uk_spi_support_mass_change_reason, + ) + from microcosm.build.uk_runtime.spi_support import ( + SPI_PRIOR_MASS_CHANGE_REASON, + _spi_prior_mass_change_reason, + ) + + stage = load_country_spec("uk").sources.stage_map()["spi_support_channel"] + reason = uk_spi_support_mass_change_reason(stage) + + # The record the support stage writes for the declared shares. + assert reason == _spi_prior_mass_change_reason(0.5, pension_age_share=0.2) + assert reason != SPI_PRIOR_MASS_CHANGE_REASON + # The release-cut coverage gate requires that record on the final dataset. + manifest = load_uk_release_input_coverage_manifest() + family = manifest.family_coverage["hmrc_spi_income"] + assert family["required_mass_change_reason"] == reason diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_support.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_support.py index 229259797..6af30dfa7 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_support.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_support.py @@ -677,3 +677,119 @@ def test_spi_fill_rejects_missing_source_ids() -> None: entity="person", columns=["employment_income"], ) + + +def _pension_age_frames(): + household = pd.DataFrame( + { + "household_id": [1, 2, 3, 4], + "household_weight": [10.0, 30.0, 20.0, 40.0], + "region": ["LONDON"] * 4, + } + ) + person = pd.DataFrame( + { + "person_id": [1001, 2001, 3001, 3002, 4001], + "person_household_id": [1, 2, 3, 3, 4], + "person_benunit_id": [101, 201, 301, 301, 401], + "age": [70, 40, 66, 30, 65], + "employment_income": [0.0] * 5, + } + ) + benunit = pd.DataFrame({"benunit_id": [101, 201, 301, 401]}) + return person, benunit, household + + +def test_build_spi_support_channel_gives_pension_age_households_their_own_share() -> ( + None +): + person, benunit, household = _pension_age_frames() + + result = build_uk_spi_support_channel( + person=person, + benunit=benunit, + household=household, + spi_household_count=4, + seed=42, + source_year=2023, + strata_columns=("region",), + pension_age_share=0.2, + state_pension_age=66, + ) + + # Households 1 and 3 have a member at or over 66 (30 of the 100 prior + # mass): the SPI channel takes 20% of it and 50% of the other 70. + channel = support_channel_column("household") + table = result.household.set_index(["source_household_id", channel])[ + "household_weight" + ] + spi, base = SPI_SYNTHETIC_SUPPORT_CHANNEL, BASE_FRS_SUPPORT_CHANNEL + assert table[(1, base)] == pytest.approx(8.0) + assert table[(3, base)] == pytest.approx(16.0) + assert table[(1, spi)] + table[(3, spi)] == pytest.approx(6.0) + assert table[(2, base)] == pytest.approx(15.0) + assert table[(4, base)] == pytest.approx(20.0) + assert table[(2, spi)] + table[(4, spi)] == pytest.approx(35.0) + assert result.household["household_weight"].sum() == 100.0 + assert spi_support.SPI_PENSION_AGE_STRATUM_COLUMN not in result.household + assert result.pension_age_spi_prior_mass_share == 0.2 + assert result.state_pension_age == 66 + assert result.pension_age_allocation == { + "pension_age_households": 2, + "pension_age_spi_households": 2, + "pension_age_prior_mass": 30.0, + "pension_age_spi_mass": pytest.approx(6.0), + "other_prior_mass": 70.0, + "other_spi_mass": pytest.approx(35.0), + } + assert "0.2 in households with" in result.mass_log[-1].reason + + +def test_build_spi_support_channel_without_a_pension_age_share_is_unchanged() -> None: + person, benunit, household = _pension_age_frames() + + result = build_uk_spi_support_channel( + person=person, + benunit=benunit, + household=household, + spi_household_count=4, + seed=42, + source_year=2023, + strata_columns=("region",), + ) + + assert result.pension_age_spi_prior_mass_share is None + assert result.pension_age_allocation is None + assert result.mass_log[-1].reason == SPI_PRIOR_MASS_CHANGE_REASON + + +@pytest.mark.parametrize( + ("kwargs", "message"), + [ + ({"pension_age_share": 1.0, "state_pension_age": 66}, "finite and in"), + ({"pension_age_share": 0.2}, "positive integer state_pension_age"), + ( + { + "pension_age_share": 0.2, + "state_pension_age": 66, + "strata_columns": ("region", "household_has_state_pension_age_member"), + }, + "derived by the allocation", + ), + ], +) +def test_build_spi_support_channel_refuses_invalid_pension_age_arguments( + kwargs: dict, message: str +) -> None: + person, benunit, household = _pension_age_frames() + arguments = {"strata_columns": ("region",), **kwargs} + with pytest.raises(ValueError, match=message): + build_uk_spi_support_channel( + person=person, + benunit=benunit, + household=household, + spi_household_count=4, + seed=42, + source_year=2023, + **arguments, + ) diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_spine_acceptance_receipt.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_spine_acceptance_receipt.py index f68595818..8b01ce745 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_spine_acceptance_receipt.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_spine_acceptance_receipt.py @@ -107,6 +107,10 @@ def _apply_pending_roster_transformations( # household draws, so they run right after was_wealth. assert "was_lisa" not in roster roster.insert(roster.index("was_wealth") + 1, "was_lisa") + # microcosm#1069 re-mint pending: the Pension Credit take-up redraw reads + # the post-SPI incomes, so it runs right after UC capital coherence. + assert "pension_credit_take_up" not in roster + roster.insert(roster.index("uc_capital_coherence") + 1, "pension_credit_take_up") return tuple(roster) diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_stage_health.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_stage_health.py index 45d20b764..d779c64de 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_stage_health.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_stage_health.py @@ -1425,3 +1425,86 @@ def test_spi_income_band_donor_support_gate_checks_every_reserved_band() -> None assert not result.passed and "differ from the published" in " ".join( result.failures ) + + +def test_spi_support_channel_checks_the_declared_pension_age_share() -> None: + evidence = { + "stage": "spi_support_channel", + "spi_prior_mass_share": 0.5, + "pension_age_spi_prior_mass_share": 0.25, + "household_weight_kind": "importance", + "spi_households": 10, + } + parameters = { + "stage": "spi_support_channel", + "check": "spi_support_channel", + "spi_prior_mass_share": 0.5, + "pension_age_spi_prior_mass_share": 0.25, + "absolute_tolerance": 0.0, + "household_weight_kind": "importance", + "minimum_spi_households": 10, + } + + def gate(evidence, parameters): + return uk_stage_health_gate( + evidence=evidence, + stage="spi_support_channel", + check="spi_support_channel", + parameters=parameters, + ) + + passed = gate(evidence, parameters) + assert _passed(passed) + assert passed.details["pension_age_spi_prior_mass_share"] == 0.25 + drifted = gate(evidence, {**parameters, "pension_age_spi_prior_mass_share": 0.5}) + assert not drifted.passed + assert "pension_age_spi_prior_mass_share 0.25 != declared 0.5" in str( + drifted.failures + ) + missing = gate( + {k: v for k, v in evidence.items() if k != "pension_age_spi_prior_mass_share"}, + parameters, + ) + assert not missing.passed + + +def test_pension_credit_take_up_checks_each_band_against_its_rate() -> None: + def band(name, rate, realized, *, exceed=False, units=10): + return { + "band": name, + "rate": rate, + "realized_take_up": realized, + "reporters_exceed_rate": exceed, + "entitled_units": units, + } + + parameters = { + "stage": "pension_credit_take_up", + "check": "pension_credit_take_up", + "maximum_take_up_deviation": 0.05, + "minimum_entitled_units": 1, + } + + def gate(*bands): + return uk_stage_health_gate( + evidence={"stage": "pension_credit_take_up", "bands": list(bands)}, + stage="pension_credit_take_up", + check="pension_credit_take_up", + parameters=parameters, + ) + + assert _passed( + gate( + band("guarantee_credit", 0.69, 0.70), + band("savings_credit_only", 0.37, 0.36), + ) + ) + assert not gate(band("guarantee_credit", 0.69, 0.60)).passed + assert _passed(gate(band("guarantee_credit", 0.69, 0.80, exceed=True))) + assert not gate(band("guarantee_credit", 0.69, 0.50, exceed=True)).passed + assert not gate(band("guarantee_credit", 0.69, None, units=0)).passed + assert not gate().passed + # The realised rates are population facts: a synthetic smoke fixture records + # the failure without blocking, every other posture blocks on it. + committed = _gate_parameters("uk_stage_pension_credit_take_up") + assert committed["check"] == "pension_credit_take_up" diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_state_pension_targets.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_state_pension_targets.py new file mode 100644 index 000000000..6792e7e40 --- /dev/null +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_state_pension_targets.py @@ -0,0 +1,327 @@ +"""The State Pension target rows (microcosm#1069 c3).""" + +from __future__ import annotations + +import hashlib +import json +import os +import re +from pathlib import Path + +import pytest + +from microcosm.build.country_spec import load_country_spec +from microcosm.build.ledger_targets import compile_ledger_target_references +from microcosm.build.uk_runtime.chronicle_feed import load_uk_chronicle_feed +from microcosm.build.uk_runtime.local_targets import load_uk_population_contract +from test_support.paths import paths_for + +_TEST_PATHS = paths_for("microcosm-build") +AGE_CELL = re.compile(r"^dwp\.state_pension\.recipients_(male|female)_\d+_(\d+|plus)_") +STABLE_UK_FACT_FEED_NAME = ".codex-work/consumer_facts_uk.jsonl" +PUBLISHER_TYPE_TO_ENGINE = { + "New State Pension": "NEW", + "Pre-2016 State Pension": "BASIC", +} +GB_REGIONS = { + "NORTH_EAST", + "NORTH_WEST", + "YORKSHIRE", + "EAST_MIDLANDS", + "WEST_MIDLANDS", + "EAST_OF_ENGLAND", + "LONDON", + "SOUTH_EAST", + "SOUTH_WEST", + "WALES", + "SCOTLAND", +} + + +def _pension_targets() -> list[dict]: + return [ + target + for target in load_uk_population_contract()["targets"] + if target["family"] == "dwp_state_pension" + ] + + +def _pension_references() -> list: + return [ + reference + for reference in load_country_spec("uk").target_references + if reference.family == "dwp_state_pension" + ] + + +def _filter(binding: dict, variable: str, operator: str = "==") -> list: + return [ + predicate.get("value", predicate.get("equals")) + for predicate in binding.get("filters", ()) + if predicate["variable"] == variable + and predicate.get("operator", "==") == operator + ] + + +def test_the_state_pension_family_is_26_targets_and_59_references() -> None: + targets = _pension_targets() + references = _pension_references() + + assert len(targets) == 26 + # The empty new State Pension £40-£60 band is signed out (no frame support). + assert len(references) == 59 + assert {target["category_id"] for target in targets} == { + "dwp.state_pension", + "dfc_ni.state_pension", + } + assert all(target["period_match_policy"] == "source_window" for target in targets) + + +def test_every_row_binds_the_population_its_selector_names() -> None: + for target in _pension_targets(): + binding = target["bindings"]["policyengine"] + selector = target["ledger_selector"] + cells = selector.get("dimension_values", {}) + conditions = binding["household_conditions"] + assert len(conditions) == 1, target["target_id"] + (condition,) = conditions + assert condition["map_to"] == "person" + if target["target_id"].startswith("dfc_ni."): + assert condition["value"] == "NORTHERN_IRELAND" + elif target["target_id"].endswith("_by_english_region"): + assert (condition["variable"], condition["value"]) == ( + "country", + "ENGLAND", + ) + elif target["target_id"].endswith(("_scotland", "_wales")): + assert condition["value"] == target["target_id"].rsplit("_", 1)[1].upper() + else: + assert set(condition["value"]) == GB_REGIONS + if binding.get("value_variable") == "person_count": + assert _filter(binding, "state_pension", ">") == [0] + publisher_type = cells.get("category_of_pension") + if publisher_type not in (None, "all"): + assert _filter(binding, "state_pension_type") == [ + PUBLISHER_TYPE_TO_ENGINE[publisher_type] + ], target["target_id"] + ages = cells.get("age_bands_and_single_year") + if ages not in (None, "all"): + low = _filter(binding, "age", ">=") + high = _filter(binding, "age", "<=") + if ages == "90 and over": + assert (low, high) == ([90], []) + else: + assert (low, high) == ([min(ages)], [max(ages)]) + assert [ + operand["dimension_values"]["age_bands_and_single_year"] + for operand in target["value_operands"] + ] == list(ages) + + +def test_the_amounts_multiply_recipients_by_the_weekly_mean_at_2025_rates() -> None: + amounts = [ + target + for target in _pension_targets() + if target["target_id"].endswith(".amount") + ] + + assert [target["target_id"] for target in amounts] == [ + "dwp.state_pension.amount", + "dfc_ni.state_pension.amount", + ] + for target in amounts: + assert target["value_operation"] == "monthly_window_count_x_mean" + assert target["value_operands"][1]["period_factor"] == 52 + assert target["uprating_index"] == ( + "policyengine_uk_parameter:gov.dwp.state_pension.new_state_pension.amount" + ) + assert target["bindings"]["policyengine"]["value_variable"] == "state_pension" + + +def test_the_amount_bands_keep_the_points_paid_at_the_2025_26_rate() -> None: + bands = [ + target + for target in _pension_targets() + if target["target_id"].endswith("_by_weekly_amount") + ] + + assert len(bands) == 2 + for target in bands: + binding = target["bindings"]["policyengine"] + assert target["measurement"]["source_months"] == [ + "2025-05", + "2025-08", + "2025-11", + ] + assert binding["groupby_variable"] == "state_pension" + assert binding["band_period_factor"] == 52 + # The detail measure leaves out the publisher's 'all' margin row. + assert target["ledger_selector"]["source_measure_id"] == "recipients" + rows = [ + reference.name + for reference in _pension_references() + if "_by_weekly_amount." in reference.name + ] + assert len(rows) == 19 + assert not any("grouped_amount_of_benefit_all" in name for name in rows) + assert not any("40_00_to_under_60_00__new_state_pension" in name for name in rows) + + +def _state_pension_facts() -> list[dict]: + """The pinned feed's State Pension facts, or skip (the artifact is untracked).""" + + root = _TEST_PATHS.repository + configured = os.environ.get("CHRONICLE_UK_FACTS") + feed = Path(configured) if configured else root / STABLE_UK_FACT_FEED_NAME + if feed.is_dir(): + feed = feed / "consumer_facts.jsonl" + if not feed.is_file(): + pytest.skip("pinned UK Chronicle consumer feed is not present") + assert hashlib.sha256(feed.read_bytes()).hexdigest() == ( + load_uk_chronicle_feed().facts_sha256 + ) + with feed.open(encoding="utf-8") as handle: + return [ + json.loads(line) + for line in handle + if "state-pension" in line or "state_pension" in line + ] + + +def test_the_shape_rows_reconcile_with_the_great_britain_level() -> None: + """Feed-gated: every shape partitions the resident caseload it describes.""" + + references = [ + reference + for reference in _pension_references() + if not reference.name.endswith(".amount") + and "_by_weekly_amount." not in reference.name + ] + compiled = compile_ledger_target_references( + _state_pension_facts(), references, country="uk" + ) + values = {spec.name: spec.value for spec in compiled.specs} + total = values["dwp.state_pension.recipients"] + ages = sum(value for name, value in values.items() if AGE_CELL.match(name)) + areas = sum( + value + for name, value in values.items() + if "_by_english_region@" in name or name.endswith(("_scotland", "_wales")) + ) + + # DWP's unknown ages (740) and the near-empty type cells left unbound are + # the only difference. + assert ages == pytest.approx(total, abs=1_000) + assert areas == pytest.approx(total, abs=1_000) + assert values["dfc_ni.state_pension.recipients"] == pytest.approx(330_147.5) + + +STATE_PENSION_DIAGNOSTICS = { + "obr.state_pension": "dwp.state_pension.amount", + "dwp.state_pension.forecast_expenditure": "dwp.state_pension.amount", + "dwp.state_pension.forecast_expenditure_paid_abroad": "dwp.state_pension.amount", + "dwp.state_pension.forecast_caseload": "dwp.state_pension.recipients", + "dwp.state_pension.forecast_caseload_paid_abroad": "dwp.state_pension.recipients", +} + + +def test_the_obr_line_is_a_diagnostic_beside_the_resident_level() -> None: + from microcosm.build.uk_runtime.ledger_targets import ( + UK_REQUIRED_TARGET_DIAGNOSTICS, + ) + + contract = load_uk_population_contract() + diagnostics = contract["diagnostic_references"] + assert "obr.state_pension" not in {t["target_id"] for t in contract["targets"]} + parity = contract["registry_parity"] + assert "obr/state_pension" in parity["excluded"] + assert "obr/state_pension" not in parity["mapped"] + assert { + name: diagnostics[name]["attach_to_target"] + for name in STATE_PENSION_DIAGNOSTICS + } == STATE_PENSION_DIAGNOSTICS + # Closed world: every declared diagnostic is required by the target it + # attaches to, and every requirement is declared. + required = { + name: target + for target, names in UK_REQUIRED_TARGET_DIAGNOSTICS.items() + for name in names + } + assert { + name: declaration["attach_to_target"] + for name, declaration in diagnostics.items() + } == required + + +def test_the_state_pension_diagnostics_carry_the_published_forecasts() -> None: + """Feed-gated: each diagnostic resolves its exact FY2025-26 fact.""" + + from microcosm.build.uk_runtime.ledger_targets import ( + _attached_diagnostic_metadata, + ) + + root = _TEST_PATHS.repository + configured = os.environ.get("CHRONICLE_UK_FACTS") + feed = Path(configured) if configured else root / STABLE_UK_FACT_FEED_NAME + if feed.is_dir(): + feed = feed / "consumer_facts.jsonl" + if not feed.is_file(): + pytest.skip("pinned UK Chronicle consumer feed is not present") + with feed.open(encoding="utf-8") as handle: + facts = tuple( + json.loads(line) + for line in handle + if '"obr.state_pension"' in line or "benefit-expenditure-caseload" in line + ) + + amount = _attached_diagnostic_metadata(facts, "dwp.state_pension.amount") + recipients = _attached_diagnostic_metadata(facts, "dwp.state_pension.recipients") + + assert amount["obr_state_pension_diagnostic_role"] == "diagnostic_only_not_in_fit" + assert float(amount["obr_state_pension_diagnostic_value_gbp"]) == pytest.approx( + 146_185_954_351.574 + ) + assert float(amount["dwp_forecast_state_pension_diagnostic_value_gbp"]) == ( + pytest.approx(146_071_196_250.359) + ) + assert float( + amount["dwp_forecast_state_pension_paid_abroad_diagnostic_value_gbp"] + ) == pytest.approx(5_629_144_317.972) + assert ( + float(recipients["dwp_forecast_state_pension_caseload_diagnostic_value_count"]) + == 13_204_000 + ) + assert ( + float( + recipients[ + "dwp_forecast_state_pension_caseload_paid_abroad_diagnostic_value_count" + ] + ) + == 1_088_000 + ) + assert { + value + for key, value in {**amount, **recipients}.items() + if key.endswith("_status") + } == {"available"} + + +def test_a_missing_state_pension_diagnostic_refuses_the_resident_level( + tmp_path, monkeypatch +) -> None: + from microcosm.build.uk_runtime import ledger_targets + + contract = load_uk_population_contract() + del contract["diagnostic_references"]["obr.state_pension"] + (tmp_path / "uk_population_targets.json").write_text(json.dumps(contract)) + original_files = ledger_targets.importlib_resources.files + monkeypatch.setattr( + ledger_targets.importlib_resources, + "files", + lambda package: ( + tmp_path if package == "microcosm.build.uk" else original_files(package) + ), + ) + + with pytest.raises(ValueError, match="'obr.state_pension': missing"): + ledger_targets._attached_diagnostic_metadata((), "dwp.state_pension.amount") diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_take_up_contract.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_take_up_contract.py index 55797b0fc..a1e8c2ba9 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_take_up_contract.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_take_up_contract.py @@ -16,6 +16,8 @@ def test_uk_contract_loads_and_selects_build_year_rates() -> None: "child_benefit", "child_benefit_opts_out_rate", "pension_credit", + "pension_credit_guarantee_credit", + "pension_credit_savings_credit_only", "universal_credit", "marriage_allowance", "tax_free_childcare", @@ -31,6 +33,8 @@ def test_uk_contract_loads_and_selects_build_year_rates() -> None: 0.89, 0.23, 0.7, + 0.69, + 0.37, 0.55, 0.5, 0.88, @@ -109,7 +113,10 @@ def test_rate_without_source_is_refused(monkeypatch) -> None: def test_frozen_and_fitted_status_blocks_are_required(monkeypatch) -> None: raw = _resource() mutated = copy.deepcopy(raw) - del mutated["programs"][3]["source"]["freeze"] + universal_credit = next( + entry for entry in mutated["programs"] if entry["key"] == "universal_credit" + ) + del universal_credit["source"]["freeze"] _reload_with(monkeypatch, mutated) with pytest.raises(ValueError, match="freeze block"): load_uk_take_up_contract() diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_target_references.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_target_references.py index 021bc9e11..9a0fbfaad 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_target_references.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_target_references.py @@ -64,7 +64,7 @@ _TEST_PATHS = paths_for("microcosm-build") -ACTIVE_REFERENCE_COUNT = 1152 +ACTIVE_REFERENCE_COUNT = 1230 REGION_TIER_LEVEL = {code: level for level, code in UK_REGION_TIER} UK_DATA_REPO = "policyengine-" + "uk-data" @@ -229,6 +229,7 @@ def test_uk_target_references_follow_contract_derivation_rules() -> None: "calendar_year_window", "linear_combination", "monthly_window_average", + "monthly_window_count_x_mean", "monthly_window_sum_average", "scaled_by_ratio", ] @@ -749,9 +750,9 @@ def test_uk_target_reference_membership_report_is_packaged() -> None: assert membership["target_period"] == 2025 assert membership["active_reference_count"] == ACTIVE_REFERENCE_COUNT assert membership["status_counts"] == { - "active": 1152, + "active": 1230, "no_fact_at_or_before_period": 7, - "signed_excluded": 15, + "signed_excluded": 16, } assert membership["genuine_sum_residue"] assert membership["uprating_holds"] @@ -859,6 +860,21 @@ def test_uk_target_reference_membership_report_is_packaged() -> None: "the same publication." ), }, + { + "family": "dwp_state_pension", + "status": "active_english_region_and_amount_band_fanout", + # 18 English-region cells and 19 weekly amount bands: the empty new + # State Pension £40-£60 band is signed out (microcosm#1069). + "active_reference_count": 37, + "signed_rationale": ( + "The State Pension recipients by type fan out over the nine " + "English regions (Scotland and Wales are their own rows, since " + "DWP publishes no Northern Ireland cell for a twelve-area tier) " + "and over DWP's weekly amount bands, whose 'all' margin is a " + "total row the detail measure pin leaves out; the empty new " + "State Pension £40-£60 band is signed out (microcosm#1069)." + ), + }, ] rationales = membership["signed_exclusion_rationales"] cgt_rows = [entry for entry in rationales if entry["family"] == "hmrc_cgt"] @@ -881,7 +897,22 @@ def test_uk_target_reference_membership_report_is_packaged() -> None: ("hmrc.cgt.taxpayers_by_gain_band", "hmrc/cgt_taxpayers_band_0"), ] assert all(entry["status"] == "signed_excluded" for entry in cgt_rows) - assert [entry for entry in rationales if entry["family"] != "hmrc_cgt"] == [ + pension_rows = [ + entry for entry in rationales if entry["family"] == "dwp_state_pension" + ] + assert [(entry["target_id"], entry["row"]) for entry in pension_rows] == [ + ( + "dwp.state_pension.recipients_new_by_weekly_amount", + "dwp.state_pension.recipients_new_by_weekly_amount." + "40_00_to_under_60_00__new_state_pension", + ) + ] + assert "no record on the frame" in pension_rows[0]["signed_rationale"] + assert [ + entry + for entry in rationales + if entry["family"] not in {"hmrc_cgt", "dwp_state_pension"} + ] == [ { "family": "hmrc_spi", "target_id": "hmrc.spi.property_income.amount_by_total_income_band", @@ -1489,7 +1520,7 @@ def test_two_level_targets_fan_out_over_the_region_tier() -> None: for target in contract["targets"] if sorted(target.get("geography_levels") or ()) == ["country", "region"] ] - assert len(two_level) == 50 + assert len(two_level) == 52 ons = [target_id for target_id in two_level if target_id.startswith("ons.")] mhclg = [target_id for target_id in two_level if target_id.startswith("mhclg.")] hmrc = [target_id for target_id in two_level if target_id.startswith("hmrc.cgt.")] @@ -1566,8 +1597,9 @@ def test_two_level_targets_fan_out_over_the_region_tier() -> None: candidates = membership["targets"][target_id]["candidates"] assert [entry["geography_id"] for entry in candidates] == cells assert {entry["status"] for entry in candidates} == {"active"} - # 108 ONS + 81 MHCLG + 24 CGT + 360 SPI Table 3.11 region-tier rows. - assert sum(len(by_contract[target_id]) for target_id in two_level) == 573 + # 108 ONS + 81 MHCLG + 24 CGT + 360 SPI Table 3.11 region-tier rows, and + # 18 English-region State Pension cells (microcosm#1069). + assert sum(len(by_contract[target_id]) for target_id in two_level) == 591 # The twelve ONS cells of a band sum to the retired UK row of the same # publication (the 0-9 band: 7,553,013 at mid-2024). zero_to_nine = membership["targets"]["ons.population.age_0_9_by_region"] diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_terminal_gates.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_terminal_gates.py index 0a6dad118..fcaf03d39 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_terminal_gates.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_terminal_gates.py @@ -394,18 +394,12 @@ def test_committed_target_fit_register_retains_only_live_deferrals() -> None: # calibration-competition residuals are deferred for four weeks. The SE # 12,570-15,000 income-tax deferral is retired in turn (microcosm#1012): # with the SPI households' housing imputed from their own incomes the row - # fits at +24.5 %, back inside the bound. - assert set(register) == { - "hmrc/state_pension_income_band_50_000_to_70_000@2025", - } - for name in sorted(register): - record = register[name] - assert record.approved_by == "juaristi22" - assert record.adjudication.startswith( - "PolicyEngine/microcosm#1006 (issue comment 5812206367" - ) - assert record.approved_on == "2026-09-23" - assert record.expires_on == "2026-10-21" + # fits at +24.5 %, back inside the bound. The state-pension 50-70k + # deferral (ruling D6) is retired in turn (microcosm#1069): with the SPI + # channel's State Pension at 66 repaired the row fits at +23.0 % to +24.0 % + # across the c5-fix and c6 arms, back inside the bound. The register is + # empty. + assert set(register) == set() # Aggregate errors from the fresh UC #882 development run: 1,500 epochs with diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_uc_capital_coherence.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_uc_capital_coherence.py index b045957c8..30e375c3e 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_uc_capital_coherence.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_uc_capital_coherence.py @@ -55,7 +55,14 @@ def test_stage_orders_after_every_universal_credit_report_writer() -> None: assert reporter_writers assert all(index < coherence_index for index, _ in reporter_writers) - assert stages[coherence_index + 1].stage == "uc_deduction_attributes" + # The Pension Credit take-up redraw sits between the coherence stage and the + # deduction attributes (microcosm#1069 c7); it writes no UC report. + assert [ + stage.stage for stage in stages[coherence_index + 1 : coherence_index + 3] + ] == [ + "pension_credit_take_up", + "uc_deduction_attributes", + ] def test_or_refresh_truth_table_and_same_capital_source() -> None: diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_uc_source_periods.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_uc_source_periods.py index 94e4cdefd..92f780019 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_uc_source_periods.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_uc_source_periods.py @@ -514,8 +514,8 @@ def test_shipped_uc_monthly_references_preserve_each_declared_window(): assert new_paid <= {reference.name for reference in monthly} assert set(element_windows) <= {reference.name for reference in monthly} # The #882 Housing Benefit caseload rows bind the Stat-Xplore client-type - # by tenure cube on the same calendar-2025 window; no other family - # declares source months. + # by tenure cube on the same calendar-2025 window, and since microcosm#1069 + # c10 so do its pension-age rows. housing_benefit = [ reference for reference in references @@ -523,6 +523,9 @@ def test_shipped_uc_monthly_references_preserve_each_declared_window(): ] assert sorted(reference.name for reference in housing_benefit) == [ "dwp.hb.households", + "dwp.hb.households_pension_age", + "dwp.hb.households_pension_age_private_rented", + "dwp.hb.households_pension_age_social_rented", "dwp.hb.households_private_rented", "dwp.hb.households_social_rented", ] @@ -551,9 +554,59 @@ def test_shipped_uc_monthly_references_preserve_each_declared_window(): assert reference.value_operation == "monthly_window_sum_average" assert reference.period_match_policy == "source_window" assert json.loads(reference.metadata[EXPECTED_SOURCE_MONTHS]) == esa_quarters + # The State Pension rows bind the four quarterly points inside calendar + # 2025; the amount bands keep the three DWP pays at the 2025-26 rate the + # engine pays (microcosm#1069 R1). + pension = [ + reference for reference in references if reference.family == "dwp_state_pension" + ] + assert len(pension) == 59 + for reference in pension: + months = json.loads(reference.metadata[EXPECTED_SOURCE_MONTHS]) + assert months == reference.ledger_selector["period_value"] + assert reference.period_match_policy == "source_window" + assert months == ( + esa_quarters[1:] if "_by_weekly_amount." in reference.name else esa_quarters + ) + # The Pension Credit caseload rows bind the same four quarterly points + # (microcosm#1069 c7). + pension_credit = [ + reference + for reference in references + if reference.family == "dwp_pension_credit" + ] + assert len(pension_credit) == 14 + for reference in pension_credit: + assert reference.ledger_selector["period_value"] == esa_quarters + assert reference.value_operation == "monthly_window_average" + assert reference.period_match_policy == "source_window" + assert json.loads(reference.metadata[EXPECTED_SOURCE_MONTHS]) == esa_quarters + # The Attendance Allowance rows (England, Wales) bind the same four + # quarterly points (microcosm#1069 c10). + attendance = [ + reference + for reference in references + if reference.family == "dwp_attendance_allowance" + ] + assert sorted(reference.name for reference in attendance) == [ + "dwp.attendance_allowance.recipients_england", + "dwp.attendance_allowance.recipients_wales", + ] + for reference in attendance: + assert reference.ledger_selector["period_value"] == esa_quarters + assert reference.value_operation == "monthly_window_average" + assert reference.period_match_policy == "source_window" + assert json.loads(reference.metadata[EXPECTED_SOURCE_MONTHS]) == esa_quarters assert not any( EXPECTED_SOURCE_MONTHS in reference.metadata for reference in references if reference.family - not in {"dwp_universal_credit", "dwp_housing_benefit", "dwp_legacy_benefits"} + not in { + "dwp_universal_credit", + "dwp_housing_benefit", + "dwp_legacy_benefits", + "dwp_state_pension", + "dwp_pension_credit", + "dwp_attendance_allowance", + } ) diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_uc_support_diagnostics.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_uc_support_diagnostics.py index 4dcbb4bc9..5551c6ffd 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_uc_support_diagnostics.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_uc_support_diagnostics.py @@ -207,7 +207,7 @@ def write_saved_run(tmp_path, **overrides): *sorted(support_tool.KNOWN_ZERO_ROWS), "obr.income_tax", "obr.ni", - "obr.state_pension", + "dwp.state_pension.amount", "obr.child_benefit", "hmrc/employment_income_count_income_band_0_to_5000", ] diff --git a/packages/microcosm-calibrate/src/microcosm/calibrate/geography_constants.py b/packages/microcosm-calibrate/src/microcosm/calibrate/geography_constants.py index 058cd6c94..e3e96ccb6 100644 --- a/packages/microcosm-calibrate/src/microcosm/calibrate/geography_constants.py +++ b/packages/microcosm-calibrate/src/microcosm/calibrate/geography_constants.py @@ -25,6 +25,9 @@ { "K02000001": "United Kingdom", "K03000001": "Great Britain", + # DWP's Winter Fuel Payment statistics from winter 2024-25 (Scotland + # pays its own Pension Age Winter Heating Payment). + "K04000001": "England and Wales", "E92000001": "England", "W92000004": "Wales", "S92000003": "Scotland", diff --git a/packages/microcosm-calibrate/tests/engine_free/shared/test_diagnostics.py b/packages/microcosm-calibrate/tests/engine_free/shared/test_diagnostics.py index 8ef6f5efd..614bfdb7b 100644 --- a/packages/microcosm-calibrate/tests/engine_free/shared/test_diagnostics.py +++ b/packages/microcosm-calibrate/tests/engine_free/shared/test_diagnostics.py @@ -63,6 +63,7 @@ def test_shared_geography_constant_views_are_consistent() -> None: assert dict(UK_GEOGRAPHY_ID_TO_LABEL) == { "K02000001": "United Kingdom", "K03000001": "Great Britain", + "K04000001": "England and Wales", "E92000001": "England", "W92000004": "Wales", "S92000003": "Scotland", diff --git a/packages/microcosm-data/src/microcosm/data/contract.py b/packages/microcosm-data/src/microcosm/data/contract.py index 9442b1cea..2fdccd6e2 100644 --- a/packages/microcosm-data/src/microcosm/data/contract.py +++ b/packages/microcosm-data/src/microcosm/data/contract.py @@ -416,13 +416,13 @@ def compatibility_claim_declarer_error(declared_by: object) -> str | None: # fingerprint derives from the manifest digest. Editing the spec moves all # three here in the same reviewed change. _UK_GATE_BATTERY_POLICY_SHA256 = ( - "7365ded0928aa124ff8fe3e9ca87cc5b55c8f61ad7fc6c910fa5b17b5cd60e29" + "e6ad5f71e55a9c639026eb3794753ad9da0f2d1633949166956fc2f13be4d5c2" ) _UK_GATE_BATTERY_GATES_MANIFEST_SHA256 = ( - "dcc233997328072dbb94b823c93b4e3db33e7410ed94533530f0a6fe31f0d4c9" + "9ade6a80be484b410c47bf93191bd17cce01542d3d9032ba672d38bd23cdb98c" ) _UK_GATE_BATTERY_SPEC_FINGERPRINT = ( - "13ba3e6141315da40c2db07ec6a3be3ec6607be3c47645220b399c02e8e6f626" + "7830c47cab40144f503e2e377391fe2a0f008b0dd20b88a584f750acdb8127ae" ) #: Spec entry id -> the legacy gate name whose observable detail checks #: apply unchanged (the battery re-keys the report by entry id; the gate @@ -486,6 +486,7 @@ def compatibility_claim_declarer_error(declared_by: object) -> str | None: "stage_health", "transferred", ), + "uk_stage_pension_credit_take_up": ("stage_health", "transferred"), "uk_stage_cgt_incidence_clone_mass": ("stage_health", "transferred"), "uk_stage_cgt_support_split_mass": ("stage_health", "transferred"), "uk_stage_spi_income_band_donors_support": ("stage_health", "transferred"), @@ -580,6 +581,7 @@ def compatibility_claim_declarer_error(declared_by: object) -> str | None: "uk_stage_frs_hmrc_spine_leaves_signal", "uk_stage_spi_support_channel_mass", "uk_stage_hmrc_spi_income_spine_identity", + "uk_stage_pension_credit_take_up", "uk_stage_cgt_incidence_clone_mass", "uk_stage_cgt_support_split_mass", "uk_stage_spi_income_band_donors_support", @@ -789,6 +791,7 @@ def _uk_line_cut_tag_re(release_id: str) -> re.Pattern[str] | None: "uk_stage_lcfs_consumption_support", "uk_stage_nts_bus_travel_facts", "uk_stage_nts_bus_travel_support", + "uk_stage_pension_credit_take_up", "uk_stage_salary_sacrifice_realization", "uk_stage_spi_support_channel_mass", "uk_stage_student_loans_realization", @@ -836,10 +839,10 @@ def _uk_line_cut_tag_re(release_id: str) -> re.Pattern[str] | None: _UK_CERTIFICATION_PART_DIGESTS: Mapping[str, Mapping[str, str]] = { "spine": { "gates_manifest_sha256": ( - "e24f22b411d69ca0da2a884ed530ed3d19c5b8a3f0061866dbf8c88fb053a267" + "c6fce886d43fc981a1d65fbe24decca84bca0988d98f0bbb054758e7d8bbe0e7" ), "policy_sha256": ( - "af1750f20eafea8b63d0a816ceeffe95ad6719a18fb5b81bb8023a9cb770cb6a" + "68399e4cb348b7cb7f1ac07e9b03cb0027cbc94f056b412bd1db7fdf49e7bff8" ), }, "calibration_seam": { @@ -852,7 +855,7 @@ def _uk_line_cut_tag_re(release_id: str) -> re.Pattern[str] | None: }, "release_cut": { "gates_manifest_sha256": ( - "dbf6099f574995d3134efeb10d900dd106772f6765d5520e999db45871164c7c" + "60e37d4ac2ed3725e1a6d89eeb939513486efddd6ac7f6d689857485bd9a1ef1" ), "policy_sha256": ( "264084717c05c80509795a69299fe60f4513e821f443e0c3f2126911c8ce3605" diff --git a/packages/microcosm-data/tests/engine_free/shared/test_contract.py b/packages/microcosm-data/tests/engine_free/shared/test_contract.py index 583ba86d1..a6660b969 100644 --- a/packages/microcosm-data/tests/engine_free/shared/test_contract.py +++ b/packages/microcosm-data/tests/engine_free/shared/test_contract.py @@ -117,13 +117,13 @@ def _trusted_terminal_gate_signing_key(monkeypatch) -> None: UK_GATE_BATTERY_PRODUCER = "microcosm.build.gate_battery" UK_GATE_BATTERY_SIGNING_KEY_ENV = "MICROCOSM_UK_TERMINAL_GATE_SIGNING_KEY" UK_GATE_BATTERY_POLICY_SHA256 = ( - "7365ded0928aa124ff8fe3e9ca87cc5b55c8f61ad7fc6c910fa5b17b5cd60e29" + "e6ad5f71e55a9c639026eb3794753ad9da0f2d1633949166956fc2f13be4d5c2" ) UK_GATE_BATTERY_GATES_MANIFEST_SHA256 = ( - "dcc233997328072dbb94b823c93b4e3db33e7410ed94533530f0a6fe31f0d4c9" + "9ade6a80be484b410c47bf93191bd17cce01542d3d9032ba672d38bd23cdb98c" ) UK_GATE_BATTERY_SPEC_FINGERPRINT = ( - "13ba3e6141315da40c2db07ec6a3be3ec6607be3c47645220b399c02e8e6f626" + "7830c47cab40144f503e2e377391fe2a0f008b0dd20b88a584f750acdb8127ae" ) UK_GATE_BATTERY_DEGENERATE_EVIDENCE_SHA256 = ( "6f0243bcda09dad26945376230c44ec3cf55d4e417c3a25e29bae8c59bc1a69d" @@ -179,6 +179,7 @@ def _trusted_terminal_gate_signing_key(monkeypatch) -> None: "transferred", None, ), + "uk_stage_pension_credit_take_up": ("stage_health", "transferred", None), "uk_stage_cgt_support_split_mass": ( "stage_health", "transferred", @@ -1230,6 +1231,7 @@ def _gate_battery_payload( "spi_support_channel", "hmrc_spi_income_spine", "uc_capital_coherence", + "pension_credit_take_up", "uc_deduction_attributes", "cgt_support_split", "cgt_incidence_clone", @@ -1253,6 +1255,7 @@ def _gate_battery_payload( "uk_stage_frs_hmrc_spine_leaves_signal": "frs_hmrc_spine_leaves", "uk_stage_spi_support_channel_mass": "spi_support_channel", "uk_stage_hmrc_spi_income_spine_identity": "hmrc_spi_income_spine", + "uk_stage_pension_credit_take_up": "pension_credit_take_up", "uk_stage_cgt_support_split_mass": "cgt_support_split", "uk_stage_cgt_incidence_clone_mass": "cgt_incidence_clone", "uk_stage_spi_income_band_donors_support": "spi_income_band_donors", diff --git a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/cgt_asset_type_facts.json b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/cgt_asset_type_facts.json index 71f170ce9..a2cf4dbb7 100644 --- a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/cgt_asset_type_facts.json +++ b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/cgt_asset_type_facts.json @@ -2,70 +2,70 @@ "resource": "synthetic-cgt-asset-type.json", "resource_sha256": "synthetic", "source_commit": "synthetic", - "table4_all_gains": 85655532.16327287, + "table4_all_gains": 86140764.44464564, "table4_all_tax": 0.0, - "table4_all_taxpayers": 190.7294386227545, + "table4_all_taxpayers": 194.81827357660933, "table4_bands": [ { - "gains": 80168.68515167845, + "gains": 109881.50549018131, "lower_bound": 0, "tax": null, - "taxpayers": 17.418184880239522, + "taxpayers": 24.254564087265, "upper_bound": 10000 }, { - "gains": 453343.7314999845, + "gains": 292228.7986384038, "lower_bound": 10000, "tax": null, - "taxpayers": 24.45008982035928, + "taxpayers": 16.58439246485428, "upper_bound": 25000 }, { - "gains": 617786.7688845046, + "gains": 669730.4631223604, "lower_bound": 25000, "tax": null, - "taxpayers": 16.40005988023952, + "taxpayers": 16.663812046135067, "upper_bound": 50000 }, { - "gains": 1345563.1908268796, + "gains": 1661458.7134747333, "lower_bound": 50000, "tax": null, - "taxpayers": 16.70318488023952, + "taxpayers": 23.49154791320917, "upper_bound": 100000 }, { - "gains": 4150905.922211022, + "gains": 3395372.364664346, "lower_bound": 100000, "tax": null, - "taxpayers": 24.55258982035928, + "taxpayers": 16.459524279304198, "upper_bound": 250000 }, { - "gains": 7001192.286424931, + "gains": 6803922.927752389, "lower_bound": 250000, "tax": null, - "taxpayers": 16.40443488023952, + "taxpayers": 16.407377522325543, "upper_bound": 500000 }, { - "gains": 13421361.997435555, + "gains": 16060242.575711947, "lower_bound": 500000, "tax": null, - "taxpayers": 16.21568488023952, + "taxpayers": 23.809128167724772, "upper_bound": 1000000 }, { - "gains": 58585209.58083832, + "gains": 57147927.09579129, "lower_bound": 1000000, "tax": null, - "taxpayers": 58.585209580838324, + "taxpayers": 57.14792709579129, "upper_bound": null } ], - "table4_individuals_gains": 85655532.16327287, + "table4_individuals_gains": 86140764.44464564, "table4_individuals_tax": 0.0, - "table4_individuals_taxpayers": 190.7294386227545, + "table4_individuals_taxpayers": 194.81827357660933, "table4_trusts_gains": 0.0, "table4_trusts_tax": 0.0, "table7_total_disposals": 2743095.2380952383, @@ -114,12 +114,12 @@ "proceeds": 9000000000.0 } ], - "table8a_disposals_total": 356.7370791916169, - "table8a_gains_total": 493365043.2627384, - "table8a_tax_total": 98673008.65254769, - "table8a_taxpayers_total": 324.3064356287426, - "table8b_all_gains": 493365043.2627384, - "table8b_all_taxpayers": 324.3064356287426, - "table8b_individuals_gains": 493365043.2627384, - "table8b_individuals_taxpayers": 324.3064356287426 + "table8a_disposals_total": 366.328632, + "table8a_gains_total": 572565131.7814949, + "table8a_tax_total": 114513026.35629898, + "table8a_taxpayers_total": 333.0260290909091, + "table8b_all_gains": 572565131.7814949, + "table8b_all_taxpayers": 333.0260290909091, + "table8b_individuals_gains": 572565131.7814949, + "table8b_individuals_taxpayers": 333.0260290909091 } diff --git a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/fixture.json b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/fixture.json index d79fbe2d7..ef551bb80 100644 --- a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/fixture.json +++ b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/fixture.json @@ -1140,6 +1140,35 @@ "size_bytes": 14946, "table": "benefits", "vintage": "synthetic-h2" + }, + { + "format": "tab", + "kind": "licensed_microdata", + "locator": "job.tab", + "role": "frs_table", + "runtime_sha256_required": true, + "sha256": "0f787336f16448b3b9ec0b7ca46ca50da12b4fa90892161c0054fa89282189d7", + "size_bytes": 2643, + "table": "job", + "vintage": "synthetic-h2" + }, + { + "format": "tab", + "kind": "licensed_microdata", + "locator": "penprov.tab", + "role": "frs_table", + "runtime_sha256_required": true, + "sha256": "573c972543165c2f3d3780661877352ae7d4cf9520936e2edf59f19ed53ba706", + "size_bytes": 2705, + "table": "penprov", + "vintage": "synthetic-h2" + }, + { + "format": "json", + "kind": "public_aggregate_reference", + "resource": "ashe_employer_pension_contribution_rates.json", + "role": "employer_rate_bands", + "runtime_sha256_required": true } ], "grain": "person", @@ -1151,7 +1180,7 @@ "srp_regular_code5", "employer_pension_contributions" ], - "notes": "Retains adjudicated raw-FRS HMRC leaves on the raw FRS spine, where person_id equals the raw sernum*1000+person identity, then ports the incumbent employer-pension-contributions estimate.", + "notes": "Retains adjudicated raw-FRS HMRC leaves on the raw FRS spine, where person_id equals the raw sernum*1000+person identity, then draws employer pension contributions: each member of an employer scheme (PENPROV.STEMPPEN 1 to 4) with earnings takes an ASHE 2024 employer contribution rate for their scheme type and sector (Table P10 band shares, full pay, all industries; occupational schemes split into defined benefit and defined contribution by the sector's Table P2 job counts), uniform within the band (top band 20% to 30%), times pay. It replaces the incumbent's three times the employee contribution (microcosm#1069 c9, R6).", "operations": [ { "annualization": "weekly raw FRS amounts * (365.25 / 7)", @@ -1231,10 +1260,20 @@ "status": "adjudicated_partial_replay" }, { - "formula": "3 * employee_pension_contributions", - "kind": "derive", + "artifact_role": "employer_rate_bands", + "kind": "draw_employer_pension_contributions_from_rate_bands", + "occupational_split": "defined benefit or defined contribution by ASHE Table P2 job counts in the sector", "output": "employer_pension_contributions", - "source": "incumbent enhanced-FRS frs.py employer-pension contribution estimate" + "rate_basis": "full pay (employment_income)", + "resource": "ashe_employer_pension_contribution_rates.json", + "salts": [ + "employer_pension_occupational_type", + "employer_pension_contribution_rate" + ], + "scheme_source": "PENPROV.STEMPPEN 1 to 4 (employer schemes; occupational before group personal, group stakeholder, other)", + "sector_source": "JOB.JOBSECT (first job with a stated sector)", + "seed": 0, + "top_band_ceiling": 0.3 } ], "outputs": [ @@ -1717,8 +1756,8 @@ "locator": "job.tab", "role": "frs_table", "runtime_sha256_required": true, - "sha256": "c382b8db75d9a3d6d2ab2c7ccb8c45b72e6c6fc2473255530f5103c478f47985", - "size_bytes": 2365, + "sha256": "0f787336f16448b3b9ec0b7ca46ca50da12b4fa90892161c0054fa89282189d7", + "size_bytes": 2643, "table": "job", "vintage": "synthetic-h2" }, @@ -1761,8 +1800,8 @@ "locator": "penprov.tab", "role": "frs_table", "runtime_sha256_required": true, - "sha256": "6110ac0e369795baf6d3ffd221fd6ac4d6fe7731da22d535f5ad144d2b031830", - "size_bytes": 1820, + "sha256": "573c972543165c2f3d3780661877352ae7d4cf9520936e2edf59f19ed53ba706", + "size_bytes": 2705, "table": "penprov", "vintage": "synthetic-h2" }, @@ -2470,6 +2509,13 @@ "survey": "HMRC Personal Incomes Tables 3.6 and 3.7", "tax_year_start": 2023, "vintage": "2023-24" + }, + { + "format": "json", + "kind": "public_aggregate_reference", + "resource": "ons_single_year_age_populations.json", + "role": "donor_age_populations", + "runtime_sha256_required": true } ], "grain": "person", @@ -2541,6 +2587,14 @@ "seed": 42, "weight": "FACT" }, + { + "artifact_role": "qrf_donor", + "kind": "draw_spi_donor_ages_by_population", + "method": "whole-year age drawn within the AGERANGE band in proportion to the ONS single-year population of the donor's sex, then a uniform fraction of a year; State Pension recipients (SRP > 0) are drawn at or above State Pension age, and the band's below-State-Pension-age population share is drawn from its non-recipients", + "population_period": 2023, + "resource": "ons_single_year_age_populations.json", + "state_pension_age": "policyengine-uk gov.dwp.state_pension.age at the build instant" + }, { "assessable_income_source_semantics": "QRF draws leaves only; TEI, TII, and TI are deterministic post-draw accounting aggregates and TI equals TEI + TII exactly", "categorical_predictors": [ @@ -2721,6 +2775,7 @@ "training_artifact_role": "qrf_donor" }, { + "age_pool_minimum": 20, "band_column": "spi_income_band_donor_lower_bound", "band_lower_bounds": [ 200000, @@ -2731,7 +2786,7 @@ "carrier_column": "person_is_spi_income_band_carrier", "kind": "resample_band_donor_leaves", "outputs": "stage-1 outputs, uprated as the stage-1 draws", - "pool": "full prepared donor tape by published total income band (TEI + TII), narrowed to the carrier's region where that pool holds the minimum", + "pool": "full prepared donor tape by published total income band (TEI + TII), narrowed to the carrier's SPI age band where that pool holds the age minimum (composites never age-match), then to the carrier's region where that pool holds the regional minimum", "regional_pool_minimum": 20, "seed": 44, "weighting": "FACT", @@ -2819,6 +2874,20 @@ "weight": "household_weight", "weight_mapping": "household_to_person" }, + { + "base_channel_columns": [ + "state_pension_reported" + ], + "kind": "zero_pension_age_reports_below_state_pension_age", + "receipt": "rows, weighted people and amounts removed per column and step", + "spi_channel_columns": [ + "state_pension_reported", + "pension_credit_reported", + "winter_fuel_allowance_reported" + ], + "spi_state_pension_leaf": "hmrc_spi_state_pension_income", + "state_pension_age": "policyengine-uk gov.dwp.state_pension.age at the build instant" + }, { "columns": [ "dividend_income" @@ -4144,6 +4213,59 @@ "stage": "nts_bus_travel", "survey": "National Travel Survey 2002-2024" }, + "pension_credit_take_up": { + "artifacts": [], + "grain": "benunit", + "nonnegative_outputs": [], + "notes": "Runs after the SPI income chain and UC capital coherence, before CGT cloning (microcosm#1069 R9). One temporary engine materialization gives each benefit unit's pre-take-up Pension Credit entitlement (guarantee_credit, savings_credit, is_pension_credit_eligible; consumed only). Entitled units fall into DWP's take-up components, Guarantee Credit (with or without Savings Credit) and Savings Credit only; within a component a reporter claims and the other entitled units claim at r = (t * E - R) / (E - R), t being DWP's financial year ending 2024 caseload take-up (69% and 37%), E the component's entitled units and R its reporters, weighted at the stage's household weights. A unit with no entitlement claims only if it reports. The uniform draw is frs_take_up's would_claim_pc identity stream, whose early draw this rewrite replaces; units with every adult at or over State Pension age are the only ones the engine finds eligible.", + "operations": [ + { + "consumed_only": true, + "kind": "materialize_rules_engine_predictors", + "predictors": [ + "guarantee_credit", + "savings_credit", + "is_pension_credit_eligible" + ] + }, + { + "aggregates": { + "pension_credit_reported_anchor": "pension_credit_reported" + }, + "consumed_only": true, + "kind": "aggregate_person_to_benunit", + "method": "any_positive" + }, + { + "anchor": "pension_credit_reported_anchor", + "bands": [ + { + "name": "guarantee_credit", + "rate_key": "pension_credit_guarantee_credit", + "rule": "is_pension_credit_eligible AND guarantee_credit > 0" + }, + { + "name": "savings_credit_only", + "rate_key": "pension_credit_savings_credit_only", + "rule": "is_pension_credit_eligible AND guarantee_credit <= 0 AND savings_credit > 0" + } + ], + "draw": "would_claim_pc", + "kind": "assign_component_take_up_residual", + "output": "would_claim_pc", + "residual_rate": "(rate * entitled - reporters) / (entitled - reporters), weighted, clipped to [0, 1]", + "seed": 0, + "weight_mapping": "household_to_benunit" + } + ], + "outputs": [], + "rewrites": [ + "would_claim_pc" + ], + "source": "DWP Income-related benefits: estimates of take-up, financial year ending 2024 (Pension Credit caseload take-up by component), applied to PolicyEngine-UK pre-take-up Pension Credit entitlement after the SPI income chain.", + "stage": "pension_credit_take_up", + "survey": "Family Resources Survey 2024-25" + }, "regional_property_uprating": { "artifacts": [ { @@ -4194,9 +4316,10 @@ "grain": "person", "nonnegative_outputs": [ "pension_contributions_via_salary_sacrifice", - "employee_pension_contributions" + "employee_pension_contributions", + "employment_income" ], - "notes": "The QRF trains only on the 2024-25 FRS asked subset. The second arm creates support toward the reviewed 5.4m staging target by moving contributors' full pension amounts.", + "notes": "The QRF trains only on the 2024-25 FRS asked subset. The second arm creates support toward the reviewed 5.4m staging target by moving contributors' full pension amounts into salary sacrifice and lowering their pay by the same amount, since the engine reads employment_income after sacrifice; before microcosm#1069 c9 the pay stayed whole and the converted record lost its net-pay relief.", "operations": [ { "cache": false, @@ -4220,9 +4343,9 @@ { "donor_pool": "employee_pension_contributions > 0 and pension_contributions_via_salary_sacrifice == 0 and employment_income > 0", "kind": "convert_donors_to_target_stock", - "move": "full employee_pension_contributions to pension_contributions_via_salary_sacrifice; source zeroed", + "move": "full employee_pension_contributions to pension_contributions_via_salary_sacrifice; source zeroed; employment_income lowered by the amount sacrificed", "rate_cap": 0.5, - "reason": "Salary-sacrifice support stage rewrites pension columns only; household rows and typed household weights pass through and total household mass is conserved.", + "reason": "Salary-sacrifice support stage rewrites pension columns and converted records' pay; household rows and typed household weights pass through and total household mass is conserved.", "receipt": "weighted_headcount", "resource": "salary_sacrifice_anchor.json", "salt": "salary_sacrifice_conversion", @@ -4232,11 +4355,13 @@ ], "outputs": [ "pension_contributions_via_salary_sacrifice", - "employee_pension_contributions" + "employee_pension_contributions", + "employment_income" ], "rewrites": [ "pension_contributions_via_salary_sacrifice", - "employee_pension_contributions" + "employee_pension_contributions", + "employment_income" ], "source": "HMRC, Salary sacrifice reform for pension contributions effective from 6 April 2029", "stage": "salary_sacrifice", @@ -4430,7 +4555,7 @@ "source_household_id", "source_year" ], - "notes": "Stacks the pre-clone SPI support channel, gates the 10,000 zero-weight synthetic households under a stage-local declaration, and allocates 50 percent of each region stratum prior mass to the SPI channel with exact national conservation.", + "notes": "Stacks the pre-clone SPI support channel, gates the 10,000 zero-weight synthetic households under a stage-local declaration, and allocates prior mass with exact national conservation within each region, split by whether the household has a member at or over State Pension age (the engine's at the build instant): the SPI channel takes 50 percent of the stratum mass of households without one and pension_age_share of those with one. The channel's households are drawn unweighted with one weight per stratum and every adult in them carries a taxpayer's income, so a region-only allocation gave the channel more pension-age mass than the FRS design gives pension-age households (microcosm#1069).", "operations": [ { "channels": { @@ -4460,6 +4585,8 @@ { "conservation": "exact_total", "kind": "allocate_zero_weight_prior_mass", + "pension_age_share": 0.2, + "pension_age_stratum": "any_member_at_or_over_state_pension_age", "share": 0.5, "strata": [ "region" diff --git a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/frs_raw/job.tab b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/frs_raw/job.tab index b99780e09..7520fc9a2 100644 --- a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/frs_raw/job.tab +++ b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/frs_raw/job.tab @@ -1,136 +1,136 @@ -SERNUM BENUNIT PERSON DEDUC1 SPNAMT SALSAC -1 1 1 2.0 3.0 1 -2 1 1 2.0 3.0 1 -3 1 1 2.0 3.0 1 -4 1 1 2.0 3.0 1 -5 1 1 2.0 3.0 1 -6 1 1 2.0 3.0 1 -7 1 1 2.0 3.0 1 -8 1 1 2.0 3.0 1 -9 1 1 2.0 3.0 1 -10 1 1 2.0 3.0 1 -11 1 1 2.0 3.0 1 -12 1 1 2.0 3.0 1 -13 1 1 2.0 3.0 1 -14 1 1 2.0 3.0 1 -15 1 1 2.0 3.0 1 -16 1 1 2.0 3.0 1 -17 1 1 2.0 3.0 1 -18 1 1 2.0 3.0 1 -19 1 1 2.0 3.0 1 -20 1 1 2.0 3.0 1 -21 1 1 2.0 3.0 1 -22 1 1 2.0 3.0 1 -23 1 1 2.0 3.0 1 -24 1 1 2.0 3.0 1 -25 1 1 2.0 3.0 1 -26 1 1 2.0 3.0 1 -27 1 1 2.0 3.0 1 -28 1 1 2.0 3.0 1 -29 1 1 2.0 3.0 1 -30 1 1 2.0 3.0 1 -31 1 1 2.0 3.0 1 -32 1 1 2.0 3.0 1 -33 1 1 2.0 3.0 1 -34 1 1 2.0 3.0 1 -35 1 1 2.0 3.0 1 -36 1 1 2.0 3.0 1 -37 1 1 2.0 3.0 1 -38 1 1 2.0 3.0 1 -39 1 1 2.0 3.0 1 -40 1 1 2.0 3.0 1 -41 1 1 2.0 3.0 1 -42 1 1 2.0 3.0 1 -43 1 1 2.0 3.0 1 -44 1 1 2.0 3.0 1 -45 1 1 2.0 3.0 1 -46 1 1 2.0 3.0 1 -47 1 1 2.0 3.0 1 -48 1 1 2.0 3.0 1 -49 1 1 2.0 3.0 1 -50 1 1 2.0 3.0 1 -51 1 1 2.0 3.0 1 -52 1 1 2.0 3.0 1 -53 1 1 2.0 3.0 1 -54 1 1 2.0 3.0 1 -55 1 1 2.0 3.0 1 -56 1 1 2.0 3.0 1 -57 1 1 2.0 3.0 1 -58 1 1 2.0 3.0 1 -59 1 1 2.0 3.0 1 -60 1 1 2.0 3.0 1 -61 1 1 2.0 3.0 1 -62 1 1 2.0 3.0 1 -63 1 1 2.0 3.0 1 -64 1 1 2.0 3.0 1 -65 1 1 2.0 3.0 1 -66 1 1 2.0 3.0 1 -67 1 1 2.0 3.0 1 -68 1 1 2.0 3.0 1 -69 1 1 2.0 3.0 1 -70 1 1 2.0 3.0 1 -71 1 1 2.0 3.0 1 -72 1 1 2.0 3.0 1 -73 1 1 2.0 3.0 1 -74 1 1 2.0 3.0 1 -75 1 1 2.0 3.0 1 -76 1 1 2.0 3.0 1 -77 1 1 2.0 3.0 1 -78 1 1 2.0 3.0 1 -79 1 1 2.0 3.0 1 -80 1 1 2.0 3.0 1 -81 1 1 2.0 3.0 1 -82 1 1 2.0 3.0 1 -83 1 1 2.0 3.0 1 -84 1 1 2.0 3.0 1 -85 1 1 2.0 3.0 1 -86 1 1 2.0 3.0 1 -87 1 1 2.0 3.0 1 -88 1 1 2.0 3.0 1 -89 1 1 2.0 3.0 1 -90 1 1 2.0 3.0 1 -91 1 1 2.0 3.0 1 -92 1 1 2.0 3.0 1 -93 1 1 2.0 3.0 1 -94 1 1 2.0 3.0 1 -95 1 1 2.0 3.0 1 -96 1 1 2.0 3.0 1 -97 1 1 2.0 3.0 1 -98 1 1 2.0 3.0 1 -99 1 1 2.0 3.0 1 -100 1 1 2.0 3.0 1 -101 1 1 2.0 3.0 1 -102 1 1 2.0 3.0 1 -103 1 1 2.0 3.0 1 -104 1 1 2.0 3.0 1 -105 1 1 2.0 3.0 1 -106 1 1 2.0 3.0 1 -107 1 1 2.0 3.0 1 -108 1 1 2.0 3.0 1 -109 1 1 2.0 3.0 1 -110 1 1 2.0 3.0 1 -111 1 1 2.0 3.0 1 -112 1 1 2.0 3.0 1 -113 1 1 2.0 3.0 1 -114 1 1 2.0 3.0 1 -115 1 1 2.0 3.0 1 -116 1 1 2.0 3.0 1 -117 1 1 2.0 3.0 1 -118 1 1 2.0 3.0 1 -119 1 1 2.0 3.0 1 -120 1 1 2.0 3.0 1 -121 1 1 2.0 3.0 1 -122 1 1 2.0 3.0 1 -123 1 1 2.0 3.0 1 -124 1 1 2.0 3.0 1 -125 1 1 2.0 3.0 1 -126 1 1 2.0 3.0 1 -127 1 1 2.0 3.0 1 -128 1 1 2.0 3.0 1 -129 1 1 2.0 3.0 1 -130 1 1 2.0 3.0 1 -131 1 1 2.0 3.0 1 -132 1 1 2.0 3.0 1 -133 1 1 2.0 3.0 1 -134 1 1 2.0 3.0 1 -135 1 1 2.0 3.0 1 +SERNUM BENUNIT PERSON DEDUC1 SPNAMT SALSAC JOBSECT +1 1 1 2.0 3.0 1 2 +2 1 1 2.0 3.0 1 1 +3 1 1 2.0 3.0 1 2 +4 1 1 2.0 3.0 1 1 +5 1 1 2.0 3.0 1 2 +6 1 1 2.0 3.0 1 1 +7 1 1 2.0 3.0 1 2 +8 1 1 2.0 3.0 1 1 +9 1 1 2.0 3.0 1 2 +10 1 1 2.0 3.0 1 1 +11 1 1 2.0 3.0 1 2 +12 1 1 2.0 3.0 1 1 +13 1 1 2.0 3.0 1 2 +14 1 1 2.0 3.0 1 1 +15 1 1 2.0 3.0 1 2 +16 1 1 2.0 3.0 1 1 +17 1 1 2.0 3.0 1 2 +18 1 1 2.0 3.0 1 1 +19 1 1 2.0 3.0 1 2 +20 1 1 2.0 3.0 1 1 +21 1 1 2.0 3.0 1 2 +22 1 1 2.0 3.0 1 1 +23 1 1 2.0 3.0 1 2 +24 1 1 2.0 3.0 1 1 +25 1 1 2.0 3.0 1 2 +26 1 1 2.0 3.0 1 1 +27 1 1 2.0 3.0 1 2 +28 1 1 2.0 3.0 1 1 +29 1 1 2.0 3.0 1 2 +30 1 1 2.0 3.0 1 1 +31 1 1 2.0 3.0 1 2 +32 1 1 2.0 3.0 1 1 +33 1 1 2.0 3.0 1 2 +34 1 1 2.0 3.0 1 1 +35 1 1 2.0 3.0 1 2 +36 1 1 2.0 3.0 1 1 +37 1 1 2.0 3.0 1 2 +38 1 1 2.0 3.0 1 1 +39 1 1 2.0 3.0 1 2 +40 1 1 2.0 3.0 1 1 +41 1 1 2.0 3.0 1 2 +42 1 1 2.0 3.0 1 1 +43 1 1 2.0 3.0 1 2 +44 1 1 2.0 3.0 1 1 +45 1 1 2.0 3.0 1 2 +46 1 1 2.0 3.0 1 1 +47 1 1 2.0 3.0 1 2 +48 1 1 2.0 3.0 1 1 +49 1 1 2.0 3.0 1 2 +50 1 1 2.0 3.0 1 1 +51 1 1 2.0 3.0 1 2 +52 1 1 2.0 3.0 1 1 +53 1 1 2.0 3.0 1 2 +54 1 1 2.0 3.0 1 1 +55 1 1 2.0 3.0 1 2 +56 1 1 2.0 3.0 1 1 +57 1 1 2.0 3.0 1 2 +58 1 1 2.0 3.0 1 1 +59 1 1 2.0 3.0 1 2 +60 1 1 2.0 3.0 1 1 +61 1 1 2.0 3.0 1 2 +62 1 1 2.0 3.0 1 1 +63 1 1 2.0 3.0 1 2 +64 1 1 2.0 3.0 1 1 +65 1 1 2.0 3.0 1 2 +66 1 1 2.0 3.0 1 1 +67 1 1 2.0 3.0 1 2 +68 1 1 2.0 3.0 1 1 +69 1 1 2.0 3.0 1 2 +70 1 1 2.0 3.0 1 1 +71 1 1 2.0 3.0 1 2 +72 1 1 2.0 3.0 1 1 +73 1 1 2.0 3.0 1 2 +74 1 1 2.0 3.0 1 1 +75 1 1 2.0 3.0 1 2 +76 1 1 2.0 3.0 1 1 +77 1 1 2.0 3.0 1 2 +78 1 1 2.0 3.0 1 1 +79 1 1 2.0 3.0 1 2 +80 1 1 2.0 3.0 1 1 +81 1 1 2.0 3.0 1 2 +82 1 1 2.0 3.0 1 1 +83 1 1 2.0 3.0 1 2 +84 1 1 2.0 3.0 1 1 +85 1 1 2.0 3.0 1 2 +86 1 1 2.0 3.0 1 1 +87 1 1 2.0 3.0 1 2 +88 1 1 2.0 3.0 1 1 +89 1 1 2.0 3.0 1 2 +90 1 1 2.0 3.0 1 1 +91 1 1 2.0 3.0 1 2 +92 1 1 2.0 3.0 1 1 +93 1 1 2.0 3.0 1 2 +94 1 1 2.0 3.0 1 1 +95 1 1 2.0 3.0 1 2 +96 1 1 2.0 3.0 1 1 +97 1 1 2.0 3.0 1 2 +98 1 1 2.0 3.0 1 1 +99 1 1 2.0 3.0 1 2 +100 1 1 2.0 3.0 1 1 +101 1 1 2.0 3.0 1 2 +102 1 1 2.0 3.0 1 1 +103 1 1 2.0 3.0 1 2 +104 1 1 2.0 3.0 1 1 +105 1 1 2.0 3.0 1 2 +106 1 1 2.0 3.0 1 1 +107 1 1 2.0 3.0 1 2 +108 1 1 2.0 3.0 1 1 +109 1 1 2.0 3.0 1 2 +110 1 1 2.0 3.0 1 1 +111 1 1 2.0 3.0 1 2 +112 1 1 2.0 3.0 1 1 +113 1 1 2.0 3.0 1 2 +114 1 1 2.0 3.0 1 1 +115 1 1 2.0 3.0 1 2 +116 1 1 2.0 3.0 1 1 +117 1 1 2.0 3.0 1 2 +118 1 1 2.0 3.0 1 1 +119 1 1 2.0 3.0 1 2 +120 1 1 2.0 3.0 1 1 +121 1 1 2.0 3.0 1 2 +122 1 1 2.0 3.0 1 1 +123 1 1 2.0 3.0 1 2 +124 1 1 2.0 3.0 1 1 +125 1 1 2.0 3.0 1 2 +126 1 1 2.0 3.0 1 1 +127 1 1 2.0 3.0 1 2 +128 1 1 2.0 3.0 1 1 +129 1 1 2.0 3.0 1 2 +130 1 1 2.0 3.0 1 1 +131 1 1 2.0 3.0 1 2 +132 1 1 2.0 3.0 1 1 +133 1 1 2.0 3.0 1 2 +134 1 1 2.0 3.0 1 1 +135 1 1 2.0 3.0 1 2 diff --git a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/frs_raw/penprov.tab b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/frs_raw/penprov.tab index fa90b8d29..2e2b7811d 100644 --- a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/frs_raw/penprov.tab +++ b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/frs_raw/penprov.tab @@ -1,136 +1,203 @@ SERNUM BENUNIT PERSON STEMPPEN PENAMT 1 1 1 5 4.0 2 1 1 5 4.0 +2 1 1 2 0.0 3 1 1 5 4.0 4 1 1 5 4.0 +4 1 1 2 0.0 5 1 1 5 4.0 6 1 1 5 4.0 +6 1 1 2 0.0 7 1 1 5 4.0 8 1 1 5 4.0 +8 1 1 2 0.0 9 1 1 5 4.0 10 1 1 5 4.0 +10 1 1 2 0.0 11 1 1 5 4.0 12 1 1 5 4.0 +12 1 1 2 0.0 13 1 1 5 4.0 14 1 1 5 4.0 +14 1 1 2 0.0 15 1 1 5 4.0 16 1 1 5 4.0 +16 1 1 2 0.0 17 1 1 5 4.0 18 1 1 5 4.0 +18 1 1 2 0.0 19 1 1 5 4.0 20 1 1 5 4.0 +20 1 1 2 0.0 21 1 1 5 4.0 22 1 1 5 4.0 +22 1 1 2 0.0 23 1 1 5 4.0 24 1 1 5 4.0 +24 1 1 2 0.0 25 1 1 5 4.0 26 1 1 5 4.0 +26 1 1 2 0.0 27 1 1 5 4.0 28 1 1 5 4.0 +28 1 1 2 0.0 29 1 1 5 4.0 30 1 1 5 4.0 +30 1 1 2 0.0 31 1 1 5 4.0 32 1 1 5 4.0 +32 1 1 2 0.0 33 1 1 5 4.0 34 1 1 5 4.0 +34 1 1 2 0.0 35 1 1 5 4.0 36 1 1 5 4.0 +36 1 1 2 0.0 37 1 1 5 4.0 38 1 1 5 4.0 +38 1 1 2 0.0 39 1 1 5 4.0 40 1 1 5 4.0 +40 1 1 2 0.0 41 1 1 5 4.0 42 1 1 5 4.0 +42 1 1 2 0.0 43 1 1 5 4.0 44 1 1 5 4.0 +44 1 1 2 0.0 45 1 1 5 4.0 46 1 1 5 4.0 +46 1 1 2 0.0 47 1 1 5 4.0 48 1 1 5 4.0 +48 1 1 2 0.0 49 1 1 5 4.0 50 1 1 5 4.0 +50 1 1 2 0.0 51 1 1 5 4.0 52 1 1 5 4.0 +52 1 1 2 0.0 53 1 1 5 4.0 54 1 1 5 4.0 +54 1 1 2 0.0 55 1 1 5 4.0 56 1 1 5 4.0 +56 1 1 2 0.0 57 1 1 5 4.0 58 1 1 5 4.0 +58 1 1 2 0.0 59 1 1 5 4.0 60 1 1 5 4.0 +60 1 1 2 0.0 61 1 1 5 4.0 62 1 1 5 4.0 +62 1 1 2 0.0 63 1 1 5 4.0 64 1 1 5 4.0 +64 1 1 2 0.0 65 1 1 5 4.0 66 1 1 5 4.0 +66 1 1 2 0.0 67 1 1 5 4.0 68 1 1 5 4.0 +68 1 1 2 0.0 69 1 1 5 4.0 70 1 1 5 4.0 +70 1 1 2 0.0 71 1 1 5 4.0 72 1 1 5 4.0 +72 1 1 2 0.0 73 1 1 5 4.0 74 1 1 5 4.0 +74 1 1 2 0.0 75 1 1 5 4.0 76 1 1 5 4.0 +76 1 1 2 0.0 77 1 1 5 4.0 78 1 1 5 4.0 +78 1 1 2 0.0 79 1 1 5 4.0 80 1 1 5 4.0 +80 1 1 2 0.0 81 1 1 5 4.0 82 1 1 5 4.0 +82 1 1 2 0.0 83 1 1 5 4.0 84 1 1 5 4.0 +84 1 1 2 0.0 85 1 1 5 4.0 86 1 1 5 4.0 +86 1 1 2 0.0 87 1 1 5 4.0 88 1 1 5 4.0 +88 1 1 2 0.0 89 1 1 5 4.0 90 1 1 5 4.0 +90 1 1 2 0.0 91 1 1 5 4.0 92 1 1 5 4.0 +92 1 1 2 0.0 93 1 1 5 4.0 94 1 1 5 4.0 +94 1 1 2 0.0 95 1 1 5 4.0 96 1 1 5 4.0 +96 1 1 2 0.0 97 1 1 5 4.0 98 1 1 5 4.0 +98 1 1 2 0.0 99 1 1 5 4.0 100 1 1 5 4.0 +100 1 1 2 0.0 101 1 1 5 4.0 102 1 1 5 4.0 +102 1 1 2 0.0 103 1 1 5 4.0 104 1 1 5 4.0 +104 1 1 2 0.0 105 1 1 5 4.0 106 1 1 5 4.0 +106 1 1 2 0.0 107 1 1 5 4.0 108 1 1 5 4.0 +108 1 1 2 0.0 109 1 1 5 4.0 110 1 1 5 4.0 +110 1 1 2 0.0 111 1 1 5 4.0 112 1 1 5 4.0 +112 1 1 2 0.0 113 1 1 5 4.0 114 1 1 5 4.0 +114 1 1 2 0.0 115 1 1 5 4.0 116 1 1 5 4.0 +116 1 1 2 0.0 117 1 1 5 4.0 118 1 1 5 4.0 +118 1 1 2 0.0 119 1 1 5 4.0 120 1 1 5 4.0 +120 1 1 2 0.0 121 1 1 5 4.0 122 1 1 5 4.0 +122 1 1 2 0.0 123 1 1 5 4.0 124 1 1 5 4.0 +124 1 1 2 0.0 125 1 1 5 4.0 126 1 1 5 4.0 +126 1 1 2 0.0 127 1 1 5 4.0 128 1 1 5 4.0 +128 1 1 2 0.0 129 1 1 5 4.0 130 1 1 5 4.0 +130 1 1 2 0.0 131 1 1 5 4.0 132 1 1 5 4.0 +132 1 1 2 0.0 133 1 1 5 4.0 134 1 1 5 4.0 +134 1 1 2 0.0 135 1 1 5 4.0 diff --git a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/uk_spine.json b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/uk_spine.json index b3a16ab57..03603c243 100644 --- a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/uk_spine.json +++ b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/uk_spine.json @@ -1 +1 @@ -{"country":"uk","nodes":[{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Load the source-bound UK FRS root population.","id":"create_uk_frs","inputs":[],"kernel":"uk.create@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"gender","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"marital_status","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"hours_worked","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"care_hours","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_household_head","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_benunit_head","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_parent","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_uc_claimant","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"maintenance_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"miscellaneous_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"private_transfer_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"lump_sum_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"student_loan_repayments","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"statutory_sick_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"statutory_maternity_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"student_loans","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"access_fund","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"healthy_start_vouchers","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_breakfasts","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_fruit_veg","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_meals","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"maintenance_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"childcare_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"salary_sacrifice_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"salary_sacrifice_asked","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"incapacity_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"is_married","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"dependent_children","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"region","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_single_adult_raw","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"external_child_payments","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"sample_fraction":1.0,"sample_seed":578,"stage_contract_sha256":"047d30937efb21e39259fdbed5597751e4f5a0c341ea583c7446e4c9c11eba48","time_period":"2024"},"population":null,"sources":["frs"],"structural":"create","weights":null},{"base":"create_uk_frs","citation":"","description":"Ownership boundary for the source-assembling root stage.","id":"frs_spine.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Claim the cells assembled by the UK FRS root transform.","id":"frs_spine","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"gender","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"marital_status","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hours_worked","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"care_hours","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_household_head","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_benunit_head","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_parent","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_uc_claimant","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maintenance_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"miscellaneous_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_transfer_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"lump_sum_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"student_loan_repayments","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"statutory_sick_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"statutory_maternity_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"student_loans","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"access_fund","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"healthy_start_vouchers","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_breakfasts","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_fruit_veg","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_meals","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maintenance_expenses","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"childcare_expenses","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_asked","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"incapacity_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_married","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dependent_children","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"region","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_single_adult_raw","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"external_child_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{},"population":"frs_spine.boundary","sources":[],"structural":"none","weights":null},{"base":"frs_spine.boundary","citation":"","description":"Ownership boundary before age_tail rewrites.","id":"age_tail.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage age_tail.","id":"age_tail","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["external_child_payments","region"],"entity":"household","rows":"all"},{"columns":["gender"],"entity":"person","rows":"all"}],"kernel":"uk.stage.age_tail@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"age_tail","stage_contract_sha256":"963a34f38caede2525e3b8735f904bb70a1bbef5a272f0eefd4346343444484f","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_relationships.","id":"frs_relationships","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","is_household_head"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_relationships@1","mass":"conserve","outputs":[{"column":"relationship_to_head","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_family_role","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_family_index","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_household_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_relationships","stage_contract_sha256":"30628808d06d9829ebcbcf460cd355a01261e78c7c73e6006c75bec2e3d60c33","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_employment.","id":"frs_employment","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["ons_household_type","region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_employment@1","mass":"conserve","outputs":[{"column":"employment_status","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_sector","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"sic_industry_division","dtype":"int64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_employment","stage_contract_sha256":"ddbefaf05b44788d794a6e4b0e8926c14318d66e50d2f11f50ca549538bbf60c","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_council_tax.","id":"frs_council_tax","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","sic_industry_division"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_council_tax@1","mass":"conserve","outputs":[{"column":"council_tax","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_council_tax","stage_contract_sha256":"3381cd9f7a736514d5073c57480e07f5098890f3ca9ed3865392043594771eb9","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_disability.","id":"frs_disability","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["council_tax","region"],"entity":"household","rows":"all"},{"columns":["afcs_reported","age","attendance_allowance_reported","dla_m_reported","dla_sc_reported","esa_contrib_reported","esa_income_reported","iidb_reported","incapacity_benefit_reported","pip_dl_reported","pip_m_reported","sda_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_disability@1","mass":"conserve","outputs":[{"column":"aa_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_sc_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_m_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_m_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_dl_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_disability","stage_contract_sha256":"ac500b4cb1bc04d4fb72d198592dd376d61da8c150921a6ac53914ac18be0508","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_education.","id":"frs_education","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","esa_contrib_reported","esa_income_reported","is_severely_disabled_for_benefits","jsa_contrib_reported","jsa_income_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_education@1","mass":"conserve","outputs":[{"column":"current_education","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"highest_education","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"is_in_non_advanced_education","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_in_approved_training","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"age_started_or_accepted_current_education_or_training","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_before_universal_credit_qualifying_young_person_terminal_date","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"adult_ema","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_ema","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"receives_benefits_in_own_right","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_education","stage_contract_sha256":"836cb0f5a582fee1425190e96c9cb81bdef859bd236c8b6bc27660b6e3d0c2f8","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_legacy_proxies.","id":"frs_legacy_proxies","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_legacy_proxies@1","mass":"conserve","outputs":[{"column":"legacy_jobseeker_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_health_condition_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_support_group_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_legacy_proxies","stage_contract_sha256":"1ecf761cf3fa7180da15659e138e67a8654e58272b4fde28344aa27a874ad0aa","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"age_tail.boundary","citation":"","description":"Ownership boundary before frs_education_grant_split rewrites.","id":"frs_education_grant_split.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_education_grant_split.","id":"frs_education_grant_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_education_grant_split@1","mass":"conserve","outputs":[{"column":"disabled_students_allowance_eligible_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_education_grant_split","stage_contract_sha256":"8718f014b90498c2cc7c754289775ca4a41452d9b978d8cbc5f34b64cbdc7df2","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_take_up.","id":"frs_take_up","inputs":[{"columns":["frs_benunit_capital","is_married"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","child_benefit_reported","education_grants","pension_credit_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_child_benefit","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"child_benefit_opts_out","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_pc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_tfc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_extended_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_universal_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_targeted_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_uc_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"maximum_extended_childcare_hours_usage","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_take_up","stage_contract_sha256":"067d31b7fbe733d1d182588705e9ce79df0c8e5f6e8f519314765af49b1b00d7","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_person_draws.","id":"frs_person_draws","inputs":[{"columns":["frs_benunit_capital","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_person_draws@1","mass":"conserve","outputs":[{"column":"would_claim_marriage_allowance","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"would_claim_scp","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"attends_private_school_random_draw","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"tax_free_childcare_spend_routed_share","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_person_draws","stage_contract_sha256":"7e0af955541ec5669dcdf1de4e1e6ca642853e48b775ec4e25238b41491df324","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_household_draws.","id":"frs_household_draws","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_household_draws@1","mass":"conserve","outputs":[{"column":"household_owns_tv","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"would_evade_tv_licence_fee","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"main_residential_property_purchased_is_first_home","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"property_purchased","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_household_draws","stage_contract_sha256":"c74c63b09264319c4bf0049dabba00ecd0ce660beb7b53d6dae71518434bc949","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_brma.","id":"frs_brma","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_brma@1","mass":"conserve","outputs":[{"column":"brma","dtype":"string","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_brma","stage_contract_sha256":"5b8f0b361310c7cd3efbaae3762b347649b7d4afb9e9943131d9bef9266fc3c8","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"frs_education_grant_split.boundary","citation":"","description":"Freeze the assembled-spine gate population.","id":"frs_brma.checkpoint","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_hmrc_spine_leaves.","id":"frs_hmrc_spine_leaves","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["brma","region"],"entity":"household","rows":"all"},{"columns":["age","employee_pension_contributions"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_hmrc_spine_leaves@1","mass":"conserve","outputs":[{"column":"hmrc_spi_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_unemployment_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_incapacity_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ossben_identifiable_subset","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"srp_regular_code5","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employer_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_hmrc_spine_leaves","stage_contract_sha256":"2bb3d068003489b47cc8676ac26c203ce3c39a9b6e92f3ecd0a3c06acd6addc4","time_period":"2024"},"population":"frs_brma.checkpoint","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"frs_brma.checkpoint","citation":"","description":"Run structural UK stage spi_support_channel.","id":"spi_support_channel","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.spi_support_channel@1","mass":"declared","outputs":[],"params":{"expand_cells":[["person","person_source_id","int64"],["person","person_support_channel","string"],["person","person_support_clone_index","int64"],["benunit","benunit_source_id","int64"],["benunit","benunit_support_channel","string"],["benunit","benunit_support_clone_index","int64"],["household","source_household_id","int64"],["household","source_year","int64"],["household","source_household_key","string"],["household","household_source_id","int64"],["household","household_support_channel","string"],["household","household_support_clone_index","int64"],["household","household_is_spi_synthetic","bool"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_support_channel","stage_contract_sha256":"4b10f1a4a215cdf2c406c9974de2d1e580eb3cd3a25ed34973c1b63abf4a54bb","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by spi_support_channel.","id":"spi_support_channel.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"person_source_id","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"person_support_channel","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"person_support_clone_index","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"benunit_source_id","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"benunit_support_channel","dtype":"string","entity":"benunit","ownership":"produced","rows":"all"},{"column":"benunit_support_clone_index","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"source_household_id","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"source_year","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"source_household_key","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"household_source_id","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_support_channel","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"household_support_clone_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_is_spi_synthetic","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["person.person_source_id","person.person_support_channel","person.person_support_clone_index","benunit.benunit_source_id","benunit.benunit_support_channel","benunit.benunit_support_clone_index","household.source_household_id","household.source_year","household.source_household_key","household.household_source_id","household.household_support_channel","household.household_support_clone_index","household.household_is_spi_synthetic"]},"population":"spi_support_channel","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"spi_support_channel","citation":"","description":"Run structural UK stage spi_income_band_donors.","id":"spi_income_band_donors","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.spi_income_band_donors@1","mass":"free","outputs":[],"params":{"expand_cells":[["person","person_source_id","int64"],["person","person_support_channel","string"],["person","person_support_clone_index","int64"],["benunit","benunit_source_id","int64"],["benunit","benunit_support_channel","string"],["benunit","benunit_support_clone_index","int64"],["household","household_source_id","int64"],["household","household_support_channel","string"],["household","household_support_clone_index","int64"],["household","household_is_spi_synthetic","bool"],["household","household_is_spi_income_band_donor","bool"],["household","spi_income_band_donor_lower_bound","float64"],["person","person_is_spi_income_band_carrier","bool"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_income_band_donors","stage_contract_sha256":"047ff55be7acca89a01859271a019428f42a40c38af4885625ec064f8ff213af","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by spi_income_band_donors.","id":"spi_income_band_donors.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"person_source_id","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"person_support_channel","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"person_support_clone_index","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_source_id","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_support_channel","dtype":"string","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_support_clone_index","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_source_id","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_support_channel","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_support_clone_index","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_is_spi_synthetic","dtype":"bool","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_is_spi_income_band_donor","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"spi_income_band_donor_lower_bound","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"person_is_spi_income_band_carrier","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_spi_income_band_donor","household.spi_income_band_donor_lower_bound","person.person_is_spi_income_band_carrier"]},"population":"spi_income_band_donors","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_spi_income_spine.","id":"hmrc_spi_income_spine","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","maintenance_expenses","childcare_expenses","salary_sacrifice_reported","salary_sacrifice_asked","ssmg_reported","incapacity_benefit_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","ossben_identifiable_subset","srp_regular_code5","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_spi_income_spine@1","mass":"conserve","outputs":[{"column":"charitable_investment_gifts","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"gift_aid","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"other_investment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employment_benefits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employment_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_other_social_security_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_taxable_termination_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_miscellaneous_employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_other_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_state_pension_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employed_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_total_earned_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_total_investment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_assessable_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employer_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_unemployment_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_incapacity_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"aa_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_spi_income_spine","stage_contract_sha256":"038505263ed7821e028773e041d9e923131df001ad31439d78d7eba5aa1ea64f","time_period":"2024"},"population":"spi_income_band_donors","sources":["frs"],"structural":"none","weights":null},{"base":"spi_income_band_donors","citation":"","description":"Ownership boundary before spi_housing_shell rewrites.","id":"spi_housing_shell.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage spi_housing_shell.","id":"spi_housing_shell","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["council_tax_single_adult_raw","household_support_channel","ons_household_type","region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","employment_income","is_household_head","other_investment_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported","would_claim_carers_allowance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.spi_housing_shell@1","mass":"conserve","outputs":[{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_housing_shell","stage_contract_sha256":"809f19fd33ff79ceda005e8cc3fa89ae40b297dceca26a7658b6259267987890","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage was_wealth.","id":"was_wealth","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.was_wealth@1","mass":"conserve","outputs":[{"column":"owned_land","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"property_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"corporate_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"private_pension_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"gross_financial_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"net_financial_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"main_residence_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"other_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"non_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"savings","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"num_vehicles","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cash_isa","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"stocks_and_shares_isa","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_debt","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"consumer_debt","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"student_loan_balance","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"was_wealth","stage_contract_sha256":"366e019c41ee2a28bcd61bbaa62a024ed0bb4b30b3ffc4d87ab23b340b4076bf","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage was_lisa.","id":"was_lisa","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.was_lisa@1","mass":"conserve","outputs":[{"column":"has_lifetime_isa","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"lifetime_isa_balance","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"household_lifetime_isa_balance","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"was_lisa","stage_contract_sha256":"f1d0f962e84d32007821b32e4e03a8af9443acc0ed3d1836ff094dcbacb928da","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"spi_housing_shell.boundary","citation":"","description":"Ownership boundary before regional_property_uprating rewrites.","id":"regional_property_uprating.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage regional_property_uprating.","id":"regional_property_uprating","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["household_lifetime_isa_balance","household_support_channel","region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.regional_property_uprating@1","mass":"conserve","outputs":[{"column":"main_residence_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_wealth","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"regional_property_uprating","stage_contract_sha256":"acb342e8ca1770556c5682a9411c5ead5d61dd1420cfe6b0305ed14a3407fb25","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage nts_bus_travel.","id":"nts_bus_travel","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.nts_bus_travel@1","mass":"conserve","outputs":[{"column":"local_bus_use_band","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"bus_in_london_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"other_local_bus_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"local_bus_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"bus_pass_eligible","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"local_bus_single_fare_share","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"household_local_bus_trips","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"nts_bus_travel","stage_contract_sha256":"cf854e8cf6edd006b677dcc67b63d6bb104d09eed93d7ee78bde6f0e838b9de9","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage lcfs_consumption.","id":"lcfs_consumption","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.lcfs_consumption@1","mass":"conserve","outputs":[{"column":"food_and_non_alcoholic_beverages_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"alcohol_and_tobacco_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"clothing_and_footwear_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"housing_water_and_electricity_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_furnishings_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"health_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"transport_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"communication_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"recreation_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"education_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"restaurants_and_hotels_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"miscellaneous_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"petrol_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"diesel_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"bus_fare_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"domestic_energy_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"electricity_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"gas_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"has_fuel_consumption","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"lcfs_consumption","stage_contract_sha256":"63079c6f53d507702b4b1fadcf30def5188baf1f17e026e9f89f285577fe9c60","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage etb_vat.","id":"etb_vat","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.etb_vat@1","mass":"conserve","outputs":[{"column":"full_rate_vat_expenditure_rate","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"etb_vat","stage_contract_sha256":"5a2b777d88315bcccb72477c088a136c634131e0bc1a339b7287217ee5cfd8d3","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage etb_services.","id":"etb_services","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.etb_services@1","mass":"conserve","outputs":[{"column":"dfe_education_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rail_subsidy_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"bus_subsidy_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rail_usage","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"a_and_e_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"admitted_patient_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"outpatient_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_a_and_e_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_admitted_patient_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_outpatient_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"etb_services","stage_contract_sha256":"37bfc4c0935ab99c5f270f307451cbf6cc6a85a3f8c6ce77429f6a6c66c07021","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"regional_property_uprating.boundary","citation":"","description":"Ownership boundary before uc_reporter_redraw rewrites.","id":"uc_reporter_redraw.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_reporter_redraw.","id":"uc_reporter_redraw","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_reporter_redraw@1","mass":"conserve","outputs":[{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_reporter_redraw","stage_contract_sha256":"7e94e034cad29c5bae566ffb875c42cddf3a1025c15496907e783ceff1144f8b","time_period":"2024"},"population":"uc_reporter_redraw.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_reporter_redraw.boundary","citation":"","description":"Ownership boundary before uc_capital_coherence rewrites.","id":"uc_capital_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_capital_coherence.","id":"uc_capital_coherence","inputs":[{"columns":["benunit_support_channel","dependent_children","is_married"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","is_benunit_head","is_parent","person_support_channel","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_capital_coherence@1","mass":"conserve","outputs":[{"column":"uc_reported_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_capital_coherence","stage_contract_sha256":"059f27ee687ee15385b246d43068b17aeecbe3645ccc41fd52fcad06a006a081","time_period":"2024"},"population":"uc_capital_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_deduction_attributes.","id":"uc_deduction_attributes","inputs":[{"columns":["frs_benunit_capital","would_claim_uc"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_deduction_attributes@1","mass":"conserve","outputs":[{"column":"uc_deduction_random_draw","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_deduction_type_random_draw","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_latent_deduction_rate","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_deduction_combination","dtype":"string","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_deduction_attributes","stage_contract_sha256":"6bc7e3ec1a5712e23ca1b7d2956e8b17f2526b94431ba3e5a9294b04658e4fe0","time_period":"2024"},"population":"uc_capital_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"uc_capital_coherence.boundary","citation":"","description":"Run structural UK stage cgt_support_split.","id":"cgt_support_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_support_split@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_cgt_support_copy","bool"],["household","cgt_support_copies","int64"],["household","cgt_support_copy_index","int64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_support_split","stage_contract_sha256":"556e2db7907ad62920149da9104150997031e3cfddbdb4610075369d77147499","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_support_split.","id":"cgt_support_split.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_cgt_support_copy","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_support_copies","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_support_copy_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_cgt_support_copy","household.cgt_support_copies","household.cgt_support_copy_index"]},"population":"cgt_support_split","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"cgt_support_split","citation":"","description":"Run structural UK stage cgt_incidence_clone.","id":"cgt_incidence_clone","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_incidence_clone@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_capital_gains_clone","bool"],["person","capital_gains","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_incidence_clone","stage_contract_sha256":"ee30278543cc0297a5366d855b7753aa04af5518971594c193c52be36bf8a7b4","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_incidence_clone.","id":"cgt_incidence_clone.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_capital_gains_clone","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_capital_gains_clone","person.capital_gains"]},"population":"cgt_incidence_clone","sources":[],"structural":"none","weights":null},{"base":"cgt_incidence_clone","citation":"","description":"Ownership boundary before hmrc_cgt_gains_spine rewrites.","id":"hmrc_cgt_gains_spine.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index","household_is_capital_gains_clone"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_cgt_gains_spine.","id":"hmrc_cgt_gains_spine","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["cgt_support_copies","corporate_wealth","gross_financial_wealth","household_is_cgt_support_copy","non_residential_property_value","other_residential_property_value","region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","employment_income","miscellaneous_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported","tax_free_savings_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_cgt_gains_spine@1","mass":"conserve","outputs":[{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_cgt_gains_spine","stage_contract_sha256":"49717d6586a4a5d7fc370200c71c0f91d01473158454571c056deb6f5618d562","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_cgt_asset_type_spine.","id":"hmrc_cgt_asset_type_spine","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["corporate_wealth","gross_financial_wealth","other_residential_property_value","region","stocks_and_shares_isa"],"entity":"household","rows":"all"},{"columns":["age","capital_gains","dividend_income","property_income","self_employment_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_cgt_asset_type_spine@1","mass":"conserve","outputs":[{"column":"capital_gains_asset_type","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"capital_gains_residential_property","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"capital_gains_badr","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_cgt_asset_type_spine","stage_contract_sha256":"5f9a5f2d12e2a7db87c7c0d6f0df6f70875a579e90c39b2b8c48943eac43905e","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"hmrc_cgt_gains_spine.boundary","citation":"","description":"Run structural UK stage cgt_incidence_anchor.","id":"cgt_incidence_anchor","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["household_is_capital_gains_clone","region"],"entity":"household","rows":"all"},{"columns":["age","capital_gains","capital_gains_badr","dividend_income","employment_income","miscellaneous_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_incidence_anchor@1","mass":"conserve","outputs":[],"params":{"expand_cells":[],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_incidence_anchor","stage_contract_sha256":"b79ce806015de2f1e1703fa68bf4ad871c6df54b5b32633c864632ab68919a48","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage salary_sacrifice.","id":"salary_sacrifice","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index","household_is_capital_gains_clone"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","capital_gains","capital_gains_asset_type","capital_gains_residential_property","capital_gains_badr"],"entity":"person","rows":"all"}],"kernel":"uk.stage.salary_sacrifice@1","mass":"conserve","outputs":[{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"salary_sacrifice","stage_contract_sha256":"89b589d19fcb99b265cb40d08cf2b9ff7955bd41b6de0e8c9ff4dc6f35be1eb6","time_period":"2024"},"population":"cgt_incidence_anchor","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage student_loans.","id":"student_loans","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","current_education","employee_pension_contributions","highest_education","student_loan_repayments","student_loans"],"entity":"person","rows":"all"}],"kernel":"uk.stage.student_loans@1","mass":"conserve","outputs":[{"column":"student_loan_plan","dtype":"string","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"student_loans","stage_contract_sha256":"f2936c5e22a0e9b097437e3f3aabaf06c4561d5c25a9b7c05e720a6553f73bbc","time_period":"2024"},"population":"cgt_incidence_anchor","sources":["frs"],"structural":"none","weights":null}],"sources":[{"codec":"csv-tables","description":"Content-bound UK FRS and donor fixture/source bundle.","name":"frs"}]} +{"country":"uk","nodes":[{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Load the source-bound UK FRS root population.","id":"create_uk_frs","inputs":[],"kernel":"uk.create@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"gender","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"marital_status","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"hours_worked","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"care_hours","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_household_head","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_benunit_head","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_parent","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_uc_claimant","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"maintenance_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"miscellaneous_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"private_transfer_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"lump_sum_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"student_loan_repayments","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"statutory_sick_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"statutory_maternity_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"student_loans","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"access_fund","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"healthy_start_vouchers","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_breakfasts","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_fruit_veg","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_meals","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"maintenance_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"childcare_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"salary_sacrifice_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"salary_sacrifice_asked","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"incapacity_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"is_married","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"dependent_children","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"region","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_single_adult_raw","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"external_child_payments","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"sample_fraction":1.0,"sample_seed":578,"stage_contract_sha256":"047d30937efb21e39259fdbed5597751e4f5a0c341ea583c7446e4c9c11eba48","time_period":"2024"},"population":null,"sources":["frs"],"structural":"create","weights":null},{"base":"create_uk_frs","citation":"","description":"Ownership boundary for the source-assembling root stage.","id":"frs_spine.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Claim the cells assembled by the UK FRS root transform.","id":"frs_spine","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"gender","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"marital_status","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hours_worked","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"care_hours","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_household_head","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_benunit_head","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_parent","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_uc_claimant","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maintenance_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"miscellaneous_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_transfer_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"lump_sum_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"student_loan_repayments","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"statutory_sick_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"statutory_maternity_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"student_loans","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"access_fund","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"healthy_start_vouchers","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_breakfasts","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_fruit_veg","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_meals","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maintenance_expenses","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"childcare_expenses","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_asked","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"incapacity_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_married","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dependent_children","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"region","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_single_adult_raw","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"external_child_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{},"population":"frs_spine.boundary","sources":[],"structural":"none","weights":null},{"base":"frs_spine.boundary","citation":"","description":"Ownership boundary before age_tail rewrites.","id":"age_tail.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage age_tail.","id":"age_tail","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["external_child_payments","region"],"entity":"household","rows":"all"},{"columns":["gender"],"entity":"person","rows":"all"}],"kernel":"uk.stage.age_tail@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"age_tail","stage_contract_sha256":"963a34f38caede2525e3b8735f904bb70a1bbef5a272f0eefd4346343444484f","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_relationships.","id":"frs_relationships","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","is_household_head"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_relationships@1","mass":"conserve","outputs":[{"column":"relationship_to_head","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_family_role","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_family_index","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_household_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_relationships","stage_contract_sha256":"30628808d06d9829ebcbcf460cd355a01261e78c7c73e6006c75bec2e3d60c33","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_employment.","id":"frs_employment","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["ons_household_type","region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_employment@1","mass":"conserve","outputs":[{"column":"employment_status","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_sector","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"sic_industry_division","dtype":"int64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_employment","stage_contract_sha256":"ddbefaf05b44788d794a6e4b0e8926c14318d66e50d2f11f50ca549538bbf60c","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_council_tax.","id":"frs_council_tax","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","sic_industry_division"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_council_tax@1","mass":"conserve","outputs":[{"column":"council_tax","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_council_tax","stage_contract_sha256":"3381cd9f7a736514d5073c57480e07f5098890f3ca9ed3865392043594771eb9","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_disability.","id":"frs_disability","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["council_tax","region"],"entity":"household","rows":"all"},{"columns":["afcs_reported","age","attendance_allowance_reported","dla_m_reported","dla_sc_reported","esa_contrib_reported","esa_income_reported","iidb_reported","incapacity_benefit_reported","pip_dl_reported","pip_m_reported","sda_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_disability@1","mass":"conserve","outputs":[{"column":"aa_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_sc_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_m_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_m_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_dl_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_disability","stage_contract_sha256":"ac500b4cb1bc04d4fb72d198592dd376d61da8c150921a6ac53914ac18be0508","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_education.","id":"frs_education","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","esa_contrib_reported","esa_income_reported","is_severely_disabled_for_benefits","jsa_contrib_reported","jsa_income_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_education@1","mass":"conserve","outputs":[{"column":"current_education","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"highest_education","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"is_in_non_advanced_education","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_in_approved_training","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"age_started_or_accepted_current_education_or_training","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_before_universal_credit_qualifying_young_person_terminal_date","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"adult_ema","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_ema","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"receives_benefits_in_own_right","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_education","stage_contract_sha256":"836cb0f5a582fee1425190e96c9cb81bdef859bd236c8b6bc27660b6e3d0c2f8","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_legacy_proxies.","id":"frs_legacy_proxies","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_legacy_proxies@1","mass":"conserve","outputs":[{"column":"legacy_jobseeker_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_health_condition_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_support_group_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_legacy_proxies","stage_contract_sha256":"1ecf761cf3fa7180da15659e138e67a8654e58272b4fde28344aa27a874ad0aa","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"age_tail.boundary","citation":"","description":"Ownership boundary before frs_education_grant_split rewrites.","id":"frs_education_grant_split.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_education_grant_split.","id":"frs_education_grant_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_education_grant_split@1","mass":"conserve","outputs":[{"column":"disabled_students_allowance_eligible_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_education_grant_split","stage_contract_sha256":"8718f014b90498c2cc7c754289775ca4a41452d9b978d8cbc5f34b64cbdc7df2","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_take_up.","id":"frs_take_up","inputs":[{"columns":["frs_benunit_capital","is_married"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","child_benefit_reported","education_grants","pension_credit_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_child_benefit","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"child_benefit_opts_out","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_pc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_tfc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_extended_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_universal_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_targeted_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_uc_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"maximum_extended_childcare_hours_usage","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_take_up","stage_contract_sha256":"067d31b7fbe733d1d182588705e9ce79df0c8e5f6e8f519314765af49b1b00d7","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_person_draws.","id":"frs_person_draws","inputs":[{"columns":["frs_benunit_capital","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_person_draws@1","mass":"conserve","outputs":[{"column":"would_claim_marriage_allowance","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"would_claim_scp","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"attends_private_school_random_draw","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"tax_free_childcare_spend_routed_share","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_person_draws","stage_contract_sha256":"5b9b4b7ad87cdc16f96a7f2ee0794946a308011b529956d8adf8ab53d704ede2","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_household_draws.","id":"frs_household_draws","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_household_draws@1","mass":"conserve","outputs":[{"column":"household_owns_tv","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"would_evade_tv_licence_fee","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"main_residential_property_purchased_is_first_home","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"property_purchased","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_household_draws","stage_contract_sha256":"c74c63b09264319c4bf0049dabba00ecd0ce660beb7b53d6dae71518434bc949","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_brma.","id":"frs_brma","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_brma@1","mass":"conserve","outputs":[{"column":"brma","dtype":"string","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_brma","stage_contract_sha256":"5b8f0b361310c7cd3efbaae3762b347649b7d4afb9e9943131d9bef9266fc3c8","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"frs_education_grant_split.boundary","citation":"","description":"Freeze the assembled-spine gate population.","id":"frs_brma.checkpoint","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_hmrc_spine_leaves.","id":"frs_hmrc_spine_leaves","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["brma","region"],"entity":"household","rows":"all"},{"columns":["age","employment_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_hmrc_spine_leaves@1","mass":"conserve","outputs":[{"column":"hmrc_spi_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_unemployment_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_incapacity_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ossben_identifiable_subset","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"srp_regular_code5","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employer_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_hmrc_spine_leaves","stage_contract_sha256":"8cfab42bcc250fdf1161b22e4fd988fbe8a0473af78f99afea4b1017556633ae","time_period":"2024"},"population":"frs_brma.checkpoint","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"frs_brma.checkpoint","citation":"","description":"Run structural UK stage spi_support_channel.","id":"spi_support_channel","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.spi_support_channel@1","mass":"declared","outputs":[],"params":{"expand_cells":[["person","person_source_id","int64"],["person","person_support_channel","string"],["person","person_support_clone_index","int64"],["benunit","benunit_source_id","int64"],["benunit","benunit_support_channel","string"],["benunit","benunit_support_clone_index","int64"],["household","source_household_id","int64"],["household","source_year","int64"],["household","source_household_key","string"],["household","household_source_id","int64"],["household","household_support_channel","string"],["household","household_support_clone_index","int64"],["household","household_is_spi_synthetic","bool"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_support_channel","stage_contract_sha256":"2c682605139c0a8f96e8ba45a2c03f506d3f758ef437841066a8fdb8b74269b6","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by spi_support_channel.","id":"spi_support_channel.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"person_source_id","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"person_support_channel","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"person_support_clone_index","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"benunit_source_id","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"benunit_support_channel","dtype":"string","entity":"benunit","ownership":"produced","rows":"all"},{"column":"benunit_support_clone_index","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"source_household_id","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"source_year","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"source_household_key","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"household_source_id","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_support_channel","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"household_support_clone_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_is_spi_synthetic","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["person.person_source_id","person.person_support_channel","person.person_support_clone_index","benunit.benunit_source_id","benunit.benunit_support_channel","benunit.benunit_support_clone_index","household.source_household_id","household.source_year","household.source_household_key","household.household_source_id","household.household_support_channel","household.household_support_clone_index","household.household_is_spi_synthetic"]},"population":"spi_support_channel","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"spi_support_channel","citation":"","description":"Run structural UK stage spi_income_band_donors.","id":"spi_income_band_donors","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.spi_income_band_donors@1","mass":"free","outputs":[],"params":{"expand_cells":[["person","person_source_id","int64"],["person","person_support_channel","string"],["person","person_support_clone_index","int64"],["benunit","benunit_source_id","int64"],["benunit","benunit_support_channel","string"],["benunit","benunit_support_clone_index","int64"],["household","household_source_id","int64"],["household","household_support_channel","string"],["household","household_support_clone_index","int64"],["household","household_is_spi_synthetic","bool"],["household","household_is_spi_income_band_donor","bool"],["household","spi_income_band_donor_lower_bound","float64"],["person","person_is_spi_income_band_carrier","bool"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_income_band_donors","stage_contract_sha256":"190a40ab145b001993733553f45b3e8e5adfe999f598231481ab6706447d5f3c","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by spi_income_band_donors.","id":"spi_income_band_donors.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"person_source_id","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"person_support_channel","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"person_support_clone_index","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_source_id","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_support_channel","dtype":"string","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_support_clone_index","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_source_id","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_support_channel","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_support_clone_index","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_is_spi_synthetic","dtype":"bool","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_is_spi_income_band_donor","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"spi_income_band_donor_lower_bound","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"person_is_spi_income_band_carrier","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_spi_income_band_donor","household.spi_income_band_donor_lower_bound","person.person_is_spi_income_band_carrier"]},"population":"spi_income_band_donors","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_spi_income_spine.","id":"hmrc_spi_income_spine","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","maintenance_expenses","childcare_expenses","salary_sacrifice_reported","salary_sacrifice_asked","ssmg_reported","incapacity_benefit_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","ossben_identifiable_subset","srp_regular_code5","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_spi_income_spine@1","mass":"conserve","outputs":[{"column":"charitable_investment_gifts","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"gift_aid","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"other_investment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employment_benefits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employment_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_other_social_security_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_taxable_termination_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_miscellaneous_employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_other_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_state_pension_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employed_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_total_earned_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_total_investment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_assessable_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employer_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_unemployment_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_incapacity_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"aa_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_spi_income_spine","stage_contract_sha256":"834334536c1c6add6648b801272c61ca2f597a54c82553a943667200b9e6c4ce","time_period":"2024"},"population":"spi_income_band_donors","sources":["frs"],"structural":"none","weights":null},{"base":"spi_income_band_donors","citation":"","description":"Ownership boundary before spi_housing_shell rewrites.","id":"spi_housing_shell.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage spi_housing_shell.","id":"spi_housing_shell","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["council_tax_single_adult_raw","household_support_channel","ons_household_type","region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","employment_income","is_household_head","other_investment_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported","would_claim_carers_allowance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.spi_housing_shell@1","mass":"conserve","outputs":[{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_housing_shell","stage_contract_sha256":"809f19fd33ff79ceda005e8cc3fa89ae40b297dceca26a7658b6259267987890","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage was_wealth.","id":"was_wealth","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.was_wealth@1","mass":"conserve","outputs":[{"column":"owned_land","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"property_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"corporate_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"private_pension_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"gross_financial_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"net_financial_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"main_residence_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"other_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"non_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"savings","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"num_vehicles","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cash_isa","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"stocks_and_shares_isa","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_debt","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"consumer_debt","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"student_loan_balance","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"was_wealth","stage_contract_sha256":"366e019c41ee2a28bcd61bbaa62a024ed0bb4b30b3ffc4d87ab23b340b4076bf","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage was_lisa.","id":"was_lisa","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.was_lisa@1","mass":"conserve","outputs":[{"column":"has_lifetime_isa","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"lifetime_isa_balance","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"household_lifetime_isa_balance","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"was_lisa","stage_contract_sha256":"f1d0f962e84d32007821b32e4e03a8af9443acc0ed3d1836ff094dcbacb928da","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"spi_housing_shell.boundary","citation":"","description":"Ownership boundary before regional_property_uprating rewrites.","id":"regional_property_uprating.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage regional_property_uprating.","id":"regional_property_uprating","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["household_lifetime_isa_balance","household_support_channel","region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.regional_property_uprating@1","mass":"conserve","outputs":[{"column":"main_residence_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_wealth","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"regional_property_uprating","stage_contract_sha256":"acb342e8ca1770556c5682a9411c5ead5d61dd1420cfe6b0305ed14a3407fb25","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage nts_bus_travel.","id":"nts_bus_travel","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.nts_bus_travel@1","mass":"conserve","outputs":[{"column":"local_bus_use_band","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"bus_in_london_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"other_local_bus_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"local_bus_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"bus_pass_eligible","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"local_bus_single_fare_share","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"household_local_bus_trips","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"nts_bus_travel","stage_contract_sha256":"59767eeb246755f4636e2abbbc9ab3370a64c6142e01cda21a12cb01be95e535","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage lcfs_consumption.","id":"lcfs_consumption","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.lcfs_consumption@1","mass":"conserve","outputs":[{"column":"food_and_non_alcoholic_beverages_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"alcohol_and_tobacco_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"clothing_and_footwear_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"housing_water_and_electricity_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_furnishings_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"health_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"transport_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"communication_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"recreation_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"education_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"restaurants_and_hotels_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"miscellaneous_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"petrol_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"diesel_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"bus_fare_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"domestic_energy_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"electricity_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"gas_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"has_fuel_consumption","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"lcfs_consumption","stage_contract_sha256":"f428215b7d66e1297688cfc8dce94e670268fb26a6681ca5f0e6e0641cfaf076","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage etb_vat.","id":"etb_vat","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.etb_vat@1","mass":"conserve","outputs":[{"column":"full_rate_vat_expenditure_rate","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"etb_vat","stage_contract_sha256":"5a2b777d88315bcccb72477c088a136c634131e0bc1a339b7287217ee5cfd8d3","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage etb_services.","id":"etb_services","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.etb_services@1","mass":"conserve","outputs":[{"column":"dfe_education_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rail_subsidy_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"bus_subsidy_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rail_usage","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"a_and_e_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"admitted_patient_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"outpatient_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_a_and_e_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_admitted_patient_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_outpatient_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"etb_services","stage_contract_sha256":"991be160f2f2c28cf7eadc911b3214aca8bf5be441676fe21a87ba12888c5c25","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"regional_property_uprating.boundary","citation":"","description":"Ownership boundary before uc_reporter_redraw rewrites.","id":"uc_reporter_redraw.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_reporter_redraw.","id":"uc_reporter_redraw","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_reporter_redraw@1","mass":"conserve","outputs":[{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_reporter_redraw","stage_contract_sha256":"7e94e034cad29c5bae566ffb875c42cddf3a1025c15496907e783ceff1144f8b","time_period":"2024"},"population":"uc_reporter_redraw.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_reporter_redraw.boundary","citation":"","description":"Ownership boundary before uc_capital_coherence rewrites.","id":"uc_capital_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_capital_coherence.","id":"uc_capital_coherence","inputs":[{"columns":["benunit_support_channel","dependent_children","is_married"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","is_benunit_head","is_parent","person_support_channel","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_capital_coherence@1","mass":"conserve","outputs":[{"column":"uc_reported_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_capital_coherence","stage_contract_sha256":"059f27ee687ee15385b246d43068b17aeecbe3645ccc41fd52fcad06a006a081","time_period":"2024"},"population":"uc_capital_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_capital_coherence.boundary","citation":"","description":"Ownership boundary before pension_credit_take_up rewrites.","id":"pension_credit_take_up.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage pension_credit_take_up.","id":"pension_credit_take_up","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.pension_credit_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_pc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"pension_credit_take_up","stage_contract_sha256":"5f2f0410ec296be7119d7f58365658e72ee46b5e4397c37f97ce01e911a98960","time_period":"2024"},"population":"pension_credit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_deduction_attributes.","id":"uc_deduction_attributes","inputs":[{"columns":["frs_benunit_capital","would_claim_pc"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_deduction_attributes@1","mass":"conserve","outputs":[{"column":"uc_deduction_random_draw","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_deduction_type_random_draw","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_latent_deduction_rate","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_deduction_combination","dtype":"string","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_deduction_attributes","stage_contract_sha256":"6bc7e3ec1a5712e23ca1b7d2956e8b17f2526b94431ba3e5a9294b04658e4fe0","time_period":"2024"},"population":"pension_credit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"pension_credit_take_up.boundary","citation":"","description":"Run structural UK stage cgt_support_split.","id":"cgt_support_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_support_split@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_cgt_support_copy","bool"],["household","cgt_support_copies","int64"],["household","cgt_support_copy_index","int64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_support_split","stage_contract_sha256":"30b37e1c4e122db18391c5f76f1a6d432aea970275bcda7a52126dacc923490b","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_support_split.","id":"cgt_support_split.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_cgt_support_copy","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_support_copies","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_support_copy_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_cgt_support_copy","household.cgt_support_copies","household.cgt_support_copy_index"]},"population":"cgt_support_split","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"cgt_support_split","citation":"","description":"Run structural UK stage cgt_incidence_clone.","id":"cgt_incidence_clone","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_incidence_clone@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_capital_gains_clone","bool"],["person","capital_gains","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_incidence_clone","stage_contract_sha256":"ee30278543cc0297a5366d855b7753aa04af5518971594c193c52be36bf8a7b4","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_incidence_clone.","id":"cgt_incidence_clone.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_capital_gains_clone","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_capital_gains_clone","person.capital_gains"]},"population":"cgt_incidence_clone","sources":[],"structural":"none","weights":null},{"base":"cgt_incidence_clone","citation":"","description":"Ownership boundary before hmrc_cgt_gains_spine rewrites.","id":"hmrc_cgt_gains_spine.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index","household_is_capital_gains_clone"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_cgt_gains_spine.","id":"hmrc_cgt_gains_spine","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["cgt_support_copies","corporate_wealth","gross_financial_wealth","household_is_cgt_support_copy","non_residential_property_value","other_residential_property_value","region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","employment_income","miscellaneous_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported","tax_free_savings_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_cgt_gains_spine@1","mass":"conserve","outputs":[{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_cgt_gains_spine","stage_contract_sha256":"ff740a36b03dcda73b889aa43bde7cff5d178de7b3da38e487320c68342bf9a3","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_cgt_asset_type_spine.","id":"hmrc_cgt_asset_type_spine","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["corporate_wealth","gross_financial_wealth","other_residential_property_value","region","stocks_and_shares_isa"],"entity":"household","rows":"all"},{"columns":["age","capital_gains","dividend_income","property_income","self_employment_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_cgt_asset_type_spine@1","mass":"conserve","outputs":[{"column":"capital_gains_asset_type","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"capital_gains_residential_property","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"capital_gains_badr","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_cgt_asset_type_spine","stage_contract_sha256":"c918223197c706279b37d1b32d0ff3885fb1cd7b65b2e50d0308ab508ed0ed64","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"hmrc_cgt_gains_spine.boundary","citation":"","description":"Run structural UK stage cgt_incidence_anchor.","id":"cgt_incidence_anchor","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["household_is_capital_gains_clone","region"],"entity":"household","rows":"all"},{"columns":["age","capital_gains","capital_gains_badr","dividend_income","employment_income","miscellaneous_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_incidence_anchor@1","mass":"conserve","outputs":[],"params":{"expand_cells":[],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_incidence_anchor","stage_contract_sha256":"b79ce806015de2f1e1703fa68bf4ad871c6df54b5b32633c864632ab68919a48","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage salary_sacrifice.","id":"salary_sacrifice","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index","household_is_capital_gains_clone"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_uc_claimant","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","capital_gains","capital_gains_asset_type","capital_gains_residential_property","capital_gains_badr"],"entity":"person","rows":"all"}],"kernel":"uk.stage.salary_sacrifice@1","mass":"conserve","outputs":[{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"salary_sacrifice","stage_contract_sha256":"b4581ac43437c170dbe6369392630a832c1f18e99c113753984be6e57b5b18cd","time_period":"2024"},"population":"cgt_incidence_anchor","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage student_loans.","id":"student_loans","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","current_education","employment_income","highest_education","student_loan_repayments","student_loans"],"entity":"person","rows":"all"}],"kernel":"uk.stage.student_loans@1","mass":"conserve","outputs":[{"column":"student_loan_plan","dtype":"string","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.100.0"],["policyengine-core","3.32.5"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"student_loans","stage_contract_sha256":"f2936c5e22a0e9b097437e3f3aabaf06c4561d5c25a9b7c05e720a6553f73bbc","time_period":"2024"},"population":"cgt_incidence_anchor","sources":["frs"],"structural":"none","weights":null}],"sources":[{"codec":"csv-tables","description":"Content-bound UK FRS and donor fixture/source bundle.","name":"frs"}]} diff --git a/test_support/microcosm_build/ledger_monthly_count_x_mean.py b/test_support/microcosm_build/ledger_monthly_count_x_mean.py new file mode 100644 index 000000000..232c2d51b --- /dev/null +++ b/test_support/microcosm_build/ledger_monthly_count_x_mean.py @@ -0,0 +1,114 @@ +"""Stat-Xplore-shaped count and mean facts for the count x mean window tests.""" + +from __future__ import annotations + +from microcosm.build.ledger_targets import ( + MONTHLY_WINDOW_COUNT_X_MEAN, + LedgerTargetReference, +) + +COUNT = "dwp.state_pension_recipients" +MEAN = "dwp.state_pension_mean_weekly_amount" +MONTHS = ("2025-02", "2025-05", "2025-08", "2025-11") + + +def statx_fact( + month: str, + role: str, + value: float, + *, + group: str = "all", + release: str = "stat_xplore_2026_09_29", + sha: str = "a" * 64, +) -> dict[str, object]: + stamp = month.replace("-", "_") + mean = role == "mean" + record_set = "dwp.statx.state_pension.type" + (".mean" if mean else "") + return { + "aggregate_fact_key": f"ledger.aggregate_fact.v2:{role}-{group}-{stamp}", + "semantic_fact_key": f"ledger.semantic_fact.v2:{role}-{group}", + "label": f"Great Britain {month} State Pension {role}", + "source_release_key": release, + "value": value, + "period": {"type": "month", "value": month}, + "geography": { + "level": "country", + "id": "K03000001", + "name": "Great Britain", + "vintage": "current", + }, + "entity": {"name": "person", "role": "claimant"}, + "observed_measure": { + "source_name": "dwp", + "source_measure_id": "mean_weekly_amount" if mean else "recipients", + "source_concept": "dwp.state_pension_mean_weekly_amount" + if mean + else "dwp.state_pension_caseload", + "unit": "gbp_per_week" if mean else "count", + }, + "concept_alignment": { + "source_concept": "dwp.state_pension_mean_weekly_amount" + if mean + else "dwp.state_pension_caseload", + "canonical_concept": MEAN if mean else COUNT, + "relation": "source_label", + "authority": "dwp", + }, + "aggregation": {"method": "mean" if mean else "sum"}, + "source": { + "source_name": "dwp", + "source_table": "State Pension caseload and mean weekly amount", + "source_file": "state_pension_by_type.json", + "source_sha256": sha, + "vintage": "stat_xplore_2026_09_29", + }, + "dimensions": {"category_of_pension": group}, + "universe_constraints": {"domain": "social_security"}, + "layout": { + "record_set_id": f"{record_set}.month{stamp}", + "record_set_spec_id": f"{record_set}.month{stamp}.v1", + "groupby_dimension": "dwp.state_pension_type", + "groupby_value_id": group, + "measure_id": "mean_weekly_amount" if mean else "recipients", + }, + } + + +def statx_window(counts, means, **kwargs) -> list[dict[str, object]]: + return [ + fact + for month, count, mean in zip(MONTHS, counts, means, strict=True) + for fact in ( + statx_fact(month, "count", count, **kwargs), + statx_fact(month, "mean", mean, **kwargs), + ) + ] + + +def window_reference(**overrides) -> LedgerTargetReference: + fields = { + "name": "dwp/state_pension/amount", + "ledger_selector": { + "source_name": "dwp", + "source_concept": [ + "dwp.state_pension_caseload", + "dwp.state_pension_mean_weekly_amount", + ], + "geography_id": "K03000001", + "dimension_values": {"category_of_pension": "all"}, + "period_type": "month", + "period_value": list(MONTHS), + }, + "value_operation": MONTHLY_WINDOW_COUNT_X_MEAN, + "period_match_policy": "source_window", + "value_operands": ( + {"role": "count", "concept": COUNT}, + {"role": "mean", "concept": MEAN, "period_factor": 52}, + ), + "entity": "person", + "measure": "state_pension", + "period": 2025, + "family": "dwp_state_pension", + } + fields.update(overrides) + return LedgerTargetReference(**fields) diff --git a/test_support/microcosm_build/uk_hmrc_uprating.py b/test_support/microcosm_build/uk_hmrc_uprating.py index 65ab5dfec..df90a072b 100644 --- a/test_support/microcosm_build/uk_hmrc_uprating.py +++ b/test_support/microcosm_build/uk_hmrc_uprating.py @@ -18,6 +18,9 @@ UK_ENGINE_INDEX_PARAMETERS, UK_ENGINE_PARAMETER_INDEX_PREFIX, UK_HMRC_TAXPAYER_GROWTH_INDEX_CONCEPT, + UK_SPI_STATE_PENSION_AMOUNT_INDEX_CONCEPT, + UK_SPI_STATE_PENSION_RATE_PARAMETER, + align_hmrc_amount_by_recipient_growth_and_rate, align_hmrc_count_row_by_taxpayer_growth, align_hmrc_row_by_engine_index, engine_parameter_value, diff --git a/tools/build_uk_ledger_compile_parity_signed_differences.py b/tools/build_uk_ledger_compile_parity_signed_differences.py index d2f0c4899..7f897fa19 100644 --- a/tools/build_uk_ledger_compile_parity_signed_differences.py +++ b/tools/build_uk_ledger_compile_parity_signed_differences.py @@ -110,6 +110,25 @@ class ParityReceiptSpec: "dwp.esa_contrib_claimants", "dwp.esa_income_claimants", ) + +#: microcosm#1069: the resident State Pension level replaces the OBR line in +#: the fit (ruling R4); the exact OBR forecast stays as diagnostic provenance. +_OBR_STATE_PENSION_DIAGNOSTIC_RATIONALE = ( + "microcosm#1069 (ruling R4) moves the OBR FY2025-26 State Pension forecast " + "out of the fit: it counts Great Britain plus pensioners paid abroad and " + "leaves out Northern Ireland, a different quantity from the resident level " + "the DWP Stat-Xplore and DfC rows bind. The exact forecast is retained as " + "diagnostic provenance on dwp.state_pension.amount, so the frozen fixture's " + "fitted row is fixture-only on the current surface." +) +_STATE_PENSION_PREFIXES = ("dwp.state_pension.", "dfc_ni.state_pension.") +_STATE_PENSION_LEDGER_ONLY_RATIONALE = ( + "microcosm#1069 binds the resident State Pension from DWP Stat-Xplore (Great " + "Britain) and DfC (Northern Ireland) on the four quarterly points inside " + "calendar 2025 (PolicyEngine/chronicle#302 via #305): the level, age band by " + "sex by type, area by type and weekly amount band by type. The frozen fixture " + "has no State Pension caseload or resident-level row." +) _INCOME_ANCHOR_PREFIXES = ("hmrc.itl.", "hmrc.spi.savings_interest_income.") _CGT_OBSERVED_RATIONALES = { @@ -593,6 +612,13 @@ def _add_signed_rationale_notes( row["reason"] = _WELSHGOV_COUNTRY_BASIS_RATIONALE elif name.startswith("welshgov.council_tax_stock.band_i"): row["reason"] = _WELSH_BAND_I_LEDGER_ONLY_RATIONALE + elif name == "obr.state_pension" and row.get("kind") == "fixture_only": + row["reason"] = _OBR_STATE_PENSION_DIAGNOSTIC_RATIONALE + elif ( + name.startswith(_STATE_PENSION_PREFIXES) + and row.get("kind") == "ledger_only" + ): + row["reason"] = _STATE_PENSION_LEDGER_ONLY_RATIONALE elif fixture_resource != "registry_parity_fixture_2025.json": continue elif name in _CGT_OBSERVED_RATIONALES: diff --git a/tools/build_uk_release_input_coverage_manifest.py b/tools/build_uk_release_input_coverage_manifest.py index e8fbd8e4d..e44d8dec7 100644 --- a/tools/build_uk_release_input_coverage_manifest.py +++ b/tools/build_uk_release_input_coverage_manifest.py @@ -1038,10 +1038,11 @@ def _hmrc_family_coverage_contract( *, candidate_source: dict[str, Any], ) -> dict[str, Any]: + from microcosm.build.source_manifest import SourceStageSpec from microcosm.build.uk_runtime.hmrc_source_contract import ( assert_uk_hmrc_income_source_contract_current, ) - from microcosm.build.uk_runtime.spi_support import SPI_PRIOR_MASS_CHANGE_REASON + from microcosm.build.uk_runtime.spi_spine import uk_spi_support_mass_change_reason assert_uk_hmrc_income_source_contract_current(SOURCE_STAGES_PATH) payload = _load(SOURCE_STAGES_PATH) @@ -1118,7 +1119,9 @@ def _hmrc_family_coverage_contract( ), }, "spi_prior_national_household_mass_share": float(prior["share"]), - "required_mass_change_reason": SPI_PRIOR_MASS_CHANGE_REASON, + "required_mass_change_reason": uk_spi_support_mass_change_reason( + SourceStageSpec.from_mapping(stages["spi_support_channel"]) + ), "input_weight_kind": str(classification["input_weight_kind"]), "output_weight_kind": str(classification["output_weight_kind"]), "calibration_permitted": bool(classification["calibration_permitted"]), diff --git a/tools/diagnose_uk_uc_lp_evidence.py b/tools/diagnose_uk_uc_lp_evidence.py index 960a6a922..8e3312bd2 100644 --- a/tools/diagnose_uk_uc_lp_evidence.py +++ b/tools/diagnose_uk_uc_lp_evidence.py @@ -576,7 +576,7 @@ def bounded_redistribution(run): in [ "obr.income_tax@2025", "obr.ni@2025", - "obr.state_pension@2025", + "dwp.state_pension.amount@2025", "obr.child_benefit@2025", ] ], diff --git a/tools/diagnose_uk_uc_support.py b/tools/diagnose_uk_uc_support.py index 7891bc978..8da101cea 100644 --- a/tools/diagnose_uk_uc_support.py +++ b/tools/diagnose_uk_uc_support.py @@ -255,7 +255,9 @@ def supported_uc_probe(matrix, targets, prior, names, rows, tolerance=0.05): def protected_subset_probe(matrix, targets, prior, names, tolerance=0.05): - obr = ["obr.income_tax", "obr.ni", "obr.state_pension", "obr.child_benefit"] + # The bound State Pension level (microcosm#1069 moved the OBR line to a + # diagnostic). + obr = ["obr.income_tax", "obr.ni", "dwp.state_pension.amount", "obr.child_benefit"] employment = [ str(name).rsplit("@", 1)[0] for name in names diff --git a/tools/generate_uk_target_references.py b/tools/generate_uk_target_references.py index 06ca40871..d3334ae1f 100644 --- a/tools/generate_uk_target_references.py +++ b/tools/generate_uk_target_references.py @@ -34,6 +34,7 @@ UK_GEOGRAPHY_IDS = { "uk": "K02000001", "great_britain": "K03000001", + "england_and_wales": "K04000001", "england": "E92000001", "scotland": "S92000003", "wales": "W92000004", @@ -435,6 +436,14 @@ def _geography_composition( ("welshgov.", "wales"), ("nithc.", "northern_ireland"), ("dfi_ni.", "northern_ireland"), + # Northern Ireland's State Pension and Pension Credit come from DfC, not + # DWP (Chronicle stamps them N92000002); the substring rule sees no nation + # in "dfc_ni" (microcosm#1069). + ("dfc_ni.", "northern_ireland"), + # Scotland replaced Winter Fuel Payment with its Pension Age Winter + # Heating Payment from winter 2024-25, so DWP publishes the 2024-25 and + # 2025-26 statistics for England and Wales (K04000001) only (microcosm#1069). + ("dwp.winter_fuel_payment.", "england_and_wales"), ) # DfT BUS05i rows name their area in the selector; the geography follows the # declared area, never a prefix, so a London or UK row can never be stamped @@ -920,6 +929,19 @@ def _add_uk_membership_accounting( "the same publication." ), }, + { + "family": "dwp_state_pension", + "status": "active_english_region_and_amount_band_fanout", + "active_reference_count": fanout_counts.get("dwp_state_pension", 0), + "signed_rationale": ( + "The State Pension recipients by type fan out over the nine " + "English regions (Scotland and Wales are their own rows, since " + "DWP publishes no Northern Ireland cell for a twelve-area tier) " + "and over DWP's weekly amount bands, whose 'all' margin is a " + "total row the detail measure pin leaves out; the empty new " + "State Pension £40-£60 band is signed out (microcosm#1069)." + ), + }, ] report["signed_exclusion_rationales"] = [ { @@ -939,15 +961,27 @@ def _add_uk_membership_accounting( ]["candidates"][0]["signed_rationale"], }, ] + row_families = ( + ("hmrc.cgt.", "hmrc_cgt"), + ("dwp.state_pension.", "dwp_state_pension"), + ) for target_id, entry in sorted(report["targets"].items()): - if not str(target_id).startswith("hmrc.cgt."): + family = next( + ( + name + for prefix, name in row_families + if str(target_id).startswith(prefix) + ), + None, + ) + if family is None: continue for candidate in entry["candidates"]: if candidate.get("status") != "signed_excluded": continue report["signed_exclusion_rationales"].append( { - "family": "hmrc_cgt", + "family": family, "target_id": target_id, "row": candidate["name"], "status": "signed_excluded", diff --git a/tools/graph_uk_spine_fixture.py b/tools/graph_uk_spine_fixture.py index 980f9634c..87bf7966b 100644 --- a/tools/graph_uk_spine_fixture.py +++ b/tools/graph_uk_spine_fixture.py @@ -100,6 +100,9 @@ UKLCFSConsumptionStageTransform, ) from microcosm.build.uk_runtime.nts_bus_travel import UKNTSBusTravelStageTransform +from microcosm.build.uk_runtime.pension_credit_take_up import ( + UKPensionCreditTakeUpStageTransform, +) from microcosm.build.uk_runtime.regional_uprating import ( UKRegionalPropertyUpratingStageTransform, ) @@ -151,11 +154,11 @@ _SPI_DONOR_SAMPLE_SIZE = 64 #: The packaged FRS spine roster the fixture exercises (manifest minus the #: certified-pair exclusions); moves whenever a spine stage is added. -UK_FIXTURE_STAGE_COUNT = 35 +UK_FIXTURE_STAGE_COUNT = 36 _QRF_ESTIMATORS = 4 # These are the complete object-string surface observed in the unchanged -# legacy 35-stage output. Graph storage uses pandas StringDtype/python. +# legacy 36-stage output. Graph storage uses pandas StringDtype/python. _NORMALIZED_STRING_COLUMNS: Mapping[str, tuple[str, ...]] = { "person": ( "gender", @@ -490,6 +493,7 @@ def _frs_tables() -> dict[str, pd.DataFrame]: "DEDUC1": 2.0, "SPNAMT": 3.0, "SALSAC": "1", + "JOBSECT": 1 + household_id % 2, } ) pensions.append( @@ -514,6 +518,18 @@ def _frs_tables() -> dict[str, pd.DataFrame]: "PENAMT": 4.0, } ) + if household_id % 2 == 0: + # An occupational scheme for the employer contribution draw + # (microcosm#1069 c9); the FRS spine reads only personal pensions. + penprov.append( + { + "SERNUM": household_id, + "BENUNIT": 1, + "PERSON": 1, + "STEMPPEN": 2, + "PENAMT": 0.0, + } + ) oddjobs.append( { "SERNUM": household_id, @@ -1575,6 +1591,9 @@ def capture_root(frame: Frame) -> Frame: "uc_capital_coherence": UKUCCapitalCoherenceStageTransform( stage=stages["uc_capital_coherence"] ), + "pension_credit_take_up": UKPensionCreditTakeUpStageTransform( + stage=stages["pension_credit_take_up"], engine=engine + ), "uc_deduction_attributes": UKUCDeductionAttributesStageTransform( stage=stages["uc_deduction_attributes"] ), @@ -1615,7 +1634,7 @@ def _run_legacy_plan( stages: Iterable[SourceStageSpec], implementations: Mapping[str, object], ) -> Frame: - """Run the legacy 35-stage StagePlan oracle and return its final frame.""" + """Run the legacy 36-stage StagePlan oracle and return its final frame.""" stages = tuple(stages) committed = load_country_spec("uk")