From cbd3128bd9952dbabb329ee33798f89c24043f33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 22 Oct 2026 17:26:03 +0100 Subject: [PATCH 01/25] Bind ONS single years of age 3-6 for the UK and 0-6 for England MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Item 6 of the £100k childcare costing fixes (#1278, #1095). With ages 0, 1 and 2 bound, calibration still moved the single years inside the 0-4 and 5-9 sex bands: on the pre-Budget combined build the UK held too many 5-year-olds and too few 4-year-olds, and England's 5-year-olds sat about 15% above ONS. England's funded childcare is costed on England's children, so the contract now binds eleven more all-persons rows: - ons.population.age_3 .. age_6, pinned to K02000001 like ages 0-2; - ons.population.england_age_0 .. england_age_6, pinned to E92000001 by the generator's nation substring rule, counting persons in households with country == ENGLAND. Each reads the ONS mid-2025 estimate by single year of age (MYE2 persons), the series the sex bands and the region 0-9 cells sum, and counts age >= n and age < n + 1. The nested rows are consistent: the UK rows for ages 0-4 sum to the two 0-4 sex bands, and England's rows sit inside its nine region 0-9 cells. Every band stays bound. Wales, Scotland and Northern Ireland get no single-year rows, because each nation's single year rests on too few FRS households; the UK rows bind their sum, and Scotland's age 0 keeps scotland_babies_under_1. Registry accounting: eleven contract-only declarations. The contract has 432 targets (421), the registry scope 373 (362) and the unmapped declarations 187 (176); the mapped targets stay at 186. The compile-parity tool gains the rows' ledger-only rationale. The references and membership are regenerated in the next commit, which takes the active references from 1,322 to 1,333. Co-Authored-By: Claude Opus 5.5 --- .../uk-childcare-ons-ages-0-6.added.md | 1 + .../build/uk/uk_population_targets.json | 754 +++++++++++++++++- .../engine_free/shared/test_country_spec.py | 4 +- .../uk/test_uk_national_calibration.py | 5 +- .../uk/test_uk_population_targets.py | 103 ++- .../uk/test_uk_target_references.py | 38 +- ...edger_compile_parity_signed_differences.py | 16 + 7 files changed, 892 insertions(+), 29 deletions(-) create mode 100644 changelog.d/uk-childcare-ons-ages-0-6.added.md diff --git a/changelog.d/uk-childcare-ons-ages-0-6.added.md b/changelog.d/uk-childcare-ons-ages-0-6.added.md new file mode 100644 index 000000000..bae4f98d1 --- /dev/null +++ b/changelog.d/uk-childcare-ons-ages-0-6.added.md @@ -0,0 +1 @@ +The national UK contract binds eleven more ONS single years of age for all persons, for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): the UK's ages 3 to 6, so the UK rows run from age 0 to age 6, and England's ages 0 to 6 (`ons.population.england_age_`, pinned to E92000001, counting persons in households with `country == ENGLAND`). With ages 0 to 2 bound, calibration still moved the single years inside the 0-4 and 5-9 sex bands, holding too many 5-year-olds and too few 4-year-olds, and England's funded childcare is costed on England's children. Each row reads the ONS mid-2025 estimate by single year of age, the series the sex bands and the region 0-9 cells sum, and counts people with `age >= n` and `age < n + 1`; every band stays bound beside them. Wales, Scotland and Northern Ireland get no single-year rows, because each nation's single year rests on too few FRS households; the UK rows bind their sum, and Scotland's age 0 keeps its own row. The contract has 432 targets (421 before) and the registry scope 373 (362): eleven more contract-only declarations (187) beside the same 186 mapped targets. The national references and membership give 1,333 active references (1,322), and the compile-parity tool signs the eleven rows as `ledger_only`, with their rationale. 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 3b31ade36..f01e26728 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 @@ -860,7 +860,18 @@ "microcosm.high_value_homes.over_2m_by_region": "Microcosm-derived fact family (owner-occupied homes over £2m by English region and Wales, from Land Registry Price Paid, the UK HPI and the NSPL; uk/high_value_home_stock_facts.json, microcosm#1240), no uk-data metric. Bound on the local line only (calibration_lines), so the national line drops it after the compile (microcosm#1301).", "ons.population.age_0": "microcosm#1278 (the pre-Budget PR's plan, approved by María on 2026-10-20; microcosm#1095): the national 0_4 sex bands bind, but the single years inside them were free to move, so the contract also binds ages 0, 1 and 2 for all persons, on the 15_19 split's precedent. The 0_4 sex bands stay bound beside them: the three rows cover ages 0 to 2 for both sexes together, so neither band is their sum. No incumbent row has this row's definition.", "ons.population.age_1": "microcosm#1278 (the pre-Budget PR's plan, approved by María on 2026-10-20; microcosm#1095): the national 0_4 sex bands bind, but the single years inside them were free to move, so the contract also binds ages 0, 1 and 2 for all persons, on the 15_19 split's precedent. The 0_4 sex bands stay bound beside them: the three rows cover ages 0 to 2 for both sexes together, so neither band is their sum. No incumbent row has this row's definition.", - "ons.population.age_2": "microcosm#1278 (the pre-Budget PR's plan, approved by María on 2026-10-20; microcosm#1095): the national 0_4 sex bands bind, but the single years inside them were free to move, so the contract also binds ages 0, 1 and 2 for all persons, on the 15_19 split's precedent. The 0_4 sex bands stay bound beside them: the three rows cover ages 0 to 2 for both sexes together, so neither band is their sum. No incumbent row has this row's definition." + "ons.population.age_2": "microcosm#1278 (the pre-Budget PR's plan, approved by María on 2026-10-20; microcosm#1095): the national 0_4 sex bands bind, but the single years inside them were free to move, so the contract also binds ages 0, 1 and 2 for all persons, on the 15_19 split's precedent. The 0_4 sex bands stay bound beside them: the three rows cover ages 0 to 2 for both sexes together, so neither band is their sum. No incumbent row has this row's definition.", + "ons.population.age_3": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): with ages 0, 1 and 2 bound, the single years 3 to 6 were still free inside the 0_4 and 5_9 sex bands, and the calibrated weights held too many 5-year-olds and too few 4-year-olds. The contract therefore binds ages 3, 4, 5 and 6 for all persons too, read from the same ONS mid-year estimate by single year of age as ages 0 to 2. The sex bands stay bound beside them. No incumbent row has this row's definition.", + "ons.population.age_4": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): with ages 0, 1 and 2 bound, the single years 3 to 6 were still free inside the 0_4 and 5_9 sex bands, and the calibrated weights held too many 5-year-olds and too few 4-year-olds. The contract therefore binds ages 3, 4, 5 and 6 for all persons too, read from the same ONS mid-year estimate by single year of age as ages 0 to 2. The sex bands stay bound beside them. No incumbent row has this row's definition.", + "ons.population.age_5": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): with ages 0, 1 and 2 bound, the single years 3 to 6 were still free inside the 0_4 and 5_9 sex bands, and the calibrated weights held too many 5-year-olds and too few 4-year-olds. The contract therefore binds ages 3, 4, 5 and 6 for all persons too, read from the same ONS mid-year estimate by single year of age as ages 0 to 2. The sex bands stay bound beside them. No incumbent row has this row's definition.", + "ons.population.age_6": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): with ages 0, 1 and 2 bound, the single years 3 to 6 were still free inside the 0_4 and 5_9 sex bands, and the calibrated weights held too many 5-year-olds and too few 4-year-olds. The contract therefore binds ages 3, 4, 5 and 6 for all persons too, read from the same ONS mid-year estimate by single year of age as ages 0 to 2. The sex bands stay bound beside them. No incumbent row has this row's definition.", + "ons.population.england_age_0": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): England's funded childcare is costed on England's children, whose single years the UK rows and the region 0_9 cells leave free, so the contract binds England's ages 0 to 6 for all persons, read from the ONS mid-year estimate for England (E92000001) by single year of age. Wales, Scotland and Northern Ireland get no single-year rows: each nation's single year rests on too few FRS households, and the UK rows bind their sum. No incumbent row has this row's definition.", + "ons.population.england_age_1": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): England's funded childcare is costed on England's children, whose single years the UK rows and the region 0_9 cells leave free, so the contract binds England's ages 0 to 6 for all persons, read from the ONS mid-year estimate for England (E92000001) by single year of age. Wales, Scotland and Northern Ireland get no single-year rows: each nation's single year rests on too few FRS households, and the UK rows bind their sum. No incumbent row has this row's definition.", + "ons.population.england_age_2": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): England's funded childcare is costed on England's children, whose single years the UK rows and the region 0_9 cells leave free, so the contract binds England's ages 0 to 6 for all persons, read from the ONS mid-year estimate for England (E92000001) by single year of age. Wales, Scotland and Northern Ireland get no single-year rows: each nation's single year rests on too few FRS households, and the UK rows bind their sum. No incumbent row has this row's definition.", + "ons.population.england_age_3": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): England's funded childcare is costed on England's children, whose single years the UK rows and the region 0_9 cells leave free, so the contract binds England's ages 0 to 6 for all persons, read from the ONS mid-year estimate for England (E92000001) by single year of age. Wales, Scotland and Northern Ireland get no single-year rows: each nation's single year rests on too few FRS households, and the UK rows bind their sum. No incumbent row has this row's definition.", + "ons.population.england_age_4": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): England's funded childcare is costed on England's children, whose single years the UK rows and the region 0_9 cells leave free, so the contract binds England's ages 0 to 6 for all persons, read from the ONS mid-year estimate for England (E92000001) by single year of age. Wales, Scotland and Northern Ireland get no single-year rows: each nation's single year rests on too few FRS households, and the UK rows bind their sum. No incumbent row has this row's definition.", + "ons.population.england_age_5": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): England's funded childcare is costed on England's children, whose single years the UK rows and the region 0_9 cells leave free, so the contract binds England's ages 0 to 6 for all persons, read from the ONS mid-year estimate for England (E92000001) by single year of age. Wales, Scotland and Northern Ireland get no single-year rows: each nation's single year rests on too few FRS households, and the UK rows bind their sum. No incumbent row has this row's definition.", + "ons.population.england_age_6": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): England's funded childcare is costed on England's children, whose single years the UK rows and the region 0_9 cells leave free, so the contract binds England's ages 0 to 6 for all persons, read from the ONS mid-year estimate for England (E92000001) by single year of age. Wales, Scotland and Northern Ireland get no single-year rows: each nation's single year rests on too few FRS households, and the UK rows bind their sum. No incumbent row has this row's definition." }, "suppressed_ancestors": { "hmrc/salary_sacrifice_it_relief_basic_rate": { @@ -893,7 +904,8 @@ "ons_terminal_sex_band_split": "María ruling 2026-08-21: split the incumbent terminal sex bands into uniform five-year 85_89 bands plus 90_plus tails. The incumbent six-year 85_90 terminal rows leave ages 91+ unconstrained; Microcosm keeps the uniform five-year bands and constrains the tail. The 85_89-vs-85_90 value gap is the single-age-90 share and is a signed semantic difference.", "cgt_band_promotion": "The 18 banded CGT registry names (hmrc/cgt_taxpayers_band_ and hmrc/capital_gains_band_, nine bands from 12,300) move from excluded to mapped: Chronicle now carries HMRC Table 2.1a for 2024-25 (cgt_size_of_gain_2026), so the incumbent's unpackaged uk-data CSV is superseded by published individual rows bound at identity; the 3,000 and 6,000 bands the incumbent never carried are authored under the same naming form and the 0-2,999 band below the 2024 AEA is signed out (microcosm#467, #725). Chronicle's Table 2.1a package emits taxpayers and gains only, although the published sheet carries an amounts-of-tax column, so no liability-by-band target exists yet; it becomes possible once Chronicle emits that column.", "ons_15_19_sex_band_split": "María's ruling of 2026-10-13 (microcosm#1095, uk-data#563): the two national 15_19 sex bands are split into ages 15, 16-17 and 18-19. uk-data#563 found weights that fit the five-year band while holding too many 16-year-olds and too few 18- and 19-year-olds, and nothing in this contract bound the mix inside the band either. The six rows partition the two bands and read the same ONS mid-year estimate by single year of age, so each sex's three rows sum to the band they replace. The incumbent ons/female_15_19 and ons/male_15_19 rows move from mapped to excluded: no single contract row has their definition.", - "ons_single_year_ages_0_2": "microcosm#1278 (the pre-Budget PR's plan, approved by María on 2026-10-20; microcosm#1095): three all-persons rows bind ages 0, 1 and 2, read from the same ONS mid-year estimate by single year of age as the 0_4 sex bands. Unlike the 15_19 split, whose pieces replaced the bands, the 0_4 sex bands keep their incumbent mapping and stay bound: the three rows cover ages 0 to 2 for both sexes together, so neither band is their sum. The three are contract-only declarations; no incumbent row moves." + "ons_single_year_ages_0_2": "microcosm#1278 (the pre-Budget PR's plan, approved by María on 2026-10-20; microcosm#1095): three all-persons rows bind ages 0, 1 and 2, read from the same ONS mid-year estimate by single year of age as the 0_4 sex bands. Unlike the 15_19 split, whose pieces replaced the bands, the 0_4 sex bands keep their incumbent mapping and stay bound: the three rows cover ages 0 to 2 for both sexes together, so neither band is their sum. The three are contract-only declarations; no incumbent row moves.", + "ons_single_year_ages_0_6": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095). Eleven all-persons rows extend the single years of age: the UK rows go on from age 2 to age 6, and England binds ages 0 to 6 at E92000001. Every row reads the ONS mid-2025 estimate by single year of age, the series the 0_4 and 5_9 sex bands and the region 0_9 cells sum, so the nested rows are consistent: the UK rows for ages 0 to 4 sum to the two 0_4 sex bands, and England's rows sit inside England's nine region 0_9 cells. Every band stays bound; the eleven are contract-only declarations and no incumbent row moves. Scotland's age 0 is already bound as ons.population.scotland_babies_under_1; Wales and Northern Ireland are left to the UK rows, as each nation's single year rests on too few FRS households." }, "scope_target_ids": [ "obr.income_tax", @@ -990,6 +1002,17 @@ "ons.population.age_0", "ons.population.age_1", "ons.population.age_2", + "ons.population.age_3", + "ons.population.age_4", + "ons.population.age_5", + "ons.population.age_6", + "ons.population.england_age_0", + "ons.population.england_age_1", + "ons.population.england_age_2", + "ons.population.england_age_3", + "ons.population.england_age_4", + "ons.population.england_age_5", + "ons.population.england_age_6", "ons.population.female_0_4", "ons.population.female_10_14", "ons.population.female_15", @@ -8186,6 +8209,733 @@ "label": "Age 2", "selector_note": "The selector pins ages through dimension_values and no longer requires the table's layout to group by age: the ONS mid-2025 workbook lays its rows out by geography (microcosm#1123)." }, + { + "target_id": "ons.population.age_3", + "family": "ons_population", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 3 + }, + { + "concept": "uk.demographics.age", + "operator": "<", + "value": 4 + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "ons/age_3", + "filters": [ + { + "variable": "age", + "operator": ">=", + "value": 3 + }, + { + "variable": "age", + "operator": "<", + "value": 4 + } + ], + "value_variable": "person_count", + "from_entity": "person", + "map_to": "household" + }, + "axiom": { + "metric_name": "ons/age_3", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "dimension_values": { + "age": [ + 3 + ] + } + }, + "category_id": "ons.population", + "label": "Age 3", + "selector_note": "The selector pins ages through dimension_values and no longer requires the table's layout to group by age: the ONS mid-2025 workbook lays its rows out by geography (microcosm#1123)." + }, + { + "target_id": "ons.population.age_4", + "family": "ons_population", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 4 + }, + { + "concept": "uk.demographics.age", + "operator": "<", + "value": 5 + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "ons/age_4", + "filters": [ + { + "variable": "age", + "operator": ">=", + "value": 4 + }, + { + "variable": "age", + "operator": "<", + "value": 5 + } + ], + "value_variable": "person_count", + "from_entity": "person", + "map_to": "household" + }, + "axiom": { + "metric_name": "ons/age_4", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "dimension_values": { + "age": [ + 4 + ] + } + }, + "category_id": "ons.population", + "label": "Age 4", + "selector_note": "The selector pins ages through dimension_values and no longer requires the table's layout to group by age: the ONS mid-2025 workbook lays its rows out by geography (microcosm#1123)." + }, + { + "target_id": "ons.population.age_5", + "family": "ons_population", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 5 + }, + { + "concept": "uk.demographics.age", + "operator": "<", + "value": 6 + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "ons/age_5", + "filters": [ + { + "variable": "age", + "operator": ">=", + "value": 5 + }, + { + "variable": "age", + "operator": "<", + "value": 6 + } + ], + "value_variable": "person_count", + "from_entity": "person", + "map_to": "household" + }, + "axiom": { + "metric_name": "ons/age_5", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "dimension_values": { + "age": [ + 5 + ] + } + }, + "category_id": "ons.population", + "label": "Age 5", + "selector_note": "The selector pins ages through dimension_values and no longer requires the table's layout to group by age: the ONS mid-2025 workbook lays its rows out by geography (microcosm#1123)." + }, + { + "target_id": "ons.population.age_6", + "family": "ons_population", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 6 + }, + { + "concept": "uk.demographics.age", + "operator": "<", + "value": 7 + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "ons/age_6", + "filters": [ + { + "variable": "age", + "operator": ">=", + "value": 6 + }, + { + "variable": "age", + "operator": "<", + "value": 7 + } + ], + "value_variable": "person_count", + "from_entity": "person", + "map_to": "household" + }, + "axiom": { + "metric_name": "ons/age_6", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "dimension_values": { + "age": [ + 6 + ] + } + }, + "category_id": "ons.population", + "label": "Age 6", + "selector_note": "The selector pins ages through dimension_values and no longer requires the table's layout to group by age: the ONS mid-2025 workbook lays its rows out by geography (microcosm#1123)." + }, + { + "target_id": "ons.population.england_age_0", + "family": "ons_population", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.geography.country", + "equals": "england" + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 0 + }, + { + "concept": "uk.demographics.age", + "operator": "<", + "value": 1 + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "ons/england_age_0", + "filters": [ + { + "variable": "country", + "equals": "ENGLAND" + }, + { + "variable": "age", + "operator": ">=", + "value": 0 + }, + { + "variable": "age", + "operator": "<", + "value": 1 + } + ], + "value_variable": "person_count", + "from_entity": "person", + "map_to": "household" + }, + "axiom": { + "metric_name": "ons/england_age_0", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "dimension_values": { + "age": [ + 0 + ] + } + }, + "category_id": "ons.population", + "label": "England age 0", + "selector_note": "The selector pins ages through dimension_values and no longer requires the table's layout to group by age: the ONS mid-2025 workbook lays its rows out by geography (microcosm#1123)." + }, + { + "target_id": "ons.population.england_age_1", + "family": "ons_population", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.geography.country", + "equals": "england" + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 1 + }, + { + "concept": "uk.demographics.age", + "operator": "<", + "value": 2 + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "ons/england_age_1", + "filters": [ + { + "variable": "country", + "equals": "ENGLAND" + }, + { + "variable": "age", + "operator": ">=", + "value": 1 + }, + { + "variable": "age", + "operator": "<", + "value": 2 + } + ], + "value_variable": "person_count", + "from_entity": "person", + "map_to": "household" + }, + "axiom": { + "metric_name": "ons/england_age_1", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "dimension_values": { + "age": [ + 1 + ] + } + }, + "category_id": "ons.population", + "label": "England age 1", + "selector_note": "The selector pins ages through dimension_values and no longer requires the table's layout to group by age: the ONS mid-2025 workbook lays its rows out by geography (microcosm#1123)." + }, + { + "target_id": "ons.population.england_age_2", + "family": "ons_population", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.geography.country", + "equals": "england" + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 2 + }, + { + "concept": "uk.demographics.age", + "operator": "<", + "value": 3 + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "ons/england_age_2", + "filters": [ + { + "variable": "country", + "equals": "ENGLAND" + }, + { + "variable": "age", + "operator": ">=", + "value": 2 + }, + { + "variable": "age", + "operator": "<", + "value": 3 + } + ], + "value_variable": "person_count", + "from_entity": "person", + "map_to": "household" + }, + "axiom": { + "metric_name": "ons/england_age_2", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "dimension_values": { + "age": [ + 2 + ] + } + }, + "category_id": "ons.population", + "label": "England age 2", + "selector_note": "The selector pins ages through dimension_values and no longer requires the table's layout to group by age: the ONS mid-2025 workbook lays its rows out by geography (microcosm#1123)." + }, + { + "target_id": "ons.population.england_age_3", + "family": "ons_population", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.geography.country", + "equals": "england" + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 3 + }, + { + "concept": "uk.demographics.age", + "operator": "<", + "value": 4 + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "ons/england_age_3", + "filters": [ + { + "variable": "country", + "equals": "ENGLAND" + }, + { + "variable": "age", + "operator": ">=", + "value": 3 + }, + { + "variable": "age", + "operator": "<", + "value": 4 + } + ], + "value_variable": "person_count", + "from_entity": "person", + "map_to": "household" + }, + "axiom": { + "metric_name": "ons/england_age_3", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "dimension_values": { + "age": [ + 3 + ] + } + }, + "category_id": "ons.population", + "label": "England age 3", + "selector_note": "The selector pins ages through dimension_values and no longer requires the table's layout to group by age: the ONS mid-2025 workbook lays its rows out by geography (microcosm#1123)." + }, + { + "target_id": "ons.population.england_age_4", + "family": "ons_population", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.geography.country", + "equals": "england" + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 4 + }, + { + "concept": "uk.demographics.age", + "operator": "<", + "value": 5 + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "ons/england_age_4", + "filters": [ + { + "variable": "country", + "equals": "ENGLAND" + }, + { + "variable": "age", + "operator": ">=", + "value": 4 + }, + { + "variable": "age", + "operator": "<", + "value": 5 + } + ], + "value_variable": "person_count", + "from_entity": "person", + "map_to": "household" + }, + "axiom": { + "metric_name": "ons/england_age_4", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "dimension_values": { + "age": [ + 4 + ] + } + }, + "category_id": "ons.population", + "label": "England age 4", + "selector_note": "The selector pins ages through dimension_values and no longer requires the table's layout to group by age: the ONS mid-2025 workbook lays its rows out by geography (microcosm#1123)." + }, + { + "target_id": "ons.population.england_age_5", + "family": "ons_population", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.geography.country", + "equals": "england" + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 5 + }, + { + "concept": "uk.demographics.age", + "operator": "<", + "value": 6 + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "ons/england_age_5", + "filters": [ + { + "variable": "country", + "equals": "ENGLAND" + }, + { + "variable": "age", + "operator": ">=", + "value": 5 + }, + { + "variable": "age", + "operator": "<", + "value": 6 + } + ], + "value_variable": "person_count", + "from_entity": "person", + "map_to": "household" + }, + "axiom": { + "metric_name": "ons/england_age_5", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "dimension_values": { + "age": [ + 5 + ] + } + }, + "category_id": "ons.population", + "label": "England age 5", + "selector_note": "The selector pins ages through dimension_values and no longer requires the table's layout to group by age: the ONS mid-2025 workbook lays its rows out by geography (microcosm#1123)." + }, + { + "target_id": "ons.population.england_age_6", + "family": "ons_population", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.geography.country", + "equals": "england" + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 6 + }, + { + "concept": "uk.demographics.age", + "operator": "<", + "value": 7 + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "ons/england_age_6", + "filters": [ + { + "variable": "country", + "equals": "ENGLAND" + }, + { + "variable": "age", + "operator": ">=", + "value": 6 + }, + { + "variable": "age", + "operator": "<", + "value": 7 + } + ], + "value_variable": "person_count", + "from_entity": "person", + "map_to": "household" + }, + "axiom": { + "metric_name": "ons/england_age_6", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "dimension_values": { + "age": [ + 6 + ] + } + }, + "category_id": "ons.population", + "label": "England age 6", + "selector_note": "The selector pins ages through dimension_values and no longer requires the table's layout to group by age: the ONS mid-2025 workbook lays its rows out by geography (microcosm#1123)." + }, { "target_id": "ons.population.female_0_4", "family": "ons_population", 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 b30b2c4ff..a5ef5eec2 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 @@ -1174,8 +1174,8 @@ def test_uk_target_references_accept_regenerated_contract_fields(self) -> None: references = {reference.name: reference for reference in spec.target_references} assert ( - len(references) == 1322 - ) # microcosm#1278: + 3, the ONS single years 0, 1 and 2 for all persons; microcosm#1095: + 4, the two national 15_19 sex bands split into ages 15, 16-17 and 18-19; microcosm#1106: + 13 SPI property amounts; microcosm#1113: + 1 ONS 07.2.2 household road fuel; PolicyEngine/chronicle#280 lane: 705 + 33 HMRC liabilities rows (Table 2.5, three + len(references) == 1333 + ) # childcare costing fixes (item 6): + 11, the UK's ONS single years 3 to 6 and England's 0 to 6; microcosm#1278: + 3, the ONS single years 0, 1 and 2 for all persons; microcosm#1095: + 4, the two national 15_19 sex bands split into ages 15, 16-17 and 18-19; microcosm#1106: + 13 SPI property amounts; microcosm#1113: + 1 ONS 07.2.2 household road fuel; 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 # ten regional bands over twelve areas); microcosm#905: 424 - 18 country 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 e17857775..26d8ef49e 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 @@ -56,8 +56,9 @@ # microcosm#1301: the references include the high-value homes region cells (30 # less the two signed out below the small-cell floor), which # load_uk_national_target_inputs drops after the compile; microcosm#1278 adds -# the ONS single years 0, 1 and 2 for all persons. -ACTIVE_REFERENCE_COUNT = 1322 +# the ONS single years 0, 1 and 2 for all persons, and the childcare costing +# fixes (item 6) the UK's single years 3 to 6 and England's 0 to 6. +ACTIVE_REFERENCE_COUNT = 1333 def _uc_reference(**overrides) -> LedgerTargetReference: 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 8c68654b7..b28b9f515 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 @@ -236,8 +236,9 @@ def test_uk_population_targets_shape_order_and_registry_accounting() -> None: # high-value homes region rows, bound on the local line only, and # microcosm#1262 binds Scotland's PIPR rents at BRMA grain; microcosm#1278 # adds the ONS single years 0, 1 and 2 for all persons inside the 0_4 sex - # bands. - assert len(resource["targets"]) == 421 + # bands, and the childcare costing fixes (item 6) the UK's single years 3 + # to 6 and England's 0 to 6. + assert len(resource["targets"]) == 432 providers = resource["hierarchy"]["providers"] categories = resource["hierarchy"]["categories"] @@ -251,10 +252,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) == 362 + assert len(registry_scope) == 373 assert len(profile_scope) == 59 - assert target_ids[:362] == registry_scope - assert target_ids[362:] == profile_scope + assert target_ids[:373] == registry_scope + assert target_ids[373:] == profile_scope parity = resource["registry_parity"] assert parity["pinned_ref"] == "12a1e028afeef08d8b2d74ee03fd9de3a78b2dd3" @@ -272,9 +273,10 @@ def test_uk_population_targets_shape_order_and_registry_accounting() -> None: # and the two incumbent 15_19 sex bands leave them for the six rows that # partition them; microcosm#1207's nine BUS01a journey rows and # microcosm#1301's three high-value homes region rows have no uk-data - # metric, nor do microcosm#1278's three single years of age. + # metric, nor do microcosm#1278's three single years of age or the eleven + # the childcare costing fixes add (UK 3 to 6, England 0 to 6). assert len(mapped_target_ids) == 186 - assert len(unmapped_declarations) == 176 + assert len(unmapped_declarations) == 187 suppressed_ancestors = parity["suppressed_ancestors"] assert len(suppressed_ancestors) == 5 assert set(suppressed_ancestors).isdisjoint(parity["mapped"]) @@ -441,28 +443,36 @@ def test_uk_population_targets_split_the_15_19_sex_bands() -> None: assert "partition" in parity["accounting_notes"]["ons_15_19_sex_band_split"] -def test_uk_population_targets_bind_single_years_0_to_2_inside_the_0_4_bands() -> None: - """Ages 0, 1 and 2 bind for all persons beside the 0_4 sex bands. +def test_uk_population_targets_bind_single_years_0_to_6_inside_the_sex_bands() -> None: + """The UK's ages 0 to 6 bind for all persons beside the sex bands. The 0_4 sex bands left the single years inside them free to move, so the contract binds the three youngest single years too (microcosm#1278, - #1095). Unlike the 15_19 split the bands stay mapped and bound: the new - rows cover both sexes and only ages 0 to 2, so neither band is their sum. + #1095), and the childcare costing fixes (item 6) carry the UK rows on to + age 6, inside the 5_9 bands. Unlike the 15_19 split the bands stay mapped + and bound: the new rows cover both sexes, so no row replaces a band. """ resource = _load() parity = resource["registry_parity"] target_ids = [target["target_id"] for target in resource["targets"]] - new_ids = [f"ons.population.age_{age}" for age in (0, 1, 2)] - - for sex in ("female", "male"): - assert parity["mapped"][f"ons/{sex}_0_4"] == f"ons.population.{sex}_0_4" - assert f"ons.population.{sex}_0_4" in target_ids - # In scope order, just before the national sex bands. + ages = range(7) + new_ids = [f"ons.population.age_{age}" for age in ages] + england_ids = [f"ons.population.england_age_{age}" for age in ages] + + for band in ("female_0_4", "male_0_4", "female_5_9", "male_5_9"): + assert parity["mapped"][f"ons/{band}"] == f"ons.population.{band}" + assert f"ons.population.{band}" in target_ids + # In scope order, the UK rows then England's, just before the national + # sex bands. first = target_ids.index(new_ids[0]) - assert target_ids[first : first + 4] == [*new_ids, "ons.population.female_0_4"] + assert target_ids[first : first + 15] == [ + *new_ids, + *england_ids, + "ons.population.female_0_4", + ] - for age, target_id in zip((0, 1, 2), new_ids, strict=True): + for age, target_id in zip(ages, new_ids, strict=True): target = _target_by_id(resource, target_id) assert target_id in parity["unmapped_declarations"] assert target_id not in set(parity["mapped"].values()) @@ -487,13 +497,64 @@ def test_uk_population_targets_bind_single_years_0_to_2_inside_the_0_4_bands() - assert binding["value_variable"] == "person_count" assert binding["map_to"] == "household" assert "stay bound" in parity["accounting_notes"]["ons_single_year_ages_0_2"] + assert "stays bound" in parity["accounting_notes"]["ons_single_year_ages_0_6"] + + +def test_uk_population_targets_bind_england_single_years_0_to_6() -> None: + """England's ages 0 to 6 bind for all persons on England's own series. + + England's funded childcare is costed on England's children, so the + childcare costing fixes (item 6) bind England's single years 0 to 6 beside + the UK rows. Each row reads the ONS estimate the UK rows read, scoped by + the target id to England, and counts persons in English households. The + other nations get no single-year rows; Scotland's age 0 keeps its own row. + """ + + resource = _load() + parity = resource["registry_parity"] + target_ids = {target["target_id"] for target in resource["targets"]} + + for age in range(7): + target_id = f"ons.population.england_age_{age}" + target = _target_by_id(resource, target_id) + assert target_id in parity["unmapped_declarations"] + assert target_id not in set(parity["mapped"].values()) + assert target["family"] == "ons_population" + assert target["category_id"] == "ons.population" + assert target["geography_levels"] == ["country"] + assert target["ledger_selector"] == { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "dimension_values": {"age": [age]}, + } + assert target["measurement"]["filters"] == [ + {"concept": "uk.geography.country", "equals": "england"}, + {"concept": "uk.demographics.age", "operator": ">=", "value": age}, + {"concept": "uk.demographics.age", "operator": "<", "value": age + 1}, + ] + binding = target["bindings"]["policyengine"] + assert binding["metric_name"] == f"ons/england_age_{age}" + assert binding["filters"] == [ + {"variable": "country", "equals": "ENGLAND"}, + {"variable": "age", "operator": ">=", "value": age}, + {"variable": "age", "operator": "<", "value": age + 1}, + ] + assert binding["value_variable"] == "person_count" + assert binding["from_entity"] == "person" + assert binding["map_to"] == "household" + for nation in ("wales", "scotland", "northern_ireland"): + assert not any( + target_id.startswith(f"ons.population.{nation}_age_") + for target_id in target_ids + ) + assert "ons.population.scotland_babies_under_1" in target_ids 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) == 421 + assert len(target_ids) == 432 assert len(target_ids) == len(set(target_ids)) @@ -994,7 +1055,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) == 421 + assert len(targets) == 432 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_target_references.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_target_references.py index 86b98acd1..df9a51bc5 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 @@ -72,7 +72,7 @@ _TEST_PATHS = paths_for("microcosm-build") -ACTIVE_REFERENCE_COUNT = 1322 +ACTIVE_REFERENCE_COUNT = 1333 REGION_TIER_LEVEL = {code: level for level, code in UK_REGION_TIER} @@ -700,6 +700,40 @@ def test_ons_age_total_targets_pin_exact_age_dimension_set() -> None: ] == ["age"] +def test_ons_single_year_age_references_pin_the_uk_and_england() -> None: + """The single years 0 to 6 resolve at the UK and at England, one fact each. + + The UK rows take the default UK pin and England's rows the nation + substring rule (their target ids name England), so each reads its own + country row of the ONS estimate by single year of age (the childcare + costing fixes, item 6; microcosm#1278). + """ + + pins = _geography_pins(_load_uk_resource("uk_population_targets.json")) + references = { + reference["name"]: reference + for reference in _load_uk_resource("target_references.json")[ + "target_references" + ] + } + for age in range(7): + for target_id, geography_id in ( + (f"ons.population.age_{age}", "K02000001"), + (f"ons.population.england_age_{age}", "E92000001"), + ): + assert pins[target_id] == { + "geography_level": "country", + "geography_id": geography_id, + } + reference = references[target_id] + assert reference["ledger_selector"]["geography_id"] == geography_id + assert reference["ledger_selector"]["dimension_values"] == {"age": [age]} + assert reference["ledger_selector"]["dimensions"] == ["age"] + assert reference["family"] == "ons_population" + assert reference["entity"] == "person" + assert reference["expected_member_count"] == 1 + + UC_ELEMENT_TARGET_IDS = frozenset( { "dwp.uc.households_lcwra_element", @@ -898,7 +932,7 @@ 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": 1322, + "active": 1333, "no_fact_at_or_before_period": 5, "signed_excluded": 17, } diff --git a/tools/build_uk_ledger_compile_parity_signed_differences.py b/tools/build_uk_ledger_compile_parity_signed_differences.py index 2206f3e64..ba8f62bb9 100644 --- a/tools/build_uk_ledger_compile_parity_signed_differences.py +++ b/tools/build_uk_ledger_compile_parity_signed_differences.py @@ -339,6 +339,20 @@ class ParityReceiptSpec: "fixture counterpart." ) _ONS_SINGLE_YEAR_AGE_ROWS = frozenset(f"ons.population.age_{age}" for age in (0, 1, 2)) +_ONS_SINGLE_YEAR_AGE_0_6_LEDGER_ONLY_RATIONALE = ( + "Requested by María on 2026-10-21 for the £100k childcare costing fixes " + "(item 6; microcosm#1278, #1095): one of the eleven all-persons rows that " + "extend the single years of age, the UK's ages 3 to 6 and England's ages 0 to " + "6, bound so the fit holds the single years inside the 0_4 and 5_9 sex bands " + "and the region 0_9 cells, which stay bound beside them. The incumbent binds " + "only the bands, so this row has no fixture counterpart." +) +_ONS_SINGLE_YEAR_AGE_0_6_ROWS = frozenset( + ( + *(f"ons.population.age_{age}" for age in (3, 4, 5, 6)), + *(f"ons.population.england_age_{age}" for age in range(7)), + ) +) _DEVOLVED_RENT_FIXTURE_ONLY_RATIONALE = ( "Ruled signed exclusion: the incumbent y-values for devolved private rent " @@ -816,6 +830,8 @@ def _add_signed_rationale_notes( row["reason"] = _ONS_15_19_BAND_SPLIT_LEDGER_ONLY_RATIONALE elif name in _ONS_SINGLE_YEAR_AGE_ROWS and row.get("kind") == "ledger_only": row["reason"] = _ONS_SINGLE_YEAR_AGE_LEDGER_ONLY_RATIONALE + elif name in _ONS_SINGLE_YEAR_AGE_0_6_ROWS and row.get("kind") == "ledger_only": + row["reason"] = _ONS_SINGLE_YEAR_AGE_0_6_LEDGER_ONLY_RATIONALE #: microcosm#1240: the high_value_homes family binds a Microcosm-derived From 179e759c5a814eb67556e7369785c4cd6bc73dc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 22 Oct 2026 17:26:58 +0100 Subject: [PATCH 02/25] Nest universal childcare take-up and re-draw the copies' childcare draws MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit frs_take_up drew would_claim_universal_childcare and would_claim_extended_childcare independently. policyengine-uk allocates a working-parent child's first 15 hours to the universal entitlement when the unit's own universal flag is false, so a family over the £100k limit drawn extended-yes and universal-no gained universal hours only once the limit was removed. The extended draw is unchanged; the universal flag is now extended OR u < r, where r, the contract's universal_childcare rate, is the rate among units not claiming the extended hours. The operation declares nested_under (added to the assign_binary_from_rate schema) and the stage refuses a manifest that drops it. The contract entry carries nested_under and says the rate is conditional; its value is unchanged until the fitter refits it. The take-up signal gate targets the nested marginal and fails on any unit claiming the extended hours without the universal ones. The flags were drawn before any support or CGT copy existed, so every copy inherited its host's draws, and a cell with few hosts fixed the take-up of all its copies. A new last spine stage, childcare_copy_take_up, re-draws would_claim_tfc, the extended, universal (nested) and targeted flags and maximum_extended_childcare_hours_usage for copy benefit units only (a non-empty household clone path or a positive benunit support clone index), through frs_take_up's derive_childcare_take_up at the same rates, seed and salts, keyed on the copy's own benunit_id (source id plus a multiple of an offset above every id, so unique and distinct from every native id). Native units keep their draws; the anchored flags and would_claim_uc_childcare are untouched. The graph declares an open surface and an isolation boundary for it, as for the other take-up redraws; the kernel tables, spine registration, fixture tool, roster pins (46 to 47 stages) and docs move with it. The coverage manifest, compile-parity receipts and the H2 fixture are left for the pin pass to regenerate. Co-Authored-By: Claude Opus 5.5 --- docs/uk-full-build-graph.md | 4 +- .../spec_engine/schema/sources.schema.json | 6 + .../src/microcosm/build/uk/gates.json | 2 +- .../src/microcosm/build/uk/source_stages.json | 68 ++++- .../src/microcosm/build/uk/spec/sources.yaml | 54 +++- .../microcosm/build/uk/take_up_contract.json | 3 +- .../uk_runtime/childcare_copy_take_up.py | 159 ++++++++++ .../microcosm/build/uk_runtime/frs_take_up.py | 143 ++++++++- .../src/microcosm/build/uk_runtime/graph.py | 21 ++ .../build/uk_runtime/graph_kernels.py | 9 + .../microcosm/build/uk_runtime/spine_build.py | 8 + .../build/uk_runtime/take_up_contract.py | 8 + .../engine_free/shared/test_country_spec.py | 5 +- .../uk/test_uk_childcare_copy_take_up.py | 288 ++++++++++++++++++ .../tests/engine_free/uk/test_uk_frs_spine.py | 1 + .../tests/engine_free/uk/test_uk_graph.py | 5 +- .../engine_free/uk/test_uk_source_stages.py | 12 +- .../uk/test_uk_spine_acceptance_receipt.py | 4 + .../engine_free/uk/test_uk_take_up_gate.py | 5 +- tools/graph_uk_spine_fixture.py | 6 + 20 files changed, 786 insertions(+), 25 deletions(-) create mode 100644 packages/microcosm-build/src/microcosm/build/uk_runtime/childcare_copy_take_up.py create mode 100644 packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_copy_take_up.py diff --git a/docs/uk-full-build-graph.md b/docs/uk-full-build-graph.md index c046c7f20..e7a9a5969 100644 --- a/docs/uk-full-build-graph.md +++ b/docs/uk-full-build-graph.md @@ -66,11 +66,11 @@ For smaller outputs, add `--dataset-households 150000` to use the common informe ## Graph owners and shared contracts -The spine graph is the 46-stage source roster declared by the UK spec, built by `uk_runtime.spine_build` (the spine tool moved into the package; `tools/build_uk_frs_spine.py` is a six-line shim over it). The superseded `frs_hmrc_retained_leaves` and `hmrc_spi_income` stages and the `UK_SPINE_EXCLUSIONS` list that hid them are removed; the active HMRC path is `frs_hmrc_spine_leaves`, `spi_support_channel`, `spi_income_band_donors` and `hmrc_spi_income_spine`, and the FRS HMRC leaf columns come from `uk_runtime.frs_hmrc_source`. The spine's assembled and transferred gate batteries are graph nodes (`uk_runtime.graph_evidence`); stage evidence and fit-weight records are read back from the content store through the shared `stage_evidence` artifact rather than from in-memory collectors; the HMRC replay sidecar is rebuilt from the SPI stage's checkpoint metadata; the spine sidecar records the operation inventory and the graph manifest, and the graph manifest is saved as `spine.graph.json` under the checkpoint root. +The spine graph is the 47-stage source roster declared by the UK spec, built by `uk_runtime.spine_build` (the spine tool moved into the package; `tools/build_uk_frs_spine.py` is a six-line shim over it). The superseded `frs_hmrc_retained_leaves` and `hmrc_spi_income` stages and the `UK_SPINE_EXCLUSIONS` list that hid them are removed; the active HMRC path is `frs_hmrc_spine_leaves`, `spi_support_channel`, `spi_income_band_donors` and `hmrc_spi_income_spine`, and the FRS HMRC leaf columns come from `uk_runtime.frs_hmrc_source`. The spine's assembled and transferred gate batteries are graph nodes (`uk_runtime.graph_evidence`); stage evidence and fit-weight records are read back from the content store through the shared `stage_evidence` artifact rather than from in-memory collectors; the HMRC replay sidecar is rebuilt from the SPI stage's checkpoint metadata; the spine sidecar records the operation inventory and the graph manifest, and the graph manifest is saved as `spine.graph.json` under the checkpoint root. | Operation | Graph owner | | --- | --- | -| Raw FRS and donor preparation, enrichment, support channels | The 46 UK spine stage nodes and their declared composite operations | +| Raw FRS and donor preparation, enrichment, support channels | The 47 UK spine stage nodes and their declared composite operations | | Assembled and transferred spine gates | `spine.gates.assembled`, `spine.gates.transferred` | | Bound checkpoint admission | `uk.full.spine_checkpoint`, when resuming a saved spine | | Pool sample and mass normalization | `uk.full.sample`, `uk.full.normalize` | 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 c072cfb3f..0d74cd5ad 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 @@ -654,6 +654,9 @@ "method": { "type": "string" }, + "nested_under": { + "type": "string" + }, "output": { "type": "string" }, @@ -6669,6 +6672,9 @@ "kind": { "const": "assign_clipped_normal" }, + "eligibility": { + "type": "string" + }, "output": { "type": "string" }, diff --git a/packages/microcosm-build/src/microcosm/build/uk/gates.json b/packages/microcosm-build/src/microcosm/build/uk/gates.json index 62a882fd6..81359a7ad 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/gates.json +++ b/packages/microcosm-build/src/microcosm/build/uk/gates.json @@ -1133,7 +1133,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. would_claim_pc is measured by uk_stage_pension_credit_take_up instead (microcosm#1069 R9), and would_claim_child_benefit and child_benefit_opts_out by uk_stage_child_benefit_take_up (microcosm#1063). would_claim_uc is drawn for FRS benefit units by frs_take_up and redrawn for SPI-channel units by spi_benefit_coherence on the same rule (microcosm#1095), so the gate measures both channels at the contract rate." + "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), and would_claim_child_benefit and child_benefit_opts_out by uk_stage_child_benefit_take_up (microcosm#1063). would_claim_uc is drawn for FRS benefit units by frs_take_up and redrawn for SPI-channel units by spi_benefit_coherence on the same rule (microcosm#1095), so the gate measures both channels at the contract rate. would_claim_universal_childcare is nested under would_claim_extended_childcare, so its target is the nested marginal r_e + (1 - r_e) * r_u of the contract's conditional universal rate, and the gate fails on any benefit unit that claims the extended hours without the universal ones." }, { "id": "uk_brma_enum_domain", 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 b42e70a0e..a5fb2cc68 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json +++ b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json @@ -1059,6 +1059,8 @@ "output": "would_claim_universal_childcare", "draw": "would_claim_universal_childcare", "rate_key": "universal_childcare", + "nested_under": "would_claim_extended_childcare", + "rate_derivation": "the contract's universal_childcare rate is the rate among benefit units not claiming the extended hours; would_claim_universal_childcare = would_claim_extended_childcare OR u < rate, so every unit claiming the extended hours claims the universal hours", "seed": 0 }, { @@ -1107,7 +1109,7 @@ "nonnegative_outputs": [ "maximum_extended_childcare_hours_usage" ], - "notes": "Identity-keyed seed 0 streams replace the incumbent sequential take-up seed 100; salts are output variable names. Reported positive receipt anchors are transient and consumed only. The Universal Credit draw's population is the benefit units with a UC claimant or partner (is_uc_claimant) aged 18 or over and under Pension Credit qualifying age (66 for everyone who can reach it in this release), the age and role conditions of policyengine-uk 2.145.0's is_uc_eligible; the engine lockstep test pins it and names the three engine cases not mirrored (16- and 17-year-old claimants under the UC Regs 2013 reg 8 exceptions, mixed-age couples on the Pension Credit route, and from 2.128.0 pension-age families moved onto Universal Credit when their legacy benefit closes, SI 2014/1230 reg 60A). So the contract rate is a share of those units, an anchor outside them stays true, and any other unit is never drawn; a unit with no claimant or partner of that age keeps its reported Housing Benefit, which a claim it cannot make no longer zeroes (#882, microcosm#867, microcosm#1095)." + "notes": "Identity-keyed seed 0 streams replace the incumbent sequential take-up seed 100; salts are output variable names. Reported positive receipt anchors are transient and consumed only. The Universal Credit draw's population is the benefit units with a UC claimant or partner (is_uc_claimant) aged 18 or over and under Pension Credit qualifying age (66 for everyone who can reach it in this release), the age and role conditions of policyengine-uk 2.145.0's is_uc_eligible; the engine lockstep test pins it and names the three engine cases not mirrored (16- and 17-year-old claimants under the UC Regs 2013 reg 8 exceptions, mixed-age couples on the Pension Credit route, and from 2.128.0 pension-age families moved onto Universal Credit when their legacy benefit closes, SI 2014/1230 reg 60A). So the contract rate is a share of those units, an anchor outside them stays true, and any other unit is never drawn; a unit with no claimant or partner of that age keeps its reported Housing Benefit, which a claim it cannot make no longer zeroes (#882, microcosm#867, microcosm#1095). The universal childcare flag is nested under the working-parent one. A unit that claims the extended hours claims the universal hours, and any other unit claims them at the contract's universal_childcare rate, the rate conditional on not claiming the extended hours; the extended draw is unchanged. childcare_copy_take_up later re-draws the childcare flags and hours of the support and CGT copies on their own benefit units." }, { "stage": "frs_person_draws", @@ -6510,6 +6512,70 @@ "attends_private_school" ], "notes": "The last spine stage (uk-data#568, microcosm#1095). policyengine-uk imputes attends_private_school with a formula that ranks households by net income at their weights and compares a percentile rate, scaled to the national pupil count, with the stored attends_private_school_random_draw. Left to the formula, attendance is re-imputed in every simulation, so a reform to income tax, National Insurance or benefits switches pupils in or out, a population under one million people of weight imputes none (pe-uk#1905), and the calibration and the release read different flags once the weights change. This stage materializes the engine's attendance once, at the calibration year and the spine's design weights, and stores it, as the root stage stores months_since_last_birthday, so the solve and the release read the same flags; no stage after it copies or re-keys a person. Stored attendance no longer responds to income changes or to reforms of the attendance parameters, and a reform to the fee VAT does not move pupils either way in the pinned engine." + }, + { + "stage": "childcare_copy_take_up", + "survey": "Family Resources Survey 2024-25", + "source": "The UK take-up contract's childcare rates and extended-hours usage distribution, as frs_take_up draws them, applied to the support and CGT copies on their own benefit units.", + "grain": "benunit", + "artifacts": [], + "operations": [ + { + "kind": "assign_binary_from_rate", + "output": "would_claim_tfc", + "draw": "would_claim_tfc", + "rate_key": "tax_free_childcare", + "eligibility": "copy benefit units only, a unit whose household has a non-empty clone path (SPI support channel or income-band donor, CGT support split, high-value home support, CGT incidence clone, residential arm) or whose benunit_support_clone_index is positive; native units keep their frs_take_up draw", + "assignment_unit": "benunit_id", + "seed": 0 + }, + { + "kind": "assign_binary_from_rate", + "output": "would_claim_extended_childcare", + "draw": "would_claim_extended_childcare", + "rate_key": "extended_childcare", + "eligibility": "copy benefit units only, a unit whose household has a non-empty clone path (SPI support channel or income-band donor, CGT support split, high-value home support, CGT incidence clone, residential arm) or whose benunit_support_clone_index is positive; native units keep their frs_take_up draw", + "assignment_unit": "benunit_id", + "seed": 0 + }, + { + "kind": "assign_binary_from_rate", + "output": "would_claim_universal_childcare", + "draw": "would_claim_universal_childcare", + "rate_key": "universal_childcare", + "nested_under": "would_claim_extended_childcare", + "rate_derivation": "the contract's universal_childcare rate is the rate among benefit units not claiming the extended hours; would_claim_universal_childcare = would_claim_extended_childcare OR u < rate, as in frs_take_up", + "eligibility": "copy benefit units only, a unit whose household has a non-empty clone path (SPI support channel or income-band donor, CGT support split, high-value home support, CGT incidence clone, residential arm) or whose benunit_support_clone_index is positive; native units keep their frs_take_up draw", + "assignment_unit": "benunit_id", + "seed": 0 + }, + { + "kind": "assign_binary_from_rate", + "output": "would_claim_targeted_childcare", + "draw": "would_claim_targeted_childcare", + "rate_key": "targeted_childcare", + "eligibility": "copy benefit units only, a unit whose household has a non-empty clone path (SPI support channel or income-band donor, CGT support split, high-value home support, CGT incidence clone, residential arm) or whose benunit_support_clone_index is positive; native units keep their frs_take_up draw", + "assignment_unit": "benunit_id", + "seed": 0 + }, + { + "kind": "assign_clipped_normal", + "output": "maximum_extended_childcare_hours_usage", + "draw": "maximum_extended_childcare_hours_usage", + "distribution_key": "maximum_extended_childcare_hours_usage", + "eligibility": "copy benefit units only, a unit whose household has a non-empty clone path (SPI support channel or income-band donor, CGT support split, high-value home support, CGT incidence clone, residential arm) or whose benunit_support_clone_index is positive; native units keep their frs_take_up draw", + "seed": 0 + } + ], + "outputs": [], + "rewrites": [ + "would_claim_tfc", + "would_claim_extended_childcare", + "would_claim_universal_childcare", + "would_claim_targeted_childcare", + "maximum_extended_childcare_hours_usage" + ], + "notes": "Runs after the last copy stage and before calibration. frs_take_up draws the childcare flags and the extended-hours usage on FRS benefit units before any copy exists, so every SPI support copy, income-band donor, high-value home support copy, CGT support copy, CGT incidence clone and residential arm inherited its host's draws, and a cell with few hosts fixed the take-up of all their copies. This stage re-draws would_claim_tfc, would_claim_extended_childcare, would_claim_universal_childcare (nested under the extended flag) and would_claim_targeted_childcare at the contract rates, and maximum_extended_childcare_hours_usage from the contract's clipped normal, for the copies only, with frs_take_up's own helper, seed 0 and output-name salts, keyed on the copy's own benunit_id. A copy's structural id is its source id plus a multiple of an offset above every id in the frame, so it is unique, differs from every native id and gives the copy streams independent of its host's; a rebuild of the same frame draws the same values. Native benefit units keep their frs_take_up draws. The anchored Child Benefit, Pension Credit and Universal Credit flags and would_claim_uc_childcare are left as they are." } ] } 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 2be3b5659..0d1043adf 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml +++ b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml @@ -976,6 +976,8 @@ stages: output: would_claim_universal_childcare draw: would_claim_universal_childcare rate_key: universal_childcare + nested_under: would_claim_extended_childcare + rate_derivation: the contract's universal_childcare rate is the rate among benefit units not claiming the extended hours; would_claim_universal_childcare = would_claim_extended_childcare OR u < rate, so every unit claiming the extended hours claims the universal hours seed: 0 - kind: assign_binary_from_rate output: would_claim_targeted_childcare @@ -1009,7 +1011,7 @@ stages: - maximum_extended_childcare_hours_usage nonnegative_outputs: - maximum_extended_childcare_hours_usage - notes: Identity-keyed seed 0 streams replace the incumbent sequential take-up seed 100; salts are output variable names. Reported positive receipt anchors are transient and consumed only. The Universal Credit draw's population is the benefit units with a UC claimant or partner (is_uc_claimant) aged 18 or over and under Pension Credit qualifying age (66 for everyone who can reach it in this release), the age and role conditions of policyengine-uk 2.145.0's is_uc_eligible; the engine lockstep test pins it and names the three engine cases not mirrored (16- and 17-year-old claimants under the UC Regs 2013 reg 8 exceptions, mixed-age couples on the Pension Credit route, and from 2.128.0 pension-age families moved onto Universal Credit when their legacy benefit closes, SI 2014/1230 reg 60A). So the contract rate is a share of those units, an anchor outside them stays true, and any other unit is never drawn; a unit with no claimant or partner of that age keeps its reported Housing Benefit, which a claim it cannot make no longer zeroes (#882, microcosm#867, microcosm#1095). + notes: Identity-keyed seed 0 streams replace the incumbent sequential take-up seed 100; salts are output variable names. Reported positive receipt anchors are transient and consumed only. The Universal Credit draw's population is the benefit units with a UC claimant or partner (is_uc_claimant) aged 18 or over and under Pension Credit qualifying age (66 for everyone who can reach it in this release), the age and role conditions of policyengine-uk 2.145.0's is_uc_eligible; the engine lockstep test pins it and names the three engine cases not mirrored (16- and 17-year-old claimants under the UC Regs 2013 reg 8 exceptions, mixed-age couples on the Pension Credit route, and from 2.128.0 pension-age families moved onto Universal Credit when their legacy benefit closes, SI 2014/1230 reg 60A). So the contract rate is a share of those units, an anchor outside them stays true, and any other unit is never drawn; a unit with no claimant or partner of that age keeps its reported Housing Benefit, which a claim it cannot make no longer zeroes (#882, microcosm#867, microcosm#1095). The universal childcare flag is nested under the working-parent one. A unit that claims the extended hours claims the universal hours, and any other unit claims them at the contract's universal_childcare rate, the rate conditional on not claiming the extended hours; the extended draw is unchanged. childcare_copy_take_up later re-draws the childcare flags and hours of the support and CGT copies on their own benefit units. - stage: frs_person_draws survey: Family Resources Survey 2024-25 source: Sourced UK take-up contract rates and identity-keyed deterministic draws. @@ -5248,3 +5250,53 @@ stages: outputs: - attends_private_school notes: 'The last spine stage (uk-data#568, microcosm#1095). policyengine-uk imputes attends_private_school with a formula that ranks households by net income at their weights and compares a percentile rate, scaled to the national pupil count, with the stored attends_private_school_random_draw. Left to the formula, attendance is re-imputed in every simulation, so a reform to income tax, National Insurance or benefits switches pupils in or out, a population under one million people of weight imputes none (pe-uk#1905), and the calibration and the release read different flags once the weights change. This stage materializes the engine''s attendance once, at the calibration year and the spine''s design weights, and stores it, as the root stage stores months_since_last_birthday, so the solve and the release read the same flags; no stage after it copies or re-keys a person. Stored attendance no longer responds to income changes or to reforms of the attendance parameters, and a reform to the fee VAT does not move pupils either way in the pinned engine.' +- stage: childcare_copy_take_up + survey: Family Resources Survey 2024-25 + source: The UK take-up contract's childcare rates and extended-hours usage distribution, as frs_take_up draws them, applied to the support and CGT copies on their own benefit units. + grain: benunit + artifacts: [] + operations: + - kind: assign_binary_from_rate + output: would_claim_tfc + draw: would_claim_tfc + rate_key: tax_free_childcare + eligibility: copy benefit units only, a unit whose household has a non-empty clone path (SPI support channel or income-band donor, CGT support split, high-value home support, CGT incidence clone, residential arm) or whose benunit_support_clone_index is positive; native units keep their frs_take_up draw + assignment_unit: benunit_id + seed: 0 + - kind: assign_binary_from_rate + output: would_claim_extended_childcare + draw: would_claim_extended_childcare + rate_key: extended_childcare + eligibility: copy benefit units only, a unit whose household has a non-empty clone path (SPI support channel or income-band donor, CGT support split, high-value home support, CGT incidence clone, residential arm) or whose benunit_support_clone_index is positive; native units keep their frs_take_up draw + assignment_unit: benunit_id + seed: 0 + - kind: assign_binary_from_rate + output: would_claim_universal_childcare + draw: would_claim_universal_childcare + rate_key: universal_childcare + nested_under: would_claim_extended_childcare + rate_derivation: the contract's universal_childcare rate is the rate among benefit units not claiming the extended hours; would_claim_universal_childcare = would_claim_extended_childcare OR u < rate, as in frs_take_up + eligibility: copy benefit units only, a unit whose household has a non-empty clone path (SPI support channel or income-band donor, CGT support split, high-value home support, CGT incidence clone, residential arm) or whose benunit_support_clone_index is positive; native units keep their frs_take_up draw + assignment_unit: benunit_id + seed: 0 + - kind: assign_binary_from_rate + output: would_claim_targeted_childcare + draw: would_claim_targeted_childcare + rate_key: targeted_childcare + eligibility: copy benefit units only, a unit whose household has a non-empty clone path (SPI support channel or income-band donor, CGT support split, high-value home support, CGT incidence clone, residential arm) or whose benunit_support_clone_index is positive; native units keep their frs_take_up draw + assignment_unit: benunit_id + seed: 0 + - kind: assign_clipped_normal + output: maximum_extended_childcare_hours_usage + draw: maximum_extended_childcare_hours_usage + distribution_key: maximum_extended_childcare_hours_usage + eligibility: copy benefit units only, a unit whose household has a non-empty clone path (SPI support channel or income-band donor, CGT support split, high-value home support, CGT incidence clone, residential arm) or whose benunit_support_clone_index is positive; native units keep their frs_take_up draw + seed: 0 + outputs: [] + rewrites: + - would_claim_tfc + - would_claim_extended_childcare + - would_claim_universal_childcare + - would_claim_targeted_childcare + - maximum_extended_childcare_hours_usage + notes: Runs after the last copy stage and before calibration. frs_take_up draws the childcare flags and the extended-hours usage on FRS benefit units before any copy exists, so every SPI support copy, income-band donor, high-value home support copy, CGT support copy, CGT incidence clone and residential arm inherited its host's draws, and a cell with few hosts fixed the take-up of all their copies. This stage re-draws would_claim_tfc, would_claim_extended_childcare, would_claim_universal_childcare (nested under the extended flag) and would_claim_targeted_childcare at the contract rates, and maximum_extended_childcare_hours_usage from the contract's clipped normal, for the copies only, with frs_take_up's own helper, seed 0 and output-name salts, keyed on the copy's own benunit_id. A copy's structural id is its source id plus a multiple of an offset above every id in the frame, so it is unique, differs from every native id and gives the copy streams independent of its host's; a rebuild of the same frame draws the same values. Native benefit units keep their frs_take_up draws. The anchored Child Benefit, Pension Credit and Universal Credit flags and would_claim_uc_childcare are left as they are. 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 9d1f0adf2..bffa17aec 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 @@ -294,6 +294,7 @@ "key": "universal_childcare", "output": "would_claim_universal_childcare", "entity": "benunit", + "nested_under": "would_claim_extended_childcare", "values": { "2015-01-01": 0.563, "2024-04-06": 0.4353 @@ -301,7 +302,7 @@ "source": { "source": "FRS empirical fit", "agency": "PolicyEngine", - "citation": "Incumbent offline FRS childcare take-up fit.", + "citation": "Incumbent offline FRS childcare take-up fit. Conditional rate, nested under the working-parent flag: the share of benefit units not claiming the extended hours that claim the universal hours. A unit that claims the extended hours claims the universal hours with them, so would_claim_universal_childcare = would_claim_extended_childcare OR u < rate and its expected share is r_e + (1 - r_e) * rate. Independent draws let a working-parent unit over the 100k limit hold extended-yes and universal-no, whose child's first 15 hours policyengine-uk then allocates to the universal entitlement only once the limit is removed. The 2024 value below was fitted as an unconditional rate (tool version 4) and is carried unchanged until the childcare fitter refits it on the conditional basis.", "status": "fitted_offline" }, "fitting_receipt": { diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/childcare_copy_take_up.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/childcare_copy_take_up.py new file mode 100644 index 000000000..82459143e --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/childcare_copy_take_up.py @@ -0,0 +1,159 @@ +"""Re-draw the childcare take-up of support and CGT copies on their own units. + +``frs_take_up`` draws the childcare flags and the extended-hours usage keyed on +each FRS benefit unit before any copy exists, so every copy the later stages +make (the SPI support channel and its income-band donors, the high-value home +support, the CGT support split, the CGT incidence clone and the residential +arms) inherits its host's draws. A small cell of hosts then fixes the take-up +of all its copies: the high-income young-family cell had a few hundred +independent draws and a realised extended take-up well above the contract +rate. This stage, which runs after the last copy stage, re-draws +``would_claim_tfc``, ``would_claim_extended_childcare``, +``would_claim_universal_childcare`` (nested under the extended flag), +``would_claim_targeted_childcare`` and ``maximum_extended_childcare_hours_usage`` +for the copies only, through ``frs_take_up``'s own +``derive_childcare_take_up`` at the same contract rates, seed and salts. + +The draws are keyed on the copy's own ``benunit_id``. Every copy stage gives a +copy the structural id ``source id + k × offset`` with an offset above every +id in the frame, so a copy's id is unique and differs from every native id: +the copy's streams are independent of its host's, and a rebuild of the same +frame draws the same values. Native benefit units keep their ``frs_take_up`` +draws untouched. Anchored flags (Child Benefit, Pension Credit, Universal +Credit) and ``would_claim_uc_childcare`` are left as they are. + +A copy is a benefit unit whose household carries a non-empty clone path +(``uk_household_clone_paths``: the SPI support channel, the CGT support split, +the high-value support, the CGT incidence clone or a residential arm), or +whose own support clone index is positive. +""" + +from __future__ import annotations + +from dataclasses import dataclass + +import numpy as np +import pandas as pd + +from microcosm.build.source_manifest import SourceStageSpec +from microcosm.build.uk_runtime.frs_brma import _benunit_household_map +from microcosm.build.uk_runtime.frs_take_up import ( + UK_CHILDCARE_HOURS_OUTPUT, + UK_CHILDCARE_TAKE_UP_FLAGS, + UK_CHILDCARE_TAKE_UP_OUTPUTS, + assert_universal_childcare_nesting_declaration, + derive_childcare_take_up, +) +from microcosm.build.uk_runtime.household_lineage import ( + uk_household_clone_paths, + without_geographic_branch, +) +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 +from microcosm.frame import Frame + +__all__ = [ + "CHILDCARE_COPY_TAKE_UP_STAGE_NAME", + "UKChildcareCopyTakeUpStageTransform", + "copy_benunits", + "redraw_childcare_copy_take_up", +] + +CHILDCARE_COPY_TAKE_UP_STAGE_NAME = "childcare_copy_take_up" +BENUNIT_SUPPORT_CLONE_INDEX = "benunit_support_clone_index" + + +@dataclass(frozen=True) +class UKChildcareCopyTakeUpStageTransform: + """Whole-stage callable re-drawing the copies' childcare take-up.""" + + contract: UKTakeUpContract + stage: SourceStageSpec + + def __call__(self, frame: Frame) -> Frame: + assert_universal_childcare_nesting_declaration(self.stage) + declared = tuple(self.stage.rewrites) + if declared != UK_CHILDCARE_TAKE_UP_OUTPUTS: + raise ValueError( + f"stage {self.stage.stage!r} must declare the rewrites " + f"{list(UK_CHILDCARE_TAKE_UP_OUTPUTS)}; declared {list(declared)}" + ) + return redraw_childcare_copy_take_up(frame, contract=self.contract) + + @staticmethod + def output_columns() -> tuple[str, ...]: + return () + + +def copy_benunits( + person: pd.DataFrame, benunit: pd.DataFrame, household: pd.DataFrame +) -> np.ndarray: + """True for every benefit unit that is a copy of a spine benefit unit.""" + + _, paths = uk_household_clone_paths(household) + copy_households = household.loc[ + np.array([bool(path) for path in without_geographic_branch(paths)], dtype=bool), + "household_id", + ] + household_of = _benunit_household_map(person) + unit_household = benunit["benunit_id"].map(household_of) + if unit_household.isna().any(): + raise ValueError( + "every benefit unit needs a person placing it in a household; the " + "childcare copy re-draw cannot tell a copy from a native unit otherwise" + ) + copies = unit_household.isin(set(copy_households)).to_numpy(dtype=bool, copy=True) + if BENUNIT_SUPPORT_CLONE_INDEX in benunit.columns: + clone_index = pd.to_numeric( + benunit[BENUNIT_SUPPORT_CLONE_INDEX], errors="raise" + ).to_numpy() + copies |= clone_index > 0 + return copies + + +def redraw_childcare_copy_take_up(frame: Frame, *, contract: UKTakeUpContract) -> Frame: + """Re-draw the copies' childcare take-up; native units keep their draws.""" + + validate_uk_national_frame(frame) + person = frame.table("person").copy() + benunit = frame.table("benunit").copy() + household = frame.table("household").copy() + missing = [ + column for column in UK_CHILDCARE_TAKE_UP_OUTPUTS if column not in benunit + ] + if missing: + raise KeyError( + f"benunit columns {missing} are missing; frs_take_up must draw them " + "before the copies' childcare take-up is re-drawn" + ) + copies = copy_benunits(person, benunit, household) + ids = benunit["benunit_id"].to_numpy() + if pd.Series(ids).duplicated().any(): + raise ValueError( + "benunit_id must be unique: the copies' childcare draws are keyed on it" + ) + if copies.any(): + redrawn = derive_childcare_take_up(ids[copies], contract=contract) + for output, _ in UK_CHILDCARE_TAKE_UP_FLAGS: + values = benunit[output].to_numpy(dtype=bool, copy=True) + values[copies] = redrawn[output] + benunit[output] = values + hours = benunit[UK_CHILDCARE_HOURS_OUTPUT].to_numpy(dtype=np.float64, copy=True) + hours[copies] = redrawn[UK_CHILDCARE_HOURS_OUTPUT] + benunit[UK_CHILDCARE_HOURS_OUTPUT] = hours + result = uk_national_frame( + person=person, + benunit=benunit, + household=household, + time_period=uk_time_period(frame), + 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 result 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 7ea3444ed..c95c17f84 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 @@ -76,6 +76,34 @@ UK_UC_AGE_ELIGIBLE_SOURCE = "age" UK_UC_AGE_ELIGIBLE_ROLE = "is_uc_claimant" UK_UC_TAKE_UP_OUTPUT = "would_claim_uc" +# The universal 15 hours are nested under the working-parent entitlement: a +# benefit unit that claims the extended (working-parent) hours claims the +# universal hours with them, and a unit that does not claims them at the +# contract's universal_childcare rate, which is the rate conditional on not +# claiming the extended hours. policyengine-uk allocates a working-parent +# child's first 15 hours to the universal entitlement when the unit's +# standalone universal flag is false, so two independent draws let a unit over +# the £100k limit gain universal hours when the limit is removed. The stage +# manifest declares the nesting on the universal operation +# (``nested_under``); ``assert_universal_childcare_nesting_declaration`` +# refuses a manifest that stops saying so. ``childcare_copy_take_up`` +# re-draws the copies through the same helper. +UK_EXTENDED_CHILDCARE_OUTPUT = "would_claim_extended_childcare" +UK_UNIVERSAL_CHILDCARE_OUTPUT = "would_claim_universal_childcare" +UK_UNIVERSAL_CHILDCARE_NESTED_UNDER = UK_EXTENDED_CHILDCARE_OUTPUT +# The childcare draws, in the order they are drawn: the flag outputs with +# their contract keys, then the extended-hours usage distribution. +UK_CHILDCARE_TAKE_UP_FLAGS = ( + ("would_claim_tfc", "tax_free_childcare"), + (UK_EXTENDED_CHILDCARE_OUTPUT, "extended_childcare"), + (UK_UNIVERSAL_CHILDCARE_OUTPUT, "universal_childcare"), + ("would_claim_targeted_childcare", "targeted_childcare"), +) +UK_CHILDCARE_HOURS_OUTPUT = "maximum_extended_childcare_hours_usage" +UK_CHILDCARE_TAKE_UP_OUTPUTS = ( + *(output for output, _ in UK_CHILDCARE_TAKE_UP_FLAGS), + UK_CHILDCARE_HOURS_OUTPUT, +) # The Universal Credit childcare element is claimed at one rate per family # type (DWP publishes the single / couple split of the households receiving # it); the couple rate applies where the benefit unit is a couple (#882). @@ -214,6 +242,27 @@ def assert_take_up_stage_population_declaration(stage: SourceStageSpec) -> None: ) +def assert_universal_childcare_nesting_declaration(stage: SourceStageSpec) -> None: + """Refuse a manifest that does not nest universal under extended take-up.""" + + declared = [ + dict(op.parameters) + for op in stage.operations + if op.parameters.get("output") == UK_UNIVERSAL_CHILDCARE_OUTPUT + ] + if not declared or any( + params.get("nested_under") != UK_UNIVERSAL_CHILDCARE_NESTED_UNDER + for params in declared + ): + raise ValueError( + f"stage {stage.stage!r} must declare " + f"nested_under={UK_UNIVERSAL_CHILDCARE_NESTED_UNDER!r} on the " + f"{UK_UNIVERSAL_CHILDCARE_OUTPUT!r} operation; the code draws " + "universal take-up as extended OR (u < the conditional universal " + f"rate) and refuses a manifest that says otherwise (declared: {declared!r})" + ) + + @dataclass(frozen=True) class UKFRSTakeUpStageTransform: """Whole-stage callable for UK benefit-unit take-up assignments.""" @@ -224,6 +273,7 @@ class UKFRSTakeUpStageTransform: def __call__(self, frame: Frame) -> Frame: assert_take_up_stage_population_declaration(self.stage) + assert_universal_childcare_nesting_declaration(self.stage) policy = self.population_policy or uk_take_up_population_policy( uk_time_period(frame) ) @@ -338,21 +388,60 @@ def derive_frs_take_up( anchors["universal_credit_reported_anchor"].to_numpy(dtype=bool), population=population, ) - for output, key in ( - ("would_claim_tfc", "tax_free_childcare"), - ("would_claim_extended_childcare", "extended_childcare"), - ("would_claim_universal_childcare", "universal_childcare"), - ("would_claim_targeted_childcare", "targeted_childcare"), - ): - values[output] = assign_binary_from_rate( - _draws(ids, output), contract.rate(key) - ) + childcare = derive_childcare_take_up(ids, contract=contract) + for output, _ in UK_CHILDCARE_TAKE_UP_FLAGS: + values[output] = childcare[output] values["would_claim_uc_childcare"] = _draws( ids, "would_claim_uc_childcare" ) < uc_childcare_rates(benunit, contract) - distribution = contract.continuous_entry("maximum_extended_childcare_hours_usage") - values["maximum_extended_childcare_hours_usage"] = clipped_normal_from_uniforms( - _draws(ids, "maximum_extended_childcare_hours_usage"), + values[UK_CHILDCARE_HOURS_OUTPUT] = childcare[UK_CHILDCARE_HOURS_OUTPUT] + return values + + +def nest_universal_childcare( + extended: np.ndarray, draws: np.ndarray, conditional_rate: float +) -> np.ndarray: + """Universal take-up nested under the working-parent flag. + + A unit that claims the extended hours claims the universal hours; any + other unit claims them where its universal draw falls under + ``conditional_rate``, the universal rate among units not claiming the + extended hours. P(universal | extended) is 1 by construction. + """ + + return np.asarray(extended, dtype=bool) | assign_binary_from_rate( + draws, conditional_rate + ) + + +def derive_childcare_take_up( + ids: np.ndarray, *, contract: UKTakeUpContract +) -> dict[str, np.ndarray]: + """The childcare take-up flags and extended-hours usage keyed on ``ids``. + + Each output draws its own identity stream (seed 0, salt the output name): + Tax-Free Childcare, extended and targeted at their contract rates, the + universal flag nested under the extended one (``nest_universal_childcare``) + and the extended-hours usage from the contract's clipped normal. Both + ``frs_take_up`` (keyed on FRS benefit units) and ``childcare_copy_take_up`` + (keyed on the copies' own benefit units) draw through it. + """ + + values: dict[str, np.ndarray] = {} + for output, key in UK_CHILDCARE_TAKE_UP_FLAGS: + if output == UK_UNIVERSAL_CHILDCARE_OUTPUT: + values[output] = nest_universal_childcare( + values[UK_UNIVERSAL_CHILDCARE_NESTED_UNDER], + _draws(ids, output), + contract.rate(key), + ) + else: + values[output] = assign_binary_from_rate( + _draws(ids, output), contract.rate(key) + ) + distribution = contract.continuous_entry(UK_CHILDCARE_HOURS_OUTPUT) + values[UK_CHILDCARE_HOURS_OUTPUT] = clipped_normal_from_uniforms( + _draws(ids, UK_CHILDCARE_HOURS_OUTPUT), mean=float(distribution["mean"]), sd=float(distribution["sd"]), lower=float(distribution["lower"]), @@ -361,6 +450,13 @@ def derive_frs_take_up( return values +def universal_childcare_marginal_rate(contract: UKTakeUpContract) -> float: + """The universal flag's expected share: r_e + (1 - r_e) * r_u_cond.""" + + extended = contract.rate("extended_childcare") + return extended + (1.0 - extended) * contract.rate("universal_childcare") + + def uc_childcare_rates(benunit: pd.DataFrame, contract: UKTakeUpContract) -> np.ndarray: """Per-unit childcare-element take-up rate: the couple or single contract rate.""" @@ -436,6 +532,25 @@ def uk_take_up_signal_gate( "unique_count": unique_count, "population_units": int(population.sum()), } + if ( + output == UK_UNIVERSAL_CHILDCARE_OUTPUT + and UK_UNIVERSAL_CHILDCARE_NESTED_UNDER in table.columns + ): + # Nested draw: P(universal | extended) = 1, so no benefit unit + # claims the extended hours without the universal ones. + extended = np.asarray( + table[UK_UNIVERSAL_CHILDCARE_NESTED_UNDER], dtype=bool + ) + violations = int((extended & ~values).sum()) + details[f"{entity}.{output}"]["extended_without_universal_units"] = ( + violations + ) + if violations: + failures.append( + f"{entity}.{output}: {violations} benefit unit(s) claim the " + "extended hours without the universal hours; the universal " + "flag is nested under would_claim_extended_childcare." + ) if unique_count < 2: failures.append( f"{entity}.{output}: constant column; stochastic take-up " @@ -463,6 +578,10 @@ def _target_share( ) -> float: if key == "uc_childcare": return float(np.average(uc_childcare_rates(table, contract), weights=weights)) + if key == "universal_childcare": + # The contract rate is conditional on not claiming the extended + # hours; the flag's share is the nested draw's marginal. + return universal_childcare_marginal_rate(contract) if key != "scp": return contract.rate(key) age = pd.to_numeric(table["age"], errors="coerce").fillna(0).to_numpy() 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 0788e7e92..7f340df67 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/graph.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/graph.py @@ -129,6 +129,10 @@ # the root cell the SPI income stage refreshes, which the open-surface # readers before it bind (microcosm#1319). "carers_allowance_take_up", + # The copies' childcare re-draw rewrites ``frs_take_up``'s childcare + # flags and extended-hours usage, which the open-surface readers before + # it bind. + "childcare_copy_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 @@ -532,6 +536,10 @@ # One engine materialization of private-school attendance over the whole # frame at its weights: an open surface (microcosm#1095). "private_school_attendance": None, + # The copies' childcare re-draw reads every household's clone path (the + # lineage columns of each copy stage) and keeps the native units' cells: + # an open surface, like the other take-up redraws. + "childcare_copy_take_up": None, "student_loans": frozenset( { ("person", "age"), @@ -1072,6 +1080,19 @@ def _cells( ), "student_loans": (_Cell("person", "student_loan_plan", "string"),), "private_school_attendance": (_Cell("person", "attends_private_school", "bool"),), + "childcare_copy_take_up": ( + *_cells( + "benunit", + ( + "would_claim_tfc", + "would_claim_extended_childcare", + "would_claim_universal_childcare", + "would_claim_targeted_childcare", + ), + "bool", + ), + _Cell("benunit", "maximum_extended_childcare_hours_usage", "float64"), + ), "age_tail": (_Cell("person", "age", "int64"),), } 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 0b83ccbf8..882eaf979 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 @@ -52,6 +52,7 @@ frs_hmrc_source, frs_take_up, hmrc_property_rental, + household_lineage, ledger_fact_vendoring, property_localisation, receipt_counts, @@ -125,6 +126,7 @@ "salary_sacrifice": "salary_sacrifice", "student_loans": "student_loans", "private_school_attendance": "private_school_attendance", + "childcare_copy_take_up": "childcare_copy_take_up", "age_tail": "age_tail", } @@ -184,6 +186,9 @@ "carers_allowance_take_up": (uk_engine_adapter, receipt_counts), # The stored attendance is one engine materialization (microcosm#1095). "private_school_attendance": (uk_engine_adapter,), + # The copies' childcare re-draw draws through frs_take_up's childcare + # helper and reads each household's clone path. + "childcare_copy_take_up": (frs_take_up, household_lineage), } _COMPUTE = Capabilities( @@ -493,6 +498,7 @@ def _fixture_implementations(source: Path) -> Mapping[str, object]: ) from .cgt_support import UKCGTSupportSplitStageTransform from .child_benefit_take_up import UKChildBenefitTakeUpStageTransform + from .childcare_copy_take_up import UKChildcareCopyTakeUpStageTransform from .etb_services import UKETBServicesStageTransform from .etb_vat import UKETBVATStageTransform from .frs_brma import UKFRSBRMAStageTransform @@ -782,6 +788,9 @@ def _fixture_implementations(source: Path) -> Mapping[str, object]: engine=engine, calibration_year=calibration_year, ), + "childcare_copy_take_up": UKChildcareCopyTakeUpStageTransform( + contract=contract, stage=stages["childcare_copy_take_up"] + ), "age_tail": UKAgeTailStageTransform(stage=stages["age_tail"]), } ) 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 307aabfb3..c2b917db0 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 @@ -90,6 +90,9 @@ from microcosm.build.uk_runtime.child_benefit_take_up import ( UKChildBenefitTakeUpStageTransform, ) +from microcosm.build.uk_runtime.childcare_copy_take_up import ( + UKChildcareCopyTakeUpStageTransform, +) from microcosm.build.uk_runtime.content_identity import uk_frame_content_identity from microcosm.build.uk_runtime.etb_services import UKETBServicesStageTransform from microcosm.build.uk_runtime.etb_vat import UKETBVATStageTransform @@ -1794,6 +1797,11 @@ def prepare_uk_spine_execution( calibration_year=frs_release.calibration_year, ) ) + if "childcare_copy_take_up" in stage_names: + implementations["childcare_copy_take_up"] = UKChildcareCopyTakeUpStageTransform( + contract=stochastic_contract, + stage=stages_by_name["childcare_copy_take_up"], + ) if "age_tail" in stage_names: implementations["age_tail"] = UKAgeTailStageTransform( stage=stages_by_name["age_tail"] diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/take_up_contract.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/take_up_contract.py index eec1c79a3..8840e6f25 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/take_up_contract.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/take_up_contract.py @@ -185,6 +185,14 @@ def _entries(values: object, *, section: str) -> tuple[UKRateEntry, ...]: raise ValueError(f"UK take-up contract {key!r} requires source.") _validate_source(key, source) _validate_fitting_receipt(key, item.get("fitting_receipt")) + nested_under = item.get("nested_under") + if nested_under is not None and ( + not isinstance(nested_under, str) or nested_under == item.get("output") + ): + raise ValueError( + f"UK take-up contract {key!r} nested_under must name another " + "output: the flag this conditional rate is nested under." + ) entries.append( UKRateEntry( key=key, 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 a5ef5eec2..85423830b 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 @@ -1038,8 +1038,9 @@ def test_uk_source_manifest_contains_only_canonical_spine_stages(self) -> None: # regional_home_values after it, and microcosm#1095 property_purchases # after property_components and uc_legacy_closure_take_up after # uc_capital_coherence; microcosm#1319 carers_allowance_take_up after - # child_benefit_take_up. - assert len(spec.sources.stages) == 46 + # child_benefit_take_up; childcare_copy_take_up last, after every copy + # stage. + assert len(spec.sources.stages) == 47 assert not {"frs_hmrc_retained_leaves", "hmrc_spi_income"}.intersection( stage.stage for stage in spec.sources.stages ) diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_copy_take_up.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_copy_take_up.py new file mode 100644 index 000000000..1bf39833a --- /dev/null +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_copy_take_up.py @@ -0,0 +1,288 @@ +"""The copies' childcare take-up re-draw and the nested universal flag.""" + +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 SourceOperationSpec +from microcosm.build.stochastic_assignment import stable_identity_uniforms +from microcosm.build.uk_runtime.childcare_copy_take_up import ( + CHILDCARE_COPY_TAKE_UP_STAGE_NAME, + UKChildcareCopyTakeUpStageTransform, + copy_benunits, + redraw_childcare_copy_take_up, +) +from microcosm.build.uk_runtime.frs_take_up import ( + UK_CHILDCARE_HOURS_OUTPUT, + UK_CHILDCARE_TAKE_UP_OUTPUTS, + assert_universal_childcare_nesting_declaration, + derive_childcare_take_up, + uk_take_up_signal_gate, + universal_childcare_marginal_rate, +) +from microcosm.build.uk_runtime.national_frame import uk_national_frame +from microcosm.build.uk_runtime.take_up_contract import load_uk_take_up_contract + +_NATIVES = 6_000 +_OFFSET = 100_000 +# One branch per copy stage: (household lineage overrides, copy multiple). +_COPY_BRANCHES = ( + ({"household_support_channel": "spi", "household_support_clone_index": 1}, 1), + ({"household_is_cgt_support_copy": True, "cgt_support_copy_index": 1}, 2), + ( + { + "household_is_high_value_support_copy": True, + "high_value_support_copy_index": 1, + }, + 3, + ), + ({"household_is_capital_gains_clone": True}, 4), + ( + { + "household_is_cgt_residential_clone": True, + "cgt_residential_clone_index": 1, + }, + 5, + ), +) + + +def _stage(): + return load_country_spec("uk").sources.stage_map()[ + CHILDCARE_COPY_TAKE_UP_STAGE_NAME + ] + + +def _frame(contract, *, natives: int = _NATIVES): + """Native households plus one copy of each per copy stage. + + Every copy carries its host's childcare draws, as the copy stages leave + them: ``frs_take_up`` drew them keyed on the host's benefit unit. + """ + + native_ids = np.arange(1, natives + 1, dtype=np.int64) + lineage = { + "household_support_channel": "frs", + "household_support_clone_index": 0, + "household_is_cgt_support_copy": False, + "cgt_support_copy_index": 0, + "household_is_high_value_support_copy": False, + "high_value_support_copy_index": 0, + "household_is_capital_gains_clone": False, + "household_is_cgt_residential_clone": False, + "cgt_residential_clone_index": 0, + } + households = [ + pd.DataFrame( + {"household_id": native_ids, "source_household_id": native_ids, **lineage} + ) + ] + for overrides, multiple in _COPY_BRANCHES: + households.append( + pd.DataFrame( + { + "household_id": native_ids + multiple * _OFFSET, + "source_household_id": native_ids, + **{**lineage, **overrides}, + } + ) + ) + household = pd.concat(households, ignore_index=True) + household["household_weight"] = 1.0 + household["region"] = "LONDON" + ids = household["household_id"].to_numpy(dtype=np.int64) + sources = household["source_household_id"].to_numpy(dtype=np.int64) + person = pd.DataFrame( + { + "person_id": ids, + "person_benunit_id": ids, + "person_household_id": ids, + "age": 3, + } + ) + benunit = pd.DataFrame( + { + "benunit_id": ids, + "benunit_source_id": sources, + "benunit_support_clone_index": household[ + "household_support_clone_index" + ].to_numpy(dtype=np.int64), + } + ) + inherited = derive_childcare_take_up(sources, contract=contract) + for output in UK_CHILDCARE_TAKE_UP_OUTPUTS: + benunit[output] = inherited[output] + benunit["would_claim_uc_childcare"] = True + benunit["is_married"] = False + return uk_national_frame( + person=person, benunit=benunit, household=household, time_period="2024" + ) + + +def test_natives_keep_their_draws_and_copies_are_redrawn_deterministically() -> None: + contract = load_uk_take_up_contract() + frame = _frame(contract) + before = frame.table("benunit") + + first = UKChildcareCopyTakeUpStageTransform(contract=contract, stage=_stage())( + frame + ) + second = UKChildcareCopyTakeUpStageTransform(contract=contract, stage=_stage())( + frame + ) + after = first.table("benunit") + native = (before["benunit_id"] <= _NATIVES).to_numpy() + + pd.testing.assert_frame_equal(after, second.table("benunit")) + for output in UK_CHILDCARE_TAKE_UP_OUTPUTS: + np.testing.assert_array_equal( + after.loc[native, output].to_numpy(), before.loc[native, output].to_numpy() + ) + assert after[output].dtype == before[output].dtype + # Copies draw on their own benefit units through frs_take_up's helper, so + # they no longer repeat their host's draws. + copies = ~native + redrawn = derive_childcare_take_up( + after.loc[copies, "benunit_id"].to_numpy(), contract=contract + ) + for output in UK_CHILDCARE_TAKE_UP_OUTPUTS: + np.testing.assert_array_equal( + after.loc[copies, output].to_numpy(), redrawn[output] + ) + inherited = before.loc[copies, "would_claim_extended_childcare"].to_numpy() + assert (redrawn["would_claim_extended_childcare"] != inherited).mean() > 0.3 + extended = after.loc[copies, "would_claim_extended_childcare"].to_numpy() + expected = stable_identity_uniforms( + after.loc[copies, "benunit_id"].to_numpy(), + seed=0, + salt="would_claim_extended_childcare", + ) < contract.rate("extended_childcare") + np.testing.assert_array_equal(extended, expected) + # The anchored and UC childcare flags are not touched. + np.testing.assert_array_equal( + after["would_claim_uc_childcare"], before["would_claim_uc_childcare"] + ) + + +def test_copy_draws_hold_the_nesting_and_the_contract_rates() -> None: + contract = load_uk_take_up_contract() + after = redraw_childcare_copy_take_up(_frame(contract), contract=contract).table( + "benunit" + ) + copies = (after["benunit_id"] > _NATIVES).to_numpy() + extended = after.loc[copies, "would_claim_extended_childcare"].to_numpy(bool) + universal = after.loc[copies, "would_claim_universal_childcare"].to_numpy(bool) + + assert not (extended & ~universal).any() + assert extended.mean() == pytest.approx( + contract.rate("extended_childcare"), abs=0.02 + ) + assert universal.mean() == pytest.approx( + universal_childcare_marginal_rate(contract), abs=0.02 + ) + # Among copies not claiming the extended hours, the conditional rate. + assert universal[~extended].mean() == pytest.approx( + contract.rate("universal_childcare"), abs=0.03 + ) + for output, key in ( + ("would_claim_tfc", "tax_free_childcare"), + ("would_claim_targeted_childcare", "targeted_childcare"), + ): + realised = after.loc[copies, output].to_numpy(bool).mean() + assert realised == pytest.approx(contract.rate(key), abs=0.02) + distribution = contract.continuous_entry(UK_CHILDCARE_HOURS_OUTPUT) + hours = after.loc[copies, UK_CHILDCARE_HOURS_OUTPUT].to_numpy(float) + assert hours.min() >= float(distribution["lower"]) + assert hours.max() <= float(distribution["upper"]) + + +def test_copies_are_read_from_every_clone_path() -> None: + contract = load_uk_take_up_contract() + frame = _frame(contract, natives=3) + person, benunit, household = ( + frame.table("person"), + frame.table("benunit").copy(), + frame.table("household"), + ) + copies = copy_benunits(person, benunit, household) + + assert copies.tolist() == [False] * 3 + [True] * 3 * len(_COPY_BRANCHES) + # A unit's own support clone index marks it a copy as well. + benunit.loc[0, "benunit_support_clone_index"] = 2 + assert copy_benunits(person, benunit, household)[0] + + +def test_stage_refuses_a_manifest_without_the_nesting_or_the_rewrites() -> None: + stage = _stage() + assert_universal_childcare_nesting_declaration(stage) + contract = load_uk_take_up_contract() + stripped = tuple( + SourceOperationSpec( + op.kind, + {k: v for k, v in op.parameters.items() if k != "nested_under"}, + ) + for op in stage.operations + ) + with pytest.raises(ValueError, match="nested_under"): + UKChildcareCopyTakeUpStageTransform( + contract=contract, stage=replace(stage, operations=stripped) + )(_frame(contract, natives=3)) + with pytest.raises(ValueError, match="must declare the rewrites"): + UKChildcareCopyTakeUpStageTransform( + contract=contract, + stage=replace(stage, rewrites=stage.rewrites[:-1]), + )(_frame(contract, natives=3)) + + +def test_frs_take_up_nests_universal_and_keeps_the_extended_draw() -> None: + contract = load_uk_take_up_contract() + ids = np.arange(1, 20_001, dtype=np.int64) + drawn = derive_childcare_take_up(ids, contract=contract) + extended = drawn["would_claim_extended_childcare"] + universal = drawn["would_claim_universal_childcare"] + + # The extended flag is the draw it always was: same stream, same rate. + np.testing.assert_array_equal( + extended, + stable_identity_uniforms(ids, seed=0, salt="would_claim_extended_childcare") + < contract.rate("extended_childcare"), + ) + assert not (extended & ~universal).any() + np.testing.assert_array_equal( + universal[~extended], + stable_identity_uniforms(ids, seed=0, salt="would_claim_universal_childcare")[ + ~extended + ] + < contract.rate("universal_childcare"), + ) + + +def test_signal_gate_targets_the_nested_marginal_and_refuses_violations() -> None: + contract = load_uk_take_up_contract() + frame = redraw_childcare_copy_take_up(_frame(contract), contract=contract) + benunit = frame.table("benunit") + result = uk_take_up_signal_gate(frame, contract=contract) + universal = result.details["benunit.would_claim_universal_childcare"] + + assert universal["target"] == pytest.approx( + universal_childcare_marginal_rate(contract) + ) + assert universal["extended_without_universal_units"] == 0 + assert not any("universal_childcare" in failure for failure in result.failures) + + broken = benunit.copy() + broken["would_claim_universal_childcare"] = False + broken_frame = uk_national_frame( + person=frame.table("person"), + benunit=broken, + household=frame.table("household"), + time_period="2024", + household_weights=frame.weights_for("household").values, + ) + failures = uk_take_up_signal_gate(broken_frame, contract=contract).failures + assert any("without the universal hours" in failure for failure in failures) 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 d648577b8..b97faa4bb 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 @@ -796,6 +796,7 @@ def source_stage( { "kind": "assign_binary_from_rate", "output": "would_claim_universal_childcare", + "nested_under": "would_claim_extended_childcare", "seed": 0, }, { 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 02bf46133..6da3dfc7a 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 @@ -57,8 +57,9 @@ def test_uk_spine_graph_contains_every_manifest_stage() -> None: # microcosm#1106 property_components after the regional uprating, and # microcosm#1240 high_value_home_support between those two; microcosm#1095 # adds property_purchases and uc_legacy_closure_take_up, microcosm#1112 - # regional_home_values, and microcosm#1319 carers_allowance_take_up. - assert len(expected) == 46 + # regional_home_values, microcosm#1319 carers_allowance_take_up, and the + # copies' childcare re-draw childcare_copy_take_up. + assert len(expected) == 47 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_source_stages.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_source_stages.py index d4db01464..7f80f4073 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 @@ -109,9 +109,14 @@ "hmrc_cgt_asset_type_spine", "salary_sacrifice", "student_loans", - # microcosm#1095: the stored private-school attendance runs last. + # microcosm#1095: the stored private-school attendance runs after the + # CGT stages. "private_school_attendance", ] +# The copies' childcare re-draw runs after every copy stage, last. +CHILDCARE_COPY_TAKE_UP_STAGE_NAMES = [ + "childcare_copy_take_up", +] UK_SOURCE_STAGE_NAMES = [ "frs_spine", *POST_FRS_SPINE_STAGE_NAMES, @@ -132,6 +137,7 @@ *CARERS_ALLOWANCE_TAKE_UP_STAGE_NAMES, *E9_STAGE_NAMES, *E8_STAGE_NAMES, + *CHILDCARE_COPY_TAKE_UP_STAGE_NAMES, ] @@ -227,7 +233,8 @@ def test_e8_block_is_final_and_all_stages_are_canonical(self) -> None: canonical = _load_json(CANONICAL_SOURCE_STAGES) names = [stage["stage"] for stage in canonical["stages"]] start = names.index(E8_STAGE_NAMES[0]) - assert names[start:] == E8_STAGE_NAMES + # Only the copies' childcare re-draw follows the E8 block. + assert names[start:] == [*E8_STAGE_NAMES, *CHILDCARE_COPY_TAKE_UP_STAGE_NAMES] assert "frs_hmrc_retained_leaves" not in names assert "hmrc_spi_income" not in names @@ -293,6 +300,7 @@ def test_country_stage_plan_assembles_spine_plan(self) -> None: "salary_sacrifice": _identity, "student_loans": _identity, "private_school_attendance": _identity, + "childcare_copy_take_up": _identity, "age_tail": _identity, "frs_relationships": _identity, "hmrc_spi_income_fallback": _identity, 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 fac9c8881..41303477c 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 @@ -160,6 +160,10 @@ def _apply_pending_roster_transformations( # the last stage of the spine. assert "private_school_attendance" not in roster roster.append("private_school_attendance") + # Re-mint pending: the copies' childcare re-draw runs after every copy + # stage, as the spine's last stage. + assert "childcare_copy_take_up" not in roster + roster.append("childcare_copy_take_up") return tuple(roster) diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_take_up_gate.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_take_up_gate.py index 26a017083..f830b66f1 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_take_up_gate.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_take_up_gate.py @@ -30,7 +30,10 @@ def rate(self, key: str, build_year: int | None = None) -> float: "universal_credit": 0.5, "tax_free_childcare": 0.5, "extended_childcare": 0.5, - "universal_childcare": 0.5, + # Conditional on not claiming the extended hours: the fixture's + # universal flag is its extended flag, so the nested marginal is + # 0.5 + 0.5 * 0.0. + "universal_childcare": 0.0, "targeted_childcare": 0.5, "uc_childcare_single": 0.5, "uc_childcare_couple": 0.5, diff --git a/tools/graph_uk_spine_fixture.py b/tools/graph_uk_spine_fixture.py index 99861d431..39dfe39cf 100644 --- a/tools/graph_uk_spine_fixture.py +++ b/tools/graph_uk_spine_fixture.py @@ -60,6 +60,9 @@ from microcosm.build.uk_runtime.child_benefit_take_up import ( UKChildBenefitTakeUpStageTransform, ) +from microcosm.build.uk_runtime.childcare_copy_take_up import ( + UKChildcareCopyTakeUpStageTransform, +) from microcosm.build.uk_runtime.content_identity import uk_frame_content_identity from microcosm.build.uk_runtime.etb_services import UKETBServicesStageTransform from microcosm.build.uk_runtime.etb_vat import UKETBVATStageTransform @@ -2118,6 +2121,9 @@ def capture_root(frame: Frame) -> Frame: engine=engine, calibration_year=2025, ), + "childcare_copy_take_up": UKChildcareCopyTakeUpStageTransform( + contract=contract, stage=stages["childcare_copy_take_up"] + ), "age_tail": UKAgeTailStageTransform(stage=stages["age_tail"]), } return implementations, root_capture From c8436d60109a567765c461caa818e1c6337c833b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 22 Oct 2026 17:26:58 +0100 Subject: [PATCH 03/25] Fit the conditional universal rate and leave reception out of the DfE rows The childcare fitter (tool version 5) fits universal_childcare on the nested basis frs_take_up now draws: the universal-only row's expectation is r_e * sum(with extended) + (1 - r_e) * r_u * sum(without extended), from the existing forced-flag sides, with no allocated term; the targeted row keeps its allocation side. The diagnostic draw helper nests the universal flag the same way. DfE's January registrations leave out children in reception, but the working-parent 2-to-4 and universal-only rows counted them. The fitter's basis and both calibration bindings (concept and policyengine filters) now leave out a child whose current_education is PRIMARY, with the existing != predicate operator. Co-Authored-By: Claude Opus 5.5 --- ...care-take-up-nesting-and-copies.changed.md | 1 + .../build/uk/uk_population_targets.json | 24 +++++++- .../uk/test_uk_measurement_period.py | 9 ++- .../uk/test_uk_stochastic_tools.py | 19 +++++- tools/fit_uk_childcare_takeup.py | 60 +++++++++++++++---- 5 files changed, 94 insertions(+), 19 deletions(-) create mode 100644 changelog.d/uk-childcare-take-up-nesting-and-copies.changed.md diff --git a/changelog.d/uk-childcare-take-up-nesting-and-copies.changed.md b/changelog.d/uk-childcare-take-up-nesting-and-copies.changed.md new file mode 100644 index 000000000..216fc65dc --- /dev/null +++ b/changelog.d/uk-childcare-take-up-nesting-and-copies.changed.md @@ -0,0 +1 @@ +The UK childcare take-up draws now nest the universal 15 hours under the working-parent entitlement, re-draw the copies' childcare take-up, and fit and calibrate the DfE childcare rows without children in reception. `frs_take_up` keeps the extended draw unchanged and draws `would_claim_universal_childcare` as `would_claim_extended_childcare` OR u < the contract's `universal_childcare` rate, which is now the rate among benefit units not claiming the extended hours (the operation declares `nested_under`, and the stage refuses a manifest that drops it). Independent draws let a family over the £100k limit hold extended-yes and universal-no, and policyengine-uk then allocated its child's first 15 hours to the universal entitlement only once the limit was removed. The take-up signal gate targets the nested marginal, r_e + (1 - r_e) * r_u, and fails on any benefit unit claiming the extended hours without the universal ones. A new last spine stage, `childcare_copy_take_up`, re-draws `would_claim_tfc`, the extended, universal (nested) and targeted flags and `maximum_extended_childcare_hours_usage` for the SPI support, high-value home support and CGT copies on their own `benunit_id`, through `frs_take_up`'s helper at the same rates, seed and salts, so a copy no longer inherits its host's draws; native units keep theirs, and the anchored flags and `would_claim_uc_childcare` are untouched. The roster moves from 46 to 47 stages. `tools/fit_uk_childcare_takeup.py` (tool version 5) fits the universal rate on the conditional basis, E = r_e * sum(with extended) + (1 - r_e) * r_u * sum(without), with no allocated term, and leaves children in primary education out of the working-parent and universal-only rows, as DfE's January registrations leave out reception; the two calibration bindings carry the same `current_education != PRIMARY` filter. The contract's numeric rates are unchanged until the fitter refits them. 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 f01e26728..fa108a1f3 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 @@ -16076,6 +16076,11 @@ "operator": ">=", "value": 2 }, + { + "concept": "uk.education.current_education", + "operator": "!=", + "value": "PRIMARY" + }, { "concept": "uk.geography.country", "equals": "ENGLAND" @@ -16098,12 +16103,17 @@ "operator": ">=", "value": 2 }, + { + "variable": "current_education", + "operator": "!=", + "value": "PRIMARY" + }, { "variable": "country", "equals": "ENGLAND" } ], - "notes": "Caseload only: entitlement spending is not bound because caseload multiplied by full-usage ceilings would double count assumptions." + "notes": "Caseload only: entitlement spending is not bound because caseload multiplied by full-usage ceilings would double count assumptions. DfE's January registrations leave out children in reception, so a child in primary education (current_education PRIMARY) is not counted." }, "axiom": { "metric_name": "dfe/funded_childcare/working_parent_children_2_to_4", @@ -16230,6 +16240,11 @@ "concept": "uk.childcare.is_child_receiving_extended_childcare", "equals": false }, + { + "concept": "uk.education.current_education", + "operator": "!=", + "value": "PRIMARY" + }, { "concept": "uk.geography.country", "equals": "ENGLAND" @@ -16251,12 +16266,17 @@ "variable": "is_child_receiving_extended_childcare", "equals": false }, + { + "variable": "current_education", + "operator": "!=", + "value": "PRIMARY" + }, { "variable": "country", "equals": "ENGLAND" } ], - "notes": "Universal-only caseload is the declared difference between the overlapping published universes; no entitlement spending row is bound. From policyengine-uk 2.128.1 a child on the working parent entitlement keeps the universal hours (Childcare Act 2016 s.1(6)(a); pe-uk#2177), so the measure counts children on the universal hours who are not receiving the extended entitlement, as the published difference does." + "notes": "Universal-only caseload is the declared difference between the overlapping published universes; no entitlement spending row is bound. DfE's January registrations leave out children in reception, so a child in primary education (current_education PRIMARY) is not counted. From policyengine-uk 2.128.1 a child on the working parent entitlement keeps the universal hours (Childcare Act 2016 s.1(6)(a); pe-uk#2177), so the measure counts children on the universal hours who are not receiving the extended entitlement, as the published difference does." }, "axiom": { "metric_name": "dfe/funded_childcare/universal_only_children", diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_measurement_period.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_measurement_period.py index e150cde4b..2212dbfcb 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_measurement_period.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_measurement_period.py @@ -352,9 +352,11 @@ def test_a_frame_without_a_period_label_keeps_the_frame_route(): #: reads. They keep their stored reads (microcosm#1324): who a row counts is #: fixed at the frame. Each is engine-computed (measured at the calibration #: period through the provider) or a stored input that does not change between -#: the frame's period and the calibration period (ages and sex are static, -#: sign filters keep their sign under uprating, the student-loan plan and the -#: private-school flag are stored at the calibration year). A new name here is +#: the frame's period and the calibration period (ages and sex are static, and +#: so is current_education, which the DfE childcare rows read beside age to +#: leave out reception; sign filters keep their sign under uprating, the +#: student-loan plan and the private-school flag are stored at the calibration +#: year). A new name here is #: a stored read to review: route it, or measure the row at the frame period. REVIEWED_PLAIN_COLUMN_POPULATION_VARIABLES = frozenset( { @@ -366,6 +368,7 @@ def test_a_frame_without_a_period_label_keeps_the_frame_route(): "benunit_tenure_type", "council_tax_band", "country", + "current_education", "dividend_income", "eldest_adult_age", "employment_income", diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_stochastic_tools.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_stochastic_tools.py index 9d53700e4..de8cb6842 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_stochastic_tools.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_stochastic_tools.py @@ -45,6 +45,16 @@ def forbidden_seed(*args, **kwargs): for key in first: np.testing.assert_array_equal(first[key], second[key]) + # The universal flag is nested under the extended one, as frs_take_up + # draws it. + assert not ( + first["would_claim_extended_childcare"] + & ~first["would_claim_universal_childcare"] + ).any() + nested = tool.draw_childcare_inputs( + ids, np.array([0.5, 1.0, 0.5, 0.0]), seed=42, contract=contract + ) + assert nested["would_claim_universal_childcare"].all() def test_childcare_fit_receipt_is_deterministic_with_seeded_runner( @@ -129,10 +139,13 @@ def test_childcare_expected_counts_are_bilinear_in_the_extended_rate() -> None: assert expected["dfe.funded_childcare.early_learning_2_year_olds"] == ( pytest.approx(0.6 * 2.0 + 0.4 * 0.25 * 1.0) ) - # universal-only: the working-parent family counts only when it does not - # take up the extended hours. + # universal-only, nested under the extended flag: a family that takes up + # the extended hours claims the universal ones (the with-extended side, + # where only the second family's child is universal-only), any other at + # the conditional universal rate (the without-extended side). No + # allocated term (tool version 5). assert expected["dfe.funded_childcare.universal_only_children"] == ( - pytest.approx(0.4 * (0.75 + 1.0)) + pytest.approx(0.25 * 1.0 + 0.75 * 0.4 * 2.0) ) ceiling = tool.expected_childcare_counts(basis, np.ones(4)) assert ceiling["dfe.funded_childcare.early_learning_2_year_olds"] == 2.0 diff --git a/tools/fit_uk_childcare_takeup.py b/tools/fit_uk_childcare_takeup.py index 2ace35ef9..d42d86e9f 100644 --- a/tools/fit_uk_childcare_takeup.py +++ b/tools/fit_uk_childcare_takeup.py @@ -23,7 +23,10 @@ clipped_normal_from_uniforms, stable_identity_uniforms, ) -from microcosm.build.uk_runtime.frs_take_up import UK_TAKE_UP_DECLARED_SEEDS +from microcosm.build.uk_runtime.frs_take_up import ( + UK_TAKE_UP_DECLARED_SEEDS, + nest_universal_childcare, +) from microcosm.build.uk_runtime.ledger_targets import _candidate_facts_for_reference from microcosm.build.uk_runtime.take_up_contract import ( UKTakeUpContract, @@ -31,7 +34,7 @@ ) from microcosm.calibrate import TargetRegistry -TOOL_VERSION = 4 +TOOL_VERSION = 5 TARGET_IDS = ( "hmrc.tfc.government_top_up", "hmrc.tfc.children_with_used_accounts", @@ -72,9 +75,15 @@ def draw_childcare_inputs( "would_claim_universal_childcare", ) for output, rate in zip(names, params, strict=True): - outputs[output] = stable_identity_uniforms(ids, seed=seed, salt=output) < float( - rate - ) + draws = stable_identity_uniforms(ids, seed=seed, salt=output) + if output == "would_claim_universal_childcare": + # Nested under the extended flag, as frs_take_up draws it: the + # universal rate is conditional on not claiming the extended hours. + outputs[output] = nest_universal_childcare( + outputs["would_claim_extended_childcare"], draws, float(rate) + ) + else: + outputs[output] = draws < float(rate) hours = contract.continuous_entry("maximum_extended_childcare_hours_usage") outputs["maximum_extended_childcare_hours_usage"] = clipped_normal_from_uniforms( stable_identity_uniforms( @@ -276,13 +285,18 @@ class ChildcareExpectationBasis: ``with_extended`` holds each target's weighted per-row values when every flag is True; ``without_extended`` the same with the extended flag False. + The universal flag is nested under the extended one (frs_take_up), so a + family that claims the extended hours claims the universal hours, and the + universal rate is the rate among families that do not: the universal row's + expected value is ``r_e * sum(with_ext) + (1 - r_e) * r_u * sum(without_ext)`` + and needs no allocated term (tool version 5). Since policyengine-uk 2.131 (pe-uk#2177) universal and targeted hours stay beside the working-parent hours, and a family that does not claim them on their own still receives them, allocated first from a participating child's working-parent hours (DfE guidance A1.11). ``allocated_from_extended`` holds those rows: the targeted and universal - flags False and the extended flag True. So at rates ``r`` a targeted or - universal target's expected value is + flags False and the extended flag True. So at rates ``r`` the targeted + target's expected value is ``r_own * sum(with_ext * r_e + without_ext * (1 - r_e)) + (1 - r_own) * r_e * sum(allocated)``, linear in the own rate and bilinear with the extended rate, and the extended row is @@ -331,6 +345,13 @@ def expected_childcare_counts( expected[target] = extended * float(with_ext.sum()) continue without_ext = basis.without_extended[target] + if own == "universal_childcare": + # Nested: an extended claimant claims the universal hours, any + # other family at the conditional universal rate. + expected[target] = extended * float(with_ext.sum()) + ( + 1.0 - extended + ) * rates[own] * float(without_ext.sum()) + continue expected[target] = rates[own] * float( (with_ext * extended + without_ext * (1.0 - extended)).sum() ) @@ -420,13 +441,18 @@ def rows(variable: str, values: np.ndarray | None = None) -> np.ndarray: extended_receiving = np.asarray( sim.calculate("is_child_receiving_extended_childcare", target_period) ) + # DfE's January registrations leave out children in reception, so neither + # the working-parent nor the universal-only row counts a child in primary + # education (the calibration bindings carry the same filter). + not_in_reception = _current_education(sim, target_period) != "PRIMARY" return { "hmrc.tfc.government_top_up": rows("tax_free_childcare"), "hmrc.tfc.children_with_used_accounts": rows( "is_child_receiving_tax_free_childcare" ), "dfe.funded_childcare.working_parent_children_2_to_4": rows( - "is_child_receiving_extended_childcare", extended_receiving & (age >= 2) + "is_child_receiving_extended_childcare", + extended_receiving & (age >= 2) & not_in_reception, ), "dfe.funded_childcare.early_learning_2_year_olds": rows( "is_child_receiving_targeted_childcare" @@ -439,16 +465,28 @@ def rows(variable: str, values: np.ndarray | None = None) -> np.ndarray: np.asarray( sim.calculate("is_child_receiving_universal_childcare", target_period) ) - & ~extended_receiving, + & ~extended_receiving + & not_in_reception, ), } +def _current_education(sim: Any, period: int) -> np.ndarray: + """Each person's ``current_education`` as enum names.""" + + values = sim.calculate("current_education", period) + for candidate in (values, getattr(values, "values", None)): + if hasattr(candidate, "decode_to_str"): + return np.asarray(candidate.decode_to_str()).astype(str) + return np.asarray(values).astype(str) + + def compute_childcare_basis( input_h5: Path, target_period: int, contract: UKTakeUpContract ) -> ChildcareExpectationBasis: """Three engine runs: extended on and off with every other flag on, and - extended on with the targeted and universal flags off.""" + extended on with the targeted and universal flags off (the targeted row's + allocation side; the nested universal row needs none).""" with_extended = _basis_side(input_h5, target_period, contract, extended=True) without_extended = _basis_side(input_h5, target_period, contract, extended=False) @@ -461,7 +499,7 @@ def compute_childcare_basis( allocated_from_extended={ target: allocation[target] for target, own in OWN_RATE_BY_TARGET.items() - if own in ("targeted_childcare", "universal_childcare") + if own == "targeted_childcare" }, rows=int(with_extended["hmrc.tfc.children_with_used_accounts"].shape[0]), ) From c4ef8871b16bdea6493613c4271cf35bbde0ec2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 22 Oct 2026 17:26:58 +0100 Subject: [PATCH 04/25] Run the copies' childcare re-draw before the private-school attendance childcare_copy_take_up ran after private_school_attendance, which broke test_the_stage_is_the_last_of_the_spine and left the stored attendance imputed from the copies' inherited childcare flags: policyengine-uk's attends_private_school ranks households on net income, and household_benefits counts Tax-Free Childcare and the extended, universal and targeted entitlements. The re-draw now runs after student_loans, still after every copy stage, and private_school_attendance is the last spine stage again. The stage-order tests, the acceptance-receipt roster helper, the stage notes and the changelog follow. The fitter's basis docstring no longer describes a universal allocated term, which tool version 5 dropped. Co-Authored-By: Claude Opus 5.5 --- ...care-take-up-nesting-and-copies.changed.md | 2 +- .../src/microcosm/build/uk/source_stages.json | 72 +++++++++---------- .../src/microcosm/build/uk/spec/sources.yaml | 50 ++++++------- .../engine_free/uk/test_uk_source_stages.py | 15 ++-- .../uk/test_uk_spine_acceptance_receipt.py | 8 +-- tools/fit_uk_childcare_takeup.py | 9 +-- 6 files changed, 75 insertions(+), 81 deletions(-) diff --git a/changelog.d/uk-childcare-take-up-nesting-and-copies.changed.md b/changelog.d/uk-childcare-take-up-nesting-and-copies.changed.md index 216fc65dc..c28093742 100644 --- a/changelog.d/uk-childcare-take-up-nesting-and-copies.changed.md +++ b/changelog.d/uk-childcare-take-up-nesting-and-copies.changed.md @@ -1 +1 @@ -The UK childcare take-up draws now nest the universal 15 hours under the working-parent entitlement, re-draw the copies' childcare take-up, and fit and calibrate the DfE childcare rows without children in reception. `frs_take_up` keeps the extended draw unchanged and draws `would_claim_universal_childcare` as `would_claim_extended_childcare` OR u < the contract's `universal_childcare` rate, which is now the rate among benefit units not claiming the extended hours (the operation declares `nested_under`, and the stage refuses a manifest that drops it). Independent draws let a family over the £100k limit hold extended-yes and universal-no, and policyengine-uk then allocated its child's first 15 hours to the universal entitlement only once the limit was removed. The take-up signal gate targets the nested marginal, r_e + (1 - r_e) * r_u, and fails on any benefit unit claiming the extended hours without the universal ones. A new last spine stage, `childcare_copy_take_up`, re-draws `would_claim_tfc`, the extended, universal (nested) and targeted flags and `maximum_extended_childcare_hours_usage` for the SPI support, high-value home support and CGT copies on their own `benunit_id`, through `frs_take_up`'s helper at the same rates, seed and salts, so a copy no longer inherits its host's draws; native units keep theirs, and the anchored flags and `would_claim_uc_childcare` are untouched. The roster moves from 46 to 47 stages. `tools/fit_uk_childcare_takeup.py` (tool version 5) fits the universal rate on the conditional basis, E = r_e * sum(with extended) + (1 - r_e) * r_u * sum(without), with no allocated term, and leaves children in primary education out of the working-parent and universal-only rows, as DfE's January registrations leave out reception; the two calibration bindings carry the same `current_education != PRIMARY` filter. The contract's numeric rates are unchanged until the fitter refits them. +The UK childcare take-up draws now nest the universal 15 hours under the working-parent entitlement, re-draw the copies' childcare take-up, and fit and calibrate the DfE childcare rows without children in reception. `frs_take_up` keeps the extended draw unchanged and draws `would_claim_universal_childcare` as `would_claim_extended_childcare` OR u < the contract's `universal_childcare` rate, which is now the rate among benefit units not claiming the extended hours (the operation declares `nested_under`, and the stage refuses a manifest that drops it). Independent draws let a family over the £100k limit hold extended-yes and universal-no, and policyengine-uk then allocated its child's first 15 hours to the universal entitlement only once the limit was removed. The take-up signal gate targets the nested marginal, r_e + (1 - r_e) * r_u, and fails on any benefit unit claiming the extended hours without the universal ones. A new spine stage, `childcare_copy_take_up`, which runs after every copy stage and before `private_school_attendance` (whose net-income ranking counts the childcare entitlements), re-draws `would_claim_tfc`, the extended, universal (nested) and targeted flags and `maximum_extended_childcare_hours_usage` for the SPI support, high-value home support and CGT copies on their own `benunit_id`, through `frs_take_up`'s helper at the same rates, seed and salts, so a copy no longer inherits its host's draws; native units keep theirs, and the anchored flags and `would_claim_uc_childcare` are untouched. The roster moves from 46 to 47 stages. `tools/fit_uk_childcare_takeup.py` (tool version 5) fits the universal rate on the conditional basis, E = r_e * sum(with extended) + (1 - r_e) * r_u * sum(without), with no allocated term, and leaves children in primary education out of the working-parent and universal-only rows, as DfE's January registrations leave out reception; the two calibration bindings carry the same `current_education != PRIMARY` filter. The contract's numeric rates are unchanged until the fitter refits them. 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 a5fb2cc68..7ea501077 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json +++ b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json @@ -6478,41 +6478,6 @@ ], "notes": "Reported borrowers are PAYE repayers, classified without a country gate, and, in England and Wales, adults who report an outstanding loan (FRS SLOS) and are not in full-time education, the borrowers below the repayment threshold (microcosm#868). A course starts three years before its borrower left full-time education (FRS EDUCLEFT), or at 18 without an answer, and its start year sets the plan, except that before 2026 a repayer never takes PLAN_5: nobody repays a Plan 5 loan before April 2026, so SLC counts no Plan 5 borrower above the threshold in academic year 2024/25. England tertiary cohorts are then topped up PLAN_5 first and PLAN_2 second to the pinned liable stocks at the FRS release calibration year. The PLAN_2 walk takes nobody in full-time education, since a student is not yet liable to repay; the PLAN_5 walk keeps the age rule, since its starters have mostly not left education. The stocks are SLC academic year 2024/25, whose reference date falls in calendar 2025, the year the borrower targets bind (ruling of 2026-10-16). PLAN_4 is never imputed, and a Scottish or Northern Irish answer of an outstanding loan assigns no plan." }, - { - "stage": "private_school_attendance", - "survey": "policyengine-uk private-school attendance imputation, stored at the spine's weights", - "source": "policyengine-uk attends_private_school (the gov.simulation.private_school_vat attendance rates and factor), evaluated by the pinned engine", - "grain": "person", - "artifacts": [ - { - "role": "frs_release", - "kind": "public_aggregate_reference", - "resource": "frs_release.json", - "format": "json", - "runtime_sha256_required": true - } - ], - "operations": [ - { - "kind": "store_rules_engine_input", - "output": "attends_private_school", - "draw": "attends_private_school_random_draw", - "year_rule": "calibration_year", - "weights": "spine_design_weights" - }, - { - "kind": "record_mass_conservation_receipt", - "entity": "household", - "reason": "Private-school attendance stored on the source spine: household weights pass through unchanged and total household mass is conserved.", - "declared_factor": 1.0, - "gate_coupling": "The terminal family gate requires a valid mass-conserving MassChangeRecord carrying exactly this stage-specific reason." - } - ], - "outputs": [ - "attends_private_school" - ], - "notes": "The last spine stage (uk-data#568, microcosm#1095). policyengine-uk imputes attends_private_school with a formula that ranks households by net income at their weights and compares a percentile rate, scaled to the national pupil count, with the stored attends_private_school_random_draw. Left to the formula, attendance is re-imputed in every simulation, so a reform to income tax, National Insurance or benefits switches pupils in or out, a population under one million people of weight imputes none (pe-uk#1905), and the calibration and the release read different flags once the weights change. This stage materializes the engine's attendance once, at the calibration year and the spine's design weights, and stores it, as the root stage stores months_since_last_birthday, so the solve and the release read the same flags; no stage after it copies or re-keys a person. Stored attendance no longer responds to income changes or to reforms of the attendance parameters, and a reform to the fee VAT does not move pupils either way in the pinned engine." - }, { "stage": "childcare_copy_take_up", "survey": "Family Resources Survey 2024-25", @@ -6575,7 +6540,42 @@ "would_claim_targeted_childcare", "maximum_extended_childcare_hours_usage" ], - "notes": "Runs after the last copy stage and before calibration. frs_take_up draws the childcare flags and the extended-hours usage on FRS benefit units before any copy exists, so every SPI support copy, income-band donor, high-value home support copy, CGT support copy, CGT incidence clone and residential arm inherited its host's draws, and a cell with few hosts fixed the take-up of all their copies. This stage re-draws would_claim_tfc, would_claim_extended_childcare, would_claim_universal_childcare (nested under the extended flag) and would_claim_targeted_childcare at the contract rates, and maximum_extended_childcare_hours_usage from the contract's clipped normal, for the copies only, with frs_take_up's own helper, seed 0 and output-name salts, keyed on the copy's own benunit_id. A copy's structural id is its source id plus a multiple of an offset above every id in the frame, so it is unique, differs from every native id and gives the copy streams independent of its host's; a rebuild of the same frame draws the same values. Native benefit units keep their frs_take_up draws. The anchored Child Benefit, Pension Credit and Universal Credit flags and would_claim_uc_childcare are left as they are." + "notes": "Runs after the last copy stage and before private_school_attendance, whose net-income ranking counts the childcare entitlements and Tax-Free Childcare. frs_take_up draws the childcare flags and the extended-hours usage on FRS benefit units before any copy exists, so every SPI support copy, income-band donor, high-value home support copy, CGT support copy, CGT incidence clone and residential arm inherited its host's draws, and a cell with few hosts fixed the take-up of all their copies. This stage re-draws would_claim_tfc, would_claim_extended_childcare, would_claim_universal_childcare (nested under the extended flag) and would_claim_targeted_childcare at the contract rates, and maximum_extended_childcare_hours_usage from the contract's clipped normal, for the copies only, with frs_take_up's own helper, seed 0 and output-name salts, keyed on the copy's own benunit_id. A copy's structural id is its source id plus a multiple of an offset above every id in the frame, so it is unique, differs from every native id and gives the copy streams independent of its host's; a rebuild of the same frame draws the same values. Native benefit units keep their frs_take_up draws. The anchored Child Benefit, Pension Credit and Universal Credit flags and would_claim_uc_childcare are left as they are." + }, + { + "stage": "private_school_attendance", + "survey": "policyengine-uk private-school attendance imputation, stored at the spine's weights", + "source": "policyengine-uk attends_private_school (the gov.simulation.private_school_vat attendance rates and factor), evaluated by the pinned engine", + "grain": "person", + "artifacts": [ + { + "role": "frs_release", + "kind": "public_aggregate_reference", + "resource": "frs_release.json", + "format": "json", + "runtime_sha256_required": true + } + ], + "operations": [ + { + "kind": "store_rules_engine_input", + "output": "attends_private_school", + "draw": "attends_private_school_random_draw", + "year_rule": "calibration_year", + "weights": "spine_design_weights" + }, + { + "kind": "record_mass_conservation_receipt", + "entity": "household", + "reason": "Private-school attendance stored on the source spine: household weights pass through unchanged and total household mass is conserved.", + "declared_factor": 1.0, + "gate_coupling": "The terminal family gate requires a valid mass-conserving MassChangeRecord carrying exactly this stage-specific reason." + } + ], + "outputs": [ + "attends_private_school" + ], + "notes": "The last spine stage (uk-data#568, microcosm#1095). policyengine-uk imputes attends_private_school with a formula that ranks households by net income at their weights and compares a percentile rate, scaled to the national pupil count, with the stored attends_private_school_random_draw. Left to the formula, attendance is re-imputed in every simulation, so a reform to income tax, National Insurance or benefits switches pupils in or out, a population under one million people of weight imputes none (pe-uk#1905), and the calibration and the release read different flags once the weights change. This stage materializes the engine's attendance once, at the calibration year and the spine's design weights, and stores it, as the root stage stores months_since_last_birthday, so the solve and the release read the same flags; no stage after it copies or re-keys a person. Stored attendance no longer responds to income changes or to reforms of the attendance parameters, and a reform to the fee VAT does not move pupils either way in the pinned engine." } ] } 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 0d1043adf..97cf3205d 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml +++ b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml @@ -5226,30 +5226,6 @@ stages: rewrites: - student_loan_plan notes: 'Reported borrowers are PAYE repayers, classified without a country gate, and, in England and Wales, adults who report an outstanding loan (FRS SLOS) and are not in full-time education, the borrowers below the repayment threshold (microcosm#868). A course starts three years before its borrower left full-time education (FRS EDUCLEFT), or at 18 without an answer, and its start year sets the plan, except that before 2026 a repayer never takes PLAN_5: nobody repays a Plan 5 loan before April 2026, so SLC counts no Plan 5 borrower above the threshold in academic year 2024/25. England tertiary cohorts are then topped up PLAN_5 first and PLAN_2 second to the pinned liable stocks at the FRS release calibration year. The PLAN_2 walk takes nobody in full-time education, since a student is not yet liable to repay; the PLAN_5 walk keeps the age rule, since its starters have mostly not left education. The stocks are SLC academic year 2024/25, whose reference date falls in calendar 2025, the year the borrower targets bind (ruling of 2026-10-16). PLAN_4 is never imputed, and a Scottish or Northern Irish answer of an outstanding loan assigns no plan.' -- stage: private_school_attendance - survey: policyengine-uk private-school attendance imputation, stored at the spine's weights - source: policyengine-uk attends_private_school (the gov.simulation.private_school_vat attendance rates and factor), evaluated by the pinned engine - grain: person - artifacts: - - role: frs_release - kind: public_aggregate_reference - resource: frs_release.json - format: json - runtime_sha256_required: true - operations: - - kind: store_rules_engine_input - output: attends_private_school - draw: attends_private_school_random_draw - year_rule: calibration_year - weights: spine_design_weights - - kind: record_mass_conservation_receipt - entity: household - reason: 'Private-school attendance stored on the source spine: household weights pass through unchanged and total household mass is conserved.' - declared_factor: 1.0 - gate_coupling: The terminal family gate requires a valid mass-conserving MassChangeRecord carrying exactly this stage-specific reason. - outputs: - - attends_private_school - notes: 'The last spine stage (uk-data#568, microcosm#1095). policyengine-uk imputes attends_private_school with a formula that ranks households by net income at their weights and compares a percentile rate, scaled to the national pupil count, with the stored attends_private_school_random_draw. Left to the formula, attendance is re-imputed in every simulation, so a reform to income tax, National Insurance or benefits switches pupils in or out, a population under one million people of weight imputes none (pe-uk#1905), and the calibration and the release read different flags once the weights change. This stage materializes the engine''s attendance once, at the calibration year and the spine''s design weights, and stores it, as the root stage stores months_since_last_birthday, so the solve and the release read the same flags; no stage after it copies or re-keys a person. Stored attendance no longer responds to income changes or to reforms of the attendance parameters, and a reform to the fee VAT does not move pupils either way in the pinned engine.' - stage: childcare_copy_take_up survey: Family Resources Survey 2024-25 source: The UK take-up contract's childcare rates and extended-hours usage distribution, as frs_take_up draws them, applied to the support and CGT copies on their own benefit units. @@ -5299,4 +5275,28 @@ stages: - would_claim_universal_childcare - would_claim_targeted_childcare - maximum_extended_childcare_hours_usage - notes: Runs after the last copy stage and before calibration. frs_take_up draws the childcare flags and the extended-hours usage on FRS benefit units before any copy exists, so every SPI support copy, income-band donor, high-value home support copy, CGT support copy, CGT incidence clone and residential arm inherited its host's draws, and a cell with few hosts fixed the take-up of all their copies. This stage re-draws would_claim_tfc, would_claim_extended_childcare, would_claim_universal_childcare (nested under the extended flag) and would_claim_targeted_childcare at the contract rates, and maximum_extended_childcare_hours_usage from the contract's clipped normal, for the copies only, with frs_take_up's own helper, seed 0 and output-name salts, keyed on the copy's own benunit_id. A copy's structural id is its source id plus a multiple of an offset above every id in the frame, so it is unique, differs from every native id and gives the copy streams independent of its host's; a rebuild of the same frame draws the same values. Native benefit units keep their frs_take_up draws. The anchored Child Benefit, Pension Credit and Universal Credit flags and would_claim_uc_childcare are left as they are. + notes: Runs after the last copy stage and before private_school_attendance, whose net-income ranking counts the childcare entitlements and Tax-Free Childcare. frs_take_up draws the childcare flags and the extended-hours usage on FRS benefit units before any copy exists, so every SPI support copy, income-band donor, high-value home support copy, CGT support copy, CGT incidence clone and residential arm inherited its host's draws, and a cell with few hosts fixed the take-up of all their copies. This stage re-draws would_claim_tfc, would_claim_extended_childcare, would_claim_universal_childcare (nested under the extended flag) and would_claim_targeted_childcare at the contract rates, and maximum_extended_childcare_hours_usage from the contract's clipped normal, for the copies only, with frs_take_up's own helper, seed 0 and output-name salts, keyed on the copy's own benunit_id. A copy's structural id is its source id plus a multiple of an offset above every id in the frame, so it is unique, differs from every native id and gives the copy streams independent of its host's; a rebuild of the same frame draws the same values. Native benefit units keep their frs_take_up draws. The anchored Child Benefit, Pension Credit and Universal Credit flags and would_claim_uc_childcare are left as they are. +- stage: private_school_attendance + survey: policyengine-uk private-school attendance imputation, stored at the spine's weights + source: policyengine-uk attends_private_school (the gov.simulation.private_school_vat attendance rates and factor), evaluated by the pinned engine + grain: person + artifacts: + - role: frs_release + kind: public_aggregate_reference + resource: frs_release.json + format: json + runtime_sha256_required: true + operations: + - kind: store_rules_engine_input + output: attends_private_school + draw: attends_private_school_random_draw + year_rule: calibration_year + weights: spine_design_weights + - kind: record_mass_conservation_receipt + entity: household + reason: 'Private-school attendance stored on the source spine: household weights pass through unchanged and total household mass is conserved.' + declared_factor: 1.0 + gate_coupling: The terminal family gate requires a valid mass-conserving MassChangeRecord carrying exactly this stage-specific reason. + outputs: + - attends_private_school + notes: 'The last spine stage (uk-data#568, microcosm#1095). policyengine-uk imputes attends_private_school with a formula that ranks households by net income at their weights and compares a percentile rate, scaled to the national pupil count, with the stored attends_private_school_random_draw. Left to the formula, attendance is re-imputed in every simulation, so a reform to income tax, National Insurance or benefits switches pupils in or out, a population under one million people of weight imputes none (pe-uk#1905), and the calibration and the release read different flags once the weights change. This stage materializes the engine''s attendance once, at the calibration year and the spine''s design weights, and stores it, as the root stage stores months_since_last_birthday, so the solve and the release read the same flags; no stage after it copies or re-keys a person. Stored attendance no longer responds to income changes or to reforms of the attendance parameters, and a reform to the fee VAT does not move pupils either way in the pinned engine.' 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 7f80f4073..9d9b8fcad 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 @@ -109,13 +109,12 @@ "hmrc_cgt_asset_type_spine", "salary_sacrifice", "student_loans", - # microcosm#1095: the stored private-school attendance runs after the - # CGT stages. - "private_school_attendance", -] -# The copies' childcare re-draw runs after every copy stage, last. -CHILDCARE_COPY_TAKE_UP_STAGE_NAMES = [ + # The copies' childcare re-draw runs after every copy stage, before the + # private-school attendance ranks households on net income (which counts + # the childcare entitlements). "childcare_copy_take_up", + # microcosm#1095: the stored private-school attendance runs last. + "private_school_attendance", ] UK_SOURCE_STAGE_NAMES = [ "frs_spine", @@ -137,7 +136,6 @@ *CARERS_ALLOWANCE_TAKE_UP_STAGE_NAMES, *E9_STAGE_NAMES, *E8_STAGE_NAMES, - *CHILDCARE_COPY_TAKE_UP_STAGE_NAMES, ] @@ -233,8 +231,7 @@ def test_e8_block_is_final_and_all_stages_are_canonical(self) -> None: canonical = _load_json(CANONICAL_SOURCE_STAGES) names = [stage["stage"] for stage in canonical["stages"]] start = names.index(E8_STAGE_NAMES[0]) - # Only the copies' childcare re-draw follows the E8 block. - assert names[start:] == [*E8_STAGE_NAMES, *CHILDCARE_COPY_TAKE_UP_STAGE_NAMES] + assert names[start:] == E8_STAGE_NAMES assert "frs_hmrc_retained_leaves" not in names assert "hmrc_spi_income" not in names 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 41303477c..edc4b5dba 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 @@ -156,14 +156,14 @@ def _apply_pending_roster_transformations( "cgt_residential_split", "hmrc_cgt_asset_type_spine", ] + # Re-mint pending: the copies' childcare re-draw runs after every copy + # stage, before the private-school attendance. + assert "childcare_copy_take_up" not in roster + roster.append("childcare_copy_take_up") # microcosm#1095 re-mint pending: the stored private-school attendance is # the last stage of the spine. assert "private_school_attendance" not in roster roster.append("private_school_attendance") - # Re-mint pending: the copies' childcare re-draw runs after every copy - # stage, as the spine's last stage. - assert "childcare_copy_take_up" not in roster - roster.append("childcare_copy_take_up") return tuple(roster) diff --git a/tools/fit_uk_childcare_takeup.py b/tools/fit_uk_childcare_takeup.py index d42d86e9f..378f06e82 100644 --- a/tools/fit_uk_childcare_takeup.py +++ b/tools/fit_uk_childcare_takeup.py @@ -301,12 +301,9 @@ class ChildcareExpectationBasis: + (1 - r_own) * r_e * sum(allocated)``, linear in the own rate and bilinear with the extended rate, and the extended row is ``r_e * sum(with_ext)``. The universal row counts universal-only children, - so every side leaves out a child who receives extended hours. Its - allocated term is computed like the others' and is near zero, not zero: a - child whose family takes no universal hours on their own and who uses 15 - hours or fewer gets the base hours from the allocation and no extended - hours, so counts as universal-only, which is rare at the DfE usage mean of - 31.141 hours (Vahid's review of microcosm#1299). The expectation is the + so every side leaves out a child who receives extended hours; under the + nesting a family claiming the extended hours never has the universal flag + off, so the row has no allocated term. The expectation is the quantity a take-up *rate* controls: the spine's persisted flags are one draw from it, and later stages clone and re-key rows, so no re-drawn realisation can sit on the From 31a979a55e595f6cc6aadb7e5926995c8f8638ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 22 Oct 2026 17:26:58 +0100 Subject: [PATCH 05/25] Bind DfE funded childcare by single year of age for England MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit María's ruling (2026-10-21): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. The contract now binds seven England rows from the January 2025 census (Funded early education and childcare, headline figures): - dfe.funded_childcare.working_parent_children_age_1 .. age_4: working parent registrations, is_child_receiving_extended_childcare at whole-year age n, outside primary education from age 2 (DfE leaves reception out); - universal_nursery_children_age_3 and age_4: universal registrations in nursery, is_child_receiving_universal_childcare at age n outside primary education, working parent children included as in DfE's counts; - universal_reception_children_age_4: every 4-year-old in primary education, no take-up flag, so the share of 4-year-olds in school is pinned. The working parent 2 to 4 row stays bound beside the singles: it is the take-up fitter's anchor, and its fact and measure are the sum of ages 2 to 4, so the rows are nested and consistent like the ONS single years inside the sex bands. universal_only_children stays too: on the facts it is the nursery ages 3 and 4 less the working parent ages 3 and 4. The accounting note dfe_funded_childcare_single_ages signs out the rest of the table with its reason: 9 to 11 months (policyengine-uk gives whole-year age 0 no working parent hours), reception at age 3 (no FRS 3-year-old is in primary education), the totals and multi-age cells that sum or copy bound cells, the universal all-provision cells (nursery plus reception), DfE's eligible-children and all-children estimates (built from population and survey-based inputs) and the registered percentages. Registry accounting: seven contract-only declarations. The contract has 439 targets (432), the registry scope 380 (373) and the unmapped declarations 194 (187); the mapped targets stay at 186. A new signed in_year_snapshot hold covers the seven rows, and the compile-parity tool gains their ledger-only rationale. The references and membership are regenerated in the next commit (1,333 to 1,340 active references). Co-Authored-By: Claude Opus 5.5 --- .../uk-childcare-dfe-single-ages.added.md | 1 + .../build/uk/uk_population_targets.json | 636 +++++++++++++++++- .../microcosm/build/uk/uprating_holds.json | 19 + .../engine_free/shared/test_country_spec.py | 4 +- .../uk/test_uk_national_calibration.py | 5 +- .../uk/test_uk_population_targets.py | 198 +++++- .../uk/test_uk_target_references.py | 68 +- ...edger_compile_parity_signed_differences.py | 23 + 8 files changed, 936 insertions(+), 18 deletions(-) create mode 100644 changelog.d/uk-childcare-dfe-single-ages.added.md diff --git a/changelog.d/uk-childcare-dfe-single-ages.added.md b/changelog.d/uk-childcare-dfe-single-ages.added.md new file mode 100644 index 000000000..0c5d4eb50 --- /dev/null +++ b/changelog.d/uk-childcare-dfe-single-ages.added.md @@ -0,0 +1 @@ +The national UK contract binds seven more DfE funded-childcare counts by single year of age, England, from the January 2025 census (María's ruling of 2026-10-21: bind every DfE childcare count the model can carry, even on few records, and sign out only those with a real reason; microcosm#1278, #1095): working parent registrations at ages 1, 2, 3 and 4 (`dfe.funded_childcare.working_parent_children_age_`), universal registrations in nursery at ages 3 and 4 (`universal_nursery_children_age_`), and 4-year-olds in reception (`universal_reception_children_age_4`, every 4-year-old in primary education, which pins the share of 4-year-olds in school). Each counts persons in English households with whole-year age `n`; from age 2 the working parent and nursery rows leave out children in primary education, as DfE's registrations leave out reception. The working parent 2 to 4 row (the take-up fitter's anchor) and the universal-only row stay bound: the first is the sum of ages 2 to 4, on the facts and on the measures; the second is the nursery ages 3 and 4 less the working parent ages 3 and 4 on the facts, and on the measures wherever a working parent child keeps the universal hours, as it does from policyengine-uk 2.128.1. The contract's accounting notes sign out the rest of the table, each for its reason: the 9 to 11 months cell (policyengine-uk gives whole-year age 0 no working parent hours), reception at age 3 (no FRS 3-year-old is in primary education), the totals and multi-age cells that sum or copy bound cells, the universal all-provision cells (nursery plus reception), DfE's eligible-children and all-children estimates (built from population and survey-based inputs) and the registered percentages. The contract has 439 targets (432 before) and the registry scope 380 (373): seven more contract-only declarations (194). A signed `in_year_snapshot` hold covers the seven rows, the national references give 1,340 active references (1,333), and the compile-parity tool signs the seven as `ledger_only`, with their rationale. 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 fa108a1f3..c748d6835 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 @@ -871,7 +871,14 @@ "ons.population.england_age_3": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): England's funded childcare is costed on England's children, whose single years the UK rows and the region 0_9 cells leave free, so the contract binds England's ages 0 to 6 for all persons, read from the ONS mid-year estimate for England (E92000001) by single year of age. Wales, Scotland and Northern Ireland get no single-year rows: each nation's single year rests on too few FRS households, and the UK rows bind their sum. No incumbent row has this row's definition.", "ons.population.england_age_4": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): England's funded childcare is costed on England's children, whose single years the UK rows and the region 0_9 cells leave free, so the contract binds England's ages 0 to 6 for all persons, read from the ONS mid-year estimate for England (E92000001) by single year of age. Wales, Scotland and Northern Ireland get no single-year rows: each nation's single year rests on too few FRS households, and the UK rows bind their sum. No incumbent row has this row's definition.", "ons.population.england_age_5": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): England's funded childcare is costed on England's children, whose single years the UK rows and the region 0_9 cells leave free, so the contract binds England's ages 0 to 6 for all persons, read from the ONS mid-year estimate for England (E92000001) by single year of age. Wales, Scotland and Northern Ireland get no single-year rows: each nation's single year rests on too few FRS households, and the UK rows bind their sum. No incumbent row has this row's definition.", - "ons.population.england_age_6": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): England's funded childcare is costed on England's children, whose single years the UK rows and the region 0_9 cells leave free, so the contract binds England's ages 0 to 6 for all persons, read from the ONS mid-year estimate for England (E92000001) by single year of age. Wales, Scotland and Northern Ireland get no single-year rows: each nation's single year rests on too few FRS households, and the UK rows bind their sum. No incumbent row has this row's definition." + "ons.population.england_age_6": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): England's funded childcare is costed on England's children, whose single years the UK rows and the region 0_9 cells leave free, so the contract binds England's ages 0 to 6 for all persons, read from the ONS mid-year estimate for England (E92000001) by single year of age. Wales, Scotland and Northern Ireland get no single-year rows: each nation's single year rests on too few FRS households, and the UK rows bind their sum. No incumbent row has this row's definition.", + "dfe.funded_childcare.working_parent_children_age_1": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. The working parent registrations by single year of age (1, 2, 3 and 4) from the DfE January census, England. The 2 to 4 row stays bound beside them. No incumbent row has this row's definition.", + "dfe.funded_childcare.working_parent_children_age_2": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. The working parent registrations by single year of age (1, 2, 3 and 4) from the DfE January census, England. The 2 to 4 row stays bound beside them. No incumbent row has this row's definition.", + "dfe.funded_childcare.working_parent_children_age_3": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. The working parent registrations by single year of age (1, 2, 3 and 4) from the DfE January census, England. The 2 to 4 row stays bound beside them. No incumbent row has this row's definition.", + "dfe.funded_childcare.working_parent_children_age_4": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. The working parent registrations by single year of age (1, 2, 3 and 4) from the DfE January census, England. The 2 to 4 row stays bound beside them. No incumbent row has this row's definition.", + "dfe.funded_childcare.universal_nursery_children_age_3": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. The universal registrations in nursery provision at ages 3 and 4 from the DfE January census, England. No incumbent row has this row's definition.", + "dfe.funded_childcare.universal_nursery_children_age_4": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. The universal registrations in nursery provision at ages 3 and 4 from the DfE January census, England. No incumbent row has this row's definition.", + "dfe.funded_childcare.universal_reception_children_age_4": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. The 4-year-olds in reception from the DfE January census, England, which pins the share of 4-year-olds in school. No incumbent row has this row's definition." }, "suppressed_ancestors": { "hmrc/salary_sacrifice_it_relief_basic_rate": { @@ -905,7 +912,8 @@ "cgt_band_promotion": "The 18 banded CGT registry names (hmrc/cgt_taxpayers_band_ and hmrc/capital_gains_band_, nine bands from 12,300) move from excluded to mapped: Chronicle now carries HMRC Table 2.1a for 2024-25 (cgt_size_of_gain_2026), so the incumbent's unpackaged uk-data CSV is superseded by published individual rows bound at identity; the 3,000 and 6,000 bands the incumbent never carried are authored under the same naming form and the 0-2,999 band below the 2024 AEA is signed out (microcosm#467, #725). Chronicle's Table 2.1a package emits taxpayers and gains only, although the published sheet carries an amounts-of-tax column, so no liability-by-band target exists yet; it becomes possible once Chronicle emits that column.", "ons_15_19_sex_band_split": "María's ruling of 2026-10-13 (microcosm#1095, uk-data#563): the two national 15_19 sex bands are split into ages 15, 16-17 and 18-19. uk-data#563 found weights that fit the five-year band while holding too many 16-year-olds and too few 18- and 19-year-olds, and nothing in this contract bound the mix inside the band either. The six rows partition the two bands and read the same ONS mid-year estimate by single year of age, so each sex's three rows sum to the band they replace. The incumbent ons/female_15_19 and ons/male_15_19 rows move from mapped to excluded: no single contract row has their definition.", "ons_single_year_ages_0_2": "microcosm#1278 (the pre-Budget PR's plan, approved by María on 2026-10-20; microcosm#1095): three all-persons rows bind ages 0, 1 and 2, read from the same ONS mid-year estimate by single year of age as the 0_4 sex bands. Unlike the 15_19 split, whose pieces replaced the bands, the 0_4 sex bands keep their incumbent mapping and stay bound: the three rows cover ages 0 to 2 for both sexes together, so neither band is their sum. The three are contract-only declarations; no incumbent row moves.", - "ons_single_year_ages_0_6": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095). Eleven all-persons rows extend the single years of age: the UK rows go on from age 2 to age 6, and England binds ages 0 to 6 at E92000001. Every row reads the ONS mid-2025 estimate by single year of age, the series the 0_4 and 5_9 sex bands and the region 0_9 cells sum, so the nested rows are consistent: the UK rows for ages 0 to 4 sum to the two 0_4 sex bands, and England's rows sit inside England's nine region 0_9 cells. Every band stays bound; the eleven are contract-only declarations and no incumbent row moves. Scotland's age 0 is already bound as ons.population.scotland_babies_under_1; Wales and Northern Ireland are left to the UK rows, as each nation's single year rests on too few FRS households." + "ons_single_year_ages_0_6": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095). Eleven all-persons rows extend the single years of age: the UK rows go on from age 2 to age 6, and England binds ages 0 to 6 at E92000001. Every row reads the ONS mid-2025 estimate by single year of age, the series the 0_4 and 5_9 sex bands and the region 0_9 cells sum, so the nested rows are consistent: the UK rows for ages 0 to 4 sum to the two 0_4 sex bands, and England's rows sit inside England's nine region 0_9 cells. Every band stays bound; the eleven are contract-only declarations and no incumbent row moves. Scotland's age 0 is already bound as ons.population.scotland_babies_under_1; Wales and Northern Ireland are left to the UK rows, as each nation's single year rests on too few FRS households.", + "dfe_funded_childcare_single_ages": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. Seven England rows read the January 2025 census (Funded early education and childcare, headline figures): working parent registrations at single ages 1, 2, 3 and 4, universal registrations in nursery at ages 3 and 4, and 4-year-olds in reception. They are seven contract-only declarations; the three earlier DfE rows stay bound. The nested rows are consistent: the working parent 2 to 4 row is the sum of ages 2, 3 and 4 (fact and measure), and universal_only_children is the nursery ages 3 and 4 less the working parent ages 3 and 4 on the facts, and on the measures wherever a working parent child keeps the universal hours (policyengine-uk 2.128.1). Signed out, each for its reason: the working parent 9 to 11 months cell (policyengine-uk gives a child of whole-year age 0 no working parent hours, so no record carries it); reception at age 3 (the FRS codes no 3-year-old in primary education, so no record carries it); the 9 months to 2 years, 3 to 4 years and Total working parent cells, the nursery and reception Totals, the early learning for 2-year-olds Total and the all-entitlements Total (sums or copies of bound cells, or sums that include an uncarried cell); the universal all-provision cells at ages 3, 4 and Total (nursery plus reception, both bound, a few children off their sum in DfE's own table); the estimated eligible children, eligible nursery children and all-children estimates (DfE builds them from population and survey-based inputs, not administrative counts, and the all-children estimates restate the ONS England single years already bound at a different reference date); and the registered percentages (ratios of a bound count to one of those estimates)." }, "scope_target_ids": [ "obr.income_tax", @@ -1128,6 +1136,13 @@ "dfe.funded_childcare.working_parent_children_2_to_4", "dfe.funded_childcare.early_learning_2_year_olds", "dfe.funded_childcare.universal_only_children", + "dfe.funded_childcare.working_parent_children_age_1", + "dfe.funded_childcare.working_parent_children_age_2", + "dfe.funded_childcare.working_parent_children_age_3", + "dfe.funded_childcare.working_parent_children_age_4", + "dfe.funded_childcare.universal_nursery_children_age_3", + "dfe.funded_childcare.universal_nursery_children_age_4", + "dfe.funded_childcare.universal_reception_children_age_4", "dft.bus_fare_receipts.england", "dft.bus_net_support.england", "dft.bus_fare_receipts.london", @@ -16291,6 +16306,623 @@ "category_id": "dfe.funded_childcare", "label": "Universal only children" }, + { + "target_id": "dfe.funded_childcare.working_parent_children_age_1", + "family": "dfe_funded_childcare", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "observation_basis": "january_stock", + "filters": [ + { + "concept": "uk.childcare.is_child_receiving_extended_childcare", + "equals": true + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 1 + }, + { + "concept": "uk.demographics.age", + "operator": "<", + "value": 2 + }, + { + "concept": "uk.geography.country", + "equals": "ENGLAND" + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dfe/funded_childcare/working_parent_children_age_1", + "value_variable": "person_count", + "from_entity": "person", + "map_to": "household", + "filters": [ + { + "variable": "is_child_receiving_extended_childcare", + "equals": true + }, + { + "variable": "age", + "operator": ">=", + "value": 1 + }, + { + "variable": "age", + "operator": "<", + "value": 2 + }, + { + "variable": "country", + "equals": "ENGLAND" + } + ], + "notes": "Caseload only, by single year of age: working parent registrations at age 1 in the January census (the 15 hours for children from 9 months from September 2024). DfE's separate 9 to 11 months cell is not bound: policyengine-uk gives a child of whole-year age 0 no working parent hours." + }, + "axiom": { + "metric_name": "dfe/funded_childcare/working_parent_children_age_1", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dfe", + "source_concept": "dfe.number_of_registered_children", + "source_measure_id": "registered_children_count", + "entity_name": "person", + "dimension_values": { + "entitlement_type": "Working parents", + "age": "1 year", + "registration_basis": "registered_children", + "provision": "all" + } + }, + "category_id": "dfe.funded_childcare", + "label": "Working parent children age 1" + }, + { + "target_id": "dfe.funded_childcare.working_parent_children_age_2", + "family": "dfe_funded_childcare", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "observation_basis": "january_stock", + "filters": [ + { + "concept": "uk.childcare.is_child_receiving_extended_childcare", + "equals": true + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 2 + }, + { + "concept": "uk.demographics.age", + "operator": "<", + "value": 3 + }, + { + "concept": "uk.education.current_education", + "operator": "!=", + "value": "PRIMARY" + }, + { + "concept": "uk.geography.country", + "equals": "ENGLAND" + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dfe/funded_childcare/working_parent_children_age_2", + "value_variable": "person_count", + "from_entity": "person", + "map_to": "household", + "filters": [ + { + "variable": "is_child_receiving_extended_childcare", + "equals": true + }, + { + "variable": "age", + "operator": ">=", + "value": 2 + }, + { + "variable": "age", + "operator": "<", + "value": 3 + }, + { + "variable": "current_education", + "operator": "!=", + "value": "PRIMARY" + }, + { + "variable": "country", + "equals": "ENGLAND" + } + ], + "notes": "Caseload only, by single year of age: working parent registrations at age 2 in the January census. DfE's January registrations leave out children in reception, so a child in primary education (current_education PRIMARY) is not counted. The 2 to 4 row stays bound beside the single years; its measure is the sum of the age 2, 3 and 4 rows, and its fact the sum of their facts." + }, + "axiom": { + "metric_name": "dfe/funded_childcare/working_parent_children_age_2", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dfe", + "source_concept": "dfe.number_of_registered_children", + "source_measure_id": "registered_children_count", + "entity_name": "person", + "dimension_values": { + "entitlement_type": "Working parents", + "age": "2 years", + "registration_basis": "registered_children", + "provision": "all" + } + }, + "category_id": "dfe.funded_childcare", + "label": "Working parent children age 2" + }, + { + "target_id": "dfe.funded_childcare.working_parent_children_age_3", + "family": "dfe_funded_childcare", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "observation_basis": "january_stock", + "filters": [ + { + "concept": "uk.childcare.is_child_receiving_extended_childcare", + "equals": true + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 3 + }, + { + "concept": "uk.demographics.age", + "operator": "<", + "value": 4 + }, + { + "concept": "uk.education.current_education", + "operator": "!=", + "value": "PRIMARY" + }, + { + "concept": "uk.geography.country", + "equals": "ENGLAND" + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dfe/funded_childcare/working_parent_children_age_3", + "value_variable": "person_count", + "from_entity": "person", + "map_to": "household", + "filters": [ + { + "variable": "is_child_receiving_extended_childcare", + "equals": true + }, + { + "variable": "age", + "operator": ">=", + "value": 3 + }, + { + "variable": "age", + "operator": "<", + "value": 4 + }, + { + "variable": "current_education", + "operator": "!=", + "value": "PRIMARY" + }, + { + "variable": "country", + "equals": "ENGLAND" + } + ], + "notes": "Caseload only, by single year of age: working parent registrations at age 3 in the January census. DfE's January registrations leave out children in reception, so a child in primary education (current_education PRIMARY) is not counted. The 2 to 4 row stays bound beside the single years; its measure is the sum of the age 2, 3 and 4 rows, and its fact the sum of their facts." + }, + "axiom": { + "metric_name": "dfe/funded_childcare/working_parent_children_age_3", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dfe", + "source_concept": "dfe.number_of_registered_children", + "source_measure_id": "registered_children_count", + "entity_name": "person", + "dimension_values": { + "entitlement_type": "Working parents", + "age": "3 years", + "registration_basis": "registered_children", + "provision": "all" + } + }, + "category_id": "dfe.funded_childcare", + "label": "Working parent children age 3" + }, + { + "target_id": "dfe.funded_childcare.working_parent_children_age_4", + "family": "dfe_funded_childcare", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "observation_basis": "january_stock", + "filters": [ + { + "concept": "uk.childcare.is_child_receiving_extended_childcare", + "equals": true + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 4 + }, + { + "concept": "uk.demographics.age", + "operator": "<", + "value": 5 + }, + { + "concept": "uk.education.current_education", + "operator": "!=", + "value": "PRIMARY" + }, + { + "concept": "uk.geography.country", + "equals": "ENGLAND" + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dfe/funded_childcare/working_parent_children_age_4", + "value_variable": "person_count", + "from_entity": "person", + "map_to": "household", + "filters": [ + { + "variable": "is_child_receiving_extended_childcare", + "equals": true + }, + { + "variable": "age", + "operator": ">=", + "value": 4 + }, + { + "variable": "age", + "operator": "<", + "value": 5 + }, + { + "variable": "current_education", + "operator": "!=", + "value": "PRIMARY" + }, + { + "variable": "country", + "equals": "ENGLAND" + } + ], + "notes": "Caseload only, by single year of age: working parent registrations at age 4 in the January census. DfE's January registrations leave out children in reception, so a child in primary education (current_education PRIMARY) is not counted. The 2 to 4 row stays bound beside the single years; its measure is the sum of the age 2, 3 and 4 rows, and its fact the sum of their facts." + }, + "axiom": { + "metric_name": "dfe/funded_childcare/working_parent_children_age_4", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dfe", + "source_concept": "dfe.number_of_registered_children", + "source_measure_id": "registered_children_count", + "entity_name": "person", + "dimension_values": { + "entitlement_type": "Working parents", + "age": "4 years", + "registration_basis": "registered_children", + "provision": "all" + } + }, + "category_id": "dfe.funded_childcare", + "label": "Working parent children age 4" + }, + { + "target_id": "dfe.funded_childcare.universal_nursery_children_age_3", + "family": "dfe_funded_childcare", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "observation_basis": "january_stock", + "filters": [ + { + "concept": "uk.childcare.is_child_receiving_universal_childcare", + "equals": true + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 3 + }, + { + "concept": "uk.demographics.age", + "operator": "<", + "value": 4 + }, + { + "concept": "uk.education.current_education", + "operator": "!=", + "value": "PRIMARY" + }, + { + "concept": "uk.geography.country", + "equals": "ENGLAND" + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dfe/funded_childcare/universal_nursery_children_age_3", + "value_variable": "person_count", + "from_entity": "person", + "map_to": "household", + "filters": [ + { + "variable": "is_child_receiving_universal_childcare", + "equals": true + }, + { + "variable": "age", + "operator": ">=", + "value": 3 + }, + { + "variable": "age", + "operator": "<", + "value": 4 + }, + { + "variable": "current_education", + "operator": "!=", + "value": "PRIMARY" + }, + { + "variable": "country", + "equals": "ENGLAND" + } + ], + "notes": "Universal hours registrations at age 3 outside reception (DfE's nursery provision), counting working parent children too, as DfE's universal counts do. DfE's January registrations leave out children in reception, so a child in primary education (current_education PRIMARY) is not counted. The nursery total is the sum of the age 3 and age 4 rows and is not bound again; universal_only_children is that total less the working parent age 3 and 4 rows." + }, + "axiom": { + "metric_name": "dfe/funded_childcare/universal_nursery_children_age_3", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dfe", + "source_concept": "dfe.number_of_registered_children_nursery", + "source_measure_id": "registered_children_nursery_count", + "entity_name": "person", + "dimension_values": { + "entitlement_type": "Universal", + "age": "3 years", + "registration_basis": "registered_children", + "provision": "nursery" + } + }, + "category_id": "dfe.funded_childcare", + "label": "Universal nursery children age 3" + }, + { + "target_id": "dfe.funded_childcare.universal_nursery_children_age_4", + "family": "dfe_funded_childcare", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "observation_basis": "january_stock", + "filters": [ + { + "concept": "uk.childcare.is_child_receiving_universal_childcare", + "equals": true + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 4 + }, + { + "concept": "uk.demographics.age", + "operator": "<", + "value": 5 + }, + { + "concept": "uk.education.current_education", + "operator": "!=", + "value": "PRIMARY" + }, + { + "concept": "uk.geography.country", + "equals": "ENGLAND" + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dfe/funded_childcare/universal_nursery_children_age_4", + "value_variable": "person_count", + "from_entity": "person", + "map_to": "household", + "filters": [ + { + "variable": "is_child_receiving_universal_childcare", + "equals": true + }, + { + "variable": "age", + "operator": ">=", + "value": 4 + }, + { + "variable": "age", + "operator": "<", + "value": 5 + }, + { + "variable": "current_education", + "operator": "!=", + "value": "PRIMARY" + }, + { + "variable": "country", + "equals": "ENGLAND" + } + ], + "notes": "Universal hours registrations at age 4 outside reception (DfE's nursery provision), counting working parent children too, as DfE's universal counts do. DfE's January registrations leave out children in reception, so a child in primary education (current_education PRIMARY) is not counted. The nursery total is the sum of the age 3 and age 4 rows and is not bound again; universal_only_children is that total less the working parent age 3 and 4 rows." + }, + "axiom": { + "metric_name": "dfe/funded_childcare/universal_nursery_children_age_4", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dfe", + "source_concept": "dfe.number_of_registered_children_nursery", + "source_measure_id": "registered_children_nursery_count", + "entity_name": "person", + "dimension_values": { + "entitlement_type": "Universal", + "age": "4 years", + "registration_basis": "registered_children", + "provision": "nursery" + } + }, + "category_id": "dfe.funded_childcare", + "label": "Universal nursery children age 4" + }, + { + "target_id": "dfe.funded_childcare.universal_reception_children_age_4", + "family": "dfe_funded_childcare", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "observation_basis": "january_stock", + "filters": [ + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 4 + }, + { + "concept": "uk.demographics.age", + "operator": "<", + "value": 5 + }, + { + "concept": "uk.education.current_education", + "equals": "PRIMARY" + }, + { + "concept": "uk.geography.country", + "equals": "ENGLAND" + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dfe/funded_childcare/universal_reception_children_age_4", + "value_variable": "person_count", + "from_entity": "person", + "map_to": "household", + "filters": [ + { + "variable": "age", + "operator": ">=", + "value": 4 + }, + { + "variable": "age", + "operator": "<", + "value": 5 + }, + { + "variable": "current_education", + "equals": "PRIMARY" + }, + { + "variable": "country", + "equals": "ENGLAND" + } + ], + "notes": "Four-year-olds in reception classes in the January census. The entitlement is the school place, so the measure counts every 4-year-old in primary education (current_education PRIMARY) in England, with no take-up flag: the row pins the share of 4-year-olds in reception, which decides who can take working parent and universal hours outside school. Reception at age 3 is not bound: the FRS codes no 3-year-old in primary education, so the model has no carrier." + }, + "axiom": { + "metric_name": "dfe/funded_childcare/universal_reception_children_age_4", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dfe", + "source_concept": "dfe.number_of_registered_children_reception", + "source_measure_id": "registered_children_reception_count", + "entity_name": "person", + "dimension_values": { + "entitlement_type": "Universal", + "age": "4 years", + "registration_basis": "registered_children", + "provision": "reception" + } + }, + "category_id": "dfe.funded_childcare", + "label": "Universal reception children age 4" + }, { "target_id": "dft.bus_fare_receipts.england", "family": "dft_local_bus", diff --git a/packages/microcosm-build/src/microcosm/build/uk/uprating_holds.json b/packages/microcosm-build/src/microcosm/build/uk/uprating_holds.json index 8930ece4a..3c5a10efa 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/uprating_holds.json +++ b/packages/microcosm-build/src/microcosm/build/uk/uprating_holds.json @@ -17,6 +17,25 @@ "status": "approved", "expires_on": "2026-12-11" }, + { + "scope": "national", + "kind": "in_year_snapshot", + "target_ids": [ + "dfe.funded_childcare.universal_nursery_children_age_3", + "dfe.funded_childcare.universal_nursery_children_age_4", + "dfe.funded_childcare.universal_reception_children_age_4", + "dfe.funded_childcare.working_parent_children_age_1", + "dfe.funded_childcare.working_parent_children_age_2", + "dfe.funded_childcare.working_parent_children_age_3", + "dfe.funded_childcare.working_parent_children_age_4" + ], + "reason": "DfE funded early-education registrations by single year of age and provision counted in the January 2025 census: a count at a date inside the calibration year, not a lagged period. Requested by María on 2026-10-21 with the single-age rows.", + "tracking": "microcosm#1278", + "approved_by": "juaristi22", + "approved_on": "2026-10-21", + "status": "approved", + "expires_on": "2026-12-11" + }, { "scope": "national", "kind": "in_year_snapshot", 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 85423830b..cb0953ba2 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 @@ -1175,8 +1175,8 @@ def test_uk_target_references_accept_regenerated_contract_fields(self) -> None: references = {reference.name: reference for reference in spec.target_references} assert ( - len(references) == 1333 - ) # childcare costing fixes (item 6): + 11, the UK's ONS single years 3 to 6 and England's 0 to 6; microcosm#1278: + 3, the ONS single years 0, 1 and 2 for all persons; microcosm#1095: + 4, the two national 15_19 sex bands split into ages 15, 16-17 and 18-19; microcosm#1106: + 13 SPI property amounts; microcosm#1113: + 1 ONS 07.2.2 household road fuel; PolicyEngine/chronicle#280 lane: 705 + 33 HMRC liabilities rows (Table 2.5, three + len(references) == 1340 + ) # childcare costing fixes: + 7, DfE funded childcare by single year of age (working parent 1-4, universal nursery 3-4, reception 4); item 6: + 11, the UK's ONS single years 3 to 6 and England's 0 to 6; microcosm#1278: + 3, the ONS single years 0, 1 and 2 for all persons; microcosm#1095: + 4, the two national 15_19 sex bands split into ages 15, 16-17 and 18-19; microcosm#1106: + 13 SPI property amounts; microcosm#1113: + 1 ONS 07.2.2 household road fuel; 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 # ten regional bands over twelve areas); microcosm#905: 424 - 18 country 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 26d8ef49e..e75f06122 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 @@ -57,8 +57,9 @@ # less the two signed out below the small-cell floor), which # load_uk_national_target_inputs drops after the compile; microcosm#1278 adds # the ONS single years 0, 1 and 2 for all persons, and the childcare costing -# fixes (item 6) the UK's single years 3 to 6 and England's 0 to 6. -ACTIVE_REFERENCE_COUNT = 1333 +# fixes (item 6) the UK's single years 3 to 6 and England's 0 to 6, and the +# DfE single-age rows seven funded-childcare counts. +ACTIVE_REFERENCE_COUNT = 1340 def _uc_reference(**overrides) -> LedgerTargetReference: 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 b28b9f515..9f51e4a81 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 @@ -19,6 +19,10 @@ metric_names, metric_names_from_target_profile, ) +from microcosm.build.uk_runtime.uprating_holds import ( + load_uk_uprating_holds, + uk_hold_is_signed, +) FORBIDDEN_VALUE_KEYS = {"aggregation", "operation", "registry", "target_value", "value"} FORBIDDEN_RUNTIME_KEYS = { @@ -237,8 +241,10 @@ def test_uk_population_targets_shape_order_and_registry_accounting() -> None: # microcosm#1262 binds Scotland's PIPR rents at BRMA grain; microcosm#1278 # adds the ONS single years 0, 1 and 2 for all persons inside the 0_4 sex # bands, and the childcare costing fixes (item 6) the UK's single years 3 - # to 6 and England's 0 to 6. - assert len(resource["targets"]) == 432 + # to 6 and England's 0 to 6, and the DfE single-age rows seven more + # funded-childcare counts (working parent ages 1-4, nursery ages 3-4, + # reception age 4). + assert len(resource["targets"]) == 439 providers = resource["hierarchy"]["providers"] categories = resource["hierarchy"]["categories"] @@ -252,10 +258,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) == 373 + assert len(registry_scope) == 380 assert len(profile_scope) == 59 - assert target_ids[:373] == registry_scope - assert target_ids[373:] == profile_scope + assert target_ids[:380] == registry_scope + assert target_ids[380:] == profile_scope parity = resource["registry_parity"] assert parity["pinned_ref"] == "12a1e028afeef08d8b2d74ee03fd9de3a78b2dd3" @@ -274,9 +280,10 @@ def test_uk_population_targets_shape_order_and_registry_accounting() -> None: # partition them; microcosm#1207's nine BUS01a journey rows and # microcosm#1301's three high-value homes region rows have no uk-data # metric, nor do microcosm#1278's three single years of age or the eleven - # the childcare costing fixes add (UK 3 to 6, England 0 to 6). + # the childcare costing fixes add (UK 3 to 6, England 0 to 6), nor the + # seven DfE funded-childcare single-age rows. assert len(mapped_target_ids) == 186 - assert len(unmapped_declarations) == 187 + assert len(unmapped_declarations) == 194 suppressed_ancestors = parity["suppressed_ancestors"] assert len(suppressed_ancestors) == 5 assert set(suppressed_ancestors).isdisjoint(parity["mapped"]) @@ -550,11 +557,180 @@ def test_uk_population_targets_bind_england_single_years_0_to_6() -> None: assert "ons.population.scotland_babies_under_1" in target_ids +DFE_SINGLE_AGE_IDS = ( + *( + f"dfe.funded_childcare.working_parent_children_age_{age}" + for age in (1, 2, 3, 4) + ), + "dfe.funded_childcare.universal_nursery_children_age_3", + "dfe.funded_childcare.universal_nursery_children_age_4", + "dfe.funded_childcare.universal_reception_children_age_4", +) +_DFE_AGE_LABEL = {1: "1 year", 2: "2 years", 3: "3 years", 4: "4 years"} + + +def _dfe_age_filters(key: str, age: int) -> list[dict]: + name = "uk.demographics.age" if key == "concept" else "age" + return [ + {key: name, "operator": ">=", "value": age}, + {key: name, "operator": "<", "value": age + 1}, + ] + + +def _dfe_country(key: str) -> dict: + name = "uk.geography.country" if key == "concept" else "country" + return {key: name, "equals": "ENGLAND"} + + +def _dfe_not_primary(key: str) -> dict: + name = "uk.education.current_education" if key == "concept" else "current_education" + return {key: name, "operator": "!=", "value": "PRIMARY"} + + +def _dfe_flag(key: str, variable: str) -> dict: + name = f"uk.childcare.{variable}" if key == "concept" else variable + return {key: name, "equals": True} + + +def _dfe_expected_filters(target_id: str, key: str) -> list[dict]: + age = int(target_id.rsplit("_", 1)[1]) + if "working_parent" in target_id: + return [ + _dfe_flag(key, "is_child_receiving_extended_childcare"), + *_dfe_age_filters(key, age), + *([_dfe_not_primary(key)] if age >= 2 else []), + _dfe_country(key), + ] + if "nursery" in target_id: + return [ + _dfe_flag(key, "is_child_receiving_universal_childcare"), + *_dfe_age_filters(key, age), + _dfe_not_primary(key), + _dfe_country(key), + ] + name = "uk.education.current_education" if key == "concept" else "current_education" + return [ + *_dfe_age_filters(key, age), + {key: name, "equals": "PRIMARY"}, + _dfe_country(key), + ] + + +def test_uk_population_targets_bind_dfe_funded_childcare_by_single_age() -> None: + """DfE's January census binds by single year of age beside the 2 to 4 row. + + María's ruling (2026-10-21) binds every DfE funded-childcare count the + model can carry, even on few records: working parent registrations at + ages 1 to 4, universal nursery registrations at ages 3 and 4, and + 4-year-olds in reception. The working parent 2 to 4 row, the take-up + fitter's anchor, stays bound: it is the sum of ages 2 to 4. Each row + counts persons in English households with whole-year age ``k``; outside + reception (``current_education != PRIMARY``) from age 2, as DfE's + registrations leave reception out, and in reception for the reception row. + """ + + resource = _load() + parity = resource["registry_parity"] + target_ids = [target["target_id"] for target in resource["targets"]] + anchor = target_ids.index("dfe.funded_childcare.universal_only_children") + assert target_ids[anchor - 2 : anchor + 1 + len(DFE_SINGLE_AGE_IDS)] == [ + "dfe.funded_childcare.working_parent_children_2_to_4", + "dfe.funded_childcare.early_learning_2_year_olds", + "dfe.funded_childcare.universal_only_children", + *DFE_SINGLE_AGE_IDS, + ] + for target_id in DFE_SINGLE_AGE_IDS: + assert target_id in parity["scope_target_ids"] + assert parity["unmapped_declarations"][target_id].startswith( + "Requested by María on 2026-10-21" + ) + assert target_id not in set(parity["mapped"].values()) + target = _target_by_id(resource, target_id) + age = int(target_id.rsplit("_", 1)[1]) + assert target["family"] == "dfe_funded_childcare" + assert target["category_id"] == "dfe.funded_childcare" + assert target["geography_levels"] == ["country"] + assert "value_operation" not in target + measurement = target["measurement"] + assert measurement["entity"] == "person" + assert measurement["map_to"] == "household" + assert measurement["concept"] == "uk.person.count" + assert measurement["observation_basis"] == "january_stock" + assert measurement["filters"] == _dfe_expected_filters(target_id, "concept") + binding = target["bindings"]["policyengine"] + slug = target_id.removeprefix("dfe.funded_childcare.") + assert binding["metric_name"] == f"dfe/funded_childcare/{slug}" + assert binding["value_variable"] == "person_count" + assert binding["from_entity"] == "person" + assert binding["map_to"] == "household" + assert binding["filters"] == _dfe_expected_filters(target_id, "variable") + selector = target["ledger_selector"] + if "working_parent" in target_id: + concept, measure = ( + "dfe.number_of_registered_children", + "registered_children_count", + ) + entitlement, provision = "Working parents", "all" + elif "nursery" in target_id: + concept = "dfe.number_of_registered_children_nursery" + measure = "registered_children_nursery_count" + entitlement, provision = "Universal", "nursery" + else: + concept = "dfe.number_of_registered_children_reception" + measure = "registered_children_reception_count" + entitlement, provision = "Universal", "reception" + assert selector == { + "source_name": "dfe", + "source_concept": concept, + "source_measure_id": measure, + "entity_name": "person", + "dimension_values": { + "entitlement_type": entitlement, + "age": _DFE_AGE_LABEL[age], + "registration_basis": "registered_children", + "provision": provision, + }, + } + + # The combined row and the universal-only difference stay as they were. + combined = _target_by_id( + resource, "dfe.funded_childcare.working_parent_children_2_to_4" + ) + assert combined["ledger_selector"]["dimension_values"]["age"] == [ + "2 years", + "3 to 4 years", + ] + note = parity["accounting_notes"]["dfe_funded_childcare_single_ages"] + assert note.startswith("Requested by María on 2026-10-21") + for reason in ( + "9 to 11 months", + "reception at age 3", + "survey-based inputs", + "registered percentages", + ): + assert reason in note + + +def test_dfe_single_age_rows_hold_the_january_2025_census() -> None: + """The seven rows read the January 2025 census, a signed in-year snapshot.""" + + (entry,) = [ + entry + for entry in load_uk_uprating_holds()["holds"] + if set(DFE_SINGLE_AGE_IDS) & set(entry["target_ids"]) + ] + assert sorted(entry["target_ids"]) == sorted(DFE_SINGLE_AGE_IDS) + assert entry["scope"] == "national" + assert entry["kind"] == "in_year_snapshot" + assert uk_hold_is_signed(entry) + assert entry["approved_on"] == "2026-10-21" + + 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) == 432 + assert len(target_ids) == 439 assert len(target_ids) == len(set(target_ids)) @@ -666,7 +842,9 @@ def test_childcare_bus_observation_basis_and_entity_pins_are_closed_world() -> N for target in resource["targets"] if target["family"] == "dfe_funded_childcare" ] - assert len(childcare) == 3 + # The working parent 2 to 4, early learning 2-year-olds and universal-only + # rows, and the seven single-age rows of the DfE single-age binding. + assert len(childcare) == 10 assert all( not target["measurement"]["concept"].endswith(".amount") for target in childcare ) @@ -1055,7 +1233,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) == 432 + assert len(targets) == 439 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_target_references.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_target_references.py index df9a51bc5..d5284bd1f 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 @@ -72,7 +72,7 @@ _TEST_PATHS = paths_for("microcosm-build") -ACTIVE_REFERENCE_COUNT = 1333 +ACTIVE_REFERENCE_COUNT = 1340 REGION_TIER_LEVEL = {code: level for level, code in UK_REGION_TIER} @@ -537,6 +537,13 @@ def test_childcare_and_bus_references_compile_with_declared_provenance() -> None "dfe.funded_childcare.working_parent_children_2_to_4": 621_482.0, "dfe.funded_childcare.early_learning_2_year_olds": 95_031.0, "dfe.funded_childcare.universal_only_children": 396_965.0, + "dfe.funded_childcare.working_parent_children_age_1": 195_104.0, + "dfe.funded_childcare.working_parent_children_age_2": 242_453.0, + "dfe.funded_childcare.working_parent_children_age_3": 278_640.0, + "dfe.funded_childcare.working_parent_children_age_4": 100_389.0, + "dfe.funded_childcare.universal_nursery_children_age_3": 565_954.0, + "dfe.funded_childcare.universal_nursery_children_age_4": 210_040.0, + "dfe.funded_childcare.universal_reception_children_age_4": 379_308.0, "dft.bus_fare_receipts.england": pytest.approx( 3_417_388_656.43538 * 204.125 / 193.125 ), @@ -557,6 +564,7 @@ def test_childcare_and_bus_references_compile_with_declared_provenance() -> None "dfe.funded_childcare.working_parent_children_2_to_4": "person", "dfe.funded_childcare.early_learning_2_year_olds": "person", "dfe.funded_childcare.universal_only_children": "person", + **{name: "person" for name in DFE_SINGLE_AGE_IDS}, "dft.bus_fare_receipts.england": "institutional_sector", "dft.bus_net_support.england": "institutional_sector", "dft.bus_fare_receipts.london": "institutional_sector", @@ -600,6 +608,20 @@ def test_childcare_and_bus_references_compile_with_declared_provenance() -> None ] == "minuend - subtrahend" ) + # The nested rows reconcile on the facts: the 2 to 4 row is the sum of the + # working parent ages 2 to 4, and universal-only is the nursery ages 3 and + # 4 less the working parent ages 3 and 4. + value = {name: spec.value for name, spec in specs.items()} + prefix = "dfe.funded_childcare." + assert value[prefix + "working_parent_children_2_to_4"] == sum( + value[prefix + f"working_parent_children_age_{age}"] for age in (2, 3, 4) + ) + assert value[prefix + "universal_only_children"] == ( + value[prefix + "universal_nursery_children_age_3"] + + value[prefix + "universal_nursery_children_age_4"] + - value[prefix + "working_parent_children_age_3"] + - value[prefix + "working_parent_children_age_4"] + ) def test_dfe_extended_sum_refuses_the_suppressed_2024_member() -> None: @@ -734,6 +756,48 @@ def test_ons_single_year_age_references_pin_the_uk_and_england() -> None: assert reference["expected_member_count"] == 1 +DFE_SINGLE_AGE_IDS = ( + *( + f"dfe.funded_childcare.working_parent_children_age_{age}" + for age in (1, 2, 3, 4) + ), + "dfe.funded_childcare.universal_nursery_children_age_3", + "dfe.funded_childcare.universal_nursery_children_age_4", + "dfe.funded_childcare.universal_reception_children_age_4", +) + + +def test_dfe_single_age_references_pin_england_at_the_january_2025_census() -> None: + """The seven DfE single-age rows resolve one England fact each. + + The ``dfe.`` prefix pins every DfE row to England (E92000001); each new + row selects one age cell of its census table, January 2025, held to the + 2025 calibration year (María's ruling, 2026-10-21). + """ + + references = { + reference["name"]: reference + for reference in _load_uk_resource("target_references.json")[ + "target_references" + ] + } + membership = _load_uk_resource("target_reference_membership.json") + for target_id in DFE_SINGLE_AGE_IDS: + reference = references[target_id] + selector = reference["ledger_selector"] + assert selector["geography_level"] == "country" + assert selector["geography_id"] == "E92000001" + assert reference["family"] == "dfe_funded_childcare" + assert reference["entity"] == "person" + assert reference["period"] == 2025 + assert reference["uprating_from_period"] == "2025-01" + assert reference["uprating_to_period"] == 2025 + assert reference["metadata"]["observation_basis"] == "january_stock" + assert membership["targets"][target_id]["status"] == "active" + (candidate,) = membership["targets"][target_id]["candidates"] + assert candidate["resolved_fact_period"] == "2025-01" + + UC_ELEMENT_TARGET_IDS = frozenset( { "dwp.uc.households_lcwra_element", @@ -932,7 +996,7 @@ 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": 1333, + "active": 1340, "no_fact_at_or_before_period": 5, "signed_excluded": 17, } diff --git a/tools/build_uk_ledger_compile_parity_signed_differences.py b/tools/build_uk_ledger_compile_parity_signed_differences.py index ba8f62bb9..ac59ec1be 100644 --- a/tools/build_uk_ledger_compile_parity_signed_differences.py +++ b/tools/build_uk_ledger_compile_parity_signed_differences.py @@ -354,6 +354,27 @@ class ParityReceiptSpec: ) ) +_DFE_SINGLE_AGE_LEDGER_ONLY_RATIONALE = ( + "Requested by María on 2026-10-21 for the £100k childcare costing fixes " + "(microcosm#1278, #1095): one of the seven DfE funded-childcare counts by " + "single year of age from the January 2025 census, England (working parent " + "registrations at ages 1 to 4, universal nursery registrations at ages 3 and " + "4, and 4-year-olds in reception), bound beside the working parent 2 to 4 and " + "universal-only rows they nest in. The incumbent binds no DfE row, so this row " + "has no fixture counterpart." +) +_DFE_SINGLE_AGE_ROWS = frozenset( + ( + *( + f"dfe.funded_childcare.working_parent_children_age_{age}" + for age in (1, 2, 3, 4) + ), + "dfe.funded_childcare.universal_nursery_children_age_3", + "dfe.funded_childcare.universal_nursery_children_age_4", + "dfe.funded_childcare.universal_reception_children_age_4", + ) +) + _DEVOLVED_RENT_FIXTURE_ONLY_RATIONALE = ( "Ruled signed exclusion: the incumbent y-values for devolved private rent " "are hardcoded constants in devolved_housing.py with no source or year, " @@ -832,6 +853,8 @@ def _add_signed_rationale_notes( row["reason"] = _ONS_SINGLE_YEAR_AGE_LEDGER_ONLY_RATIONALE elif name in _ONS_SINGLE_YEAR_AGE_0_6_ROWS and row.get("kind") == "ledger_only": row["reason"] = _ONS_SINGLE_YEAR_AGE_0_6_LEDGER_ONLY_RATIONALE + elif name in _DFE_SINGLE_AGE_ROWS and row.get("kind") == "ledger_only": + row["reason"] = _DFE_SINGLE_AGE_LEDGER_ONLY_RATIONALE #: microcosm#1240: the high_value_homes family binds a Microcosm-derived From 11d011586c6557a823e50635204833548489cb3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 22 Oct 2026 17:27:04 +0100 Subject: [PATCH 06/25] Refit the four childcare take-up rates on the fixed spine (tool version 5) The fitter ran on a local spine built at 13307a64e (nested universal take-up, reception-age children out of the DfE rows, copies re-drawing their childcare draws; items 3 and 4 reverted), feed abf0921, model period 2024, the DfE 2-4 anchor at its 2025 vintage. Extended hours 0.7594 (0.6579 before), targeted 0.8478, Tax-Free Childcare 0.9912. The conditional universal rate stops at its lower bound of 0, so universal take-up is fully nested: the nested floor already exceeds DfE's universal-only count, because the model's interview-date ages hold more 4-year-olds outside reception than DfE's 31 December ages. Per the U2c ruling the bound is kept and the receipt records the residuals (universal-only 1.036, working parent 2-4 0.961); the national calibration binds the DfE rows. Co-Authored-By: Claude Opus 5.5 --- .../microcosm/build/uk/take_up_contract.json | 160 +++++++++--------- .../uk/test_uk_take_up_contract.py | 12 +- 2 files changed, 86 insertions(+), 86 deletions(-) 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 bffa17aec..5a4c892cd 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 @@ -165,7 +165,7 @@ "entity": "benunit", "values": { "2015-01-01": 0.586, - "2024-04-06": 0.9797 + "2024-04-06": 0.9912 }, "source": { "source": "FRS empirical fit and HMRC Tax-Free Childcare statistics, June 2025 release", @@ -175,22 +175,22 @@ "status": "fitted_offline" }, "fitting_receipt": { - "source": "tools/fit_uk_childcare_takeup.py (microcosm#1095 U2c, licensed lane)", - "tool_version": 4, - "receipt_sha256": "32b06ee06f235089847b5c469e7c49ad9ee39c51e46aa5908522fec61c130d96", + "source": "tools/fit_uk_childcare_takeup.py (childcare £100k-limit fixes, licensed lane)", + "tool_version": 5, + "receipt_sha256": "4c9a7b3b4e057e486a3bc8baa52e52b6c917979908026011f812039e55b25a4a", "seed": 0, - "engine_version": "2.132.6", + "engine_version": "2.134.4", "model_period": 2024, "vintage_overrides": { "dfe.funded_childcare.working_parent_children_2_to_4": 2025 }, - "input_h5_sha256": "c883a0506a7e626804e33a43e3e7b4dbf7ea7e55a67e5624edbc445187a7ab07", - "input_spine": "the bump arm of the fifth #1095 ports PR (policyengine-uk 2.132.6, spine before the extended-hours anchor moved)", - "ledger_facts_sha256": "3033e437ed61d7d5e970f4fef34a2a5523fe068770a7798e5768af656f2a48a4", - "stochastic_contract_sha256_at_fit": "3d9fd8cd58de359ecb07b9af478f4bf8b30045dc1ad108d1952f8f9bedb44d96", + "input_h5_sha256": "83c83f044606e915b1d8a85cbbdd16f689b88a82ec690e74dc08848e0759fb58", + "input_spine": "local unsigned spine built at 13307a64e (uk-childcare-100k-fixes on #1329, items 3 and 4 reverted; policyengine-uk 2.134.4, feed abf0921), sha256 83c83f044606e915b1d8a85cbbdd16f689b88a82ec690e74dc08848e0759fb58", + "ledger_facts_sha256": "2b64fecfe746164203dac1726aae6ffdb3e5d8e478bd3d64d118ac76cb00780b", + "stochastic_contract_sha256_at_fit": "54c65e6bbc2bd5612b8d4ec3254af78d1ca0d2c9bd5fcaaf05bbf69b75e2bea2", "optimizer": { "eps": 1e-06, - "loss": 0.030876275034388008, + "loss": 0.03520654649905628, "maxiter": 50, "method": "L-BFGS-B", "success": true @@ -198,31 +198,31 @@ "achieved": { "dfe.funded_childcare.early_learning_2_year_olds": { "target": 115852.0, - "value": 115851.869, + "value": 115852.118, "ratio": 1.0 }, "dfe.funded_childcare.universal_only_children": { "target": 416537.0, - "value": 416536.609, - "ratio": 1.0 + "value": 431558.609, + "ratio": 1.0361 }, "dfe.funded_childcare.working_parent_children_2_to_4": { "target": 621482.0, - "value": 621481.151, - "ratio": 1.0 + "value": 597323.794, + "ratio": 0.9611 }, "hmrc.tfc.children_with_used_accounts": { "target": 1085020.0, - "value": 1202038.13, - "ratio": 1.1078 + "value": 1204412.311, + "ratio": 1.11 }, "hmrc.tfc.government_top_up": { "target": 632200000.0, - "value": 544497415.126, - "ratio": 0.8613 + "value": 542154568.577, + "ratio": 0.8576 } }, - "status": "fitted at the 2024 base year with the expectation basis of tool version 4: targeted and universal hours allocated from working-parent hours (pe-uk#2177) and the DfE extended-hours anchor (#1126) in the simulation. No rate reached its bound. The two HMRC Tax-Free Childcare rows cannot both be met (spend below, children above): a residual of the frame's spend per child with a used account, not of the rate." + "status": "fitted at the 2024 base year with the expectation basis of tool version 5: universal take-up nested under working-parent take-up (its rate is conditional on not claiming extended hours), targeted hours allocated from working-parent hours (pe-uk#2177), reception-age children (current_education PRIMARY) left out of the DfE working-parent and universal-only rows, and the DfE extended-hours anchor (#1126) in the simulation. At a bound: universal_childcare. The conditional universal rate stops at its lower bound of 0 (universal take-up fully nested under working-parent take-up): with reception children out, the nested floor already gives more universal-only children than DfE's January count, because the model's interview-date ages hold more 4-year-olds outside reception than DfE's 31 December ages; per María's U2c ruling the rate keeps its bound and the receipt records the residual, and the national calibration binds the DfE rows." } }, { @@ -231,7 +231,7 @@ "entity": "benunit", "values": { "2015-01-01": 0.812, - "2024-04-06": 0.6579 + "2024-04-06": 0.7594 }, "source": { "source": "FRS empirical fit", @@ -240,22 +240,22 @@ "status": "fitted_offline" }, "fitting_receipt": { - "source": "tools/fit_uk_childcare_takeup.py (microcosm#1095 U2c, licensed lane)", - "tool_version": 4, - "receipt_sha256": "32b06ee06f235089847b5c469e7c49ad9ee39c51e46aa5908522fec61c130d96", + "source": "tools/fit_uk_childcare_takeup.py (childcare £100k-limit fixes, licensed lane)", + "tool_version": 5, + "receipt_sha256": "4c9a7b3b4e057e486a3bc8baa52e52b6c917979908026011f812039e55b25a4a", "seed": 0, - "engine_version": "2.132.6", + "engine_version": "2.134.4", "model_period": 2024, "vintage_overrides": { "dfe.funded_childcare.working_parent_children_2_to_4": 2025 }, - "input_h5_sha256": "c883a0506a7e626804e33a43e3e7b4dbf7ea7e55a67e5624edbc445187a7ab07", - "input_spine": "the bump arm of the fifth #1095 ports PR (policyengine-uk 2.132.6, spine before the extended-hours anchor moved)", - "ledger_facts_sha256": "3033e437ed61d7d5e970f4fef34a2a5523fe068770a7798e5768af656f2a48a4", - "stochastic_contract_sha256_at_fit": "3d9fd8cd58de359ecb07b9af478f4bf8b30045dc1ad108d1952f8f9bedb44d96", + "input_h5_sha256": "83c83f044606e915b1d8a85cbbdd16f689b88a82ec690e74dc08848e0759fb58", + "input_spine": "local unsigned spine built at 13307a64e (uk-childcare-100k-fixes on #1329, items 3 and 4 reverted; policyengine-uk 2.134.4, feed abf0921), sha256 83c83f044606e915b1d8a85cbbdd16f689b88a82ec690e74dc08848e0759fb58", + "ledger_facts_sha256": "2b64fecfe746164203dac1726aae6ffdb3e5d8e478bd3d64d118ac76cb00780b", + "stochastic_contract_sha256_at_fit": "54c65e6bbc2bd5612b8d4ec3254af78d1ca0d2c9bd5fcaaf05bbf69b75e2bea2", "optimizer": { "eps": 1e-06, - "loss": 0.030876275034388008, + "loss": 0.03520654649905628, "maxiter": 50, "method": "L-BFGS-B", "success": true @@ -263,31 +263,31 @@ "achieved": { "dfe.funded_childcare.early_learning_2_year_olds": { "target": 115852.0, - "value": 115851.869, + "value": 115852.118, "ratio": 1.0 }, "dfe.funded_childcare.universal_only_children": { "target": 416537.0, - "value": 416536.609, - "ratio": 1.0 + "value": 431558.609, + "ratio": 1.0361 }, "dfe.funded_childcare.working_parent_children_2_to_4": { "target": 621482.0, - "value": 621481.151, - "ratio": 1.0 + "value": 597323.794, + "ratio": 0.9611 }, "hmrc.tfc.children_with_used_accounts": { "target": 1085020.0, - "value": 1202038.13, - "ratio": 1.1078 + "value": 1204412.311, + "ratio": 1.11 }, "hmrc.tfc.government_top_up": { "target": 632200000.0, - "value": 544497415.126, - "ratio": 0.8613 + "value": 542154568.577, + "ratio": 0.8576 } }, - "status": "fitted at the 2024 base year with the expectation basis of tool version 4: targeted and universal hours allocated from working-parent hours (pe-uk#2177) and the DfE extended-hours anchor (#1126) in the simulation. No rate reached its bound. The two HMRC Tax-Free Childcare rows cannot both be met (spend below, children above): a residual of the frame's spend per child with a used account, not of the rate." + "status": "fitted at the 2024 base year with the expectation basis of tool version 5: universal take-up nested under working-parent take-up (its rate is conditional on not claiming extended hours), targeted hours allocated from working-parent hours (pe-uk#2177), reception-age children (current_education PRIMARY) left out of the DfE working-parent and universal-only rows, and the DfE extended-hours anchor (#1126) in the simulation. At a bound: universal_childcare. The conditional universal rate stops at its lower bound of 0 (universal take-up fully nested under working-parent take-up): with reception children out, the nested floor already gives more universal-only children than DfE's January count, because the model's interview-date ages hold more 4-year-olds outside reception than DfE's 31 December ages; per María's U2c ruling the rate keeps its bound and the receipt records the residual, and the national calibration binds the DfE rows." } }, { @@ -297,7 +297,7 @@ "nested_under": "would_claim_extended_childcare", "values": { "2015-01-01": 0.563, - "2024-04-06": 0.4353 + "2024-04-06": 0.0 }, "source": { "source": "FRS empirical fit", @@ -306,22 +306,22 @@ "status": "fitted_offline" }, "fitting_receipt": { - "source": "tools/fit_uk_childcare_takeup.py (microcosm#1095 U2c, licensed lane)", - "tool_version": 4, - "receipt_sha256": "32b06ee06f235089847b5c469e7c49ad9ee39c51e46aa5908522fec61c130d96", + "source": "tools/fit_uk_childcare_takeup.py (childcare £100k-limit fixes, licensed lane)", + "tool_version": 5, + "receipt_sha256": "4c9a7b3b4e057e486a3bc8baa52e52b6c917979908026011f812039e55b25a4a", "seed": 0, - "engine_version": "2.132.6", + "engine_version": "2.134.4", "model_period": 2024, "vintage_overrides": { "dfe.funded_childcare.working_parent_children_2_to_4": 2025 }, - "input_h5_sha256": "c883a0506a7e626804e33a43e3e7b4dbf7ea7e55a67e5624edbc445187a7ab07", - "input_spine": "the bump arm of the fifth #1095 ports PR (policyengine-uk 2.132.6, spine before the extended-hours anchor moved)", - "ledger_facts_sha256": "3033e437ed61d7d5e970f4fef34a2a5523fe068770a7798e5768af656f2a48a4", - "stochastic_contract_sha256_at_fit": "3d9fd8cd58de359ecb07b9af478f4bf8b30045dc1ad108d1952f8f9bedb44d96", + "input_h5_sha256": "83c83f044606e915b1d8a85cbbdd16f689b88a82ec690e74dc08848e0759fb58", + "input_spine": "local unsigned spine built at 13307a64e (uk-childcare-100k-fixes on #1329, items 3 and 4 reverted; policyengine-uk 2.134.4, feed abf0921), sha256 83c83f044606e915b1d8a85cbbdd16f689b88a82ec690e74dc08848e0759fb58", + "ledger_facts_sha256": "2b64fecfe746164203dac1726aae6ffdb3e5d8e478bd3d64d118ac76cb00780b", + "stochastic_contract_sha256_at_fit": "54c65e6bbc2bd5612b8d4ec3254af78d1ca0d2c9bd5fcaaf05bbf69b75e2bea2", "optimizer": { "eps": 1e-06, - "loss": 0.030876275034388008, + "loss": 0.03520654649905628, "maxiter": 50, "method": "L-BFGS-B", "success": true @@ -329,31 +329,31 @@ "achieved": { "dfe.funded_childcare.early_learning_2_year_olds": { "target": 115852.0, - "value": 115851.869, + "value": 115852.118, "ratio": 1.0 }, "dfe.funded_childcare.universal_only_children": { "target": 416537.0, - "value": 416536.609, - "ratio": 1.0 + "value": 431558.609, + "ratio": 1.0361 }, "dfe.funded_childcare.working_parent_children_2_to_4": { "target": 621482.0, - "value": 621481.151, - "ratio": 1.0 + "value": 597323.794, + "ratio": 0.9611 }, "hmrc.tfc.children_with_used_accounts": { "target": 1085020.0, - "value": 1202038.13, - "ratio": 1.1078 + "value": 1204412.311, + "ratio": 1.11 }, "hmrc.tfc.government_top_up": { "target": 632200000.0, - "value": 544497415.126, - "ratio": 0.8613 + "value": 542154568.577, + "ratio": 0.8576 } }, - "status": "fitted at the 2024 base year with the expectation basis of tool version 4: targeted and universal hours allocated from working-parent hours (pe-uk#2177) and the DfE extended-hours anchor (#1126) in the simulation. No rate reached its bound. The two HMRC Tax-Free Childcare rows cannot both be met (spend below, children above): a residual of the frame's spend per child with a used account, not of the rate." + "status": "fitted at the 2024 base year with the expectation basis of tool version 5: universal take-up nested under working-parent take-up (its rate is conditional on not claiming extended hours), targeted hours allocated from working-parent hours (pe-uk#2177), reception-age children (current_education PRIMARY) left out of the DfE working-parent and universal-only rows, and the DfE extended-hours anchor (#1126) in the simulation. At a bound: universal_childcare. The conditional universal rate stops at its lower bound of 0 (universal take-up fully nested under working-parent take-up): with reception children out, the nested floor already gives more universal-only children than DfE's January count, because the model's interview-date ages hold more 4-year-olds outside reception than DfE's 31 December ages; per María's U2c ruling the rate keeps its bound and the receipt records the residual, and the national calibration binds the DfE rows." } }, { @@ -362,7 +362,7 @@ "entity": "benunit", "values": { "2015-01-01": 0.597, - "2024-04-06": 0.7769 + "2024-04-06": 0.8478 }, "source": { "source": "FRS empirical fit", @@ -371,22 +371,22 @@ "status": "fitted_offline" }, "fitting_receipt": { - "source": "tools/fit_uk_childcare_takeup.py (microcosm#1095 U2c, licensed lane)", - "tool_version": 4, - "receipt_sha256": "32b06ee06f235089847b5c469e7c49ad9ee39c51e46aa5908522fec61c130d96", + "source": "tools/fit_uk_childcare_takeup.py (childcare £100k-limit fixes, licensed lane)", + "tool_version": 5, + "receipt_sha256": "4c9a7b3b4e057e486a3bc8baa52e52b6c917979908026011f812039e55b25a4a", "seed": 0, - "engine_version": "2.132.6", + "engine_version": "2.134.4", "model_period": 2024, "vintage_overrides": { "dfe.funded_childcare.working_parent_children_2_to_4": 2025 }, - "input_h5_sha256": "c883a0506a7e626804e33a43e3e7b4dbf7ea7e55a67e5624edbc445187a7ab07", - "input_spine": "the bump arm of the fifth #1095 ports PR (policyengine-uk 2.132.6, spine before the extended-hours anchor moved)", - "ledger_facts_sha256": "3033e437ed61d7d5e970f4fef34a2a5523fe068770a7798e5768af656f2a48a4", - "stochastic_contract_sha256_at_fit": "3d9fd8cd58de359ecb07b9af478f4bf8b30045dc1ad108d1952f8f9bedb44d96", + "input_h5_sha256": "83c83f044606e915b1d8a85cbbdd16f689b88a82ec690e74dc08848e0759fb58", + "input_spine": "local unsigned spine built at 13307a64e (uk-childcare-100k-fixes on #1329, items 3 and 4 reverted; policyengine-uk 2.134.4, feed abf0921), sha256 83c83f044606e915b1d8a85cbbdd16f689b88a82ec690e74dc08848e0759fb58", + "ledger_facts_sha256": "2b64fecfe746164203dac1726aae6ffdb3e5d8e478bd3d64d118ac76cb00780b", + "stochastic_contract_sha256_at_fit": "54c65e6bbc2bd5612b8d4ec3254af78d1ca0d2c9bd5fcaaf05bbf69b75e2bea2", "optimizer": { "eps": 1e-06, - "loss": 0.030876275034388008, + "loss": 0.03520654649905628, "maxiter": 50, "method": "L-BFGS-B", "success": true @@ -394,31 +394,31 @@ "achieved": { "dfe.funded_childcare.early_learning_2_year_olds": { "target": 115852.0, - "value": 115851.869, + "value": 115852.118, "ratio": 1.0 }, "dfe.funded_childcare.universal_only_children": { "target": 416537.0, - "value": 416536.609, - "ratio": 1.0 + "value": 431558.609, + "ratio": 1.0361 }, "dfe.funded_childcare.working_parent_children_2_to_4": { "target": 621482.0, - "value": 621481.151, - "ratio": 1.0 + "value": 597323.794, + "ratio": 0.9611 }, "hmrc.tfc.children_with_used_accounts": { "target": 1085020.0, - "value": 1202038.13, - "ratio": 1.1078 + "value": 1204412.311, + "ratio": 1.11 }, "hmrc.tfc.government_top_up": { "target": 632200000.0, - "value": 544497415.126, - "ratio": 0.8613 + "value": 542154568.577, + "ratio": 0.8576 } }, - "status": "fitted at the 2024 base year with the expectation basis of tool version 4: targeted and universal hours allocated from working-parent hours (pe-uk#2177) and the DfE extended-hours anchor (#1126) in the simulation. No rate reached its bound. The two HMRC Tax-Free Childcare rows cannot both be met (spend below, children above): a residual of the frame's spend per child with a used account, not of the rate." + "status": "fitted at the 2024 base year with the expectation basis of tool version 5: universal take-up nested under working-parent take-up (its rate is conditional on not claiming extended hours), targeted hours allocated from working-parent hours (pe-uk#2177), reception-age children (current_education PRIMARY) left out of the DfE working-parent and universal-only rows, and the DfE extended-hours anchor (#1126) in the simulation. At a bound: universal_childcare. The conditional universal rate stops at its lower bound of 0 (universal take-up fully nested under working-parent take-up): with reception children out, the nested floor already gives more universal-only children than DfE's January count, because the model's interview-date ages hold more 4-year-olds outside reception than DfE's 31 December ages; per María's U2c ruling the rate keeps its bound and the receipt records the residual, and the national calibration binds the DfE rows." } }, { 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 c7919297f..80053beca 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 @@ -44,11 +44,11 @@ def test_uk_contract_loads_and_selects_build_year_rates() -> None: 0.6, 0.55, 0.5, - # microcosm#1095 U2c: the v4 refit on the policyengine-uk 2.132.6 spine. - 0.9797, - 0.6579, - 0.4353, - 0.7769, + # The v5 refit (nested universal, reception out) on the childcare-fix spine. + 0.9912, + 0.7594, + 0.0, + 0.8478, 0.441, 0.2682, 0.97, @@ -90,7 +90,7 @@ def test_year_selection_uses_latest_value_at_or_before_build_year() -> None: assert contract.rate("child_benefit", 2021) == 0.97 assert contract.rate("child_benefit", 2023) == 0.89 - assert contract.rate("tax_free_childcare", 2024) == 0.9797 + assert contract.rate("tax_free_childcare", 2024) == 0.9912 assert contract.rate("tax_free_childcare", 2023) == 0.586 assert contract.rate("tv_licence_evasion_rate", 2024) == 0.1252 assert contract.rate("tax_free_childcare_spend_routed_share", 2017) == 0.359 From 4dfced092af5568d145a28fd8c163e91a69f7ab9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 22 Oct 2026 17:27:19 +0100 Subject: [PATCH 07/25] Sign out the age-4 DfE cells: their December ages do not match the model's interview ages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit María's ruling (2026-10-21): the three age-4 rows added with the DfE single ages are signed out, not bound: dfe.funded_childcare.working_parent_children_age_4, universal_nursery_children_age_4 and universal_reception_children_age_4. DfE's January census reports ages as at 31 December, when about two-thirds of funded 4-year-olds are already in reception, while the model's whole-year age is the age at interview spread over the survey year, so fewer of its 4-year-olds are in primary education. Binding the single age-4 cells would move weight between 4-year-olds in school and in nursery because of the reference date, not the data. The working parent 2 to 4 and universal-only rows stay bound and are unaffected. Working parent ages 1, 2 and 3 and universal nursery age 3 stay bound. The three rows leave the targets, scope_target_ids and unmapped declarations; the accounting note dfe_funded_childcare_single_ages lists them as signed-out cells with the reason above, and the kept rows' declarations and binding notes no longer describe age-4 rows. The signed in_year_snapshot hold María confirmed (approved_by juaristi22, approved_on 2026-10-21) now covers the four kept rows, and the compile-parity tool's ledger-only rationale names the four, without the claim that they nest in the 2 to 4 and universal-only rows. Registry accounting: the contract has 436 targets (439), the registry scope 377 (380) and the unmapped declarations 191 (194); the mapped targets stay at 186. The references and membership were regenerated once with tools/generate_uk_target_references.py against the same national copy of the pinned feed abf0921 (source_fact_feed chronicle-uk-abf0921-consumer-facts) as the previous regeneration: the three references and their membership, geography-pin and uprating-hold entries are gone, every other reference is byte-identical, and active references go from 1,340 to 1,337. Co-Authored-By: Claude Opus 5.5 --- .../uk-childcare-dfe-single-ages.added.md | 2 +- .../build/uk/uk_population_targets.json | 285 +----------------- .../microcosm/build/uk/uprating_holds.json | 5 +- .../engine_free/shared/test_country_spec.py | 4 +- .../uk/test_uk_national_calibration.py | 5 +- .../uk/test_uk_population_targets.py | 90 +++--- .../uk/test_uk_target_references.py | 44 +-- ...edger_compile_parity_signed_differences.py | 14 +- 8 files changed, 94 insertions(+), 355 deletions(-) diff --git a/changelog.d/uk-childcare-dfe-single-ages.added.md b/changelog.d/uk-childcare-dfe-single-ages.added.md index 0c5d4eb50..ae2e884a1 100644 --- a/changelog.d/uk-childcare-dfe-single-ages.added.md +++ b/changelog.d/uk-childcare-dfe-single-ages.added.md @@ -1 +1 @@ -The national UK contract binds seven more DfE funded-childcare counts by single year of age, England, from the January 2025 census (María's ruling of 2026-10-21: bind every DfE childcare count the model can carry, even on few records, and sign out only those with a real reason; microcosm#1278, #1095): working parent registrations at ages 1, 2, 3 and 4 (`dfe.funded_childcare.working_parent_children_age_`), universal registrations in nursery at ages 3 and 4 (`universal_nursery_children_age_`), and 4-year-olds in reception (`universal_reception_children_age_4`, every 4-year-old in primary education, which pins the share of 4-year-olds in school). Each counts persons in English households with whole-year age `n`; from age 2 the working parent and nursery rows leave out children in primary education, as DfE's registrations leave out reception. The working parent 2 to 4 row (the take-up fitter's anchor) and the universal-only row stay bound: the first is the sum of ages 2 to 4, on the facts and on the measures; the second is the nursery ages 3 and 4 less the working parent ages 3 and 4 on the facts, and on the measures wherever a working parent child keeps the universal hours, as it does from policyengine-uk 2.128.1. The contract's accounting notes sign out the rest of the table, each for its reason: the 9 to 11 months cell (policyengine-uk gives whole-year age 0 no working parent hours), reception at age 3 (no FRS 3-year-old is in primary education), the totals and multi-age cells that sum or copy bound cells, the universal all-provision cells (nursery plus reception), DfE's eligible-children and all-children estimates (built from population and survey-based inputs) and the registered percentages. The contract has 439 targets (432 before) and the registry scope 380 (373): seven more contract-only declarations (194). A signed `in_year_snapshot` hold covers the seven rows, the national references give 1,340 active references (1,333), and the compile-parity tool signs the seven as `ledger_only`, with their rationale. +The national UK contract binds four more DfE funded-childcare counts by single year of age, England, from the January 2025 census (María's ruling of 2026-10-21: bind every DfE childcare count the model can carry, even on few records, and sign out only those with a real reason; microcosm#1278, #1095): working parent registrations at ages 1, 2 and 3 (`dfe.funded_childcare.working_parent_children_age_`) and universal registrations in nursery at age 3 (`universal_nursery_children_age_3`). Each counts persons in English households with whole-year age `n`; from age 2 the rows leave out children in primary education, as DfE's registrations leave out reception. The working parent 2 to 4 row (the take-up fitter's anchor) and the universal-only row stay bound beside them, unaffected. The contract's accounting notes sign out the rest of the table, each for its reason: the three age-4 cells, the working parent and universal nursery registrations at age 4 and the 4-year-olds in reception (DfE's January census reports ages as at 31 December, when about two-thirds of funded 4-year-olds are already in reception, while the model's whole-year age is the age at interview spread over the survey year, with fewer 4-year-olds in primary education, so binding the single age-4 cells would move weight between 4-year-olds in school and in nursery because of the reference date, not the data); the 9 to 11 months cell (policyengine-uk gives whole-year age 0 no working parent hours); reception at age 3 (no FRS 3-year-old is in primary education); the totals and multi-age cells that sum or copy bound cells or include an uncarried or signed-out cell; the universal all-provision cells (nursery plus reception); DfE's eligible-children and all-children estimates (built from population and survey-based inputs); and the registered percentages. The contract has 436 targets (432 before) and the registry scope 377 (373): four more contract-only declarations (191). A signed `in_year_snapshot` hold covers the four rows, the national references give 1,337 active references (1,333), and the compile-parity tool signs the four as `ledger_only`, with their rationale. 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 c748d6835..c58047140 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 @@ -872,13 +872,10 @@ "ons.population.england_age_4": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): England's funded childcare is costed on England's children, whose single years the UK rows and the region 0_9 cells leave free, so the contract binds England's ages 0 to 6 for all persons, read from the ONS mid-year estimate for England (E92000001) by single year of age. Wales, Scotland and Northern Ireland get no single-year rows: each nation's single year rests on too few FRS households, and the UK rows bind their sum. No incumbent row has this row's definition.", "ons.population.england_age_5": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): England's funded childcare is costed on England's children, whose single years the UK rows and the region 0_9 cells leave free, so the contract binds England's ages 0 to 6 for all persons, read from the ONS mid-year estimate for England (E92000001) by single year of age. Wales, Scotland and Northern Ireland get no single-year rows: each nation's single year rests on too few FRS households, and the UK rows bind their sum. No incumbent row has this row's definition.", "ons.population.england_age_6": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): England's funded childcare is costed on England's children, whose single years the UK rows and the region 0_9 cells leave free, so the contract binds England's ages 0 to 6 for all persons, read from the ONS mid-year estimate for England (E92000001) by single year of age. Wales, Scotland and Northern Ireland get no single-year rows: each nation's single year rests on too few FRS households, and the UK rows bind their sum. No incumbent row has this row's definition.", - "dfe.funded_childcare.working_parent_children_age_1": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. The working parent registrations by single year of age (1, 2, 3 and 4) from the DfE January census, England. The 2 to 4 row stays bound beside them. No incumbent row has this row's definition.", - "dfe.funded_childcare.working_parent_children_age_2": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. The working parent registrations by single year of age (1, 2, 3 and 4) from the DfE January census, England. The 2 to 4 row stays bound beside them. No incumbent row has this row's definition.", - "dfe.funded_childcare.working_parent_children_age_3": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. The working parent registrations by single year of age (1, 2, 3 and 4) from the DfE January census, England. The 2 to 4 row stays bound beside them. No incumbent row has this row's definition.", - "dfe.funded_childcare.working_parent_children_age_4": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. The working parent registrations by single year of age (1, 2, 3 and 4) from the DfE January census, England. The 2 to 4 row stays bound beside them. No incumbent row has this row's definition.", - "dfe.funded_childcare.universal_nursery_children_age_3": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. The universal registrations in nursery provision at ages 3 and 4 from the DfE January census, England. No incumbent row has this row's definition.", - "dfe.funded_childcare.universal_nursery_children_age_4": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. The universal registrations in nursery provision at ages 3 and 4 from the DfE January census, England. No incumbent row has this row's definition.", - "dfe.funded_childcare.universal_reception_children_age_4": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. The 4-year-olds in reception from the DfE January census, England, which pins the share of 4-year-olds in school. No incumbent row has this row's definition." + "dfe.funded_childcare.working_parent_children_age_1": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. The working parent registrations by single year of age (1, 2 and 3) from the DfE January census, England; age 4 is signed out for its reference date (accounting note dfe_funded_childcare_single_ages). The 2 to 4 row stays bound beside them. No incumbent row has this row's definition.", + "dfe.funded_childcare.working_parent_children_age_2": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. The working parent registrations by single year of age (1, 2 and 3) from the DfE January census, England; age 4 is signed out for its reference date (accounting note dfe_funded_childcare_single_ages). The 2 to 4 row stays bound beside them. No incumbent row has this row's definition.", + "dfe.funded_childcare.working_parent_children_age_3": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. The working parent registrations by single year of age (1, 2 and 3) from the DfE January census, England; age 4 is signed out for its reference date (accounting note dfe_funded_childcare_single_ages). The 2 to 4 row stays bound beside them. No incumbent row has this row's definition.", + "dfe.funded_childcare.universal_nursery_children_age_3": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. The universal registrations in nursery provision at age 3 from the DfE January census, England; age 4 is signed out for its reference date (accounting note dfe_funded_childcare_single_ages). No incumbent row has this row's definition." }, "suppressed_ancestors": { "hmrc/salary_sacrifice_it_relief_basic_rate": { @@ -913,7 +910,7 @@ "ons_15_19_sex_band_split": "María's ruling of 2026-10-13 (microcosm#1095, uk-data#563): the two national 15_19 sex bands are split into ages 15, 16-17 and 18-19. uk-data#563 found weights that fit the five-year band while holding too many 16-year-olds and too few 18- and 19-year-olds, and nothing in this contract bound the mix inside the band either. The six rows partition the two bands and read the same ONS mid-year estimate by single year of age, so each sex's three rows sum to the band they replace. The incumbent ons/female_15_19 and ons/male_15_19 rows move from mapped to excluded: no single contract row has their definition.", "ons_single_year_ages_0_2": "microcosm#1278 (the pre-Budget PR's plan, approved by María on 2026-10-20; microcosm#1095): three all-persons rows bind ages 0, 1 and 2, read from the same ONS mid-year estimate by single year of age as the 0_4 sex bands. Unlike the 15_19 split, whose pieces replaced the bands, the 0_4 sex bands keep their incumbent mapping and stay bound: the three rows cover ages 0 to 2 for both sexes together, so neither band is their sum. The three are contract-only declarations; no incumbent row moves.", "ons_single_year_ages_0_6": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095). Eleven all-persons rows extend the single years of age: the UK rows go on from age 2 to age 6, and England binds ages 0 to 6 at E92000001. Every row reads the ONS mid-2025 estimate by single year of age, the series the 0_4 and 5_9 sex bands and the region 0_9 cells sum, so the nested rows are consistent: the UK rows for ages 0 to 4 sum to the two 0_4 sex bands, and England's rows sit inside England's nine region 0_9 cells. Every band stays bound; the eleven are contract-only declarations and no incumbent row moves. Scotland's age 0 is already bound as ons.population.scotland_babies_under_1; Wales and Northern Ireland are left to the UK rows, as each nation's single year rests on too few FRS households.", - "dfe_funded_childcare_single_ages": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. Seven England rows read the January 2025 census (Funded early education and childcare, headline figures): working parent registrations at single ages 1, 2, 3 and 4, universal registrations in nursery at ages 3 and 4, and 4-year-olds in reception. They are seven contract-only declarations; the three earlier DfE rows stay bound. The nested rows are consistent: the working parent 2 to 4 row is the sum of ages 2, 3 and 4 (fact and measure), and universal_only_children is the nursery ages 3 and 4 less the working parent ages 3 and 4 on the facts, and on the measures wherever a working parent child keeps the universal hours (policyengine-uk 2.128.1). Signed out, each for its reason: the working parent 9 to 11 months cell (policyengine-uk gives a child of whole-year age 0 no working parent hours, so no record carries it); reception at age 3 (the FRS codes no 3-year-old in primary education, so no record carries it); the 9 months to 2 years, 3 to 4 years and Total working parent cells, the nursery and reception Totals, the early learning for 2-year-olds Total and the all-entitlements Total (sums or copies of bound cells, or sums that include an uncarried cell); the universal all-provision cells at ages 3, 4 and Total (nursery plus reception, both bound, a few children off their sum in DfE's own table); the estimated eligible children, eligible nursery children and all-children estimates (DfE builds them from population and survey-based inputs, not administrative counts, and the all-children estimates restate the ONS England single years already bound at a different reference date); and the registered percentages (ratios of a bound count to one of those estimates)." + "dfe_funded_childcare_single_ages": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. Four England rows read the January 2025 census (Funded early education and childcare, headline figures): working parent registrations at single ages 1, 2 and 3, and universal registrations in nursery at age 3. They are four contract-only declarations; the three earlier DfE rows stay bound. The working parent 2 to 4 row, the take-up fitter's anchor, and universal_only_children stay bound beside them, unaffected by the age-4 sign-out below: the 2 to 4 row is the bound ages 2 and 3 plus the signed-out age 4 cell (fact and measure), and universal_only_children is the nursery ages 3 and 4 less the working parent ages 3 and 4 on the facts, and on the measures wherever a working parent child keeps the universal hours (policyengine-uk 2.128.1). Signed out, each for its reason: the three age-4 cells, the working parent registrations, the universal registrations in nursery and the 4-year-olds in reception (María's ruling of 2026-10-21: DfE's January census reports ages as at 31 December, when about two-thirds of funded 4-year-olds are already in reception, while the model's whole-year age is the age at interview spread over the survey year, so fewer of its 4-year-olds are in primary education, and binding the single age-4 cells would move weight between 4-year-olds in school and in nursery because of the reference date, not the data); the working parent 9 to 11 months cell (policyengine-uk gives a child of whole-year age 0 no working parent hours, so no record carries it); reception at age 3 (the FRS codes no 3-year-old in primary education, so no record carries it); the 9 months to 2 years, 3 to 4 years and Total working parent cells, the nursery and reception Totals, the early learning for 2-year-olds Total and the all-entitlements Total (sums or copies of bound cells, or sums that include an uncarried or signed-out cell); the universal all-provision cells at ages 3, 4 and Total (nursery plus reception, whose single cells are bound, uncarried or signed out above, a few children off their sum in DfE's own table); the estimated eligible children, eligible nursery children and all-children estimates (DfE builds them from population and survey-based inputs, not administrative counts, and the all-children estimates restate the ONS England single years already bound at a different reference date); and the registered percentages (ratios of a bound count to one of those estimates)." }, "scope_target_ids": [ "obr.income_tax", @@ -1139,10 +1136,7 @@ "dfe.funded_childcare.working_parent_children_age_1", "dfe.funded_childcare.working_parent_children_age_2", "dfe.funded_childcare.working_parent_children_age_3", - "dfe.funded_childcare.working_parent_children_age_4", "dfe.funded_childcare.universal_nursery_children_age_3", - "dfe.funded_childcare.universal_nursery_children_age_4", - "dfe.funded_childcare.universal_reception_children_age_4", "dft.bus_fare_receipts.england", "dft.bus_net_support.england", "dft.bus_fare_receipts.london", @@ -16455,7 +16449,7 @@ "equals": "ENGLAND" } ], - "notes": "Caseload only, by single year of age: working parent registrations at age 2 in the January census. DfE's January registrations leave out children in reception, so a child in primary education (current_education PRIMARY) is not counted. The 2 to 4 row stays bound beside the single years; its measure is the sum of the age 2, 3 and 4 rows, and its fact the sum of their facts." + "notes": "Caseload only, by single year of age: working parent registrations at age 2 in the January census. DfE's January registrations leave out children in reception, so a child in primary education (current_education PRIMARY) is not counted. The 2 to 4 row stays bound beside the single years: its measure and its fact cover ages 2 and 3 and age 4, whose single-age cell is signed out for its 31 December reference date." }, "axiom": { "metric_name": "dfe/funded_childcare/working_parent_children_age_2", @@ -16546,7 +16540,7 @@ "equals": "ENGLAND" } ], - "notes": "Caseload only, by single year of age: working parent registrations at age 3 in the January census. DfE's January registrations leave out children in reception, so a child in primary education (current_education PRIMARY) is not counted. The 2 to 4 row stays bound beside the single years; its measure is the sum of the age 2, 3 and 4 rows, and its fact the sum of their facts." + "notes": "Caseload only, by single year of age: working parent registrations at age 3 in the January census. DfE's January registrations leave out children in reception, so a child in primary education (current_education PRIMARY) is not counted. The 2 to 4 row stays bound beside the single years: its measure and its fact cover ages 2 and 3 and age 4, whose single-age cell is signed out for its 31 December reference date." }, "axiom": { "metric_name": "dfe/funded_childcare/working_parent_children_age_3", @@ -16569,97 +16563,6 @@ "category_id": "dfe.funded_childcare", "label": "Working parent children age 3" }, - { - "target_id": "dfe.funded_childcare.working_parent_children_age_4", - "family": "dfe_funded_childcare", - "geography_levels": [ - "country" - ], - "measurement": { - "entity": "person", - "map_to": "household", - "concept": "uk.person.count", - "observation_basis": "january_stock", - "filters": [ - { - "concept": "uk.childcare.is_child_receiving_extended_childcare", - "equals": true - }, - { - "concept": "uk.demographics.age", - "operator": ">=", - "value": 4 - }, - { - "concept": "uk.demographics.age", - "operator": "<", - "value": 5 - }, - { - "concept": "uk.education.current_education", - "operator": "!=", - "value": "PRIMARY" - }, - { - "concept": "uk.geography.country", - "equals": "ENGLAND" - } - ] - }, - "bindings": { - "policyengine": { - "metric_name": "dfe/funded_childcare/working_parent_children_age_4", - "value_variable": "person_count", - "from_entity": "person", - "map_to": "household", - "filters": [ - { - "variable": "is_child_receiving_extended_childcare", - "equals": true - }, - { - "variable": "age", - "operator": ">=", - "value": 4 - }, - { - "variable": "age", - "operator": "<", - "value": 5 - }, - { - "variable": "current_education", - "operator": "!=", - "value": "PRIMARY" - }, - { - "variable": "country", - "equals": "ENGLAND" - } - ], - "notes": "Caseload only, by single year of age: working parent registrations at age 4 in the January census. DfE's January registrations leave out children in reception, so a child in primary education (current_education PRIMARY) is not counted. The 2 to 4 row stays bound beside the single years; its measure is the sum of the age 2, 3 and 4 rows, and its fact the sum of their facts." - }, - "axiom": { - "metric_name": "dfe/funded_childcare/working_parent_children_age_4", - "status": "pending", - "value_rule": "uk.person.count" - } - }, - "ledger_selector": { - "source_name": "dfe", - "source_concept": "dfe.number_of_registered_children", - "source_measure_id": "registered_children_count", - "entity_name": "person", - "dimension_values": { - "entitlement_type": "Working parents", - "age": "4 years", - "registration_basis": "registered_children", - "provision": "all" - } - }, - "category_id": "dfe.funded_childcare", - "label": "Working parent children age 4" - }, { "target_id": "dfe.funded_childcare.universal_nursery_children_age_3", "family": "dfe_funded_childcare", @@ -16728,7 +16631,7 @@ "equals": "ENGLAND" } ], - "notes": "Universal hours registrations at age 3 outside reception (DfE's nursery provision), counting working parent children too, as DfE's universal counts do. DfE's January registrations leave out children in reception, so a child in primary education (current_education PRIMARY) is not counted. The nursery total is the sum of the age 3 and age 4 rows and is not bound again; universal_only_children is that total less the working parent age 3 and 4 rows." + "notes": "Universal hours registrations at age 3 outside reception (DfE's nursery provision), counting working parent children too, as DfE's universal counts do. DfE's January registrations leave out children in reception, so a child in primary education (current_education PRIMARY) is not counted. The nursery total is the age 3 and age 4 cells and is not bound; the age 4 cell is signed out for its 31 December reference date, and universal_only_children is that total less the working parent ages 3 and 4." }, "axiom": { "metric_name": "dfe/funded_childcare/universal_nursery_children_age_3", @@ -16751,178 +16654,6 @@ "category_id": "dfe.funded_childcare", "label": "Universal nursery children age 3" }, - { - "target_id": "dfe.funded_childcare.universal_nursery_children_age_4", - "family": "dfe_funded_childcare", - "geography_levels": [ - "country" - ], - "measurement": { - "entity": "person", - "map_to": "household", - "concept": "uk.person.count", - "observation_basis": "january_stock", - "filters": [ - { - "concept": "uk.childcare.is_child_receiving_universal_childcare", - "equals": true - }, - { - "concept": "uk.demographics.age", - "operator": ">=", - "value": 4 - }, - { - "concept": "uk.demographics.age", - "operator": "<", - "value": 5 - }, - { - "concept": "uk.education.current_education", - "operator": "!=", - "value": "PRIMARY" - }, - { - "concept": "uk.geography.country", - "equals": "ENGLAND" - } - ] - }, - "bindings": { - "policyengine": { - "metric_name": "dfe/funded_childcare/universal_nursery_children_age_4", - "value_variable": "person_count", - "from_entity": "person", - "map_to": "household", - "filters": [ - { - "variable": "is_child_receiving_universal_childcare", - "equals": true - }, - { - "variable": "age", - "operator": ">=", - "value": 4 - }, - { - "variable": "age", - "operator": "<", - "value": 5 - }, - { - "variable": "current_education", - "operator": "!=", - "value": "PRIMARY" - }, - { - "variable": "country", - "equals": "ENGLAND" - } - ], - "notes": "Universal hours registrations at age 4 outside reception (DfE's nursery provision), counting working parent children too, as DfE's universal counts do. DfE's January registrations leave out children in reception, so a child in primary education (current_education PRIMARY) is not counted. The nursery total is the sum of the age 3 and age 4 rows and is not bound again; universal_only_children is that total less the working parent age 3 and 4 rows." - }, - "axiom": { - "metric_name": "dfe/funded_childcare/universal_nursery_children_age_4", - "status": "pending", - "value_rule": "uk.person.count" - } - }, - "ledger_selector": { - "source_name": "dfe", - "source_concept": "dfe.number_of_registered_children_nursery", - "source_measure_id": "registered_children_nursery_count", - "entity_name": "person", - "dimension_values": { - "entitlement_type": "Universal", - "age": "4 years", - "registration_basis": "registered_children", - "provision": "nursery" - } - }, - "category_id": "dfe.funded_childcare", - "label": "Universal nursery children age 4" - }, - { - "target_id": "dfe.funded_childcare.universal_reception_children_age_4", - "family": "dfe_funded_childcare", - "geography_levels": [ - "country" - ], - "measurement": { - "entity": "person", - "map_to": "household", - "concept": "uk.person.count", - "observation_basis": "january_stock", - "filters": [ - { - "concept": "uk.demographics.age", - "operator": ">=", - "value": 4 - }, - { - "concept": "uk.demographics.age", - "operator": "<", - "value": 5 - }, - { - "concept": "uk.education.current_education", - "equals": "PRIMARY" - }, - { - "concept": "uk.geography.country", - "equals": "ENGLAND" - } - ] - }, - "bindings": { - "policyengine": { - "metric_name": "dfe/funded_childcare/universal_reception_children_age_4", - "value_variable": "person_count", - "from_entity": "person", - "map_to": "household", - "filters": [ - { - "variable": "age", - "operator": ">=", - "value": 4 - }, - { - "variable": "age", - "operator": "<", - "value": 5 - }, - { - "variable": "current_education", - "equals": "PRIMARY" - }, - { - "variable": "country", - "equals": "ENGLAND" - } - ], - "notes": "Four-year-olds in reception classes in the January census. The entitlement is the school place, so the measure counts every 4-year-old in primary education (current_education PRIMARY) in England, with no take-up flag: the row pins the share of 4-year-olds in reception, which decides who can take working parent and universal hours outside school. Reception at age 3 is not bound: the FRS codes no 3-year-old in primary education, so the model has no carrier." - }, - "axiom": { - "metric_name": "dfe/funded_childcare/universal_reception_children_age_4", - "status": "pending", - "value_rule": "uk.person.count" - } - }, - "ledger_selector": { - "source_name": "dfe", - "source_concept": "dfe.number_of_registered_children_reception", - "source_measure_id": "registered_children_reception_count", - "entity_name": "person", - "dimension_values": { - "entitlement_type": "Universal", - "age": "4 years", - "registration_basis": "registered_children", - "provision": "reception" - } - }, - "category_id": "dfe.funded_childcare", - "label": "Universal reception children age 4" - }, { "target_id": "dft.bus_fare_receipts.england", "family": "dft_local_bus", diff --git a/packages/microcosm-build/src/microcosm/build/uk/uprating_holds.json b/packages/microcosm-build/src/microcosm/build/uk/uprating_holds.json index 3c5a10efa..6965eee5d 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/uprating_holds.json +++ b/packages/microcosm-build/src/microcosm/build/uk/uprating_holds.json @@ -22,12 +22,9 @@ "kind": "in_year_snapshot", "target_ids": [ "dfe.funded_childcare.universal_nursery_children_age_3", - "dfe.funded_childcare.universal_nursery_children_age_4", - "dfe.funded_childcare.universal_reception_children_age_4", "dfe.funded_childcare.working_parent_children_age_1", "dfe.funded_childcare.working_parent_children_age_2", - "dfe.funded_childcare.working_parent_children_age_3", - "dfe.funded_childcare.working_parent_children_age_4" + "dfe.funded_childcare.working_parent_children_age_3" ], "reason": "DfE funded early-education registrations by single year of age and provision counted in the January 2025 census: a count at a date inside the calibration year, not a lagged period. Requested by María on 2026-10-21 with the single-age rows.", "tracking": "microcosm#1278", 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 cb0953ba2..b8d272b70 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 @@ -1175,8 +1175,8 @@ def test_uk_target_references_accept_regenerated_contract_fields(self) -> None: references = {reference.name: reference for reference in spec.target_references} assert ( - len(references) == 1340 - ) # childcare costing fixes: + 7, DfE funded childcare by single year of age (working parent 1-4, universal nursery 3-4, reception 4); item 6: + 11, the UK's ONS single years 3 to 6 and England's 0 to 6; microcosm#1278: + 3, the ONS single years 0, 1 and 2 for all persons; microcosm#1095: + 4, the two national 15_19 sex bands split into ages 15, 16-17 and 18-19; microcosm#1106: + 13 SPI property amounts; microcosm#1113: + 1 ONS 07.2.2 household road fuel; PolicyEngine/chronicle#280 lane: 705 + 33 HMRC liabilities rows (Table 2.5, three + len(references) == 1337 + ) # childcare costing fixes: + 4, DfE funded childcare by single year of age (working parent 1-3, universal nursery 3; the age-4 cells are signed out); item 6: + 11, the UK's ONS single years 3 to 6 and England's 0 to 6; microcosm#1278: + 3, the ONS single years 0, 1 and 2 for all persons; microcosm#1095: + 4, the two national 15_19 sex bands split into ages 15, 16-17 and 18-19; microcosm#1106: + 13 SPI property amounts; microcosm#1113: + 1 ONS 07.2.2 household road fuel; 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 # ten regional bands over twelve areas); microcosm#905: 424 - 18 country 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 e75f06122..0a95994c3 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 @@ -58,8 +58,9 @@ # load_uk_national_target_inputs drops after the compile; microcosm#1278 adds # the ONS single years 0, 1 and 2 for all persons, and the childcare costing # fixes (item 6) the UK's single years 3 to 6 and England's 0 to 6, and the -# DfE single-age rows seven funded-childcare counts. -ACTIVE_REFERENCE_COUNT = 1340 +# DfE single-age rows four funded-childcare counts (the age-4 cells are signed +# out). +ACTIVE_REFERENCE_COUNT = 1337 def _uc_reference(**overrides) -> LedgerTargetReference: 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 9f51e4a81..be86fb3a3 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 @@ -241,10 +241,10 @@ def test_uk_population_targets_shape_order_and_registry_accounting() -> None: # microcosm#1262 binds Scotland's PIPR rents at BRMA grain; microcosm#1278 # adds the ONS single years 0, 1 and 2 for all persons inside the 0_4 sex # bands, and the childcare costing fixes (item 6) the UK's single years 3 - # to 6 and England's 0 to 6, and the DfE single-age rows seven more - # funded-childcare counts (working parent ages 1-4, nursery ages 3-4, - # reception age 4). - assert len(resource["targets"]) == 439 + # to 6 and England's 0 to 6, and the DfE single-age rows four more + # funded-childcare counts (working parent ages 1-3, nursery age 3; the + # age-4 cells are signed out for their 31 December reference date). + assert len(resource["targets"]) == 436 providers = resource["hierarchy"]["providers"] categories = resource["hierarchy"]["categories"] @@ -258,10 +258,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) == 380 + assert len(registry_scope) == 377 assert len(profile_scope) == 59 - assert target_ids[:380] == registry_scope - assert target_ids[380:] == profile_scope + assert target_ids[:377] == registry_scope + assert target_ids[377:] == profile_scope parity = resource["registry_parity"] assert parity["pinned_ref"] == "12a1e028afeef08d8b2d74ee03fd9de3a78b2dd3" @@ -281,9 +281,9 @@ def test_uk_population_targets_shape_order_and_registry_accounting() -> None: # microcosm#1301's three high-value homes region rows have no uk-data # metric, nor do microcosm#1278's three single years of age or the eleven # the childcare costing fixes add (UK 3 to 6, England 0 to 6), nor the - # seven DfE funded-childcare single-age rows. + # four DfE funded-childcare single-age rows. assert len(mapped_target_ids) == 186 - assert len(unmapped_declarations) == 194 + assert len(unmapped_declarations) == 191 suppressed_ancestors = parity["suppressed_ancestors"] assert len(suppressed_ancestors) == 5 assert set(suppressed_ancestors).isdisjoint(parity["mapped"]) @@ -558,15 +558,16 @@ def test_uk_population_targets_bind_england_single_years_0_to_6() -> None: DFE_SINGLE_AGE_IDS = ( - *( - f"dfe.funded_childcare.working_parent_children_age_{age}" - for age in (1, 2, 3, 4) - ), + *(f"dfe.funded_childcare.working_parent_children_age_{age}" for age in (1, 2, 3)), "dfe.funded_childcare.universal_nursery_children_age_3", +) +# María's ruling (2026-10-21): the age-4 cells are signed out, not bound. +DFE_SIGNED_OUT_AGE_4_IDS = ( + "dfe.funded_childcare.working_parent_children_age_4", "dfe.funded_childcare.universal_nursery_children_age_4", "dfe.funded_childcare.universal_reception_children_age_4", ) -_DFE_AGE_LABEL = {1: "1 year", 2: "2 years", 3: "3 years", 4: "4 years"} +_DFE_AGE_LABEL = {1: "1 year", 2: "2 years", 3: "3 years"} def _dfe_age_filters(key: str, age: int) -> list[dict]: @@ -601,17 +602,10 @@ def _dfe_expected_filters(target_id: str, key: str) -> list[dict]: *([_dfe_not_primary(key)] if age >= 2 else []), _dfe_country(key), ] - if "nursery" in target_id: - return [ - _dfe_flag(key, "is_child_receiving_universal_childcare"), - *_dfe_age_filters(key, age), - _dfe_not_primary(key), - _dfe_country(key), - ] - name = "uk.education.current_education" if key == "concept" else "current_education" return [ + _dfe_flag(key, "is_child_receiving_universal_childcare"), *_dfe_age_filters(key, age), - {key: name, "equals": "PRIMARY"}, + _dfe_not_primary(key), _dfe_country(key), ] @@ -620,13 +614,16 @@ def test_uk_population_targets_bind_dfe_funded_childcare_by_single_age() -> None """DfE's January census binds by single year of age beside the 2 to 4 row. María's ruling (2026-10-21) binds every DfE funded-childcare count the - model can carry, even on few records: working parent registrations at - ages 1 to 4, universal nursery registrations at ages 3 and 4, and - 4-year-olds in reception. The working parent 2 to 4 row, the take-up - fitter's anchor, stays bound: it is the sum of ages 2 to 4. Each row - counts persons in English households with whole-year age ``k``; outside - reception (``current_education != PRIMARY``) from age 2, as DfE's - registrations leave reception out, and in reception for the reception row. + model can carry, even on few records, and signs out only those with a real + reason: working parent registrations at ages 1, 2 and 3, and universal + nursery registrations at age 3, are bound. The working parent 2 to 4 row, + the take-up fitter's anchor, and the universal-only row stay bound. Each + row counts persons in English households with whole-year age ``k``, + outside reception (``current_education != PRIMARY``) from age 2, as DfE's + registrations leave reception out. The three age-4 cells are signed out: + DfE's ages are as at 31 December, the model's are interview ages, so + binding them would move weight between 4-year-olds in school and in + nursery because of the reference date, not the data. """ resource = _load() @@ -671,14 +668,10 @@ def test_uk_population_targets_bind_dfe_funded_childcare_by_single_age() -> None "registered_children_count", ) entitlement, provision = "Working parents", "all" - elif "nursery" in target_id: + else: concept = "dfe.number_of_registered_children_nursery" measure = "registered_children_nursery_count" entitlement, provision = "Universal", "nursery" - else: - concept = "dfe.number_of_registered_children_reception" - measure = "registered_children_reception_count" - entitlement, provision = "Universal", "reception" assert selector == { "source_name": "dfe", "source_concept": concept, @@ -692,6 +685,12 @@ def test_uk_population_targets_bind_dfe_funded_childcare_by_single_age() -> None }, } + # The age-4 cells are signed out: no target, scope entry or declaration. + for target_id in DFE_SIGNED_OUT_AGE_4_IDS: + assert target_id not in target_ids + assert target_id not in parity["scope_target_ids"] + assert target_id not in parity["unmapped_declarations"] + # The combined row and the universal-only difference stay as they were. combined = _target_by_id( resource, "dfe.funded_childcare.working_parent_children_2_to_4" @@ -703,6 +702,9 @@ def test_uk_population_targets_bind_dfe_funded_childcare_by_single_age() -> None note = parity["accounting_notes"]["dfe_funded_childcare_single_ages"] assert note.startswith("Requested by María on 2026-10-21") for reason in ( + "the three age-4 cells", + "as at 31 December", + "because of the reference date, not the data", "9 to 11 months", "reception at age 3", "survey-based inputs", @@ -712,14 +714,16 @@ def test_uk_population_targets_bind_dfe_funded_childcare_by_single_age() -> None def test_dfe_single_age_rows_hold_the_january_2025_census() -> None: - """The seven rows read the January 2025 census, a signed in-year snapshot.""" + """The four rows read the January 2025 census, a signed in-year snapshot.""" + holds = load_uk_uprating_holds()["holds"] (entry,) = [ - entry - for entry in load_uk_uprating_holds()["holds"] - if set(DFE_SINGLE_AGE_IDS) & set(entry["target_ids"]) + entry for entry in holds if set(DFE_SINGLE_AGE_IDS) & set(entry["target_ids"]) ] assert sorted(entry["target_ids"]) == sorted(DFE_SINGLE_AGE_IDS) + assert not any( + set(DFE_SIGNED_OUT_AGE_4_IDS) & set(hold["target_ids"]) for hold in holds + ) assert entry["scope"] == "national" assert entry["kind"] == "in_year_snapshot" assert uk_hold_is_signed(entry) @@ -730,7 +734,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) == 439 + assert len(target_ids) == 436 assert len(target_ids) == len(set(target_ids)) @@ -843,8 +847,8 @@ def test_childcare_bus_observation_basis_and_entity_pins_are_closed_world() -> N if target["family"] == "dfe_funded_childcare" ] # The working parent 2 to 4, early learning 2-year-olds and universal-only - # rows, and the seven single-age rows of the DfE single-age binding. - assert len(childcare) == 10 + # rows, and the four single-age rows of the DfE single-age binding. + assert len(childcare) == 7 assert all( not target["measurement"]["concept"].endswith(".amount") for target in childcare ) @@ -1233,7 +1237,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) == 439 + assert len(targets) == 436 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_target_references.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_target_references.py index d5284bd1f..b9273117e 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 @@ -72,7 +72,7 @@ _TEST_PATHS = paths_for("microcosm-build") -ACTIVE_REFERENCE_COUNT = 1340 +ACTIVE_REFERENCE_COUNT = 1337 REGION_TIER_LEVEL = {code: level for level, code in UK_REGION_TIER} @@ -540,10 +540,7 @@ def test_childcare_and_bus_references_compile_with_declared_provenance() -> None "dfe.funded_childcare.working_parent_children_age_1": 195_104.0, "dfe.funded_childcare.working_parent_children_age_2": 242_453.0, "dfe.funded_childcare.working_parent_children_age_3": 278_640.0, - "dfe.funded_childcare.working_parent_children_age_4": 100_389.0, "dfe.funded_childcare.universal_nursery_children_age_3": 565_954.0, - "dfe.funded_childcare.universal_nursery_children_age_4": 210_040.0, - "dfe.funded_childcare.universal_reception_children_age_4": 379_308.0, "dft.bus_fare_receipts.england": pytest.approx( 3_417_388_656.43538 * 204.125 / 193.125 ), @@ -608,19 +605,25 @@ def test_childcare_and_bus_references_compile_with_declared_provenance() -> None ] == "minuend - subtrahend" ) - # The nested rows reconcile on the facts: the 2 to 4 row is the sum of the - # working parent ages 2 to 4, and universal-only is the nursery ages 3 and - # 4 less the working parent ages 3 and 4. + # The combined rows stay bound beside the singles, unaffected by the age-4 + # sign-out (María's ruling, 2026-10-21). On the facts the 2 to 4 row is the + # bound working parent ages 2 and 3 plus DfE's signed-out age-4 cell, and + # universal-only is the bound nursery age 3 plus the signed-out nursery + # age-4 cell less the working parent ages 3 and 4 (DfE's published January + # 2025 headline figures). + working_parent_age_4, nursery_age_4 = 100_389.0, 210_040.0 value = {name: spec.value for name, spec in specs.items()} prefix = "dfe.funded_childcare." - assert value[prefix + "working_parent_children_2_to_4"] == sum( - value[prefix + f"working_parent_children_age_{age}"] for age in (2, 3, 4) + assert value[prefix + "working_parent_children_2_to_4"] == ( + value[prefix + "working_parent_children_age_2"] + + value[prefix + "working_parent_children_age_3"] + + working_parent_age_4 ) assert value[prefix + "universal_only_children"] == ( value[prefix + "universal_nursery_children_age_3"] - + value[prefix + "universal_nursery_children_age_4"] + + nursery_age_4 - value[prefix + "working_parent_children_age_3"] - - value[prefix + "working_parent_children_age_4"] + - working_parent_age_4 ) @@ -757,22 +760,24 @@ def test_ons_single_year_age_references_pin_the_uk_and_england() -> None: DFE_SINGLE_AGE_IDS = ( - *( - f"dfe.funded_childcare.working_parent_children_age_{age}" - for age in (1, 2, 3, 4) - ), + *(f"dfe.funded_childcare.working_parent_children_age_{age}" for age in (1, 2, 3)), "dfe.funded_childcare.universal_nursery_children_age_3", +) +DFE_SIGNED_OUT_AGE_4_IDS = ( + "dfe.funded_childcare.working_parent_children_age_4", "dfe.funded_childcare.universal_nursery_children_age_4", "dfe.funded_childcare.universal_reception_children_age_4", ) def test_dfe_single_age_references_pin_england_at_the_january_2025_census() -> None: - """The seven DfE single-age rows resolve one England fact each. + """The four DfE single-age rows resolve one England fact each. The ``dfe.`` prefix pins every DfE row to England (E92000001); each new row selects one age cell of its census table, January 2025, held to the - 2025 calibration year (María's ruling, 2026-10-21). + 2025 calibration year (María's ruling, 2026-10-21). The age-4 cells are + signed out for their 31 December reference date, so they have no + reference and no membership entry. """ references = { @@ -796,6 +801,9 @@ def test_dfe_single_age_references_pin_england_at_the_january_2025_census() -> N assert membership["targets"][target_id]["status"] == "active" (candidate,) = membership["targets"][target_id]["candidates"] assert candidate["resolved_fact_period"] == "2025-01" + for target_id in DFE_SIGNED_OUT_AGE_4_IDS: + assert target_id not in references + assert target_id not in membership["targets"] UC_ELEMENT_TARGET_IDS = frozenset( @@ -996,7 +1004,7 @@ 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": 1340, + "active": 1337, "no_fact_at_or_before_period": 5, "signed_excluded": 17, } diff --git a/tools/build_uk_ledger_compile_parity_signed_differences.py b/tools/build_uk_ledger_compile_parity_signed_differences.py index ac59ec1be..b4941d4e8 100644 --- a/tools/build_uk_ledger_compile_parity_signed_differences.py +++ b/tools/build_uk_ledger_compile_parity_signed_differences.py @@ -356,22 +356,20 @@ class ParityReceiptSpec: _DFE_SINGLE_AGE_LEDGER_ONLY_RATIONALE = ( "Requested by María on 2026-10-21 for the £100k childcare costing fixes " - "(microcosm#1278, #1095): one of the seven DfE funded-childcare counts by " + "(microcosm#1278, #1095): one of the four DfE funded-childcare counts by " "single year of age from the January 2025 census, England (working parent " - "registrations at ages 1 to 4, universal nursery registrations at ages 3 and " - "4, and 4-year-olds in reception), bound beside the working parent 2 to 4 and " - "universal-only rows they nest in. The incumbent binds no DfE row, so this row " - "has no fixture counterpart." + "registrations at ages 1, 2 and 3, and universal nursery registrations at " + "age 3), bound beside the working parent 2 to 4 and universal-only rows, which " + "stay bound. The age-4 cells are signed out for their 31 December reference " + "date. The incumbent binds no DfE row, so this row has no fixture counterpart." ) _DFE_SINGLE_AGE_ROWS = frozenset( ( *( f"dfe.funded_childcare.working_parent_children_age_{age}" - for age in (1, 2, 3, 4) + for age in (1, 2, 3) ), "dfe.funded_childcare.universal_nursery_children_age_3", - "dfe.funded_childcare.universal_nursery_children_age_4", - "dfe.funded_childcare.universal_reception_children_age_4", ) ) From 872ab8d8cdaca8a50a9cc1a4709ba9625cea7875 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 22 Oct 2026 17:27:19 +0100 Subject: [PATCH 08/25] Count the childcare copy stage in the UK spine fixture tool The fixture tool pinned 46 stages; childcare_copy_take_up makes 47. Co-Authored-By: Claude Opus 5.5 --- tools/graph_uk_spine_fixture.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/graph_uk_spine_fixture.py b/tools/graph_uk_spine_fixture.py index 39dfe39cf..d22519bae 100644 --- a/tools/graph_uk_spine_fixture.py +++ b/tools/graph_uk_spine_fixture.py @@ -201,7 +201,7 @@ _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 = 46 +UK_FIXTURE_STAGE_COUNT = 47 _QRF_ESTIMATORS = 4 # These are the complete object-string surface observed in the unchanged From b5f981843c3a5959b4b3ee73507a0dd399d1675b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 22 Oct 2026 17:30:15 +0100 Subject: [PATCH 09/25] Refuse a nested take-up rate fitted before the conditional basis A nested entry's rate is conditional on not holding the flag it is nested under. The childcare fitter fits that rate from tool version 5; an earlier receipt fitted the marginal rate. The loader now refuses a nested entry whose receipt is older (Vahid's round-2 item 1 on #1338). Co-Authored-By: Claude Opus 5.5 --- .../uk-childcare-nested-rate-guard.changed.md | 1 + .../build/uk_runtime/take_up_contract.py | 28 ++++++++++++ .../uk/test_uk_take_up_contract.py | 43 +++++++++++++++++++ 3 files changed, 72 insertions(+) create mode 100644 changelog.d/uk-childcare-nested-rate-guard.changed.md diff --git a/changelog.d/uk-childcare-nested-rate-guard.changed.md b/changelog.d/uk-childcare-nested-rate-guard.changed.md new file mode 100644 index 000000000..e4f03e82b --- /dev/null +++ b/changelog.d/uk-childcare-nested-rate-guard.changed.md @@ -0,0 +1 @@ +The UK take-up contract refuses a nested rate (`nested_under`) unless its fitting receipt is from childcare fitter tool version 5 or later, the first to fit the conditional rate; an earlier receipt fitted the marginal rate. diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/take_up_contract.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/take_up_contract.py index 8840e6f25..da572780f 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/take_up_contract.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/take_up_contract.py @@ -30,6 +30,8 @@ } ) UK_ALLOWED_RATE_ENTITIES = frozenset({"person", "benunit", "household"}) +# The childcare fitter's first version to fit a nested entry's conditional rate. +NESTED_RATE_MIN_TOOL_VERSION = 5 @dataclass(frozen=True) @@ -193,6 +195,8 @@ def _entries(values: object, *, section: str) -> tuple[UKRateEntry, ...]: f"UK take-up contract {key!r} nested_under must name another " "output: the flag this conditional rate is nested under." ) + if nested_under is not None: + _validate_nested_rate_receipt(key, item.get("fitting_receipt")) entries.append( UKRateEntry( key=key, @@ -230,6 +234,30 @@ def _validate_fitting_receipt(key: str, receipt: object) -> None: ) +def _validate_nested_rate_receipt(key: str, receipt: object) -> None: + """Refuse a nested rate fitted on the marginal basis. + + A nested entry's rate is conditional on not holding the flag it is + nested under. The childcare fitter has fitted that conditional rate + since tool version 5; an earlier receipt fitted the marginal rate, which + read as a conditional one overstates take-up. So a nested entry needs a + receipt from tool version 5 or later. + """ + + version = receipt.get("tool_version") if isinstance(receipt, Mapping) else None + if ( + isinstance(version, bool) + or not isinstance(version, int) + or version < NESTED_RATE_MIN_TOOL_VERSION + ): + raise ValueError( + f"UK take-up contract {key!r} is nested_under another flag, so its " + "rate must come from a fitting receipt of tool version " + f"{NESTED_RATE_MIN_TOOL_VERSION} or later (the conditional basis); " + f"got {version!r}." + ) + + def _continuous_entries(values: object) -> tuple[Mapping[str, Any], ...]: if not isinstance(values, Sequence) or isinstance(values, (str, bytes)): raise ValueError("UK take-up contract continuous must be a list.") 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 80053beca..d22849a3d 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 @@ -85,6 +85,49 @@ def test_landed_fitting_receipt_must_name_the_engine() -> None: assert _entries([entry], section="programs") +def test_nested_rate_needs_a_conditional_basis_receipt() -> None: + from microcosm.build.uk_runtime.take_up_contract import ( + NESTED_RATE_MIN_TOOL_VERSION, + _entries, + ) + + entry = { + "key": "universal_childcare", + "output": "would_claim_universal_childcare", + "nested_under": "would_claim_extended_childcare", + "entity": "benunit", + "values": {"2024-04-06": 0.05}, + "source": {"source": "fit", "status": "fitted_offline"}, + "fitting_receipt": { + "engine_version": "2.134.4", + "tool_version": NESTED_RATE_MIN_TOOL_VERSION - 1, + }, + } + with pytest.raises(ValueError, match="conditional basis"): + _entries([entry], section="programs") + for receipt in (None, {"engine_version": "2.134.4"}, {"tool_version": True}): + entry["fitting_receipt"] = receipt + with pytest.raises(ValueError, match="conditional basis"): + _entries([entry], section="programs") + + entry["fitting_receipt"] = { + "engine_version": "2.134.4", + "tool_version": NESTED_RATE_MIN_TOOL_VERSION, + } + assert _entries([entry], section="programs")[0].key == "universal_childcare" + + # An entry that is not nested keeps any receipt, as before. + del entry["nested_under"] + entry["fitting_receipt"] = {"engine_version": "2.134.4", "tool_version": 1} + assert _entries([entry], section="programs") + + # The landed nested entry carries a conditional-basis receipt. + contract = load_uk_take_up_contract() + universal = contract.entry("universal_childcare").raw + assert universal["nested_under"] == "would_claim_extended_childcare" + assert universal["fitting_receipt"]["tool_version"] >= NESTED_RATE_MIN_TOOL_VERSION + + def test_year_selection_uses_latest_value_at_or_before_build_year() -> None: contract = load_uk_take_up_contract() From 2fdeb897a9cd057aa39ce4c4328445cb6c0b553d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 22 Oct 2026 21:27:48 +0100 Subject: [PATCH 10/25] Re-lock policyengine-uk 2.147.2, the release with #2570 The UK lock moves from 2.145.0 to 2.147.2 (policyengine-core stays at 3.33.3). 2.147.2 stops the early years hours at school start by date of birth and starts working-parent hours the term after the minimum age (PolicyEngine/policyengine-uk#2570). The uprating pins' stamp, the concept coverage (311 to 314 inputs), the coverage manifest, the cited versions and APPROVED_UV_LOCK_SHA256 re-derive. The liquid-asset reason follows 2.147.0's share_like_capital; the three new inputs stay at their defaults. Co-Authored-By: Claude Opus 5.5 --- .../uk-policyengine-uk-2-147.changed.md | 1 + docs/concept-coverage/policyengine-uk.md | 16 +++---- packages/microcosm-build/pyproject.toml | 2 +- .../build/uk/hmrc_uprating_engine_pins.json | 2 +- .../uk/release_input_coverage_manifest.json | 44 +++++++++---------- .../src/microcosm/build/uk/source_stages.json | 8 ++-- .../src/microcosm/build/uk/spec/sources.yaml | 8 ++-- .../microcosm/build/uk_runtime/frs_take_up.py | 2 +- .../build/uk_runtime/hmrc_uprating.py | 4 +- .../build/uk_runtime/uc_capital_coherence.py | 5 ++- .../build/us_runtime/worker_identity.py | 2 +- .../shared/test_engine_core_pins.py | 2 +- .../engine_free/uk/test_uk_frs_stochastic.py | 2 +- packages/microcosm-data/pyproject.toml | 2 +- packages/microcosm-frame/pyproject.toml | 2 +- .../adapters/policyengine_uk_concepts.py | 16 ++++--- .../test_concept_mapping_policyengine_uk.py | 18 ++++++-- .../concept-coverage/policyengine-uk.json | 18 ++++++-- uv.lock | 12 ++--- 19 files changed, 98 insertions(+), 68 deletions(-) create mode 100644 changelog.d/uk-policyengine-uk-2-147.changed.md diff --git a/changelog.d/uk-policyengine-uk-2-147.changed.md b/changelog.d/uk-policyengine-uk-2-147.changed.md new file mode 100644 index 000000000..e59be4d62 --- /dev/null +++ b/changelog.d/uk-policyengine-uk-2-147.changed.md @@ -0,0 +1 @@ +The UK lock moves from policyengine-uk 2.145.0 to 2.147.2, the release that carries pe-uk#2570 (early years hours stop at school start; working-parent hours start the term after the minimum age), with policyengine-core still at 3.33.3: the uprating pins' stamp, the concept coverage (311 to 314 inputs), the coverage manifest, the H2 fixture, the cited versions and `APPROVED_UV_LOCK_SHA256` re-derive. The concept mapping's liquid-asset reason follows 2.147.0, where Universal Credit and Pension Credit count `share_like_capital`, which is `corporate_wealth` unless its components add up to more. The build leaves the three new inputs at their defaults: `directly_held_shares` and `unit_and_investment_trusts` (the WAS stage's `corporate_wealth` already holds the shares and funds, so `share_like_capital` equals it) and `early_years_school_start_deferred` (the FRS records no deferred or council-funded independent reception start, so every child starts school on the date its date of birth implies). diff --git a/docs/concept-coverage/policyengine-uk.md b/docs/concept-coverage/policyengine-uk.md index df7bda628..c1a830d2f 100644 --- a/docs/concept-coverage/policyengine-uk.md +++ b/docs/concept-coverage/policyengine-uk.md @@ -1,11 +1,11 @@ # Concept coverage: policyengine-uk -Engine version `2.145.0`; concept schema `5a55669d0447`. Generated by `tools/refresh_concept_coverage.py`; do not edit by hand. +Engine version `2.147.2`; concept schema `5a55669d0447`. Generated by `tools/refresh_concept_coverage.py`; do not edit by hand. -- Engine inputs: 311 +- Engine inputs: 314 - Fed by a concept: 42 - Structural: 11 -- Uncovered: 258 +- Uncovered: 261 - Mapped but missing from the engine: 0 ## Inputs each concept feeds @@ -44,7 +44,7 @@ Engine version `2.145.0`; concept schema `5a55669d0447`. Generated by `tools/ref | `fact:person.legal_marital_status` | policyengine-uk derives marital status from benefit-unit composition; marital_status and is_married are formula-owned. | | `fact:person.partner_person_id` | Partnerships reach policyengine-uk only through benefit-unit membership, a structure the bundle must already carry (the adapter builds no units); is_benunit_head and is_married are formula-owned. | | `fact:household.reference_person_id` | is_household_head is formula-owned (the oldest member). The UK build overrides it with the FRS household reference person (frs_spine.py), an override the loader accepts, but it is not an input, so the mapping does not target it. Every housing input is household-level, so nothing is allocated to the reference person. | -| `fact:person.liquid_financial_assets` | policyengine-uk holds financial wealth on the household: savings ('Household liquid savings'), corporate_wealth ('Wealth held in corporations directly or through investment funds'), gross_financial_wealth and net_financial_wealth are household inputs, and no transform puts a person amount on a household input. Its person-level GBP stock inputs are student_loan_balance, a debt; car_list_price, the price vehicle excise duty's expensive-car supplement tests; and lifetime_isa_balance ('Current value of the person's Lifetime ISAs, cash and stocks and shares together'), one savings wrapper, which the engine documents as already inside gross_financial_wealth and net_financial_wealth. Since policyengine-uk 2.130.0 three more describe a company the person owns, for Universal Credit's regulation 77 (owned_company_capital, owned_company_holding_value and owned_company_trade_assets); every one defaults to no such company, and the build sets none. savings and corporate_wealth are two of Universal Credit's capital sources (gov.dwp.universal_credit.means_test.capital.sources), and lifetime_isa_countable_capital, the Lifetime ISA at its surrender value, is its one person-level source (capital.person_sources). uc_reported_capital (benefit unit, default -1) is Universal Credit capital; since policyengine-uk 2.136.1 a value of zero or more set directly is the unit's complete countable capital, in place of every source, property included. benunit_reported_capital, a benefit-unit input ('Savings and investments of the benefit unit's adults (the claimant and any partner) as recorded'), replaces the financial sources only: the household pool it otherwise sums from the household sources, net of what other benefit units report or override, and apportions by claimant and partner count, and the person-level sources of the unit's claimant and partner. Property is valued separately (uc_property_capital) and shared across every claimant and partner in the household. Feeding either would be a modelling choice for a UK build, not a mapping of this concept. | +| `fact:person.liquid_financial_assets` | policyengine-uk holds financial wealth on the household: savings ('Household liquid savings'), corporate_wealth ('Wealth held in corporations directly or through investment funds'), gross_financial_wealth and net_financial_wealth are household inputs, and no transform puts a person amount on a household input. Its person-level GBP stock inputs are student_loan_balance, a debt; car_list_price, the price vehicle excise duty's expensive-car supplement tests; and lifetime_isa_balance ('Current value of the person's Lifetime ISAs, cash and stocks and shares together'), one savings wrapper, which the engine documents as already inside gross_financial_wealth and net_financial_wealth. Since policyengine-uk 2.130.0 three more describe a company the person owns, for Universal Credit's regulation 77 (owned_company_capital, owned_company_holding_value and owned_company_trade_assets); every one defaults to no such company, and the build sets none. savings and share_like_capital are two of Universal Credit's capital sources (gov.dwp.universal_credit.means_test.capital.sources); since policyengine-uk 2.147.0 share_like_capital is corporate_wealth unless its components, the household inputs directly_held_shares and unit_and_investment_trusts, add up to more, and the build sets neither. Universal Credit's one person-level source is lifetime_isa_countable_capital, the Lifetime ISA at its surrender value (capital.person_sources). uc_reported_capital (benefit unit, default -1) is Universal Credit capital; since policyengine-uk 2.136.1 a value of zero or more set directly is the unit's complete countable capital, in place of every source, property included. benunit_reported_capital, a benefit-unit input ('Savings and investments of the benefit unit's adults (the claimant and any partner) as recorded'), replaces the financial sources only: the household pool it otherwise sums from the household sources, net of what other benefit units report or override, and apportions by claimant and partner count, and the person-level sources of the unit's claimant and partner. Property is valued separately (uc_property_capital) and shared across every claimant and partner in the household. Feeding either would be a modelling choice for a UK build, not a mapping of this concept. | | `fact:person.public_pension_income` | The State Pension is computed from state_pension_reported, which is formula-owned: the loader accepts it as an override, but it is not an input. | | `fact:household.source_household_id` | Original donor household lineage is build provenance and weight diagnostic support, not a policyengine-uk rules input. | @@ -54,10 +54,10 @@ Engine version `2.145.0`; concept schema `5a55669d0447`. Generated by `tools/ref `baseline_child_benefit_entitlement`, `baseline_income_support_entitlement`, `baseline_pension_credit_entitlement`, `benunit_reported_capital`, `housing_benefit_board_and_attendance_determination`, `in_specified_or_temporary_accommodation`, `liable_for_share_of_household_rent`, `maximum_extended_childcare_hours_usage`, `meals_included_in_rent`, `tax_free_childcare_meets_uk_connection`, `uc_receives_new_claimant_health_element`, `working_tax_credit_run_on` -### household (83) +### household (85) -`accommodation_type`, `additional_residential_property_purchased`, `alcohol_and_tobacco_consumption`, `beer_draught_share`, `beer_litres`, `bus_fare_spending_reported`, `bus_subsidy_spending`, `cash_isa`, `cider_draught_share`, `cider_litres`, `cigarettes_per_week`, `cigars_grams_per_week`, `clothing_and_footwear_consumption`, `communication_consumption`, `consumer_debt`, `corporate_wealth`, `council_tax_band`, `cumulative_non_residential_rent`, `cumulative_residential_rent`, `dfe_education_spending`, `diesel_spending`, `domestic_energy_consumption`, `domestic_rates`, `ebr_energy_bills_credit_eligible`, `education_consumption`, `electricity_consumption`, `external_child_payments`, `food_and_non_alcoholic_beverages_consumption`, `full_rate_vat_expenditure_rate`, `gas_consumption`, `gross_financial_wealth`, `hand_rolling_tobacco_grams_per_week`, `health_consumption`, `heated_tobacco_grams_per_week`, `household_furnishings_consumption`, `household_owns_tv`, `housing_service_charges`, `housing_water_and_electricity_consumption`, `in_original_frs`, `in_rural_fuel_duty_relief_area`, `is_shared_accommodation`, `local_authority`, `lpg_kg`, `main_residence_value`, `main_residential_property_purchased_is_first_home`, `miscellaneous_consumption`, `mortgage_debt`, `natural_gas_kg`, `net_financial_wealth`, `non_residential_property_purchased`, `non_residential_property_secured_debt`, `non_residential_property_value`, `non_residential_rent`, `num_bedrooms`, `num_vehicles`, `other_fermented_draught_share`, `other_fermented_litres`, `other_residential_property_secured_debt`, `other_residential_property_value`, `other_tobacco_grams_per_week`, `owned_land`, `petrol_spending`, `private_pension_wealth`, `property_purchased`, `rail_usage`, `recreation_consumption`, `region`, `restaurants_and_hotels_consumption`, `savings`, `sparkling_cider_draught_share`, `sparkling_cider_litres`, `spi_imputed`, `spirits_draught_share`, `spirits_litres`, `stocks_and_shares_isa`, `structural_insurance_payments`, `transport_consumption`, `uc_migrated`, `uses_energy_prepayment_meter`, `water_and_sewerage_charges`, `wine_draught_share`, `wine_litres`, `would_evade_tv_licence_fee` +`accommodation_type`, `additional_residential_property_purchased`, `alcohol_and_tobacco_consumption`, `beer_draught_share`, `beer_litres`, `bus_fare_spending_reported`, `bus_subsidy_spending`, `cash_isa`, `cider_draught_share`, `cider_litres`, `cigarettes_per_week`, `cigars_grams_per_week`, `clothing_and_footwear_consumption`, `communication_consumption`, `consumer_debt`, `corporate_wealth`, `council_tax_band`, `cumulative_non_residential_rent`, `cumulative_residential_rent`, `dfe_education_spending`, `diesel_spending`, `directly_held_shares`, `domestic_energy_consumption`, `domestic_rates`, `ebr_energy_bills_credit_eligible`, `education_consumption`, `electricity_consumption`, `external_child_payments`, `food_and_non_alcoholic_beverages_consumption`, `full_rate_vat_expenditure_rate`, `gas_consumption`, `gross_financial_wealth`, `hand_rolling_tobacco_grams_per_week`, `health_consumption`, `heated_tobacco_grams_per_week`, `household_furnishings_consumption`, `household_owns_tv`, `housing_service_charges`, `housing_water_and_electricity_consumption`, `in_original_frs`, `in_rural_fuel_duty_relief_area`, `is_shared_accommodation`, `local_authority`, `lpg_kg`, `main_residence_value`, `main_residential_property_purchased_is_first_home`, `miscellaneous_consumption`, `mortgage_debt`, `natural_gas_kg`, `net_financial_wealth`, `non_residential_property_purchased`, `non_residential_property_secured_debt`, `non_residential_property_value`, `non_residential_rent`, `num_bedrooms`, `num_vehicles`, `other_fermented_draught_share`, `other_fermented_litres`, `other_residential_property_secured_debt`, `other_residential_property_value`, `other_tobacco_grams_per_week`, `owned_land`, `petrol_spending`, `private_pension_wealth`, `property_purchased`, `rail_usage`, `recreation_consumption`, `region`, `restaurants_and_hotels_consumption`, `savings`, `sparkling_cider_draught_share`, `sparkling_cider_litres`, `spi_imputed`, `spirits_draught_share`, `spirits_litres`, `stocks_and_shares_isa`, `structural_insurance_payments`, `transport_consumption`, `uc_migrated`, `unit_and_investment_trusts`, `uses_energy_prepayment_meter`, `water_and_sewerage_charges`, `wine_draught_share`, `wine_litres`, `would_evade_tv_licence_fee` -### person (163) +### person (164) -`a_and_e_visits`, `aa_category`, `access_fund`, `admitted_patient_visits`, `adult_dependants_grant_has_other_adult_dependant`, `adult_dependants_grant_other_adult_income`, `adult_dependants_grant_receives_postgraduate_loan`, `adult_ema`, `afcs_reported`, `age_started_or_accepted_current_education_or_training`, `armed_forces_independence_payment`, `attends_private_school_random_draw`, `base_net_income`, `blind_persons_allowance`, `bsp_reported`, `bursary_fund_16_to_19_in_care_or_care_leaver`, `bursary_fund_16_to_19_participation_costs`, `bursary_fund_16_to_19_self_supporting`, `bus_in_london_trips`, `bus_pass_eligible`, `capital_allowances`, `capital_gains_badr`, `capital_gains_carried_interest`, `capital_gains_residential_property`, `car_co2_emissions`, `car_engine_size`, `car_first_registration_date`, `car_fuel_type`, `car_is_ved_exempt`, `car_list_price`, `care_hours`, `carers_allowance_reported`, `charitable_investment_gifts`, `child_benefit_reported`, `child_ema`, `child_tax_credit_reported`, `childcare_expenses`, `childcare_grant_child_has_special_educational_needs`, `childcare_grant_provider_is_nanny`, `childcare_grant_receives_nhs_childcare_support`, `childcare_grant_receives_postgraduate_loan`, `council_tax_benefit_reported`, `covenanted_payments`, `deficiency_relief`, `defined_benefit_pension_share`, `disabled_students_allowance_eligible_expenses`, `disabled_students_allowance_receives_equivalent_support`, `dla_m_category`, `dla_sc_category`, `education_grants`, `employee_pension_contributions_reported`, `employer_pension_contributions`, `employment_expenses`, `employment_sector`, `employment_status`, `esa_contrib_reported`, `esa_income_reported`, `free_school_fruit_veg`, `free_school_meals`, `free_school_milk`, `gift_aid`, `healthy_start_vouchers`, `housing_benefit_reported`, `iidb_reported`, `in_FE`, `incapacity_benefit_reported`, `income_support_reported`, `is_about_to_start_paid_work`, `is_apprentice`, `is_before_universal_credit_qualifying_young_person_terminal_date`, `is_blind`, `is_engaged_in_owned_company_trade`, `is_full_year_category_a_director`, `is_in_approved_training`, `is_looked_after_by_local_authority`, `is_newly_self_employed`, `jsa_contrib_reported`, `jsa_income_reported`, `lifetime_isa_balance`, `local_bus_uncapped_single_fare`, `loss_relief`, `lump_sum_income`, `maintenance_expenses`, `maintenance_income`, `married_couples_allowance`, `maternity_allowance_reported`, `max_free_entitlement_hours_used`, `miscellaneous_income`, `nhs_a_and_e_spending`, `nhs_admitted_patient_spending`, `nhs_outpatient_spending`, `ni_class_3`, `other_deductions`, `other_investment_income`, `other_local_bus_trips`, `other_tax_credits`, `outpatient_visits`, `owned_company_capital`, `owned_company_carries_on_property_business`, `owned_company_carries_on_trade`, `owned_company_holding_value`, `owned_company_income_share`, `owned_company_intermediary_earnings_chapter`, `owned_company_intermediary_earnings_from_main_employment`, `owned_company_is_main_employment`, `owned_company_trade_assets`, `pension_annual_allowance_taxable_lump_sum_death_benefits`, `pension_contributions_via_salary_sacrifice`, `pension_contributions_via_salary_sacrifice_pre_2015`, `pension_credit_reported`, `pension_income`, `person_benunit_role`, `person_household_role`, `personal_pension_contributions`, `pip_dl_points`, `pip_m_points`, `private_transfer_income`, `property_finance_costs`, `property_finance_costs_brought_forward`, `property_rental_income`, `receives_benefits_in_own_right`, `receives_limited_capability_for_work_credits`, `rent_paid_as_boarder`, `rent_paid_as_lodger`, `role`, `salary_sacrifice_returned_to_income`, `scottish_funded_early_learning_childcare_start_date_reached`, `sda_reported`, `self_employment_gross_receipts`, `sic_industry_division`, `ssmg_reported`, `stands_as_sole_owner_or_partner_of_company`, `statutory_maternity_pay`, `statutory_paternity_pay`, `statutory_sick_pay`, `student_loan_balance`, `student_loan_plan`, `student_loans`, `sublet_income`, `tax_free_childcare_on_adoption_leave`, `tax_free_childcare_on_carers_leave`, `tax_free_childcare_on_qualifying_leave`, `tax_free_childcare_on_shared_parental_leave`, `tax_free_childcare_self_employment_start_up_period`, `tax_free_childcare_spend_routed_share`, `tax_free_childcare_uses_qualifying_provider`, `tax_reported`, `travel_grant_abroad_placement`, `travel_grant_clinical_placement`, `travel_grant_eligible_expenses`, `travel_grant_receives_means_tested_nhs_bursary`, `uc_has_offer_of_paid_work_starting_by_end_of_next_assessment_period`, `uc_is_adopter_in_first_year`, `uc_is_foster_parent_or_new_friend_or_family_carer`, `uc_is_in_pregnancy_or_post_confinement_period`, `uc_is_in_startup_period`, `uc_is_responsible_foster_parent_of_child_under_one`, `uc_is_student_with_no_work_related_requirements`, `uc_is_temporarily_absent_from_claimant_household`, `universal_credit_reported`, `war_widows_pension_reported`, `winter_fuel_allowance_reported`, `working_tax_credit_reported` +`a_and_e_visits`, `aa_category`, `access_fund`, `admitted_patient_visits`, `adult_dependants_grant_has_other_adult_dependant`, `adult_dependants_grant_other_adult_income`, `adult_dependants_grant_receives_postgraduate_loan`, `adult_ema`, `afcs_reported`, `age_started_or_accepted_current_education_or_training`, `armed_forces_independence_payment`, `attends_private_school_random_draw`, `base_net_income`, `blind_persons_allowance`, `bsp_reported`, `bursary_fund_16_to_19_in_care_or_care_leaver`, `bursary_fund_16_to_19_participation_costs`, `bursary_fund_16_to_19_self_supporting`, `bus_in_london_trips`, `bus_pass_eligible`, `capital_allowances`, `capital_gains_badr`, `capital_gains_carried_interest`, `capital_gains_residential_property`, `car_co2_emissions`, `car_engine_size`, `car_first_registration_date`, `car_fuel_type`, `car_is_ved_exempt`, `car_list_price`, `care_hours`, `carers_allowance_reported`, `charitable_investment_gifts`, `child_benefit_reported`, `child_ema`, `child_tax_credit_reported`, `childcare_expenses`, `childcare_grant_child_has_special_educational_needs`, `childcare_grant_provider_is_nanny`, `childcare_grant_receives_nhs_childcare_support`, `childcare_grant_receives_postgraduate_loan`, `council_tax_benefit_reported`, `covenanted_payments`, `deficiency_relief`, `defined_benefit_pension_share`, `disabled_students_allowance_eligible_expenses`, `disabled_students_allowance_receives_equivalent_support`, `dla_m_category`, `dla_sc_category`, `early_years_school_start_deferred`, `education_grants`, `employee_pension_contributions_reported`, `employer_pension_contributions`, `employment_expenses`, `employment_sector`, `employment_status`, `esa_contrib_reported`, `esa_income_reported`, `free_school_fruit_veg`, `free_school_meals`, `free_school_milk`, `gift_aid`, `healthy_start_vouchers`, `housing_benefit_reported`, `iidb_reported`, `in_FE`, `incapacity_benefit_reported`, `income_support_reported`, `is_about_to_start_paid_work`, `is_apprentice`, `is_before_universal_credit_qualifying_young_person_terminal_date`, `is_blind`, `is_engaged_in_owned_company_trade`, `is_full_year_category_a_director`, `is_in_approved_training`, `is_looked_after_by_local_authority`, `is_newly_self_employed`, `jsa_contrib_reported`, `jsa_income_reported`, `lifetime_isa_balance`, `local_bus_uncapped_single_fare`, `loss_relief`, `lump_sum_income`, `maintenance_expenses`, `maintenance_income`, `married_couples_allowance`, `maternity_allowance_reported`, `max_free_entitlement_hours_used`, `miscellaneous_income`, `nhs_a_and_e_spending`, `nhs_admitted_patient_spending`, `nhs_outpatient_spending`, `ni_class_3`, `other_deductions`, `other_investment_income`, `other_local_bus_trips`, `other_tax_credits`, `outpatient_visits`, `owned_company_capital`, `owned_company_carries_on_property_business`, `owned_company_carries_on_trade`, `owned_company_holding_value`, `owned_company_income_share`, `owned_company_intermediary_earnings_chapter`, `owned_company_intermediary_earnings_from_main_employment`, `owned_company_is_main_employment`, `owned_company_trade_assets`, `pension_annual_allowance_taxable_lump_sum_death_benefits`, `pension_contributions_via_salary_sacrifice`, `pension_contributions_via_salary_sacrifice_pre_2015`, `pension_credit_reported`, `pension_income`, `person_benunit_role`, `person_household_role`, `personal_pension_contributions`, `pip_dl_points`, `pip_m_points`, `private_transfer_income`, `property_finance_costs`, `property_finance_costs_brought_forward`, `property_rental_income`, `receives_benefits_in_own_right`, `receives_limited_capability_for_work_credits`, `rent_paid_as_boarder`, `rent_paid_as_lodger`, `role`, `salary_sacrifice_returned_to_income`, `scottish_funded_early_learning_childcare_start_date_reached`, `sda_reported`, `self_employment_gross_receipts`, `sic_industry_division`, `ssmg_reported`, `stands_as_sole_owner_or_partner_of_company`, `statutory_maternity_pay`, `statutory_paternity_pay`, `statutory_sick_pay`, `student_loan_balance`, `student_loan_plan`, `student_loans`, `sublet_income`, `tax_free_childcare_on_adoption_leave`, `tax_free_childcare_on_carers_leave`, `tax_free_childcare_on_qualifying_leave`, `tax_free_childcare_on_shared_parental_leave`, `tax_free_childcare_self_employment_start_up_period`, `tax_free_childcare_spend_routed_share`, `tax_free_childcare_uses_qualifying_provider`, `tax_reported`, `travel_grant_abroad_placement`, `travel_grant_clinical_placement`, `travel_grant_eligible_expenses`, `travel_grant_receives_means_tested_nhs_bursary`, `uc_has_offer_of_paid_work_starting_by_end_of_next_assessment_period`, `uc_is_adopter_in_first_year`, `uc_is_foster_parent_or_new_friend_or_family_carer`, `uc_is_in_pregnancy_or_post_confinement_period`, `uc_is_in_startup_period`, `uc_is_responsible_foster_parent_of_child_under_one`, `uc_is_student_with_no_work_related_requirements`, `uc_is_temporarily_absent_from_claimant_household`, `universal_credit_reported`, `war_widows_pension_reported`, `winter_fuel_allowance_reported`, `working_tax_credit_reported` diff --git a/packages/microcosm-build/pyproject.toml b/packages/microcosm-build/pyproject.toml index 349abaae0..15f8da368 100644 --- a/packages/microcosm-build/pyproject.toml +++ b/packages/microcosm-build/pyproject.toml @@ -46,7 +46,7 @@ us = [ # The UK extra adds the rules engine for local metric generation from a # Microcosm UK H5. Target tables remain explicit inputs, and the base package # still does not import policyengine-uk at import time. -uk = ["policyengine-uk>=2.145.0", "microcosm-data>=0.1,<0.2", "h5py>=3", "tables>=3", "openpyxl>=3.1"] +uk = ["policyengine-uk>=2.147.2", "microcosm-data>=0.1,<0.2", "h5py>=3", "tables>=3", "openpyxl>=3.1"] [project.scripts] microcosm-build-uk = "microcosm.build.uk_runtime.full_build_cli:main" 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 9fdb6aafb..f3aad5d9e 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 @@ -2,7 +2,7 @@ "schema_version": 1, "engine": { "package": "policyengine-uk", - "version": "2.145.0" + "version": "2.147.2" }, "basis": "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)", "written_by": "tools/pin_uk_uprating_engine_values.py", 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 7232877dd..cc8619359 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 @@ -470,7 +470,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": "8ac2ff840181bc1789c88155f3f4ffe64d0f98b393e8d3b1b9326f80def1aa7e", + "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", "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" @@ -493,7 +493,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "8ac2ff840181bc1789c88155f3f4ffe64d0f98b393e8d3b1b9326f80def1aa7e", + "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", "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" @@ -516,7 +516,7 @@ "required_mass_change_reason": "Capital-gains residential split divides every household carrying liable gainers into arms weighted by the solved residential probabilities, one arm per subset of residential gainers; every household's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "8ac2ff840181bc1789c88155f3f4ffe64d0f98b393e8d3b1b9326f80def1aa7e", + "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", "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) on the amounts the Table 3 redraw placed" @@ -538,7 +538,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": "8ac2ff840181bc1789c88155f3f4ffe64d0f98b393e8d3b1b9326f80def1aa7e", + "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", "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)" @@ -567,7 +567,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": "8ac2ff840181bc1789c88155f3f4ffe64d0f98b393e8d3b1b9326f80def1aa7e", + "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", "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" @@ -587,7 +587,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": "8ac2ff840181bc1789c88155f3f4ffe64d0f98b393e8d3b1b9326f80def1aa7e", + "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", "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" @@ -609,7 +609,7 @@ "required_mass_change_reason": "High-value home support divides every owner household in the top value stratum of its region 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": "8ac2ff840181bc1789c88155f3f4ffe64d0f98b393e8d3b1b9326f80def1aa7e", + "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", "source_vintages": { "source": "Microcosm structural operator (microcosm#1240 fix 1); no publisher input", "survey": "Family Resources Survey 2024-25 and SPI synthetic support, after the WAS wealth draw and the regional property uprating" @@ -630,7 +630,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": "8ac2ff840181bc1789c88155f3f4ffe64d0f98b393e8d3b1b9326f80def1aa7e", + "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", "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" @@ -654,7 +654,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "8ac2ff840181bc1789c88155f3f4ffe64d0f98b393e8d3b1b9326f80def1aa7e", + "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", "source_vintages": { "conditioning_resource": "hmrc_cgt_conditioning_facts.json", "conditioning_resource_sha256": "054b1ee1a66cae6ed3793053eb0d3b9eea6b3f8976953479948ae11f7eedcd35", @@ -743,7 +743,7 @@ "full_frs_tei_band_unavailable" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "8ac2ff840181bc1789c88155f3f4ffe64d0f98b393e8d3b1b9326f80def1aa7e", + "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", "source_vintages": { "hmrc_surface": "2023-24", "mapped_build_period": "2024", @@ -785,7 +785,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": "8ac2ff840181bc1789c88155f3f4ffe64d0f98b393e8d3b1b9326f80def1aa7e", + "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", "source_vintages": { "source": "UK Data Service SN 9603 Living Costs and Food Survey 2024-25 (2nd edition) household/person tabs and the vendored Chronicle facts for NEED 2024 mean kWh, DESNZ Energy Trends and QEP average prices paid for calendar 2024, road-fuel outturn (DESNZ, HMRC, ONS Consumer Trends) and road fuel by vehicle type (DESNZ), ONS Consumer Trends household spending by COICOP division, the DfT VEH1103 licensed-car stock, NTS bus use, and the DfT and devolved bus finance tables and fares indices.", "survey": "Living Costs and Food Survey 2024-25" @@ -811,7 +811,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": "8ac2ff840181bc1789c88155f3f4ffe64d0f98b393e8d3b1b9326f80def1aa7e", + "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", "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" @@ -831,7 +831,7 @@ "required_mass_change_reason": "Private-school attendance stored on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "8ac2ff840181bc1789c88155f3f4ffe64d0f98b393e8d3b1b9326f80def1aa7e", + "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", "source_vintages": { "source": "policyengine-uk attends_private_school (the gov.simulation.private_school_vat attendance rates and factor), evaluated by the pinned engine", "survey": "policyengine-uk private-school attendance imputation, stored at the spine's weights" @@ -854,7 +854,7 @@ "property_finance_costs" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "8ac2ff840181bc1789c88155f3f4ffe64d0f98b393e8d3b1b9326f80def1aa7e", + "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", "source_vintages": { "source": "https://www.gov.uk/government/statistics/property-rental-income-statistics", "survey": "Survey of Personal Incomes Public Use Tape 2022-23 and HMRC Property Rental Income Statistics 2026 (tax year 2024-25)" @@ -875,7 +875,7 @@ "required_mass_change_reason": "Annual property purchases imputed on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "8ac2ff840181bc1789c88155f3f4ffe64d0f98b393e8d3b1b9326f80def1aa7e", + "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", "source_vintages": { "source": "https://www.gov.uk/government/statistics/uk-stamp-tax-statistics", "survey": "HMRC Annual Stamp Tax Statistics 2024 to 2025 (corrected 11 March 2026), Tables 6b, 8a and 8b" @@ -898,7 +898,7 @@ "property_wealth" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "8ac2ff840181bc1789c88155f3f4ffe64d0f98b393e8d3b1b9326f80def1aa7e", + "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", "source_vintages": { "source": "uk/high_value_home_value_knots.json, built by tools/build_uk_high_value_home_stock.py from PolicyEngine/chronicle#343's registrations", "survey": "HM Land Registry Price Paid latest sales uprated with the UK House Price Index, owner-weighted by region (the dense value node's knots, region level)" @@ -922,7 +922,7 @@ "non_residential_property_value" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "8ac2ff840181bc1789c88155f3f4ffe64d0f98b393e8d3b1b9326f80def1aa7e", + "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", "source_vintages": { "source": "MHCLG dwellings and the UK House Price Index regional average price averaged over the twelve months of calendar 2024 from the July 2026 full file, the frame's valuation basis, so the engine's annual uprating from 2024 projects the value once (microcosm#1240 fix 5).", "survey": "Public regional property reference" @@ -949,7 +949,7 @@ "employment_income" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "8ac2ff840181bc1789c88155f3f4ffe64d0f98b393e8d3b1b9326f80def1aa7e", + "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", "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" @@ -982,7 +982,7 @@ "household_source_id" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "8ac2ff840181bc1789c88155f3f4ffe64d0f98b393e8d3b1b9326f80def1aa7e", + "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", "source_vintages": { "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).", "survey": "Survey of Personal Incomes Public Use Tape 2022-23 and HMRC Income Tax liabilities statistics July 2026 Table 2.5" @@ -1004,7 +1004,7 @@ "student_loan_plan" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "8ac2ff840181bc1789c88155f3f4ffe64d0f98b393e8d3b1b9326f80def1aa7e", + "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", "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" @@ -1026,7 +1026,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": "8ac2ff840181bc1789c88155f3f4ffe64d0f98b393e8d3b1b9326f80def1aa7e", + "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", "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" @@ -1061,7 +1061,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": "8ac2ff840181bc1789c88155f3f4ffe64d0f98b393e8d3b1b9326f80def1aa7e", + "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", "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/source_stages.json b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json index 7ea501077..3b5e593f4 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json +++ b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json @@ -1109,7 +1109,7 @@ "nonnegative_outputs": [ "maximum_extended_childcare_hours_usage" ], - "notes": "Identity-keyed seed 0 streams replace the incumbent sequential take-up seed 100; salts are output variable names. Reported positive receipt anchors are transient and consumed only. The Universal Credit draw's population is the benefit units with a UC claimant or partner (is_uc_claimant) aged 18 or over and under Pension Credit qualifying age (66 for everyone who can reach it in this release), the age and role conditions of policyengine-uk 2.145.0's is_uc_eligible; the engine lockstep test pins it and names the three engine cases not mirrored (16- and 17-year-old claimants under the UC Regs 2013 reg 8 exceptions, mixed-age couples on the Pension Credit route, and from 2.128.0 pension-age families moved onto Universal Credit when their legacy benefit closes, SI 2014/1230 reg 60A). So the contract rate is a share of those units, an anchor outside them stays true, and any other unit is never drawn; a unit with no claimant or partner of that age keeps its reported Housing Benefit, which a claim it cannot make no longer zeroes (#882, microcosm#867, microcosm#1095). The universal childcare flag is nested under the working-parent one. A unit that claims the extended hours claims the universal hours, and any other unit claims them at the contract's universal_childcare rate, the rate conditional on not claiming the extended hours; the extended draw is unchanged. childcare_copy_take_up later re-draws the childcare flags and hours of the support and CGT copies on their own benefit units." + "notes": "Identity-keyed seed 0 streams replace the incumbent sequential take-up seed 100; salts are output variable names. Reported positive receipt anchors are transient and consumed only. The Universal Credit draw's population is the benefit units with a UC claimant or partner (is_uc_claimant) aged 18 or over and under Pension Credit qualifying age (66 for everyone who can reach it in this release), the age and role conditions of policyengine-uk 2.147.2's is_uc_eligible; the engine lockstep test pins it and names the three engine cases not mirrored (16- and 17-year-old claimants under the UC Regs 2013 reg 8 exceptions, mixed-age couples on the Pension Credit route, and from 2.128.0 pension-age families moved onto Universal Credit when their legacy benefit closes, SI 2014/1230 reg 60A). So the contract rate is a share of those units, an anchor outside them stays true, and any other unit is never drawn; a unit with no claimant or partner of that age keeps its reported Housing Benefit, which a claim it cannot make no longer zeroes (#882, microcosm#867, microcosm#1095). The universal childcare flag is nested under the working-parent one. A unit that claims the extended hours claims the universal hours, and any other unit claims them at the contract's universal_childcare rate, the rate conditional on not claiming the extended hours; the extended draw is unchanged. childcare_copy_take_up later re-draws the childcare flags and hours of the support and CGT copies on their own benefit units." }, { "stage": "frs_person_draws", @@ -5335,7 +5335,7 @@ "frs_benunit_capital", "would_claim_uc" ], - "notes": "Runs after the last universal_credit_reported writer and before CGT cloning. Redraws every SPI benefit unit's capital, since the channel's incomes are SPI draws and the copied FRS answer no longer belongs to the unit (uk-data#495, microcosm#1095), from weighted base-FRS units with available capital in cells of UC reporter status by financial investment income band (interest, dividends and other investment income; property income is excluded because TOTCAPB4 counts accounts and assets) by is_uc_couple (two retained FRS claimant/partner roles, independently of legal is_married) by dependent-children band. A cell with fewer than 20 donors widens in the declared coarsening order, and reporter status is never coarsened. It then applies the monotone reported-UC OR refresh. The recorded capitals add property (uk-data#495, microcosm#1095), since policyengine-uk 2.145.0 replaces every capital source with a recorded figure of 0 or more and takes it as countable, and TOTCAPB4 has no property. WAS records the property for the household, and each means test counts the claimant's and partner's own capital (UC Regs 2013 reg 18; SPCA 2002 s.5). The household reference person's benefit unit therefore holds all of the household's property, and no other unit records any (María's ruling of 2026-10-12), since that person is the one in whose name the home is owned or rented, the best single reading of the owner. The engine shares household property over every claimant or partner instead, which puts a parent's property on an adult child's claim; a recorded figure consumes its own unit's share, so the engine's shares reach only a unit on the unavailable sentinel, and since policyengine-uk 2.136.1 such a unit takes its share whatever a recording unit beside it holds (the receipt counts any unit left there). The property counts at 90% of its value, market value less 10% for the costs of sale (UC Regs 2013 reg 49; SPC Regs 2002 reg 19); debt secured on it is not on the frame and is not netted (pe-uk#1969). Universal Credit counts other residential and non-residential property, and Pension Credit counts those and owned land. A unit that reports Universal Credit keeps its receipt and records the carrier alone for Universal Credit, since DWP assessed its capital to pay it and the property is imputed without that receipt. frs_benunit_capital stays the financial carrier, and its unavailable sentinel -1 passes through to both. Both recorded figures project to later years by GDP per head, as financial capital does, while policyengine-uk 2.139.1 projects other residential property by house prices, so the other residential property in a recorded figure grows faster than the engine's own projection of it; by the OBR indices the engine carries, it grows 1.5% faster by 2025 and 2.0% by 2026 from a 2024 base." + "notes": "Runs after the last universal_credit_reported writer and before CGT cloning. Redraws every SPI benefit unit's capital, since the channel's incomes are SPI draws and the copied FRS answer no longer belongs to the unit (uk-data#495, microcosm#1095), from weighted base-FRS units with available capital in cells of UC reporter status by financial investment income band (interest, dividends and other investment income; property income is excluded because TOTCAPB4 counts accounts and assets) by is_uc_couple (two retained FRS claimant/partner roles, independently of legal is_married) by dependent-children band. A cell with fewer than 20 donors widens in the declared coarsening order, and reporter status is never coarsened. It then applies the monotone reported-UC OR refresh. The recorded capitals add property (uk-data#495, microcosm#1095), since policyengine-uk 2.147.2 replaces every capital source with a recorded figure of 0 or more and takes it as countable, and TOTCAPB4 has no property. WAS records the property for the household, and each means test counts the claimant's and partner's own capital (UC Regs 2013 reg 18; SPCA 2002 s.5). The household reference person's benefit unit therefore holds all of the household's property, and no other unit records any (María's ruling of 2026-10-12), since that person is the one in whose name the home is owned or rented, the best single reading of the owner. The engine shares household property over every claimant or partner instead, which puts a parent's property on an adult child's claim; a recorded figure consumes its own unit's share, so the engine's shares reach only a unit on the unavailable sentinel, and since policyengine-uk 2.136.1 such a unit takes its share whatever a recording unit beside it holds (the receipt counts any unit left there). The property counts at 90% of its value, market value less 10% for the costs of sale (UC Regs 2013 reg 49; SPC Regs 2002 reg 19); debt secured on it is not on the frame and is not netted (pe-uk#1969). Universal Credit counts other residential and non-residential property, and Pension Credit counts those and owned land. A unit that reports Universal Credit keeps its receipt and records the carrier alone for Universal Credit, since DWP assessed its capital to pay it and the property is imputed without that receipt. frs_benunit_capital stays the financial carrier, and its unavailable sentinel -1 passes through to both. Both recorded figures project to later years by GDP per head, as financial capital does, while policyengine-uk 2.139.1 projects other residential property by house prices, so the other residential property in a recorded figure grows faster than the engine's own projection of it; by the OBR indices the engine carries, it grows 1.5% faster by 2025 and 2.0% by 2026 from a 2024 base." }, { "stage": "uc_legacy_closure_take_up", @@ -6090,7 +6090,7 @@ { "role": "policy_parameters", "kind": "versioned_parameter_tree", - "dependency": "policyengine-uk>=2.145.0 via microcosm-build[uk]", + "dependency": "policyengine-uk>=2.147.2 via microcosm-build[uk]", "parameters": [ "gov.hmrc.cgt.annual_exempt_amount" ], @@ -6171,7 +6171,7 @@ { "role": "policy_parameters", "kind": "versioned_parameter_tree", - "dependency": "policyengine-uk>=2.145.0 via microcosm-build[uk]", + "dependency": "policyengine-uk>=2.147.2 via microcosm-build[uk]", "parameters": [ "gov.hmrc.cgt.annual_exempt_amount", "gov.hmrc.cgt.badr.lifetime_limit", 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 97cf3205d..9185e865b 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml +++ b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml @@ -1011,7 +1011,7 @@ stages: - maximum_extended_childcare_hours_usage nonnegative_outputs: - maximum_extended_childcare_hours_usage - notes: Identity-keyed seed 0 streams replace the incumbent sequential take-up seed 100; salts are output variable names. Reported positive receipt anchors are transient and consumed only. The Universal Credit draw's population is the benefit units with a UC claimant or partner (is_uc_claimant) aged 18 or over and under Pension Credit qualifying age (66 for everyone who can reach it in this release), the age and role conditions of policyengine-uk 2.145.0's is_uc_eligible; the engine lockstep test pins it and names the three engine cases not mirrored (16- and 17-year-old claimants under the UC Regs 2013 reg 8 exceptions, mixed-age couples on the Pension Credit route, and from 2.128.0 pension-age families moved onto Universal Credit when their legacy benefit closes, SI 2014/1230 reg 60A). So the contract rate is a share of those units, an anchor outside them stays true, and any other unit is never drawn; a unit with no claimant or partner of that age keeps its reported Housing Benefit, which a claim it cannot make no longer zeroes (#882, microcosm#867, microcosm#1095). The universal childcare flag is nested under the working-parent one. A unit that claims the extended hours claims the universal hours, and any other unit claims them at the contract's universal_childcare rate, the rate conditional on not claiming the extended hours; the extended draw is unchanged. childcare_copy_take_up later re-draws the childcare flags and hours of the support and CGT copies on their own benefit units. + notes: Identity-keyed seed 0 streams replace the incumbent sequential take-up seed 100; salts are output variable names. Reported positive receipt anchors are transient and consumed only. The Universal Credit draw's population is the benefit units with a UC claimant or partner (is_uc_claimant) aged 18 or over and under Pension Credit qualifying age (66 for everyone who can reach it in this release), the age and role conditions of policyengine-uk 2.147.2's is_uc_eligible; the engine lockstep test pins it and names the three engine cases not mirrored (16- and 17-year-old claimants under the UC Regs 2013 reg 8 exceptions, mixed-age couples on the Pension Credit route, and from 2.128.0 pension-age families moved onto Universal Credit when their legacy benefit closes, SI 2014/1230 reg 60A). So the contract rate is a share of those units, an anchor outside them stays true, and any other unit is never drawn; a unit with no claimant or partner of that age keeps its reported Housing Benefit, which a claim it cannot make no longer zeroes (#882, microcosm#867, microcosm#1095). The universal childcare flag is nested under the working-parent one. A unit that claims the extended hours claims the universal hours, and any other unit claims them at the contract's universal_childcare rate, the rate conditional on not claiming the extended hours; the extended draw is unchanged. childcare_copy_take_up later re-draws the childcare flags and hours of the support and CGT copies on their own benefit units. - stage: frs_person_draws survey: Family Resources Survey 2024-25 source: Sourced UK take-up contract rates and identity-keyed deterministic draws. @@ -4323,7 +4323,7 @@ stages: rewrites: - frs_benunit_capital - would_claim_uc - notes: Runs after the last universal_credit_reported writer and before CGT cloning. Redraws every SPI benefit unit's capital, since the channel's incomes are SPI draws and the copied FRS answer no longer belongs to the unit (uk-data#495, microcosm#1095), from weighted base-FRS units with available capital in cells of UC reporter status by financial investment income band (interest, dividends and other investment income; property income is excluded because TOTCAPB4 counts accounts and assets) by is_uc_couple (two retained FRS claimant/partner roles, independently of legal is_married) by dependent-children band. A cell with fewer than 20 donors widens in the declared coarsening order, and reporter status is never coarsened. It then applies the monotone reported-UC OR refresh. The recorded capitals add property (uk-data#495, microcosm#1095), since policyengine-uk 2.145.0 replaces every capital source with a recorded figure of 0 or more and takes it as countable, and TOTCAPB4 has no property. WAS records the property for the household, and each means test counts the claimant's and partner's own capital (UC Regs 2013 reg 18; SPCA 2002 s.5). The household reference person's benefit unit therefore holds all of the household's property, and no other unit records any (María's ruling of 2026-10-12), since that person is the one in whose name the home is owned or rented, the best single reading of the owner. The engine shares household property over every claimant or partner instead, which puts a parent's property on an adult child's claim; a recorded figure consumes its own unit's share, so the engine's shares reach only a unit on the unavailable sentinel, and since policyengine-uk 2.136.1 such a unit takes its share whatever a recording unit beside it holds (the receipt counts any unit left there). The property counts at 90% of its value, market value less 10% for the costs of sale (UC Regs 2013 reg 49; SPC Regs 2002 reg 19); debt secured on it is not on the frame and is not netted (pe-uk#1969). Universal Credit counts other residential and non-residential property, and Pension Credit counts those and owned land. A unit that reports Universal Credit keeps its receipt and records the carrier alone for Universal Credit, since DWP assessed its capital to pay it and the property is imputed without that receipt. frs_benunit_capital stays the financial carrier, and its unavailable sentinel -1 passes through to both. Both recorded figures project to later years by GDP per head, as financial capital does, while policyengine-uk 2.139.1 projects other residential property by house prices, so the other residential property in a recorded figure grows faster than the engine's own projection of it; by the OBR indices the engine carries, it grows 1.5% faster by 2025 and 2.0% by 2026 from a 2024 base. + notes: Runs after the last universal_credit_reported writer and before CGT cloning. Redraws every SPI benefit unit's capital, since the channel's incomes are SPI draws and the copied FRS answer no longer belongs to the unit (uk-data#495, microcosm#1095), from weighted base-FRS units with available capital in cells of UC reporter status by financial investment income band (interest, dividends and other investment income; property income is excluded because TOTCAPB4 counts accounts and assets) by is_uc_couple (two retained FRS claimant/partner roles, independently of legal is_married) by dependent-children band. A cell with fewer than 20 donors widens in the declared coarsening order, and reporter status is never coarsened. It then applies the monotone reported-UC OR refresh. The recorded capitals add property (uk-data#495, microcosm#1095), since policyengine-uk 2.147.2 replaces every capital source with a recorded figure of 0 or more and takes it as countable, and TOTCAPB4 has no property. WAS records the property for the household, and each means test counts the claimant's and partner's own capital (UC Regs 2013 reg 18; SPCA 2002 s.5). The household reference person's benefit unit therefore holds all of the household's property, and no other unit records any (María's ruling of 2026-10-12), since that person is the one in whose name the home is owned or rented, the best single reading of the owner. The engine shares household property over every claimant or partner instead, which puts a parent's property on an adult child's claim; a recorded figure consumes its own unit's share, so the engine's shares reach only a unit on the unavailable sentinel, and since policyengine-uk 2.136.1 such a unit takes its share whatever a recording unit beside it holds (the receipt counts any unit left there). The property counts at 90% of its value, market value less 10% for the costs of sale (UC Regs 2013 reg 49; SPC Regs 2002 reg 19); debt secured on it is not on the frame and is not netted (pe-uk#1969). Universal Credit counts other residential and non-residential property, and Pension Credit counts those and owned land. A unit that reports Universal Credit keeps its receipt and records the carrier alone for Universal Credit, since DWP assessed its capital to pay it and the property is imputed without that receipt. frs_benunit_capital stays the financial carrier, and its unavailable sentinel -1 passes through to both. Both recorded figures project to later years by GDP per head, as financial capital does, while policyengine-uk 2.139.1 projects other residential property by house prices, so the other residential property in a recorded figure grows faster than the engine's own projection of it; by the OBR indices the engine carries, it grows 1.5% faster by 2025 and 2.0% by 2026 from a 2024 base. - stage: uc_legacy_closure_take_up survey: DWP Stat-Xplore, Households invited to Move to Universal Credit by legacy benefit and move status, notices July 2022 to June 2026 source: https://stat-xplore.dwp.gov.uk @@ -4913,7 +4913,7 @@ stages: artifacts: - role: policy_parameters kind: versioned_parameter_tree - dependency: policyengine-uk>=2.145.0 via microcosm-build[uk] + dependency: policyengine-uk>=2.147.2 via microcosm-build[uk] parameters: - gov.hmrc.cgt.annual_exempt_amount instant_rule: raw dated parameter files evaluated at 1 June of the build period's tax year @@ -4978,7 +4978,7 @@ stages: artifacts: - role: policy_parameters kind: versioned_parameter_tree - dependency: policyengine-uk>=2.145.0 via microcosm-build[uk] + dependency: policyengine-uk>=2.147.2 via microcosm-build[uk] parameters: - gov.hmrc.cgt.annual_exempt_amount - gov.hmrc.cgt.badr.lifetime_limit 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 c95c17f84..2f9754726 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 @@ -49,7 +49,7 @@ } UK_TAKE_UP_DECLARED_SEEDS = {output: 0 for output in FRS_TAKE_UP_OUTPUT_COLUMNS} # Universal Credit is claimable only by a benefit unit whose claimant or -# partner meets its age conditions: policyengine-uk 2.145.0's ``is_uc_eligible`` +# partner meets its age conditions: policyengine-uk 2.147.2's ``is_uc_eligible`` # (capital aside) needs a single or joint claimant, taken from # ``is_uc_claimant``, who meets UC's minimum age and has not reached Pension # Credit qualifying age. The draw's population is therefore the units with a 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 2cc39c6f4..cd15d0d5b 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 @@ -437,8 +437,8 @@ def assert_installed_engine_is_pinned() -> str: jobs and the H2 parity run them on the lock. Three things must hold. The distribution's version is the pinned one, - exactly, so a post-release or a local build of it (``2.145.0.post1``, - ``2.145.0+local``) is refused. ``policyengine_uk`` imports from that + exactly, so a post-release or a local build of it (``2.147.2.post1``, + ``2.147.2+local``) is refused. ``policyengine_uk`` imports from that distribution's own files, so a copy earlier on ``sys.path`` or an editable install is refused. And its ``__init__.py`` matches the distribution's RECORD, so a stale record beside other files is refused where the files diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/uc_capital_coherence.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/uc_capital_coherence.py index 6f8d9cdce..0f7e22c4a 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/uc_capital_coherence.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/uc_capital_coherence.py @@ -75,12 +75,13 @@ _UC_CAPITAL_LEVELS = ("exact_cell", *UC_CAPITAL_COARSENING) #: The UC capital limits the receipt measures the redraw against. _UC_CAPITAL_RECEIPT_LIMITS = (6_000.0, 16_000.0) -#: policyengine-uk 2.145.0 counts these household property values as Universal +#: policyengine-uk 2.147.2 counts these household property values as Universal #: Credit capital (``property_sources`` under #: ``gov.dwp.universal_credit.means_test.capital``, at 90% of value less any #: secured debt since 2.136.1) and as Pension Credit capital (the ``sources`` #: list under ``gov.dwp.pension_credit.income.capital``, beside ``savings`` and -#: ``corporate_wealth``). A recorded figure of 0 or more is a unit's complete +#: ``share_like_capital``, which is ``corporate_wealth`` unless the share +#: components the build leaves unset exceed it). A recorded figure of 0 or more is a unit's complete #: capital: it replaces every source, property included, and the engine takes #: it as already countable, but TOTCAPB4 counts accounts and assets and no #: property. So the recorded figures add the household's property for the unit diff --git a/packages/microcosm-build/src/microcosm/build/us_runtime/worker_identity.py b/packages/microcosm-build/src/microcosm/build/us_runtime/worker_identity.py index ff1d9f91a..db3b05654 100644 --- a/packages/microcosm-build/src/microcosm/build/us_runtime/worker_identity.py +++ b/packages/microcosm-build/src/microcosm/build/us_runtime/worker_identity.py @@ -28,7 +28,7 @@ PRIMARY_QRF_WORKER_MODULE = "microcosm.build.us_runtime.puf_qrf_worker" PRIMARY_QRF_INTERPRETER_PLACEHOLDER = "{python_interpreter}" APPROVED_UV_LOCK_SHA256 = ( - "ceffa14029b2f4818fa1749684361a6de4d38358c27d3173cc2b0d47721ef3a4" + "66ed380da8ad2caa67a6147793e9e8ed1906f0815959c50cb921b2005b5dc547" ) LEGACY_CAMPAIGN_UV_LOCK_SHA256 = ( "27f47e385cfa35e2644a37410d1804b361ad9aee123577551c8421547bda65ee" diff --git a/packages/microcosm-build/tests/engine_free/shared/test_engine_core_pins.py b/packages/microcosm-build/tests/engine_free/shared/test_engine_core_pins.py index ae9b149b0..779b70b8b 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_engine_core_pins.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_engine_core_pins.py @@ -33,7 +33,7 @@ #: policyengine-core its own floor brings. UK_ENGINE = { "policyengine-core": "3.33.3", - "policyengine-uk": "2.145.0", + "policyengine-uk": "2.147.2", } ENGINE_PACKAGES = ("microcosm-build", "microcosm-data", "microcosm-frame") diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_frs_stochastic.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_frs_stochastic.py index de7e62e12..5e2556a42 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_frs_stochastic.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_frs_stochastic.py @@ -178,7 +178,7 @@ def test_uc_take_up_population_excludes_units_without_a_working_age_adult() -> N def test_uc_take_up_population_needs_a_claimant_or_partner_of_working_age() -> None: """A working-age dependant does not bring a unit into the UC population. - policyengine-uk 2.145.0's is_uc_eligible reads the age of the unit's UC + policyengine-uk 2.147.2's is_uc_eligible reads the age of the unit's UC claimant or partner (is_uc_claimant), not of any adult: a pensioner unit with an 18-year-old dependant cannot claim Universal Credit. """ diff --git a/packages/microcosm-data/pyproject.toml b/packages/microcosm-data/pyproject.toml index 03c19dea7..d0ad1be68 100644 --- a/packages/microcosm-data/pyproject.toml +++ b/packages/microcosm-data/pyproject.toml @@ -37,7 +37,7 @@ us = ["policyengine-us>=2.2.1,<3", "policyengine-core==3.32.5"] # The UK artifact lives in a PRIVATE repo (UK Data Service licence): loads # require an authenticated HF token with access. The loader surfaces the # 401 with that explanation rather than retrying. -uk = ["policyengine-uk>=2.145.0"] +uk = ["policyengine-uk>=2.147.2"] [project.urls] Homepage = "https://microcosm.institute" diff --git a/packages/microcosm-frame/pyproject.toml b/packages/microcosm-frame/pyproject.toml index 149476141..ef175ba17 100644 --- a/packages/microcosm-frame/pyproject.toml +++ b/packages/microcosm-frame/pyproject.toml @@ -22,7 +22,7 @@ policyengine = [ "policyengine-core==3.32.5", "microunit>=0.1.0", ] -uk = ["policyengine-uk>=2.145.0"] +uk = ["policyengine-uk>=2.147.2"] # The Axiom adapter's PyPI-resolvable dependencies. The engine itself # (axiom-rules-engine + its dense native extension) is not on PyPI yet and # installs from a checkout; see microcosm/frame/adapters/axiom.py. diff --git a/packages/microcosm-frame/src/microcosm/frame/adapters/policyengine_uk_concepts.py b/packages/microcosm-frame/src/microcosm/frame/adapters/policyengine_uk_concepts.py index 0197d133e..74c009933 100644 --- a/packages/microcosm-frame/src/microcosm/frame/adapters/policyengine_uk_concepts.py +++ b/packages/microcosm-frame/src/microcosm/frame/adapters/policyengine_uk_concepts.py @@ -32,7 +32,7 @@ # --------------------------------------------------------------------------- # # Which PolicyEngine-UK inputs each engine-neutral concept feeds -# (microcosm.frame.concepts), reviewed against policyengine-uk 2.145.0. Every +# (microcosm.frame.concepts), reviewed against policyengine-uk 2.147.2. Every # target is a pure input (in ``PolicyEngineUKEngine.variables``). The UK # loader also accepts some formula-owned variables as overrides # (``employment_income``, ``state_pension_reported``, ``is_household_head``); @@ -206,7 +206,7 @@ def _uk_take_up(program: str, entity: str) -> InputBinding: POLICYENGINE_UK_CONCEPT_MAPPING = ConceptMapping( engine="policyengine-uk", - engine_version="2.145.0", + engine_version="2.147.2", entity_correspondence={"person": "person", "household": "household"}, input_declaration=InputDeclaration.ENGINE_TYPED, bindings=( @@ -575,11 +575,15 @@ def _uk_take_up(program: str, entity: str) -> InputBinding: "describe a company the person owns, for Universal Credit's " "regulation 77 (owned_company_capital, owned_company_holding_value " "and owned_company_trade_assets); every one defaults to no such " - "company, and the build sets none. savings and corporate_wealth are two of " - "Universal Credit's capital sources " - "(gov.dwp.universal_credit.means_test.capital.sources), and " + "company, and the build sets none. savings and share_like_capital are two " + "of Universal Credit's capital sources " + "(gov.dwp.universal_credit.means_test.capital.sources); since " + "policyengine-uk 2.147.0 share_like_capital is corporate_wealth unless " + "its components, the household inputs directly_held_shares and " + "unit_and_investment_trusts, add up to more, and the build sets " + "neither. Universal Credit's one person-level source is " "lifetime_isa_countable_capital, the Lifetime ISA at its surrender " - "value, is its one person-level source (capital.person_sources). " + "value (capital.person_sources). " "uc_reported_capital (benefit unit, default -1) is Universal " "Credit capital; since policyengine-uk 2.136.1 a value of zero or " "more set directly is the unit's complete countable capital, in " diff --git a/packages/microcosm-frame/tests/engine/uk/test_concept_mapping_policyengine_uk.py b/packages/microcosm-frame/tests/engine/uk/test_concept_mapping_policyengine_uk.py index d125ff9e7..e4576c682 100644 --- a/packages/microcosm-frame/tests/engine/uk/test_concept_mapping_policyengine_uk.py +++ b/packages/microcosm-frame/tests/engine/uk/test_concept_mapping_policyengine_uk.py @@ -171,16 +171,27 @@ def test_the_liquid_asset_reason_holds(engine) -> None: def test_the_liquid_asset_reason_names_the_household_wealth_inputs(engine) -> None: - # Shares and funds sit on the household too, in corporate_wealth, which - # Universal Credit counts as capital alongside savings. Its one + # Shares and funds sit on the household too, in corporate_wealth. Since + # policyengine-uk 2.147.0 Universal Credit counts them, alongside savings, + # as share_like_capital: corporate_wealth unless its two household + # components, which the build leaves unset, add up to more. Its one # person-level source is the Lifetime ISA at its surrender value. reason = MAPPING.unmapped["fact:person.liquid_financial_assets"] + inputs = set(engine.variables()) assert engine.variable_metadata("corporate_wealth").entity == "household" assert engine._variable("corporate_wealth").quantity_type == "stock" assert engine._variable("corporate_wealth").unit == "currency-GBP" universal_credit = engine._tax_benefit_system().parameters.gov.dwp.universal_credit sources = universal_credit.means_test.capital.sources("2026-01-01") - assert {"savings", "corporate_wealth"} <= set(sources) + assert {"savings", "share_like_capital"} <= set(sources) + assert "share_like_capital" not in inputs + share_like = inspect.getsource(engine._variable("share_like_capital").get_formula()) + for name in ("corporate_wealth", "directly_held_shares", "unit_and_investment_trusts"): + assert name in share_like, name + for name in ("directly_held_shares", "unit_and_investment_trusts"): + assert name in inputs, name + assert engine.variable_metadata(name).entity == "household", name + assert name in reason, name person_sources = universal_credit.means_test.capital.person_sources("2026-01-01") assert list(person_sources) == ["lifetime_isa_countable_capital"] source = inspect.getsource(engine._variable("uc_assessable_capital").get_formula()) @@ -188,6 +199,7 @@ def test_the_liquid_asset_reason_names_the_household_wealth_inputs(engine) -> No for name in ( "savings", "corporate_wealth", + "share_like_capital", "gross_financial_wealth", "net_financial_wealth", "lifetime_isa_countable_capital", diff --git a/packages/microcosm-frame/tests/golden/concept-coverage/policyengine-uk.json b/packages/microcosm-frame/tests/golden/concept-coverage/policyengine-uk.json index ddc5b6eb5..d30d63705 100644 --- a/packages/microcosm-frame/tests/golden/concept-coverage/policyengine-uk.json +++ b/packages/microcosm-frame/tests/golden/concept-coverage/policyengine-uk.json @@ -413,8 +413,8 @@ } ], "engine": "policyengine-uk", - "engine_version": "2.145.0", - "input_count": 311, + "engine_version": "2.147.2", + "input_count": 314, "schema_sha256": "5a55669d0447a686692911a6327ae298f19741dde29559f2654a75807878a141", "structural_inputs": [ { @@ -743,6 +743,10 @@ "entity": "household", "name": "diesel_spending" }, + { + "entity": "household", + "name": "directly_held_shares" + }, { "entity": "person", "name": "disabled_students_allowance_eligible_expenses" @@ -767,6 +771,10 @@ "entity": "household", "name": "domestic_rates" }, + { + "entity": "person", + "name": "early_years_school_start_deferred" + }, { "entity": "household", "name": "ebr_energy_bills_credit_eligible" @@ -1455,6 +1463,10 @@ "entity": "benunit", "name": "uc_receives_new_claimant_health_element" }, + { + "entity": "household", + "name": "unit_and_investment_trusts" + }, { "entity": "person", "name": "universal_credit_reported" @@ -1501,7 +1513,7 @@ "fact:household.reference_person_id": "is_household_head is formula-owned (the oldest member). The UK build overrides it with the FRS household reference person (frs_spine.py), an override the loader accepts, but it is not an input, so the mapping does not target it. Every housing input is household-level, so nothing is allocated to the reference person.", "fact:household.source_household_id": "Original donor household lineage is build provenance and weight diagnostic support, not a policyengine-uk rules input.", "fact:person.legal_marital_status": "policyengine-uk derives marital status from benefit-unit composition; marital_status and is_married are formula-owned.", - "fact:person.liquid_financial_assets": "policyengine-uk holds financial wealth on the household: savings ('Household liquid savings'), corporate_wealth ('Wealth held in corporations directly or through investment funds'), gross_financial_wealth and net_financial_wealth are household inputs, and no transform puts a person amount on a household input. Its person-level GBP stock inputs are student_loan_balance, a debt; car_list_price, the price vehicle excise duty's expensive-car supplement tests; and lifetime_isa_balance ('Current value of the person's Lifetime ISAs, cash and stocks and shares together'), one savings wrapper, which the engine documents as already inside gross_financial_wealth and net_financial_wealth. Since policyengine-uk 2.130.0 three more describe a company the person owns, for Universal Credit's regulation 77 (owned_company_capital, owned_company_holding_value and owned_company_trade_assets); every one defaults to no such company, and the build sets none. savings and corporate_wealth are two of Universal Credit's capital sources (gov.dwp.universal_credit.means_test.capital.sources), and lifetime_isa_countable_capital, the Lifetime ISA at its surrender value, is its one person-level source (capital.person_sources). uc_reported_capital (benefit unit, default -1) is Universal Credit capital; since policyengine-uk 2.136.1 a value of zero or more set directly is the unit's complete countable capital, in place of every source, property included. benunit_reported_capital, a benefit-unit input ('Savings and investments of the benefit unit's adults (the claimant and any partner) as recorded'), replaces the financial sources only: the household pool it otherwise sums from the household sources, net of what other benefit units report or override, and apportions by claimant and partner count, and the person-level sources of the unit's claimant and partner. Property is valued separately (uc_property_capital) and shared across every claimant and partner in the household. Feeding either would be a modelling choice for a UK build, not a mapping of this concept.", + "fact:person.liquid_financial_assets": "policyengine-uk holds financial wealth on the household: savings ('Household liquid savings'), corporate_wealth ('Wealth held in corporations directly or through investment funds'), gross_financial_wealth and net_financial_wealth are household inputs, and no transform puts a person amount on a household input. Its person-level GBP stock inputs are student_loan_balance, a debt; car_list_price, the price vehicle excise duty's expensive-car supplement tests; and lifetime_isa_balance ('Current value of the person's Lifetime ISAs, cash and stocks and shares together'), one savings wrapper, which the engine documents as already inside gross_financial_wealth and net_financial_wealth. Since policyengine-uk 2.130.0 three more describe a company the person owns, for Universal Credit's regulation 77 (owned_company_capital, owned_company_holding_value and owned_company_trade_assets); every one defaults to no such company, and the build sets none. savings and share_like_capital are two of Universal Credit's capital sources (gov.dwp.universal_credit.means_test.capital.sources); since policyengine-uk 2.147.0 share_like_capital is corporate_wealth unless its components, the household inputs directly_held_shares and unit_and_investment_trusts, add up to more, and the build sets neither. Universal Credit's one person-level source is lifetime_isa_countable_capital, the Lifetime ISA at its surrender value (capital.person_sources). uc_reported_capital (benefit unit, default -1) is Universal Credit capital; since policyengine-uk 2.136.1 a value of zero or more set directly is the unit's complete countable capital, in place of every source, property included. benunit_reported_capital, a benefit-unit input ('Savings and investments of the benefit unit's adults (the claimant and any partner) as recorded'), replaces the financial sources only: the household pool it otherwise sums from the household sources, net of what other benefit units report or override, and apportions by claimant and partner count, and the person-level sources of the unit's claimant and partner. Property is valued separately (uc_property_capital) and shared across every claimant and partner in the household. Feeding either would be a modelling choice for a UK build, not a mapping of this concept.", "fact:person.partner_person_id": "Partnerships reach policyengine-uk only through benefit-unit membership, a structure the bundle must already carry (the adapter builds no units); is_benunit_head and is_married are formula-owned.", "fact:person.public_pension_income": "The State Pension is computed from state_pension_reported, which is formula-owned: the loader accepts it as an override, but it is not an input." } diff --git a/uv.lock b/uv.lock index e9497a138..f26899896 100644 --- a/uv.lock +++ b/uv.lock @@ -857,7 +857,7 @@ requires-dist = [ { name = "openpyxl", marker = "extra == 'uk'", specifier = ">=3.1" }, { name = "pandas", specifier = ">=2" }, { name = "policyengine-core", marker = "extra == 'us'", specifier = "==3.32.5" }, - { name = "policyengine-uk", marker = "extra == 'uk'", specifier = ">=2.145.0" }, + { name = "policyengine-uk", marker = "extra == 'uk'", specifier = ">=2.147.2" }, { name = "policyengine-us", marker = "extra == 'us'", specifier = ">=2.2.1,<3" }, { name = "pyarrow", specifier = ">=15" }, { name = "pyyaml", specifier = ">=6" }, @@ -936,7 +936,7 @@ requires-dist = [ { name = "microcosm-diagnostics", editable = "packages/microcosm-diagnostics" }, { name = "packaging", specifier = ">=24" }, { name = "policyengine-core", marker = "extra == 'us'", specifier = "==3.32.5" }, - { name = "policyengine-uk", marker = "extra == 'uk'", specifier = ">=2.145.0" }, + { name = "policyengine-uk", marker = "extra == 'uk'", specifier = ">=2.147.2" }, { name = "policyengine-us", marker = "extra == 'us'", specifier = ">=2.2.1,<3" }, ] provides-extras = ["us", "uk"] @@ -1055,7 +1055,7 @@ requires-dist = [ { name = "numpy", specifier = ">=2" }, { name = "pandas", specifier = ">=2.3" }, { name = "policyengine-core", marker = "extra == 'policyengine'", specifier = "==3.32.5" }, - { name = "policyengine-uk", marker = "extra == 'uk'", specifier = ">=2.145.0" }, + { name = "policyengine-uk", marker = "extra == 'uk'", specifier = ">=2.147.2" }, { name = "policyengine-us", marker = "extra == 'policyengine'", specifier = ">=2.2.1,<3" }, { name = "tables", marker = "extra == 'axiom'", specifier = ">=3" }, ] @@ -1675,7 +1675,7 @@ wheels = [ [[package]] name = "policyengine-uk" -version = "2.145.0" +version = "2.147.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "microdf-python" }, @@ -1683,9 +1683,9 @@ dependencies = [ { name = "pydantic" }, { name = "tables" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fc/69/9b71ed5706bb1ea2744673acb76ca7bc17641ee7acd0bff3747dcf939602/policyengine_uk-2.145.0.tar.gz", hash = "sha256:4cfdf97f60a5f95114e7748bad277c4a7b99e5ef8edc775fc65160347213e73c", size = 3074821, upload-time = "2026-10-21T20:22:35.157Z" } +sdist = { url = "https://files.pythonhosted.org/packages/89/16/14fe43a9e0323eb29e2877e7860356d7ae682dd89575973adaa4f25a3e33/policyengine_uk-2.147.2.tar.gz", hash = "sha256:7a718b03cb09e21d7e00cfe655b9a2082af5edba747471b5aec20e651e1cc180", size = 3191436, upload-time = "2026-10-22T18:40:49.878Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bb/21/3d226b95a5ffc555b1d1ee2a6b910de2e10b70aee71ffecc86466044375b/policyengine_uk-2.145.0-py3-none-any.whl", hash = "sha256:996d9d95cb2deea0d6595a2a6524804cacbc0943f53d45fced0b3ecebbe78331", size = 4557152, upload-time = "2026-10-21T20:22:32.55Z" }, + { url = "https://files.pythonhosted.org/packages/96/dd/54ddc9226756877e630a3f9fcda4dbf2ae142635e96a564cab3a062ced62/policyengine_uk-2.147.2-py3-none-any.whl", hash = "sha256:4b48ab1008b00610abc38192927ac9d4bb22037b6bbd9578926c2899e639f972", size = 4705225, upload-time = "2026-10-22T18:40:47.418Z" }, ] [[package]] From 7bf92baecac6215d738830a3dd85893caa4d88a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 22 Oct 2026 21:33:58 +0100 Subject: [PATCH 11/25] Measure the DfE funded childcare rows at the spring term DfE counts the children registered for each funded entitlement in its January census, by age on 31 December. policyengine-uk's entitlements are annual, and since 2.147.2 they stop at school start by date of birth and start working-parent hours the term after the minimum age. Four person measures (dfe_spring_term.py) classify each child at the spring term of the model year: the DfE age, and spring-term receipt of working-parent hours, universal hours and early learning for 2-year-olds. The universal and 2-year-old measures keep the engine's family and claim conditions but count every child of the DfE age, as the term after the birthday does; the engine still gates them on the age at 6 October. The resolver routes the measures, refuses them as persisted columns, and an engine test checks them on hand-built households (Vahid's round-2 finding A on #1338). Co-Authored-By: Claude Opus 5.5 --- .../build/uk_runtime/dfe_spring_term.py | 140 +++++++++++++++ .../build/uk_runtime/measure_simulation.py | 30 +++- .../engine/uk/test_uk_dfe_spring_term.py | 167 ++++++++++++++++++ .../uk/test_uk_measure_simulation.py | 121 +++++++++++++ 4 files changed, 457 insertions(+), 1 deletion(-) create mode 100644 packages/microcosm-build/src/microcosm/build/uk_runtime/dfe_spring_term.py create mode 100644 packages/microcosm-build/tests/engine/uk/test_uk_dfe_spring_term.py diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/dfe_spring_term.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/dfe_spring_term.py new file mode 100644 index 000000000..dda9f486a --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/dfe_spring_term.py @@ -0,0 +1,140 @@ +"""DfE funded early-years registrations on the spring-term basis. + +DfE counts the children registered for each funded entitlement in England in +the census of January, by age on the preceding 31 December. policyengine-uk's +entitlements are annual: a child receives one if it is funded in any of the +year's three terms (1 April, 1 September and the next 1 January). A child +counts in DfE's January figures only if it is funded in the spring term, so +these measures classify each child at the spring term of model year Y, which +starts on 1 January of Y + 1: + +- **School.** Since policyengine-uk 2.147.2 a child's free hours stop when it + starts school, from its date of birth. + ``early_years_term_share_before_school`` is 0, 1/3 or 1, and a child is + still before school in the spring term only at 1. The share is float32, + so it is tested against one half, never for equality. +- **Working parent.** Working-parent hours start the term after the child + reaches the minimum age (SI 2022/1134 reg 27). The year's eligible terms + always end with the spring term, so an annual receipt before school is a + spring receipt. +- **Universal and early learning for 2-year-olds.** These start the term + after the third or second birthday, so in the spring term they reach every + child of that DfE age. policyengine-uk still gates them on the whole age at + 6 October, which leaves out the children born from 7 October to 31 + December. The measures keep the engine's family and claim conditions and + replace only that age gate, so they count the children DfE counts; they do + not change what the engine pays. +- **DfE age** is ``Y - birth_year``, the age on 31 December Y. + +The take-up flags and family conditions are annual and apply to the spring +term unchanged. ``early_years_school_start_deferred`` is not supplied (the +FRS records no deferred start), so every child starts school on the date its +date of birth implies. +""" + +from __future__ import annotations + +from collections.abc import Callable, Mapping + +import numpy as np + +__all__ = [ + "DFE_AGE_AT_31_DECEMBER", + "DFE_SPRING_EARLY_LEARNING_2", + "DFE_SPRING_TERM_ENGINE_INPUTS", + "DFE_SPRING_TERM_MEASURES", + "DFE_SPRING_UNIVERSAL", + "DFE_SPRING_WORKING_PARENT", + "dfe_spring_term_status", +] + +DFE_AGE_AT_31_DECEMBER = "dfe_age_at_31_december" +DFE_SPRING_WORKING_PARENT = "dfe_spring_working_parent" +DFE_SPRING_UNIVERSAL = "dfe_spring_universal" +DFE_SPRING_EARLY_LEARNING_2 = "dfe_spring_early_learning_2" +#: Person-level measures, all computed together from one set of engine reads. +DFE_SPRING_TERM_MEASURES = ( + DFE_AGE_AT_31_DECEMBER, + DFE_SPRING_WORKING_PARENT, + DFE_SPRING_UNIVERSAL, + DFE_SPRING_EARLY_LEARNING_2, +) +#: The engine variables the measures read, each at person grain. +DFE_SPRING_TERM_ENGINE_INPUTS = ( + "birth_year", + "country", + "early_years_term_share_before_school", + "is_child_receiving_extended_childcare", + "is_of_compulsory_school_age", + "max_free_entitlement_hours_used", + "targeted_childcare_entitlement_eligible", + "would_claim_targeted_childcare", + "would_claim_universal_childcare", +) +_UNIVERSAL_DFE_AGES = (3, 4) +_EARLY_LEARNING_DFE_AGE = 2 + + +def _spring_term_start(year: int) -> int: + from policyengine_uk.utils.dates import term_starts + + spring = int(term_starts(year)[2]) + if spring != (year + 1) * 10_000 + 101: + raise ValueError( + f"policyengine-uk's spring term of {year} starts on {spring}, not " + f"1 January {year + 1}; the DfE spring-term measures assume the " + "engine's April-to-March year." + ) + return spring + + +def _flag(values: np.ndarray) -> np.ndarray: + array = np.asarray(values) + if array.dtype.kind in "biuf": + return array.astype(float) > 0.5 + raise ValueError(f"expected a numeric or boolean flag, got dtype {array.dtype}") + + +def dfe_spring_term_status( + calculate: Callable[[str], np.ndarray], year: int +) -> Mapping[str, np.ndarray]: + """Classify each person at the spring term of model year ``year``. + + ``calculate(name)`` returns an engine variable at person grain for + ``year``, group variables broadcast to their members and enums decoded to + their names. The result maps each name in ``DFE_SPRING_TERM_MEASURES`` to + a person array: the DfE age as a float, the others as 0/1 floats. + """ + + _spring_term_start(int(year)) + dfe_age = float(year) - np.asarray(calculate("birth_year"), dtype=float) + in_nursery = ( + np.asarray(calculate("early_years_term_share_before_school"), dtype=float) > 0.5 + ) + uses_hours = ( + np.asarray(calculate("max_free_entitlement_hours_used"), dtype=float) > 0 + ) + working_parent = ( + _flag(calculate("is_child_receiving_extended_childcare")) & in_nursery + ) + in_england = np.asarray(calculate("country")).astype(str) == "ENGLAND" + universal = ( + in_england + & ~_flag(calculate("is_of_compulsory_school_age")) + & in_nursery + & uses_hours + & np.isin(dfe_age, _UNIVERSAL_DFE_AGES) + & (_flag(calculate("would_claim_universal_childcare")) | working_parent) + ) + early_learning_2 = ( + _flag(calculate("targeted_childcare_entitlement_eligible")) + & uses_hours + & (dfe_age == _EARLY_LEARNING_DFE_AGE) + & (_flag(calculate("would_claim_targeted_childcare")) | working_parent) + ) + return { + DFE_AGE_AT_31_DECEMBER: dfe_age, + DFE_SPRING_WORKING_PARENT: working_parent.astype(float), + DFE_SPRING_UNIVERSAL: universal.astype(float), + DFE_SPRING_EARLY_LEARNING_2: early_learning_2.astype(float), + } 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 d96584ee0..b1e19b250 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 @@ -17,6 +17,11 @@ without_uk_native_alias_columns, ) from microcosm.build.uk_runtime.cgt_calibration import UK_CGT_DATED_MEASURE +from microcosm.build.uk_runtime.dfe_spring_term import ( + DFE_SPRING_TERM_ENGINE_INPUTS, + DFE_SPRING_TERM_MEASURES, + dfe_spring_term_status, +) from microcosm.build.uk_runtime.high_value_homes import ( high_value_home_mask, uk_high_value_home_thresholds, @@ -368,6 +373,17 @@ def compute_uk_measure_input( f"frame_columns:high_value_home_mask:{_HIGH_VALUE_HOME_MEASURES[variable]}", ) + if variable in DFE_SPRING_TERM_MEASURES: + if entity != "person": + raise KeyError(f"DfE spring-term measures are person-only: {entity}") + status = dfe_spring_term_status( + lambda name: compute_uk_measure_input( + frame, simulation, "person", name, year + )[0], + year, + ) + return status[variable], f"dfe_spring_term:{variable}" + if variable in _LOSS_RELIEF_MEASURES: if entity != "person": raise KeyError(f"{variable} is person-only: {entity}") @@ -838,6 +854,14 @@ def __init__( "High-value home measures must not be persisted as source inputs: " f"{persisted_high_value}" ) + persisted_spring_term = sorted( + set(DFE_SPRING_TERM_MEASURES) & set(map(str, frame.table("person"))) + ) + if persisted_spring_term: + raise ValueError( + "DfE spring-term measures must not be persisted as source inputs: " + f"{persisted_spring_term}" + ) self.simulation = factory(dataset=str(source_path)) validate_uc_claimant_input(self.simulation, frame.table("person"), self.year) self.contract_targets = _uk_contract_targets() @@ -916,6 +940,10 @@ def knows(self, entity: str, variable: str) -> bool: return entity == "benunit" if variable in _BUS_BOARDING_MEASURES or variable in _HIGH_VALUE_HOME_MEASURES: return entity == "household" + if variable in DFE_SPRING_TERM_MEASURES: + return entity == "person" and all( + self.knows("person", name) for name in DFE_SPRING_TERM_ENGINE_INPUTS + ) cgt_measure = _cgt_model_measure(variable, self.year) if cgt_measure is not None: return entity == "person" and self.knows(entity, cgt_measure[0]) @@ -947,7 +975,7 @@ def entity_for(self, variable: str) -> str | None: return "household" if _cgt_model_measure(variable, self.year) is not None: return "person" - if variable in _LOSS_RELIEF_MEASURES: + if variable in _LOSS_RELIEF_MEASURES or variable in DFE_SPRING_TERM_MEASURES: return "person" if ( variable diff --git a/packages/microcosm-build/tests/engine/uk/test_uk_dfe_spring_term.py b/packages/microcosm-build/tests/engine/uk/test_uk_dfe_spring_term.py new file mode 100644 index 000000000..8888434a0 --- /dev/null +++ b/packages/microcosm-build/tests/engine/uk/test_uk_dfe_spring_term.py @@ -0,0 +1,167 @@ +"""The DfE spring-term measures on hand-built households (policyengine-uk 2.147.2).""" + +from __future__ import annotations + +import numpy as np +import pytest + +from microcosm.build.uk_runtime.dfe_spring_term import ( + DFE_AGE_AT_31_DECEMBER, + DFE_SPRING_EARLY_LEARNING_2, + DFE_SPRING_TERM_ENGINE_INPUTS, + DFE_SPRING_UNIVERSAL, + DFE_SPRING_WORKING_PARENT, + dfe_spring_term_status, +) + +YEAR = 2025 + + +def _age_on_6_october(date_of_birth: int) -> int: + birth_year, month_day = divmod(date_of_birth, 10_000) + return YEAR - birth_year - (1 if month_day > 1006 else 0) + + +def _child_status( + date_of_birth: int, + *, + earnings: tuple[float, ...] = (40_000.0, 30_000.0), + deferred: bool = False, +) -> tuple[dict[str, float], dict[str, float]]: + from policyengine_uk import Simulation + + people = { + f"parent{index}": {"age": {YEAR: 35}, "employment_income": {YEAR: pay}} + for index, pay in enumerate(earnings) + } + child = { + "age": {YEAR: _age_on_6_october(date_of_birth)}, + "date_of_birth": {YEAR: date_of_birth}, + } + if deferred: + child["early_years_school_start_deferred"] = {YEAR: True} + people["child"] = child + simulation = Simulation( + situation={ + "people": people, + "benunits": {"family": {"members": list(people)}}, + "households": { + "home": {"members": list(people), "country": {YEAR: "ENGLAND"}} + }, + } + ) + + def calculate(name: str) -> np.ndarray: + result = simulation.calculate(name, YEAR) + values = ( + np.asarray(result.decode_to_str()) + if hasattr(result, "decode_to_str") + else np.asarray(getattr(result, "values", result)) + ) + # One family and one household, so a group value is every member's. + return np.repeat(values, len(people)) if len(values) == 1 else values + + status = dfe_spring_term_status(calculate, YEAR) + child_row = list(people).index("child") + engine = { + name: float(np.asarray(simulation.calculate(name, YEAR))[child_row]) + for name in ( + "is_child_receiving_universal_childcare", + "is_child_receiving_extended_childcare", + "is_child_receiving_targeted_childcare", + "early_years_term_share_before_school", + ) + } + return {name: float(values[child_row]) for name, values in status.items()}, engine + + +def test_the_engine_year_starts_its_spring_term_on_1_january() -> None: + from policyengine_uk.utils.dates import term_starts + + assert term_starts(YEAR) == (20250401, 20250901, 20260101) + + +def test_the_measures_read_existing_person_or_group_variables() -> None: + from policyengine_uk import CountryTaxBenefitSystem + + variables = CountryTaxBenefitSystem().variables + for name in DFE_SPRING_TERM_ENGINE_INPUTS: + assert name in variables, name + + +@pytest.mark.parametrize( + ("date_of_birth", "expected"), + [ + # Born in 2021 before September: reception from September 2025, so + # not funded in the spring term although the engine funds its summer. + (20210615, {DFE_AGE_AT_31_DECEMBER: 4, DFE_SPRING_UNIVERSAL: 0}), + # Born after 1 September 2021: nursery until September 2026. + (20211015, {DFE_AGE_AT_31_DECEMBER: 4, DFE_SPRING_UNIVERSAL: 1}), + # Three on 31 December 2025 but two on 6 October: funded from January + # under the regulations, and the engine pays no universal hours. + (20221115, {DFE_AGE_AT_31_DECEMBER: 3, DFE_SPRING_UNIVERSAL: 1}), + # Five on 31 December: outside DfE's 3 and 4. + (20200915, {DFE_AGE_AT_31_DECEMBER: 5, DFE_SPRING_UNIVERSAL: 0}), + ], +) +def test_universal_hours_in_the_spring_term(date_of_birth, expected) -> None: + status, engine = _child_status(date_of_birth) + for name, value in expected.items(): + assert status[name] == value, name + if date_of_birth == 20221115: + assert engine["is_child_receiving_universal_childcare"] == 0 + if date_of_birth == 20210615: + assert engine["is_child_receiving_universal_childcare"] == 1 + assert engine["early_years_term_share_before_school"] == pytest.approx(1 / 3) + + +@pytest.mark.parametrize( + ("date_of_birth", "funded"), + [ + # Nine months on 15 November 2025: funded from 1 January 2026. + (20250215, 1), + # Nine months on 15 January 2026: not yet funded in that term. + (20250415, 0), + # In reception from September 2025. + (20210615, 0), + (20221115, 1), + ], +) +def test_working_parent_hours_in_the_spring_term(date_of_birth, funded) -> None: + status, _ = _child_status(date_of_birth) + assert status[DFE_SPRING_WORKING_PARENT] == funded + + +def test_early_learning_for_two_year_olds_follows_dfe_age() -> None: + # A lone parent with no earnings: the family qualifies for the targeted + # offer. Born November 2023, the child is two on 31 December 2025 and + # funded in the spring term, while the engine (age one on 6 October) + # pays it nothing. + status, engine = _child_status(20231115, earnings=(0.0,)) + assert status[DFE_AGE_AT_31_DECEMBER] == 2 + assert status[DFE_SPRING_EARLY_LEARNING_2] == 1 + assert engine["is_child_receiving_targeted_childcare"] == 0 + # A working couple does not qualify; its child takes working-parent hours. + status, _ = _child_status(20231115) + assert status[DFE_SPRING_EARLY_LEARNING_2] == 0 + assert status[DFE_SPRING_WORKING_PARENT] == 1 + + +def test_a_deferred_school_start_keeps_the_spring_term() -> None: + status, engine = _child_status(20210615, deferred=True) + assert engine["early_years_term_share_before_school"] == 1 + assert status[DFE_SPRING_UNIVERSAL] == 1 + assert status[DFE_SPRING_WORKING_PARENT] == 1 + + +@pytest.mark.parametrize("date_of_birth", [20210915, 20211015, 20220315, 20220915]) +def test_at_engine_age_three_or_four_universal_is_the_engines_flag( + date_of_birth, +) -> None: + # The measure departs from the engine only for children the engine still + # gates out on their age at 6 October. + status, engine = _child_status(date_of_birth) + in_nursery = engine["early_years_term_share_before_school"] > 0.5 + assert status[DFE_SPRING_UNIVERSAL] == float( + bool(engine["is_child_receiving_universal_childcare"]) and in_nursery + ) 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 f79fd63b5..da786fa12 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 @@ -1892,3 +1892,124 @@ def test_the_resolver_routes_high_value_home_measures_to_households( assert resolver.entity_for(name) == "household" assert resolver.knows("household", name) assert not resolver.knows("person", name) + + +def _stub_engine_term_calendar(monkeypatch) -> None: + """policyengine-uk's year of terms, without the engine installed.""" + + dates = SimpleNamespace( + term_starts=lambda year: ( + year * 10_000 + 401, + year * 10_000 + 901, + (year + 1) * 10_000 + 101, + ) + ) + utils = SimpleNamespace(dates=dates) + monkeypatch.setitem(sys.modules, "policyengine_uk", SimpleNamespace(utils=utils)) + monkeypatch.setitem(sys.modules, "policyengine_uk.utils", utils) + monkeypatch.setitem(sys.modules, "policyengine_uk.utils.dates", dates) + + +def _spring_term_simulation() -> SimulationStub: + # Person 1 is an adult, person 2 a three-year-old on working-parent hours + # in a family that does not claim the universal hours on their own, and + # person 3 a four-year-old already in reception (a third of the year). + return SimulationStub( + { + "birth_year": ("person", np.array([1990, 2022, 2021])), + "country": ("household", np.array(["ENGLAND", "ENGLAND"])), + "early_years_term_share_before_school": ( + "person", + np.array([1.0, 1.0, 1 / 3], dtype=np.float32), + ), + "is_child_receiving_extended_childcare": ( + "person", + np.array([False, True, True]), + ), + "is_of_compulsory_school_age": ("person", np.array([False] * 3)), + "max_free_entitlement_hours_used": ( + "person", + np.array([30.0, 30.0, 30.0]), + ), + "targeted_childcare_entitlement_eligible": ( + "benunit", + np.array([False, False]), + ), + "would_claim_targeted_childcare": ("benunit", np.array([True, True])), + "would_claim_universal_childcare": ("benunit", np.array([False, True])), + } + ) + + +def test_dfe_spring_term_measures_classify_people_at_the_spring_term(monkeypatch): + _stub_engine_term_calendar(monkeypatch) + frame, simulation = FrameStub(), _spring_term_simulation() + expected = { + "dfe_age_at_31_december": [35.0, 3.0, 4.0], + # The working-parent child keeps its universal hours; the child in + # reception is not funded in the spring term. + "dfe_spring_working_parent": [0.0, 1.0, 0.0], + "dfe_spring_universal": [0.0, 1.0, 0.0], + "dfe_spring_early_learning_2": [0.0, 0.0, 0.0], + } + for variable, values in expected.items(): + computed, route = compute_uk_measure_input( + frame, simulation, "person", variable, 2025 + ) + assert computed.tolist() == values, variable + assert route == f"dfe_spring_term:{variable}" + with pytest.raises(KeyError, match="person-only"): + compute_uk_measure_input( + frame, simulation, "household", "dfe_spring_universal", 2025 + ) + + +def test_dfe_spring_term_measures_refuse_a_moved_term_calendar(monkeypatch): + dates = SimpleNamespace(term_starts=lambda year: (0, 0, year * 10_000 + 901)) + utils = SimpleNamespace(dates=dates) + monkeypatch.setitem(sys.modules, "policyengine_uk", SimpleNamespace(utils=utils)) + monkeypatch.setitem(sys.modules, "policyengine_uk.utils", utils) + monkeypatch.setitem(sys.modules, "policyengine_uk.utils.dates", dates) + with pytest.raises(ValueError, match="April-to-March year"): + compute_uk_measure_input( + FrameStub(), + _spring_term_simulation(), + "person", + "dfe_spring_universal", + 2025, + ) + + +def test_the_resolver_routes_dfe_spring_term_measures_to_people( + monkeypatch, tmp_path: Path +): + from microcosm.build.uk_runtime.dfe_spring_term import DFE_SPRING_TERM_MEASURES + + resolver = _resolver_over(_spring_term_simulation(), monkeypatch, tmp_path) + for name in DFE_SPRING_TERM_MEASURES: + assert resolver.entity_for(name) == "person" + assert resolver.knows("person", name) + assert not resolver.knows("household", name) + # Without one of the engine inputs the route cannot compute, so it is + # not known. + partial = _spring_term_simulation() + del partial.tax_benefit_system.variables["birth_year"] + resolver = _resolver_over(partial, monkeypatch, tmp_path) + assert not resolver.knows("person", "dfe_spring_universal") + + +def test_a_persisted_dfe_spring_term_column_is_refused(monkeypatch, tmp_path: Path): + frame = FrameStub() + frame._tables["person"]["dfe_spring_universal"] = [0.0, 1.0, 0.0] + monkeypatch.setitem( + sys.modules, + "policyengine_uk", + SimpleNamespace(__version__="9.9.9", Microsimulation=lambda *, dataset: None), + ) + with pytest.raises(ValueError, match="must not be persisted"): + UKMeasureResolver( + simulation_source=tmp_path / "input.h5", + scratch_dir=tmp_path, + year=2025, + frame=frame, + ) From bb21768d17ed63ff3334707283d0f798c48144af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 22 Oct 2026 22:37:51 +0100 Subject: [PATCH 12/25] Count DfE spring-term receipt on the gross working-parent hours The engine allocates the universal and targeted hours from a child's gross working-parent hours (extended_childcare_entitlement_total_per_child), not from the net flag, so the claim condition now reads the gross hours. DfE records each child under one entitlement: at DfE age 2 a child counted under early learning for 2-year-olds is not counted again under working parents, and at 3 and 4 a working-parent child is one that uses more than the universal 15 hours, as the engine nets them. The engine tests add families that claim only working-parent hours, the DfE-age-2 corners, the date boundaries, a child outside England and one placed by age alone. Co-Authored-By: Claude Opus 5.5 --- .../build/uk_runtime/dfe_spring_term.py | 52 +++- .../engine/uk/test_uk_dfe_spring_term.py | 244 +++++++++++------- .../uk/test_uk_measure_simulation.py | 13 +- 3 files changed, 202 insertions(+), 107 deletions(-) diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/dfe_spring_term.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/dfe_spring_term.py index dda9f486a..68b2f128a 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/dfe_spring_term.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/dfe_spring_term.py @@ -15,15 +15,21 @@ so it is tested against one half, never for equality. - **Working parent.** Working-parent hours start the term after the child reaches the minimum age (SI 2022/1134 reg 27). The year's eligible terms - always end with the spring term, so an annual receipt before school is a - spring receipt. + always end with the spring term, so a child the engine gives working-parent + hours in the year (its gross total per child) and that is still before + school takes part in the spring term. DfE records each child under one + entitlement: at DfE age 2 a child counted under early learning for + 2-year-olds is not counted again under working parents, and at 3 and 4 a + working-parent child is one that uses more than the universal hours, as the + engine nets them. - **Universal and early learning for 2-year-olds.** These start the term after the third or second birthday, so in the spring term they reach every child of that DfE age. policyengine-uk still gates them on the whole age at 6 October, which leaves out the children born from 7 October to 31 - December. The measures keep the engine's family and claim conditions and - replace only that age gate, so they count the children DfE counts; they do - not change what the engine pays. + December. The measures keep the engine's family and claim conditions (a + claim on their own, or allocation from the gross working-parent hours, as + the engine allocates them) and replace only that age gate, so they count + the children DfE counts; they do not change what the engine pays. - **DfE age** is ``Y - birth_year``, the age on 31 December Y. The take-up flags and family conditions are annual and apply to the spring @@ -45,6 +51,7 @@ "DFE_SPRING_TERM_MEASURES", "DFE_SPRING_UNIVERSAL", "DFE_SPRING_WORKING_PARENT", + "UNIVERSAL_WEEKLY_HOURS", "dfe_spring_term_status", ] @@ -64,15 +71,20 @@ "birth_year", "country", "early_years_term_share_before_school", - "is_child_receiving_extended_childcare", + "extended_childcare_entitlement_total_per_child", "is_of_compulsory_school_age", "max_free_entitlement_hours_used", + "maximum_extended_childcare_hours_usage", "targeted_childcare_entitlement_eligible", "would_claim_targeted_childcare", "would_claim_universal_childcare", ) _UNIVERSAL_DFE_AGES = (3, 4) _EARLY_LEARNING_DFE_AGE = 2 +#: The universal entitlement's weekly hours: 570 a year over 38 weeks +#: (SI 2014/2147 regs 4 and 5). A working-parent child aged 3 or 4 is +#: registered under working parents only if it uses more than these. +UNIVERSAL_WEEKLY_HOURS = 15.0 def _spring_term_start(year: int) -> int: @@ -111,12 +123,19 @@ def dfe_spring_term_status( in_nursery = ( np.asarray(calculate("early_years_term_share_before_school"), dtype=float) > 0.5 ) - uses_hours = ( - np.asarray(calculate("max_free_entitlement_hours_used"), dtype=float) > 0 - ) - working_parent = ( - _flag(calculate("is_child_receiving_extended_childcare")) & in_nursery + child_hours = np.asarray(calculate("max_free_entitlement_hours_used"), dtype=float) + family_hours = np.asarray( + calculate("maximum_extended_childcare_hours_usage"), dtype=float ) + uses_hours = child_hours > 0 + # Gross working-parent hours, before the universal or targeted hours are + # netted out: what the engine allocates those hours from. + takes_part = ( + np.asarray( + calculate("extended_childcare_entitlement_total_per_child"), dtype=float + ) + > 0 + ) & in_nursery in_england = np.asarray(calculate("country")).astype(str) == "ENGLAND" universal = ( in_england @@ -124,13 +143,20 @@ def dfe_spring_term_status( & in_nursery & uses_hours & np.isin(dfe_age, _UNIVERSAL_DFE_AGES) - & (_flag(calculate("would_claim_universal_childcare")) | working_parent) + & (_flag(calculate("would_claim_universal_childcare")) | takes_part) ) early_learning_2 = ( _flag(calculate("targeted_childcare_entitlement_eligible")) + & in_nursery & uses_hours & (dfe_age == _EARLY_LEARNING_DFE_AGE) - & (_flag(calculate("would_claim_targeted_childcare")) | working_parent) + & (_flag(calculate("would_claim_targeted_childcare")) | takes_part) + ) + beyond_universal = np.minimum(child_hours, family_hours) > UNIVERSAL_WEEKLY_HOURS + working_parent = takes_part & np.select( + [dfe_age < _EARLY_LEARNING_DFE_AGE, dfe_age == _EARLY_LEARNING_DFE_AGE], + [True, ~early_learning_2], + default=beyond_universal, ) return { DFE_AGE_AT_31_DECEMBER: dfe_age, diff --git a/packages/microcosm-build/tests/engine/uk/test_uk_dfe_spring_term.py b/packages/microcosm-build/tests/engine/uk/test_uk_dfe_spring_term.py index 8888434a0..712049d77 100644 --- a/packages/microcosm-build/tests/engine/uk/test_uk_dfe_spring_term.py +++ b/packages/microcosm-build/tests/engine/uk/test_uk_dfe_spring_term.py @@ -11,10 +11,21 @@ DFE_SPRING_TERM_ENGINE_INPUTS, DFE_SPRING_UNIVERSAL, DFE_SPRING_WORKING_PARENT, + UNIVERSAL_WEEKLY_HOURS, dfe_spring_term_status, ) YEAR = 2025 +WORKING_COUPLE = (40_000.0, 30_000.0) +#: A lone parent on Universal Credit earning enough for working-parent hours +#: and little enough for early learning for 2-year-olds. +LOW_PAID_LONE_PARENT = (12_000.0,) +_SPRING = ( + DFE_AGE_AT_31_DECEMBER, + DFE_SPRING_WORKING_PARENT, + DFE_SPRING_UNIVERSAL, + DFE_SPRING_EARLY_LEARNING_2, +) def _age_on_6_october(date_of_birth: int) -> int: @@ -22,31 +33,41 @@ def _age_on_6_october(date_of_birth: int) -> int: return YEAR - birth_year - (1 if month_day > 1006 else 0) -def _child_status( - date_of_birth: int, - *, - earnings: tuple[float, ...] = (40_000.0, 30_000.0), +def _children( + *dates_of_birth: int, + earnings: tuple[float, ...] = WORKING_COUPLE, + claims: dict[str, bool] | None = None, + hours: float | None = None, + country: str = "ENGLAND", deferred: bool = False, -) -> tuple[dict[str, float], dict[str, float]]: + give_date_of_birth: bool = True, +) -> list[dict[str, float]]: + """Each child's spring-term status, with the engine's own amounts.""" + from policyengine_uk import Simulation people = { f"parent{index}": {"age": {YEAR: 35}, "employment_income": {YEAR: pay}} for index, pay in enumerate(earnings) } - child = { - "age": {YEAR: _age_on_6_october(date_of_birth)}, - "date_of_birth": {YEAR: date_of_birth}, - } - if deferred: - child["early_years_school_start_deferred"] = {YEAR: True} - people["child"] = child + for index, date_of_birth in enumerate(dates_of_birth): + child = {"age": {YEAR: _age_on_6_october(date_of_birth)}} + if give_date_of_birth: + child["date_of_birth"] = {YEAR: date_of_birth} + if hours is not None: + child["max_free_entitlement_hours_used"] = {YEAR: hours} + if deferred: + child["early_years_school_start_deferred"] = {YEAR: True} + people[f"child{index}"] = child + family = {"members": list(people)} + for name, value in (claims or {}).items(): + family[name] = {YEAR: value} simulation = Simulation( situation={ "people": people, - "benunits": {"family": {"members": list(people)}}, + "benunits": {"family": family}, "households": { - "home": {"members": list(people), "country": {YEAR: "ENGLAND"}} + "home": {"members": list(people), "country": {YEAR: country}} }, } ) @@ -62,17 +83,23 @@ def calculate(name: str) -> np.ndarray: return np.repeat(values, len(people)) if len(values) == 1 else values status = dfe_spring_term_status(calculate, YEAR) - child_row = list(people).index("child") + rows = [list(people).index(f"child{i}") for i in range(len(dates_of_birth))] engine = { - name: float(np.asarray(simulation.calculate(name, YEAR))[child_row]) + name: np.asarray(simulation.calculate(name, YEAR), dtype=float) for name in ( - "is_child_receiving_universal_childcare", - "is_child_receiving_extended_childcare", - "is_child_receiving_targeted_childcare", + "universal_childcare_entitlement", + "targeted_childcare_entitlement", + "extended_childcare_entitlement_per_child", "early_years_term_share_before_school", ) } - return {name: float(values[child_row]) for name, values in status.items()}, engine + return [ + { + **{name: float(status[name][row]) for name in _SPRING}, + **{name: float(values[row]) for name, values in engine.items()}, + } + for row in rows + ] def test_the_engine_year_starts_its_spring_term_on_1_january() -> None: @@ -81,87 +108,120 @@ def test_the_engine_year_starts_its_spring_term_on_1_january() -> None: assert term_starts(YEAR) == (20250401, 20250901, 20260101) -def test_the_measures_read_existing_person_or_group_variables() -> None: +def test_the_measures_read_existing_variables() -> None: from policyengine_uk import CountryTaxBenefitSystem - variables = CountryTaxBenefitSystem().variables + system = CountryTaxBenefitSystem() for name in DFE_SPRING_TERM_ENGINE_INPUTS: - assert name in variables, name + assert name in system.variables, name + universal = system.parameters(f"{YEAR}-04-30").gov.dfe + weekly = universal.universal_childcare_entitlement.hours / universal.weeks_per_year + assert weekly == UNIVERSAL_WEEKLY_HOURS + + +def test_universal_hours_follow_dfe_age_and_school_start() -> None: + # Born on 31 August 2021 the child starts reception in September 2025; + # born on 1 September it stays in nursery until September 2026. + in_reception, in_nursery = _children(20210831, 20210901) + assert ( + in_reception[DFE_AGE_AT_31_DECEMBER] == in_nursery[DFE_AGE_AT_31_DECEMBER] == 4 + ) + assert in_reception[DFE_SPRING_UNIVERSAL] == 0 + assert in_reception["early_years_term_share_before_school"] == pytest.approx(1 / 3) + assert in_nursery[DFE_SPRING_UNIVERSAL] == 1 + # Three on 31 December whether born on 6 or 7 October 2022, though the + # engine pays the second no universal hours (two on 6 October). + sixth, seventh = _children(20221006, 20221007) + assert sixth[DFE_SPRING_UNIVERSAL] == seventh[DFE_SPRING_UNIVERSAL] == 1 + assert sixth["universal_childcare_entitlement"] > 0 + assert seventh["universal_childcare_entitlement"] == 0 + # 31 December 2022 is three on 31 December 2025; 1 January 2023 is two. + older, younger = _children(20221231, 20230101) + assert (older[DFE_AGE_AT_31_DECEMBER], younger[DFE_AGE_AT_31_DECEMBER]) == (3, 2) + assert (older[DFE_SPRING_UNIVERSAL], younger[DFE_SPRING_UNIVERSAL]) == (1, 0) + + +def test_working_parent_hours_start_the_term_after_nine_months() -> None: + # Nine months on 31 December 2025: funded from 1 January 2026. Nine + # months on 1 January 2026: not yet funded in that term. + funded, not_yet = _children(20250331, 20250401) + assert funded[DFE_AGE_AT_31_DECEMBER] == not_yet[DFE_AGE_AT_31_DECEMBER] == 0 + assert (funded[DFE_SPRING_WORKING_PARENT], not_yet[DFE_SPRING_WORKING_PARENT]) == ( + 1, + 0, + ) -@pytest.mark.parametrize( - ("date_of_birth", "expected"), - [ - # Born in 2021 before September: reception from September 2025, so - # not funded in the spring term although the engine funds its summer. - (20210615, {DFE_AGE_AT_31_DECEMBER: 4, DFE_SPRING_UNIVERSAL: 0}), - # Born after 1 September 2021: nursery until September 2026. - (20211015, {DFE_AGE_AT_31_DECEMBER: 4, DFE_SPRING_UNIVERSAL: 1}), - # Three on 31 December 2025 but two on 6 October: funded from January - # under the regulations, and the engine pays no universal hours. - (20221115, {DFE_AGE_AT_31_DECEMBER: 3, DFE_SPRING_UNIVERSAL: 1}), - # Five on 31 December: outside DfE's 3 and 4. - (20200915, {DFE_AGE_AT_31_DECEMBER: 5, DFE_SPRING_UNIVERSAL: 0}), - ], -) -def test_universal_hours_in_the_spring_term(date_of_birth, expected) -> None: - status, engine = _child_status(date_of_birth) - for name, value in expected.items(): - assert status[name] == value, name - if date_of_birth == 20221115: - assert engine["is_child_receiving_universal_childcare"] == 0 - if date_of_birth == 20210615: - assert engine["is_child_receiving_universal_childcare"] == 1 - assert engine["early_years_term_share_before_school"] == pytest.approx(1 / 3) +def test_a_family_that_claims_only_working_parent_hours_is_counted() -> None: + # The engine allocates the universal and targeted hours from the gross + # working-parent hours to a family that does not claim them on their own. + (universal_child,) = _children( + 20220515, claims={"would_claim_universal_childcare": False}, hours=12 + ) + assert universal_child["universal_childcare_entitlement"] > 0 + assert universal_child[DFE_SPRING_UNIVERSAL] == 1 + # Twelve hours is within the universal 15, so not a working-parent child. + assert universal_child[DFE_SPRING_WORKING_PARENT] == 0 + (two_year_old,) = _children( + 20230515, + earnings=LOW_PAID_LONE_PARENT, + claims={"would_claim_targeted_childcare": False}, + ) + assert two_year_old["targeted_childcare_entitlement"] > 0 + assert two_year_old[DFE_SPRING_EARLY_LEARNING_2] == 1 + assert two_year_old[DFE_SPRING_WORKING_PARENT] == 0 + + +def test_dfe_counts_a_two_year_old_under_one_entitlement() -> None: + # Two on 31 December but one on 6 October: the engine gives working-parent + # hours and no targeted hours, but DfE records the child under early + # learning for 2-year-olds only. + (child,) = _children(20231115, earnings=LOW_PAID_LONE_PARENT) + assert child["extended_childcare_entitlement_per_child"] > 0 + assert child[DFE_SPRING_EARLY_LEARNING_2] == 1 + assert child[DFE_SPRING_WORKING_PARENT] == 0 + # Three on 31 December but two on 6 October: the engine nets the + # targeted hours, but in the spring term the child takes universal and + # working-parent hours. + (child,) = _children(20221115, earnings=LOW_PAID_LONE_PARENT) + assert child["extended_childcare_entitlement_per_child"] == 0 + assert child[DFE_SPRING_WORKING_PARENT] == 1 + assert child[DFE_SPRING_UNIVERSAL] == 1 + assert child[DFE_SPRING_EARLY_LEARNING_2] == 0 @pytest.mark.parametrize( - ("date_of_birth", "funded"), - [ - # Nine months on 15 November 2025: funded from 1 January 2026. - (20250215, 1), - # Nine months on 15 January 2026: not yet funded in that term. - (20250415, 0), - # In reception from September 2025. - (20210615, 0), - (20221115, 1), - ], + "dates_of_birth", + [(20231115,), (20230515,), (20221115, 20231115), (20220101, 20230701, 20240301)], ) -def test_working_parent_hours_in_the_spring_term(date_of_birth, funded) -> None: - status, _ = _child_status(date_of_birth) - assert status[DFE_SPRING_WORKING_PARENT] == funded - - -def test_early_learning_for_two_year_olds_follows_dfe_age() -> None: - # A lone parent with no earnings: the family qualifies for the targeted - # offer. Born November 2023, the child is two on 31 December 2025 and - # funded in the spring term, while the engine (age one on 6 October) - # pays it nothing. - status, engine = _child_status(20231115, earnings=(0.0,)) - assert status[DFE_AGE_AT_31_DECEMBER] == 2 - assert status[DFE_SPRING_EARLY_LEARNING_2] == 1 - assert engine["is_child_receiving_targeted_childcare"] == 0 - # A working couple does not qualify; its child takes working-parent hours. - status, _ = _child_status(20231115) - assert status[DFE_SPRING_EARLY_LEARNING_2] == 0 - assert status[DFE_SPRING_WORKING_PARENT] == 1 +@pytest.mark.parametrize("earnings", [WORKING_COUPLE, LOW_PAID_LONE_PARENT]) +def test_no_child_is_counted_under_two_dfe_entitlements_at_age_two( + dates_of_birth, earnings +) -> None: + for child in _children(*dates_of_birth, earnings=earnings): + assert not ( + child[DFE_SPRING_WORKING_PARENT] and child[DFE_SPRING_EARLY_LEARNING_2] + ) def test_a_deferred_school_start_keeps_the_spring_term() -> None: - status, engine = _child_status(20210615, deferred=True) - assert engine["early_years_term_share_before_school"] == 1 - assert status[DFE_SPRING_UNIVERSAL] == 1 - assert status[DFE_SPRING_WORKING_PARENT] == 1 - - -@pytest.mark.parametrize("date_of_birth", [20210915, 20211015, 20220315, 20220915]) -def test_at_engine_age_three_or_four_universal_is_the_engines_flag( - date_of_birth, -) -> None: - # The measure departs from the engine only for children the engine still - # gates out on their age at 6 October. - status, engine = _child_status(date_of_birth) - in_nursery = engine["early_years_term_share_before_school"] > 0.5 - assert status[DFE_SPRING_UNIVERSAL] == float( - bool(engine["is_child_receiving_universal_childcare"]) and in_nursery - ) + (child,) = _children(20210615, deferred=True) + assert child["early_years_term_share_before_school"] == 1 + assert child[DFE_SPRING_UNIVERSAL] == 1 + assert child[DFE_SPRING_WORKING_PARENT] == 1 + + +def test_outside_england_no_dfe_entitlement_is_counted() -> None: + (child,) = _children(20211015, country="WALES") + assert child[DFE_SPRING_UNIVERSAL] == 0 + assert child[DFE_SPRING_WORKING_PARENT] == 0 + assert child[DFE_SPRING_EARLY_LEARNING_2] == 0 + + +def test_a_child_placed_by_age_alone_is_classified() -> None: + # Without a date of birth the engine places a whole age of 3 at the + # middle of the year (born in April 2022), so it is three on 31 December. + (child,) = _children(20220101, give_date_of_birth=False) + assert child[DFE_AGE_AT_31_DECEMBER] == 3 + assert child[DFE_SPRING_UNIVERSAL] == 1 + assert child[DFE_SPRING_WORKING_PARENT] == 1 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 da786fa12..ec5ca8fe1 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 @@ -1922,15 +1922,24 @@ def _spring_term_simulation() -> SimulationStub: "person", np.array([1.0, 1.0, 1 / 3], dtype=np.float32), ), - "is_child_receiving_extended_childcare": ( + "extended_childcare_entitlement_total_per_child": ( "person", - np.array([False, True, True]), + np.array([0.0, 6_000.0, 2_000.0]), ), "is_of_compulsory_school_age": ("person", np.array([False] * 3)), "max_free_entitlement_hours_used": ( "person", np.array([30.0, 30.0, 30.0]), ), + "maximum_extended_childcare_hours_usage": ( + "benunit", + np.array([30.0, 30.0]), + ), + # A numeric group value reaches people through map_to. + ("maximum_extended_childcare_hours_usage", "person"): ( + "person", + np.array([30.0, 30.0, 30.0]), + ), "targeted_childcare_entitlement_eligible": ( "benunit", np.array([False, False]), From 68f2cba62729d8c2cb25e106d6d89044230af50a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 22 Oct 2026 22:48:03 +0100 Subject: [PATCH 13/25] Fit the childcare rates at the spring term, with an under-2 usage share (tool version 6) The fitter measures the DfE rows through dfe_spring_term_status at model year 2025, whose spring term is the one DfE's January census counts, and no longer reads current_education. It fits a fifth rate, the share of children under 2 who use the hours their family's working-parent claim gives them, against the working parent rows at 9 to 11 months and age 1: each side's contributions from children under 2 are scaled by it, so every row stays linear in the rates. Working parent ages 2 and 3 and universal nursery age 3 are reported beside the fit, not fitted. The receipt records the expectation basis, what each rate estimates (the Tax-Free Childcare rate is a fit to HMRC's two rows, not a take-up estimate for newly eligible families: Vahid's round-2 finding C), and which rates sit at a bound. The fitter refuses a spine without stored birth months. The contract refuses a version-6 receipt without its estimand, or one at its own bound without a reason. Co-Authored-By: Claude Opus 5.5 --- .../build/uk_runtime/take_up_contract.py | 21 ++ .../uk/test_uk_stochastic_tools.py | 60 ++- .../uk/test_uk_take_up_contract.py | 37 ++ tools/fit_uk_childcare_takeup.py | 349 ++++++++++++++---- 4 files changed, 389 insertions(+), 78 deletions(-) diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/take_up_contract.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/take_up_contract.py index da572780f..ef8a4fef9 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/take_up_contract.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/take_up_contract.py @@ -32,6 +32,8 @@ UK_ALLOWED_RATE_ENTITIES = frozenset({"person", "benunit", "household"}) # The childcare fitter's first version to fit a nested entry's conditional rate. NESTED_RATE_MIN_TOOL_VERSION = 5 +# The childcare fitter's first version to record what each rate estimates. +ESTIMAND_MIN_TOOL_VERSION = 6 @dataclass(frozen=True) @@ -232,6 +234,25 @@ def _validate_fitting_receipt(key: str, receipt: object) -> None: "name the engine the rate was fitted on; a hermetic receipt " "(engine absent) cannot be landed." ) + tool_version = receipt.get("tool_version") + if ( + isinstance(tool_version, int) + and not isinstance(tool_version, bool) + and tool_version >= ESTIMAND_MIN_TOOL_VERSION + ): + estimand = receipt.get("estimand") + if not isinstance(estimand, str) or not estimand.strip(): + raise ValueError( + f"UK take-up contract {key!r} fitting_receipt of tool version " + f"{tool_version} must say what the rate estimates (estimand)." + ) + at_bound = receipt.get("params_at_bound") or () + reason = receipt.get("at_bound_reason") + if key in at_bound and (not isinstance(reason, str) or not reason.strip()): + raise ValueError( + f"UK take-up contract {key!r} was fitted at a bound of [0, 1], so " + "its fitting_receipt must give an at_bound_reason." + ) def _validate_nested_rate_receipt(key: str, receipt: object) -> None: diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_stochastic_tools.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_stochastic_tools.py index de8cb6842..da083ee04 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_stochastic_tools.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_stochastic_tools.py @@ -52,7 +52,7 @@ def forbidden_seed(*args, **kwargs): & ~first["would_claim_universal_childcare"] ).any() nested = tool.draw_childcare_inputs( - ids, np.array([0.5, 1.0, 0.5, 0.0]), seed=42, contract=contract + ids, np.array([0.5, 1.0, 0.5, 0.0, 0.5]), seed=42, contract=contract ) assert nested["would_claim_universal_childcare"].all() @@ -68,7 +68,7 @@ def test_childcare_fit_receipt_is_deterministic_with_seeded_runner( def runner(path: Path, params: np.ndarray, seed: int, period: int, contract): scale = float(params.sum()) + seed * 0.0 + len(path.read_bytes()) * 0.0 - assert period == 2024 + assert period == tool.DEFAULT_TARGET_PERIOD == 2025 assert contract.resource_sha256 return {name: value + scale * 0.0 for name, value in targets.items()} @@ -93,8 +93,20 @@ def runner(path: Path, params: np.ndarray, seed: int, period: int, contract): assert first["input_sha256"] assert first["seed"] == 42 assert set(first["params"]) == set(tool.RATE_KEYS) - assert len(first["params"]) == 4 + assert len(first["params"]) == 5 assert set(first["achieved"]) == set(tool.TARGET_IDS) + assert first["tool_version"] == 6 + assert first["expectation_basis"] == "dfe_spring_term" + assert set(first["estimands"]) == set(tool.RATE_KEYS) + # Vahid's round-2 finding C: the receipt says the Tax-Free Childcare rate + # is a fit to HMRC's rows, not a take-up estimate for newly eligible + # families. + assert "not a take-up estimate" in first["estimands"]["tax_free_childcare"] + assert first["params_at_bound"] == sorted( + key + for key, value in first["params"].items() + if value <= tool.AT_BOUND_TOLERANCE or value >= 1 - tool.AT_BOUND_TOLERANCE + ) def test_childcare_expected_counts_are_bilinear_in_the_extended_rate() -> None: @@ -156,6 +168,41 @@ def test_childcare_expected_counts_are_bilinear_in_the_extended_rate() -> None: assert allocated_only["dfe.funded_childcare.early_learning_2_year_olds"] == 1.0 +def test_childcare_expected_counts_scale_under_two_children_by_their_usage() -> None: + """Tool version 6: a child under 2 counts only when it uses its hours, so + each side's under-2 part is scaled by the usage share.""" + + tool = _load_tool("fit_uk_childcare_takeup") + nine_to_eleven = "dfe.funded_childcare.working_parent_children_9_to_11_months" + two_to_four = "dfe.funded_childcare.working_parent_children_2_to_4" + # Two working-parent children: one under 2 (whole-year age 1, but 2 on + # 31 December, so in the 2 to 4 row) and one aged 3; and a baby. + with_ext = { + "hmrc.tfc.government_top_up": np.array([0.0, 0.0, 0.0]), + two_to_four: np.array([1.0, 1.0, 0.0]), + nine_to_eleven: np.array([0.0, 0.0, 1.0]), + } + under_two = { + "with_extended": { + two_to_four: np.array([1.0, 0.0, 0.0]), + nine_to_eleven: np.array([0.0, 0.0, 1.0]), + } + } + basis = tool.ChildcareExpectationBasis( + with_extended=with_ext, + without_extended=with_ext, + allocated_from_extended={}, + rows=3, + under_two=under_two, + ) + expected = tool.expected_childcare_counts( + basis, np.array([1.0, 0.8, 1.0, 1.0, 0.5]) + ) + assert expected[two_to_four] == pytest.approx(0.8 * (1.0 + 0.5 * 1.0)) + assert expected[nine_to_eleven] == pytest.approx(0.8 * 0.5) + assert basis.total("with_extended", two_to_four, 0.0) == 1.0 + + def test_the_fit_draws_extended_hours_at_the_contract_anchor() -> None: """The spine predates the anchor, so the fit sets the hours the take-up stage draws under the current contract (microcosm#1095, #1126).""" @@ -194,6 +241,13 @@ def test_childcare_fitter_family_allow_list_excludes_entitlement_spending() -> N "dfe.funded_childcare.working_parent_children_2_to_4", "dfe.funded_childcare.early_learning_2_year_olds", "dfe.funded_childcare.universal_only_children", + "dfe.funded_childcare.working_parent_children_9_to_11_months", + "dfe.funded_childcare.working_parent_children_age_1", + ) + assert tool.DIAGNOSTIC_IDS == ( + "dfe.funded_childcare.working_parent_children_age_2", + "dfe.funded_childcare.working_parent_children_age_3", + "dfe.funded_childcare.universal_nursery_children_age_3", ) assert not any("spending" in target_id for target_id in tool.TARGET_IDS[1:]) 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 d22849a3d..dfcaf8d13 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 @@ -270,3 +270,40 @@ def test_extended_hours_usage_reproduces_dfe_additional_hours_ptes() -> None: ) dfe_mean_hours = 15 + 15 * 341_988.09 / 379_000 assert draws.mean() == pytest.approx(dfe_mean_hours, abs=0.01) + + +def test_a_version_6_receipt_says_what_it_estimates_and_why_it_sits_at_a_bound() -> ( + None +): + from microcosm.build.uk_runtime.take_up_contract import ( + ESTIMAND_MIN_TOOL_VERSION, + _entries, + ) + + entry = { + "key": "tax_free_childcare", + "output": "would_claim_tfc", + "entity": "benunit", + "values": {"2024-04-06": 0.99}, + "source": {"source": "fit", "status": "fitted_offline"}, + "fitting_receipt": { + "engine_version": "2.147.2", + "tool_version": ESTIMAND_MIN_TOOL_VERSION, + }, + } + with pytest.raises(ValueError, match="estimand"): + _entries([entry], section="programs") + entry["fitting_receipt"]["estimand"] = "A fit to HMRC's two rows." + assert _entries([entry], section="programs") + entry["fitting_receipt"]["params_at_bound"] = ["tax_free_childcare"] + with pytest.raises(ValueError, match="at_bound_reason"): + _entries([entry], section="programs") + entry["fitting_receipt"]["at_bound_reason"] = "The rows ask for more than all." + assert _entries([entry], section="programs") + # Another rate at its bound needs no reason here. + entry["fitting_receipt"]["params_at_bound"] = ["universal_childcare"] + del entry["fitting_receipt"]["at_bound_reason"] + assert _entries([entry], section="programs") + # Earlier receipts are unaffected. + entry["fitting_receipt"] = {"engine_version": "2.134.4", "tool_version": 5} + assert _entries([entry], section="programs") diff --git a/tools/fit_uk_childcare_takeup.py b/tools/fit_uk_childcare_takeup.py index 378f06e82..9e70a3856 100644 --- a/tools/fit_uk_childcare_takeup.py +++ b/tools/fit_uk_childcare_takeup.py @@ -1,4 +1,4 @@ -"""Fit four UK childcare take-up rates against the declared target registry.""" +"""Fit the UK childcare take-up rates against the declared target registry.""" from __future__ import annotations @@ -23,6 +23,13 @@ clipped_normal_from_uniforms, stable_identity_uniforms, ) +from microcosm.build.uk_runtime.dfe_spring_term import ( + DFE_AGE_AT_31_DECEMBER, + DFE_SPRING_EARLY_LEARNING_2, + DFE_SPRING_UNIVERSAL, + DFE_SPRING_WORKING_PARENT, + dfe_spring_term_status, +) from microcosm.build.uk_runtime.frs_take_up import ( UK_TAKE_UP_DECLARED_SEEDS, nest_universal_childcare, @@ -34,22 +41,74 @@ ) from microcosm.calibrate import TargetRegistry -TOOL_VERSION = 5 +TOOL_VERSION = 6 +#: The model year the DfE rows are measured in: its spring term (January of +#: the next calendar year) is the term DfE's January census counts, and from +#: it working-parent hours reach children from 9 months. +DEFAULT_TARGET_PERIOD = 2025 +#: The share of children under 2 who use the hours their family's +#: working-parent claim gives them (DfE registers far fewer of the youngest +#: eligible children than of those aged 2 to 4). +UNDER_TWO_KEY = "childcare_under_two_usage" +#: Children of whole-year age under this take the under-2 usage draw. +UNDER_TWO_AGE = 2 +#: The hours a child that uses its funded hours is given in the basis runs: +#: policyengine-uk's own default for max_free_entitlement_hours_used. +USES_HOURS = 30.0 TARGET_IDS = ( "hmrc.tfc.government_top_up", "hmrc.tfc.children_with_used_accounts", "dfe.funded_childcare.working_parent_children_2_to_4", "dfe.funded_childcare.early_learning_2_year_olds", "dfe.funded_childcare.universal_only_children", + "dfe.funded_childcare.working_parent_children_9_to_11_months", + "dfe.funded_childcare.working_parent_children_age_1", +) +#: Bound in calibration beside the fitted rows, which already fix them; the +#: receipt reports their expectation at the fitted rates. +DIAGNOSTIC_IDS = ( + "dfe.funded_childcare.working_parent_children_age_2", + "dfe.funded_childcare.working_parent_children_age_3", + "dfe.funded_childcare.universal_nursery_children_age_3", ) RATE_KEYS = ( "tax_free_childcare", "extended_childcare", "targeted_childcare", "universal_childcare", + UNDER_TWO_KEY, ) -INITIAL_PARAMS = np.array([0.88, 0.812, 0.597, 0.563], dtype=float) -BOUNDS = ((0.0, 1.0),) * 4 +INITIAL_PARAMS = np.array([0.88, 0.812, 0.597, 0.563, 0.6], dtype=float) +BOUNDS = ((0.0, 1.0),) * len(RATE_KEYS) +#: What each fitted rate estimates, as the receipt records it. +ESTIMANDS = { + "tax_free_childcare": ( + "The rate at which the spine reproduces HMRC's two Tax-Free Childcare rows " + "(children with used accounts and the government top-up) given the other " + "childcare rates: a fit across all users that trades the two rows against " + "each other, not a take-up estimate for families newly eligible above " + "£100,000, which a costing that removes the limit assumes equal to it." + ), + "extended_childcare": ( + "The share of benefit units that claim working-parent hours, fitted to DfE's " + "working parent registrations aged 2 to 4 at the spring term." + ), + "targeted_childcare": ( + "The share of qualifying benefit units that claim early learning for " + "2-year-olds on their own, fitted to DfE's registrations at the spring term." + ), + "universal_childcare": ( + "The universal claim rate among benefit units that do not claim working-parent " + "hours (nested), fitted to DfE's universal-only registrations at the spring " + "term." + ), + UNDER_TWO_KEY: ( + "The share of children under 2 (whole-year age) who use the hours their " + "family's working-parent claim gives them, fitted to DfE's working parent " + "registrations at 9 to 11 months and at age 1 at the spring term." + ), +} +AT_BOUND_TOLERANCE = 1e-4 SimulationRunner = Callable[ [Path, np.ndarray, int, int, UKTakeUpContract], Mapping[str, float] ] @@ -65,8 +124,10 @@ def draw_childcare_inputs( """Identity-keyed flags with the hours distribution fixed (diagnostic helper; the fit itself uses the expected-count objective).""" ids = np.asarray(benunit_ids) - if np.asarray(params).shape != (4,): - raise ValueError("childcare fitter accepts exactly four take-up rates") + if np.asarray(params).shape != (len(RATE_KEYS),): + raise ValueError( + f"childcare fitter accepts exactly {len(RATE_KEYS)} take-up rates" + ) outputs = {} names = ( "would_claim_tfc", @@ -74,7 +135,7 @@ def draw_childcare_inputs( "would_claim_targeted_childcare", "would_claim_universal_childcare", ) - for output, rate in zip(names, params, strict=True): + for output, rate in zip(names, np.asarray(params)[: len(names)], strict=True): draws = stable_identity_uniforms(ids, seed=seed, salt=output) if output == "would_claim_universal_childcare": # Nested under the extended flag, as frs_take_up draws it: the @@ -103,20 +164,22 @@ def compile_childcare_targets( target_period: int, vintage_overrides: Mapping[str, int], ) -> TargetRegistry: - """Compile only the five declared childcare rows, with explicit overrides.""" + """Compile the declared childcare rows (fitted and diagnostic), with + explicit overrides.""" + declared = (*TARGET_IDS, *DIAGNOSTIC_IDS) references = { r.name: r for r in load_country_spec("uk").target_references - if r.name in TARGET_IDS + if r.name in declared } - missing = sorted(set(TARGET_IDS) - references.keys()) + missing = sorted(set(declared) - references.keys()) if missing: raise ValueError(f"childcare target declarations are missing: {missing}") - unknown = sorted(set(vintage_overrides) - set(TARGET_IDS)) + unknown = sorted(set(vintage_overrides) - set(declared)) if unknown: raise ValueError(f"unknown childcare vintage override target ids: {unknown}") specs = [] - for target_id in TARGET_IDS: + for target_id in declared: reference = references[target_id] period = vintage_overrides.get(target_id, target_period) restamped = LedgerTargetReference(**{**reference.__dict__, "period": period}) @@ -134,7 +197,7 @@ def fit_childcare_takeup( *, ledger_facts: Path | None = None, ledger_facts_sha256: str | None = None, - target_period: int = 2024, + target_period: int = DEFAULT_TARGET_PERIOD, vintage_overrides: Mapping[str, int] | None = None, seed: int = 0, maxiter: int = 50, @@ -156,7 +219,9 @@ def fit_childcare_takeup( registry = compile_childcare_targets( artifact.facts, target_period=target_period, vintage_overrides=overrides ) - targets = {spec.name: float(spec.value) for spec in registry.specs} + compiled = {spec.name: float(spec.value) for spec in registry.specs} + targets = {name: compiled[name] for name in TARGET_IDS} + diagnostic_targets = {name: compiled[name] for name in DIAGNOSTIC_IDS} registry_version = registry.version feed_sha256 = artifact.facts_sha256 target_metadata = { @@ -171,8 +236,10 @@ def fit_childcare_takeup( else: if set(targets) != set(TARGET_IDS): raise ValueError( - "childcare targets must contain exactly the five target ids" + f"childcare targets must contain exactly the {len(TARGET_IDS)} " + "fitted target ids" ) + diagnostic_targets = {} feed_sha256 = ledger_facts_sha256 or "test-injected" registry_version = registry_version or "test-injected" target_metadata = { @@ -198,6 +265,12 @@ def objective(params: np.ndarray) -> float: options={"maxiter": maxiter, "eps": eps}, ) achieved = dict(runner(input_h5, result.x, seed, target_period, contract)) + params = dict(zip(RATE_KEYS, map(float, result.x), strict=True)) + at_bound = sorted( + key + for key, value in params.items() + if value <= AT_BOUND_TOLERANCE or value >= 1.0 - AT_BOUND_TOLERANCE + ) return { "tool": "fit_uk_childcare_takeup", @@ -206,6 +279,7 @@ def objective(params: np.ndarray) -> float: "input_sha256": _sha256(input_h5), "seed": seed, "objective": "expected_count", + "expectation_basis": "dfe_spring_term", "generated_at": generated_at or datetime.now(UTC).date().isoformat(), "model_period": target_period, "vintage_overrides": overrides, @@ -220,7 +294,9 @@ def objective(params: np.ndarray) -> float: "success": bool(result.success), "loss": float(result.fun), }, - "params": dict(zip(RATE_KEYS, map(float, result.x), strict=True)), + "params": params, + "params_at_bound": at_bound, + "estimands": dict(ESTIMANDS), "targets": target_metadata, "achieved": { name: { @@ -230,6 +306,15 @@ def objective(params: np.ndarray) -> float: } for name in TARGET_IDS }, + "diagnostic_rows": { + name: { + "value": float(achieved[name]), + "target": float(diagnostic_targets[name]), + "ratio": float(achieved[name]) / float(diagnostic_targets[name]), + } + for name in DIAGNOSTIC_IDS + if name in achieved and name in diagnostic_targets + }, "ceilings_at_rate_1": _ceilings(input_h5, target_period, targets), } @@ -258,7 +343,7 @@ def _ceilings( basis = _BASIS_CACHE.get((str(Path(input_h5).resolve()), int(target_period))) if basis is None: return None - ceiling = expected_childcare_counts(basis, np.ones(4)) + ceiling = expected_childcare_counts(basis, np.ones(len(RATE_KEYS))) return { name: {"value": ceiling[name], "ratio": ceiling[name] / float(targets[name])} for name in TARGET_IDS @@ -277,6 +362,11 @@ def _ceilings( "dfe.funded_childcare.working_parent_children_2_to_4": "extended_childcare", "dfe.funded_childcare.early_learning_2_year_olds": "targeted_childcare", "dfe.funded_childcare.universal_only_children": "universal_childcare", + "dfe.funded_childcare.working_parent_children_9_to_11_months": "extended_childcare", + "dfe.funded_childcare.working_parent_children_age_1": "extended_childcare", + "dfe.funded_childcare.working_parent_children_age_2": "extended_childcare", + "dfe.funded_childcare.working_parent_children_age_3": "extended_childcare", + "dfe.funded_childcare.universal_nursery_children_age_3": "universal_childcare", } @@ -303,14 +393,24 @@ class ChildcareExpectationBasis: ``r_e * sum(with_ext)``. The universal row counts universal-only children, so every side leaves out a child who receives extended hours; under the nesting a family claiming the extended hours never has the universal flag - off, so the row has no allocated term. The expectation is the + off, so the row has no allocated term. From tool version 6 the DfE rows + are measured at the spring term by the age on 31 December + (dfe_spring_term.py), and ``under_two`` holds each side's contributions + from children under 2, whom the under-2 usage share ``s`` scales: every + ``sum`` above is ``sum(rest) + s * sum(under_two)``. The expectation is the quantity a take-up *rate* controls: the spine's persisted flags are one draw from it, and later stages clone and re-key rows, so no re-drawn realisation can sit on the build's own; the expectation can. """ - __slots__ = ("with_extended", "without_extended", "allocated_from_extended", "rows") + __slots__ = ( + "with_extended", + "without_extended", + "allocated_from_extended", + "under_two", + "rows", + ) def __init__( self, @@ -319,44 +419,71 @@ def __init__( without_extended: Mapping[str, np.ndarray], allocated_from_extended: Mapping[str, np.ndarray], rows: int, + under_two: Mapping[str, Mapping[str, np.ndarray]] | None = None, ) -> None: self.with_extended = dict(with_extended) self.without_extended = dict(without_extended) self.allocated_from_extended = dict(allocated_from_extended) + # Each side's contributions from children under 2: the part the + # under-2 usage share scales (tool version 6). Keyed by side name + # ("with_extended", "without_extended", "allocated_from_extended"). + self.under_two = { + side: dict(values) for side, values in (under_two or {}).items() + } self.rows = int(rows) + def total(self, side: str, target: str, usage: float) -> float: + """A side's sum with the under-2 contributions scaled by ``usage``.""" + + values = getattr(self, side).get(target) + if values is None: + return 0.0 + under_two = self.under_two.get(side, {}).get(target) + total = float(np.asarray(values).sum()) + if under_two is not None: + total -= (1.0 - usage) * float(np.asarray(under_two).sum()) + return total + def expected_childcare_counts( basis: ChildcareExpectationBasis, params: np.ndarray ) -> dict[str, float]: - """Expected weighted aggregates at ``params`` (ordered as RATE_KEYS).""" + """Expected weighted aggregates at ``params`` (ordered as RATE_KEYS). - rates = dict( - zip(RATE_KEYS, map(float, np.asarray(params, dtype=float)), strict=True) - ) + Every side's sum takes the under-2 usage share on its contributions from + children under 2: a child that does not use its hours is counted in no + DfE row, so each row is linear in the share (tool version 6). + """ + + values = np.asarray(params, dtype=float) + if values.shape == (len(RATE_KEYS) - 1,): + # A basis without under-2 contributions needs no usage share. + values = np.append(values, 1.0) + rates = dict(zip(RATE_KEYS, map(float, values), strict=True)) extended = rates["extended_childcare"] + usage = rates[UNDER_TWO_KEY] expected: dict[str, float] = {} for target, own in OWN_RATE_BY_TARGET.items(): - with_ext = basis.with_extended[target] + if target not in basis.with_extended: + continue + with_ext = basis.total("with_extended", target, usage) if own == "extended_childcare": - expected[target] = extended * float(with_ext.sum()) + expected[target] = extended * with_ext continue - without_ext = basis.without_extended[target] + without_ext = basis.total("without_extended", target, usage) if own == "universal_childcare": # Nested: an extended claimant claims the universal hours, any # other family at the conditional universal rate. - expected[target] = extended * float(with_ext.sum()) + ( - 1.0 - extended - ) * rates[own] * float(without_ext.sum()) + expected[target] = ( + extended * with_ext + (1.0 - extended) * rates[own] * without_ext + ) continue - expected[target] = rates[own] * float( - (with_ext * extended + without_ext * (1.0 - extended)).sum() + expected[target] = rates[own] * ( + with_ext * extended + without_ext * (1.0 - extended) ) - allocated = basis.allocated_from_extended.get(target) - if allocated is not None: - expected[target] += ( - (1.0 - rates[own]) * extended * float(np.asarray(allocated).sum()) - ) + if target in basis.allocated_from_extended: + allocated = basis.total("allocated_from_extended", target, usage) + expected[target] += (1.0 - rates[own]) * extended * allocated return expected @@ -402,10 +529,17 @@ def _basis_side( *, extended: bool, allocated: bool = False, -) -> dict[str, np.ndarray]: +) -> tuple[dict[str, np.ndarray], dict[str, np.ndarray]]: + """One engine run's weighted rows, and their parts from children under 2. + + Every child uses its hours here (``USES_HOURS``), so the under-2 parts are + what those children give when they do; the usage share scales them. + """ + from policyengine_uk import Microsimulation sim = Microsimulation(dataset=str(input_h5)) + _refuse_unplaced_birth_months(sim, target_period) benunit_ids = np.asarray(sim.calculate("benunit_id", target_period)) benunit_count = benunit_ids.shape[0] for variable in FLAG_OUTPUTS: @@ -423,6 +557,11 @@ def _basis_side( contract.rate("tax_free_childcare_spend_routed_share", target_period), ), ) + sim.set_input( + "max_free_entitlement_hours_used", + target_period, + np.full(person_count, USES_HOURS), + ) variables = sim.tax_benefit_system.variables def rows(variable: str, values: np.ndarray | None = None) -> np.ndarray: @@ -434,48 +573,92 @@ def rows(variable: str, values: np.ndarray | None = None) -> np.ndarray: ) return _weighted_rows(sim, raw, entity, target_period) - age = np.asarray(sim.calculate("age", target_period)) - extended_receiving = np.asarray( - sim.calculate("is_child_receiving_extended_childcare", target_period) + status = dfe_spring_term_status( + _person_calculator(sim, target_period), target_period ) - # DfE's January registrations leave out children in reception, so neither - # the working-parent nor the universal-only row counts a child in primary - # education (the calibration bindings carry the same filter). - not_in_reception = _current_education(sim, target_period) != "PRIMARY" - return { + dfe_age = status[DFE_AGE_AT_31_DECEMBER] + working_parent = status[DFE_SPRING_WORKING_PARENT] > 0.5 + universal = status[DFE_SPRING_UNIVERSAL] > 0.5 + early_learning_2 = status[DFE_SPRING_EARLY_LEARNING_2] > 0.5 + in_england = _person_calculator(sim, target_period)("country") == "ENGLAND" + + def people(mask: np.ndarray) -> np.ndarray: + return _weighted_rows(sim, mask & in_england, "person", target_period) + + # DfE's January census at the spring term, by the age on 31 December + # (dfe_spring_term.py), as the calibration bindings read it. + result = { "hmrc.tfc.government_top_up": rows("tax_free_childcare"), "hmrc.tfc.children_with_used_accounts": rows( "is_child_receiving_tax_free_childcare" ), - "dfe.funded_childcare.working_parent_children_2_to_4": rows( - "is_child_receiving_extended_childcare", - extended_receiving & (age >= 2) & not_in_reception, + "dfe.funded_childcare.working_parent_children_2_to_4": people( + working_parent & (dfe_age >= 2) ), - "dfe.funded_childcare.early_learning_2_year_olds": rows( - "is_child_receiving_targeted_childcare" + "dfe.funded_childcare.early_learning_2_year_olds": people(early_learning_2), + # Universal-only: a working-parent child is a universal child too, and + # the row binds DfE's universal count less the working-parent one. + "dfe.funded_childcare.universal_only_children": people( + universal & ~working_parent ), - # Universal-only children: a child who also receives working-parent - # hours is not one (the target binds DfE's universal count less the - # working-parent registrations). - "dfe.funded_childcare.universal_only_children": rows( - "is_child_receiving_universal_childcare", - np.asarray( - sim.calculate("is_child_receiving_universal_childcare", target_period) - ) - & ~extended_receiving - & not_in_reception, + "dfe.funded_childcare.working_parent_children_9_to_11_months": people( + working_parent & (dfe_age == 0) + ), + "dfe.funded_childcare.working_parent_children_age_1": people( + working_parent & (dfe_age == 1) + ), + "dfe.funded_childcare.working_parent_children_age_2": people( + working_parent & (dfe_age == 2) ), + "dfe.funded_childcare.working_parent_children_age_3": people( + working_parent & (dfe_age == 3) + ), + "dfe.funded_childcare.universal_nursery_children_age_3": people( + universal & (dfe_age == 3) + ), + } + person_rows = np.asarray(sim.calculate("person_id", target_period)).shape[0] + under_two = np.asarray(sim.calculate("age", target_period)) < UNDER_TWO_AGE + under_two_rows = { + target: values * under_two + for target, values in result.items() + if np.asarray(values).shape[0] == person_rows and target.startswith("dfe.") } + return result, under_two_rows -def _current_education(sim: Any, period: int) -> np.ndarray: - """Each person's ``current_education`` as enum names.""" +def _person_calculator(sim: Any, period: int) -> Callable[[str], np.ndarray]: + """Engine variables at person grain: group values mapped to their members + and enums decoded to their names, as ``dfe_spring_term_status`` reads + them.""" + + variables = sim.tax_benefit_system.variables - values = sim.calculate("current_education", period) - for candidate in (values, getattr(values, "values", None)): - if hasattr(candidate, "decode_to_str"): - return np.asarray(candidate.decode_to_str()).astype(str) - return np.asarray(values).astype(str) + def calculate(name: str) -> np.ndarray: + if variables[name].entity.key == "person": + values = sim.calculate(name, period) + else: + values = sim.calculate(name, period, map_to="person") + for candidate in (values, getattr(values, "values", None)): + if hasattr(candidate, "decode_to_str"): + return np.asarray(candidate.decode_to_str()).astype(str) + return np.asarray(getattr(values, "values", values)) + + return calculate + + +def _refuse_unplaced_birth_months(sim: Any, period: int) -> None: + """A spine stores each person's months since their birthday + (birth_month.py); without it the engine places birthdays by its own rule, + so the fit would classify DfE ages unlike the build.""" + + holder = sim.get_holder("months_since_last_birthday") + if not holder.get_known_periods(): + raise ValueError( + "the childcare fit needs a spine that stores months_since_last_birthday " + "(uk_runtime/birth_month.py); this input has none, so the engine would " + "place birthdays by its own rule and classify DfE ages unlike the build." + ) def compute_childcare_basis( @@ -485,18 +668,34 @@ def compute_childcare_basis( extended on with the targeted and universal flags off (the targeted row's allocation side; the nested universal row needs none).""" - with_extended = _basis_side(input_h5, target_period, contract, extended=True) - without_extended = _basis_side(input_h5, target_period, contract, extended=False) - allocation = _basis_side( + with_extended, with_under_two = _basis_side( + input_h5, target_period, contract, extended=True + ) + without_extended, without_under_two = _basis_side( + input_h5, target_period, contract, extended=False + ) + allocation, allocation_under_two = _basis_side( input_h5, target_period, contract, extended=True, allocated=True ) + allocated_targets = [ + target + for target, own in OWN_RATE_BY_TARGET.items() + if own == "targeted_childcare" + ] return ChildcareExpectationBasis( with_extended=with_extended, without_extended=without_extended, allocated_from_extended={ - target: allocation[target] - for target, own in OWN_RATE_BY_TARGET.items() - if own == "targeted_childcare" + target: allocation[target] for target in allocated_targets + }, + under_two={ + "with_extended": with_under_two, + "without_extended": without_under_two, + "allocated_from_extended": { + target: allocation_under_two[target] + for target in allocated_targets + if target in allocation_under_two + }, }, rows=int(with_extended["hmrc.tfc.children_with_used_accounts"].shape[0]), ) @@ -538,7 +737,7 @@ def main() -> None: parser.add_argument("--enhanced-frs-h5", type=Path, required=True) parser.add_argument("--ledger-facts", type=Path, required=True) parser.add_argument("--ledger-facts-sha256", required=True) - parser.add_argument("--target-period", type=int, default=2024) + parser.add_argument("--target-period", type=int, default=DEFAULT_TARGET_PERIOD) parser.add_argument("--vintage-override", action="append", default=[]) parser.add_argument("--output", type=Path, required=True) parser.add_argument( @@ -556,7 +755,7 @@ def main() -> None: type=float, default=1e-6, help=( - "Finite-difference step for L-BFGS-B on the four rates. The " + "Finite-difference step for L-BFGS-B on the rates. The " "expected-count objective is smooth (bilinear in the rates), so " "a small step is exact; recorded in the receipt." ), From 4d86a2d6fbd8afd4ebbdab928a92b96e1841e6f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 22 Oct 2026 22:50:49 +0100 Subject: [PATCH 14/25] Bind the DfE funded childcare rows at the spring term, with 9 to 11 months MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Every DfE row now reads the spring-term measures (dfe_spring_term.py) instead of whole-year age and current_education (María's ruling of 2026-10-22 on Vahid's round-2 finding A). The working parent 9 to 11 months row is bound, with its own in_year_snapshot hold approved by María on 2026-10-22; the age-4 cells stay signed out, as the bound 2 to 4 and universal-only rows fix them. The accounting note states the basis, the cohort offset of the January 2025 census, the under-2 take-up and each sign-out's reason; the ONS single-year note names the mid-2025 release date (Vahid's item 8). The target references and membership regenerate against the pinned abf0921 feed: 1,338 active references, the 16 rows this PR adds and no other change. Co-Authored-By: Claude Opus 5.5 --- .../uk-childcare-dfe-spring-term.changed.md | 1 + .../build/uk/target_reference_membership.json | 348 ++++++++++++- .../microcosm/build/uk/target_references.json | 469 ++++++++++++++++++ .../build/uk/uk_population_targets.json | 227 +++++---- .../microcosm/build/uk/uprating_holds.json | 13 + .../engine/uk/test_uk_childcare_targets.py | 12 +- .../uk/test_uk_measurement_period.py | 19 +- .../uk/test_uk_population_targets.py | 177 ++++--- .../uk/test_uk_target_references.py | 15 +- ...edger_compile_parity_signed_differences.py | 15 +- 10 files changed, 1112 insertions(+), 184 deletions(-) create mode 100644 changelog.d/uk-childcare-dfe-spring-term.changed.md diff --git a/changelog.d/uk-childcare-dfe-spring-term.changed.md b/changelog.d/uk-childcare-dfe-spring-term.changed.md new file mode 100644 index 000000000..7d201a6c4 --- /dev/null +++ b/changelog.d/uk-childcare-dfe-spring-term.changed.md @@ -0,0 +1 @@ +The DfE funded-childcare rows are measured at the spring term, as DfE's January census counts them: each row counts the children funded in the term that starts on 1 January of the model year's April-to-March span, by their age on 31 December, through four person measures (`uk_runtime/dfe_spring_term.py`) built on policyengine-uk 2.147.2's date-of-birth school start and working-parent term start. No row reads `current_education`. The universal and early-learning measures count every child of the DfE age, as the term after the birthday does, where the engine still gates them on the age on 6 October; DfE's rule of one entitlement per child holds at age 2. The working parent registrations at 9 to 11 months (January 2025) are bound with their own approved uprating hold, beside ages 1, 2 and 3, universal nursery age 3, and the working parent 2 to 4, early learning and universal-only rows, which also move to the spring term; the age-4 cells stay signed out, as the bound rows fix them. The ONS single-year note names the mid-2025 estimates' release date (1 October 2026). 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 f7b817e1e..ccd6bf322 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,11 +1,11 @@ { "source_fact_feed": "chronicle-uk-abf0921-consumer-facts", "target_period": 2025, - "candidate_count": 1344, - "contract_target_count": 362, - "active_reference_count": 1322, + "candidate_count": 1360, + "contract_target_count": 378, + "active_reference_count": 1338, "status_counts": { - "active": 1322, + "active": 1338, "no_fact_at_or_before_period": 5, "signed_excluded": 17 }, @@ -818,6 +818,50 @@ "geography_level": "country", "geography_id": "K02000001" }, + "ons.population.age_3": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.age_4": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.age_5": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.age_6": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.england_age_0": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "ons.population.england_age_1": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "ons.population.england_age_2": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "ons.population.england_age_3": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "ons.population.england_age_4": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "ons.population.england_age_5": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "ons.population.england_age_6": { + "geography_level": "country", + "geography_id": "E92000001" + }, "ons.population.female_0_4": { "geography_level": "country", "geography_id": "K02000001" @@ -1980,6 +2024,26 @@ "geography_level": "country", "geography_id": "E92000001" }, + "dfe.funded_childcare.working_parent_children_9_to_11_months": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "dfe.funded_childcare.working_parent_children_age_1": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "dfe.funded_childcare.working_parent_children_age_2": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "dfe.funded_childcare.working_parent_children_age_3": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "dfe.funded_childcare.universal_nursery_children_age_3": { + "geography_level": "country", + "geography_id": "E92000001" + }, "dft.bus_fare_receipts.england": { "geography_level": "country", "geography_id": "E92000001" @@ -4462,6 +4526,7 @@ "ons.population.age_20_29_by_region@N92000002", "ons.population.age_20_29_by_region@S92000003", "ons.population.age_20_29_by_region@W92000004", + "ons.population.age_3", "ons.population.age_30_39_by_region@E12000001", "ons.population.age_30_39_by_region@E12000002", "ons.population.age_30_39_by_region@E12000003", @@ -4474,6 +4539,7 @@ "ons.population.age_30_39_by_region@N92000002", "ons.population.age_30_39_by_region@S92000003", "ons.population.age_30_39_by_region@W92000004", + "ons.population.age_4", "ons.population.age_40_49_by_region@E12000001", "ons.population.age_40_49_by_region@E12000002", "ons.population.age_40_49_by_region@E12000003", @@ -4486,6 +4552,7 @@ "ons.population.age_40_49_by_region@N92000002", "ons.population.age_40_49_by_region@S92000003", "ons.population.age_40_49_by_region@W92000004", + "ons.population.age_5", "ons.population.age_50_59_by_region@E12000001", "ons.population.age_50_59_by_region@E12000002", "ons.population.age_50_59_by_region@E12000003", @@ -4498,6 +4565,7 @@ "ons.population.age_50_59_by_region@N92000002", "ons.population.age_50_59_by_region@S92000003", "ons.population.age_50_59_by_region@W92000004", + "ons.population.age_6", "ons.population.age_60_69_by_region@E12000001", "ons.population.age_60_69_by_region@E12000002", "ons.population.age_60_69_by_region@E12000003", @@ -4534,6 +4602,13 @@ "ons.population.age_80_89_by_region@N92000002", "ons.population.age_80_89_by_region@S92000003", "ons.population.age_80_89_by_region@W92000004", + "ons.population.england_age_0", + "ons.population.england_age_1", + "ons.population.england_age_2", + "ons.population.england_age_3", + "ons.population.england_age_4", + "ons.population.england_age_5", + "ons.population.england_age_6", "ons.population.female_0_4", "ons.population.female_10_14", "ons.population.female_15", @@ -6998,6 +7073,31 @@ "from": "2025-01", "to": "2025" }, + { + "name": "dfe.funded_childcare.working_parent_children_9_to_11_months", + "from": "2025-01", + "to": "2025" + }, + { + "name": "dfe.funded_childcare.working_parent_children_age_1", + "from": "2025-01", + "to": "2025" + }, + { + "name": "dfe.funded_childcare.working_parent_children_age_2", + "from": "2025-01", + "to": "2025" + }, + { + "name": "dfe.funded_childcare.working_parent_children_age_3", + "from": "2025-01", + "to": "2025" + }, + { + "name": "dfe.funded_childcare.universal_nursery_children_age_3", + "from": "2025-01", + "to": "2025" + }, { "name": "dft.bus_fare_receipts.england", "from": "2024", @@ -16598,6 +16698,171 @@ } ] }, + "ons.population.age_3": { + "status": "active", + "candidates": [ + { + "name": "ons.population.age_3", + "status": "active", + "matched_fact_count_overall": 3, + "matched_fact_count_at_or_before_period": 3, + "resolved_period": 2025, + "resolved_value": 735292.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_4a4586fdbc26d2ca35622c57" + } + ] + }, + "ons.population.age_4": { + "status": "active", + "candidates": [ + { + "name": "ons.population.age_4", + "status": "active", + "matched_fact_count_overall": 3, + "matched_fact_count_at_or_before_period": 3, + "resolved_period": 2025, + "resolved_value": 723859.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_4b5ee836cca86ef5740d84ff" + } + ] + }, + "ons.population.age_5": { + "status": "active", + "candidates": [ + { + "name": "ons.population.age_5", + "status": "active", + "matched_fact_count_overall": 3, + "matched_fact_count_at_or_before_period": 3, + "resolved_period": 2025, + "resolved_value": 745129.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_72b1b35916ec38455ab85123" + } + ] + }, + "ons.population.age_6": { + "status": "active", + "candidates": [ + { + "name": "ons.population.age_6", + "status": "active", + "matched_fact_count_overall": 3, + "matched_fact_count_at_or_before_period": 3, + "resolved_period": 2025, + "resolved_value": 760014.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_a2c40accbafe611074a57b9e" + } + ] + }, + "ons.population.england_age_0": { + "status": "active", + "candidates": [ + { + "name": "ons.population.england_age_0", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 566856.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_016f96de92d9c331782eef36" + } + ] + }, + "ons.population.england_age_1": { + "status": "active", + "candidates": [ + { + "name": "ons.population.england_age_1", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 583995.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_0b652f4262d87b5bed1ae7db" + } + ] + }, + "ons.population.england_age_2": { + "status": "active", + "candidates": [ + { + "name": "ons.population.england_age_2", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 598812.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_76c2895246d55d796d19de56" + } + ] + }, + "ons.population.england_age_3": { + "status": "active", + "candidates": [ + { + "name": "ons.population.england_age_3", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 632519.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_a1b7f863c10c0f53a31dc5c0" + } + ] + }, + "ons.population.england_age_4": { + "status": "active", + "candidates": [ + { + "name": "ons.population.england_age_4", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 621735.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_8812d3295449b82854e294d4" + } + ] + }, + "ons.population.england_age_5": { + "status": "active", + "candidates": [ + { + "name": "ons.population.england_age_5", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 639573.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_100a9c2e5c5d4119b44a36ed" + } + ] + }, + "ons.population.england_age_6": { + "status": "active", + "candidates": [ + { + "name": "ons.population.england_age_6", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 649939.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_83049955fba3eae9f732d689" + } + ] + }, "ons.population.female_0_4": { "status": "active", "candidates": [ @@ -19301,6 +19566,81 @@ } ] }, + "dfe.funded_childcare.working_parent_children_9_to_11_months": { + "status": "active", + "candidates": [ + { + "name": "dfe.funded_childcare.working_parent_children_9_to_11_months", + "status": "active", + "matched_fact_count_overall": 2, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 29155.0, + "resolved_fact_period": "2025-01", + "resolved_fact_key": "ledger_aggregate_fact_v2_769651ffaa02515e5ee3098b" + } + ] + }, + "dfe.funded_childcare.working_parent_children_age_1": { + "status": "active", + "candidates": [ + { + "name": "dfe.funded_childcare.working_parent_children_age_1", + "status": "active", + "matched_fact_count_overall": 2, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 195104.0, + "resolved_fact_period": "2025-01", + "resolved_fact_key": "ledger_aggregate_fact_v2_6cbcc48c50d98484b296c765" + } + ] + }, + "dfe.funded_childcare.working_parent_children_age_2": { + "status": "active", + "candidates": [ + { + "name": "dfe.funded_childcare.working_parent_children_age_2", + "status": "active", + "matched_fact_count_overall": 2, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 242453.0, + "resolved_fact_period": "2025-01", + "resolved_fact_key": "ledger_aggregate_fact_v2_a57a0c03ac43b62dde04fabd" + } + ] + }, + "dfe.funded_childcare.working_parent_children_age_3": { + "status": "active", + "candidates": [ + { + "name": "dfe.funded_childcare.working_parent_children_age_3", + "status": "active", + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 8, + "resolved_period": 2025, + "resolved_value": 278640.0, + "resolved_fact_period": "2025-01", + "resolved_fact_key": "ledger_aggregate_fact_v2_ae89c21da190202937f75e8a" + } + ] + }, + "dfe.funded_childcare.universal_nursery_children_age_3": { + "status": "active", + "candidates": [ + { + "name": "dfe.funded_childcare.universal_nursery_children_age_3", + "status": "active", + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 8, + "resolved_period": 2025, + "resolved_value": 565954.0, + "resolved_fact_period": "2025-01", + "resolved_fact_key": "ledger_aggregate_fact_v2_0c21c76c8195d04ceb47d2a2" + } + ] + }, "dft.bus_fare_receipts.england": { "status": "active", "candidates": [ 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 dbd13471c..12920c5df 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/target_references.json +++ b/packages/microcosm-build/src/microcosm/build/uk/target_references.json @@ -258,8 +258,13 @@ "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_nursery_children_age_3": "dfe.funded_childcare", "dfe.funded_childcare.universal_only_children": "dfe.funded_childcare", "dfe.funded_childcare.working_parent_children_2_to_4": "dfe.funded_childcare", + "dfe.funded_childcare.working_parent_children_9_to_11_months": "dfe.funded_childcare", + "dfe.funded_childcare.working_parent_children_age_1": "dfe.funded_childcare", + "dfe.funded_childcare.working_parent_children_age_2": "dfe.funded_childcare", + "dfe.funded_childcare.working_parent_children_age_3": "dfe.funded_childcare", "dfi_ni.bus.passenger_receipts": "dfi_ni.local_bus_finances", "dft.bus_fare_receipts.england": "dft.local_bus_finances", "dft.bus_fare_receipts.london": "dft.local_bus_finances", @@ -511,12 +516,23 @@ "ons.population.age_10_19_by_region": "ons.population", "ons.population.age_2": "ons.population", "ons.population.age_20_29_by_region": "ons.population", + "ons.population.age_3": "ons.population", "ons.population.age_30_39_by_region": "ons.population", + "ons.population.age_4": "ons.population", "ons.population.age_40_49_by_region": "ons.population", + "ons.population.age_5": "ons.population", "ons.population.age_50_59_by_region": "ons.population", + "ons.population.age_6": "ons.population", "ons.population.age_60_69_by_region": "ons.population", "ons.population.age_70_79_by_region": "ons.population", "ons.population.age_80_89_by_region": "ons.population", + "ons.population.england_age_0": "ons.population", + "ons.population.england_age_1": "ons.population", + "ons.population.england_age_2": "ons.population", + "ons.population.england_age_3": "ons.population", + "ons.population.england_age_4": "ons.population", + "ons.population.england_age_5": "ons.population", + "ons.population.england_age_6": "ons.population", "ons.population.female_0_4": "ons.population", "ons.population.female_10_14": "ons.population", "ons.population.female_15": "ons.population", @@ -610,8 +626,13 @@ "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_nursery_children_age_3": "Universal nursery children age 3", "dfe.funded_childcare.universal_only_children": "Universal only children", "dfe.funded_childcare.working_parent_children_2_to_4": "Working parent children 2 to 4", + "dfe.funded_childcare.working_parent_children_9_to_11_months": "Working parent children 9 to 11 months", + "dfe.funded_childcare.working_parent_children_age_1": "Working parent children age 1", + "dfe.funded_childcare.working_parent_children_age_2": "Working parent children age 2", + "dfe.funded_childcare.working_parent_children_age_3": "Working parent children age 3", "dfi_ni.bus.passenger_receipts": "Translink passenger receipts", "dft.bus_fare_receipts.england": "England", "dft.bus_fare_receipts.london": "London", @@ -863,12 +884,23 @@ "ons.population.age_10_19_by_region": "Age 10 19 by region", "ons.population.age_2": "Age 2", "ons.population.age_20_29_by_region": "Age 20 29 by region", + "ons.population.age_3": "Age 3", "ons.population.age_30_39_by_region": "Age 30 39 by region", + "ons.population.age_4": "Age 4", "ons.population.age_40_49_by_region": "Age 40 49 by region", + "ons.population.age_5": "Age 5", "ons.population.age_50_59_by_region": "Age 50 59 by region", + "ons.population.age_6": "Age 6", "ons.population.age_60_69_by_region": "Age 60 69 by region", "ons.population.age_70_79_by_region": "Age 70 79 by region", "ons.population.age_80_89_by_region": "Age 80 89 by region", + "ons.population.england_age_0": "England age 0", + "ons.population.england_age_1": "England age 1", + "ons.population.england_age_2": "England age 2", + "ons.population.england_age_3": "England age 3", + "ons.population.england_age_4": "England age 4", + "ons.population.england_age_5": "England age 5", + "ons.population.england_age_6": "England age 6", "ons.population.female_0_4": "Female 0 4", "ons.population.female_10_14": "Female 10 14", "ons.population.female_15": "Female 15", @@ -13901,6 +13933,303 @@ "value_operation": "sum", "expected_member_count": 1 }, + { + "name": "ons.population.age_3", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "dimension_values": { + "age": [ + 3 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age" + ] + }, + "entity": "person", + "measure": "ons/age_3", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.age_3", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "expected_member_count": 1 + }, + { + "name": "ons.population.age_4", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "dimension_values": { + "age": [ + 4 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age" + ] + }, + "entity": "person", + "measure": "ons/age_4", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.age_4", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "expected_member_count": 1 + }, + { + "name": "ons.population.age_5", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "dimension_values": { + "age": [ + 5 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age" + ] + }, + "entity": "person", + "measure": "ons/age_5", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.age_5", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "expected_member_count": 1 + }, + { + "name": "ons.population.age_6", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "dimension_values": { + "age": [ + 6 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age" + ] + }, + "entity": "person", + "measure": "ons/age_6", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.age_6", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "expected_member_count": 1 + }, + { + "name": "ons.population.england_age_0", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "dimension_values": { + "age": [ + 0 + ] + }, + "geography_level": "country", + "geography_id": "E92000001", + "dimensions": [ + "age" + ] + }, + "entity": "person", + "measure": "ons/england_age_0", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.england_age_0", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "expected_member_count": 1 + }, + { + "name": "ons.population.england_age_1", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "dimension_values": { + "age": [ + 1 + ] + }, + "geography_level": "country", + "geography_id": "E92000001", + "dimensions": [ + "age" + ] + }, + "entity": "person", + "measure": "ons/england_age_1", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.england_age_1", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "expected_member_count": 1 + }, + { + "name": "ons.population.england_age_2", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "dimension_values": { + "age": [ + 2 + ] + }, + "geography_level": "country", + "geography_id": "E92000001", + "dimensions": [ + "age" + ] + }, + "entity": "person", + "measure": "ons/england_age_2", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.england_age_2", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "expected_member_count": 1 + }, + { + "name": "ons.population.england_age_3", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "dimension_values": { + "age": [ + 3 + ] + }, + "geography_level": "country", + "geography_id": "E92000001", + "dimensions": [ + "age" + ] + }, + "entity": "person", + "measure": "ons/england_age_3", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.england_age_3", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "expected_member_count": 1 + }, + { + "name": "ons.population.england_age_4", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "dimension_values": { + "age": [ + 4 + ] + }, + "geography_level": "country", + "geography_id": "E92000001", + "dimensions": [ + "age" + ] + }, + "entity": "person", + "measure": "ons/england_age_4", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.england_age_4", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "expected_member_count": 1 + }, + { + "name": "ons.population.england_age_5", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "dimension_values": { + "age": [ + 5 + ] + }, + "geography_level": "country", + "geography_id": "E92000001", + "dimensions": [ + "age" + ] + }, + "entity": "person", + "measure": "ons/england_age_5", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.england_age_5", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "expected_member_count": 1 + }, + { + "name": "ons.population.england_age_6", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "dimension_values": { + "age": [ + 6 + ] + }, + "geography_level": "country", + "geography_id": "E92000001", + "dimensions": [ + "age" + ] + }, + "entity": "person", + "measure": "ons/england_age_6", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.england_age_6", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "expected_member_count": 1 + }, { "name": "ons.population.female_0_4", "ledger_selector": { @@ -23936,6 +24265,146 @@ "uprating_from_period": "2025-01", "uprating_to_period": 2025 }, + { + "name": "dfe.funded_childcare.working_parent_children_9_to_11_months", + "ledger_selector": { + "source_name": "dfe", + "source_concept": "dfe.number_of_registered_children", + "source_measure_id": "registered_children_count", + "entity_name": "person", + "dimension_values": { + "entitlement_type": "Working parents", + "age": "9 to 11 months", + "registration_basis": "registered_children", + "provision": "all" + }, + "geography_level": "country", + "geography_id": "E92000001" + }, + "entity": "person", + "measure": "dfe/funded_childcare/working_parent_children_9_to_11_months", + "family": "dfe_funded_childcare", + "period": 2025, + "metadata": { + "contract_target_id": "dfe.funded_childcare.working_parent_children_9_to_11_months", + "measure_kind": "prepared_column", + "observation_basis": "january_stock" + }, + "uprating_from_period": "2025-01", + "uprating_to_period": 2025 + }, + { + "name": "dfe.funded_childcare.working_parent_children_age_1", + "ledger_selector": { + "source_name": "dfe", + "source_concept": "dfe.number_of_registered_children", + "source_measure_id": "registered_children_count", + "entity_name": "person", + "dimension_values": { + "entitlement_type": "Working parents", + "age": "1 year", + "registration_basis": "registered_children", + "provision": "all" + }, + "geography_level": "country", + "geography_id": "E92000001" + }, + "entity": "person", + "measure": "dfe/funded_childcare/working_parent_children_age_1", + "family": "dfe_funded_childcare", + "period": 2025, + "metadata": { + "contract_target_id": "dfe.funded_childcare.working_parent_children_age_1", + "measure_kind": "prepared_column", + "observation_basis": "january_stock" + }, + "uprating_from_period": "2025-01", + "uprating_to_period": 2025 + }, + { + "name": "dfe.funded_childcare.working_parent_children_age_2", + "ledger_selector": { + "source_name": "dfe", + "source_concept": "dfe.number_of_registered_children", + "source_measure_id": "registered_children_count", + "entity_name": "person", + "dimension_values": { + "entitlement_type": "Working parents", + "age": "2 years", + "registration_basis": "registered_children", + "provision": "all" + }, + "geography_level": "country", + "geography_id": "E92000001" + }, + "entity": "person", + "measure": "dfe/funded_childcare/working_parent_children_age_2", + "family": "dfe_funded_childcare", + "period": 2025, + "metadata": { + "contract_target_id": "dfe.funded_childcare.working_parent_children_age_2", + "measure_kind": "prepared_column", + "observation_basis": "january_stock" + }, + "uprating_from_period": "2025-01", + "uprating_to_period": 2025 + }, + { + "name": "dfe.funded_childcare.working_parent_children_age_3", + "ledger_selector": { + "source_name": "dfe", + "source_concept": "dfe.number_of_registered_children", + "source_measure_id": "registered_children_count", + "entity_name": "person", + "dimension_values": { + "entitlement_type": "Working parents", + "age": "3 years", + "registration_basis": "registered_children", + "provision": "all" + }, + "geography_level": "country", + "geography_id": "E92000001" + }, + "entity": "person", + "measure": "dfe/funded_childcare/working_parent_children_age_3", + "family": "dfe_funded_childcare", + "period": 2025, + "metadata": { + "contract_target_id": "dfe.funded_childcare.working_parent_children_age_3", + "measure_kind": "prepared_column", + "observation_basis": "january_stock" + }, + "uprating_from_period": "2025-01", + "uprating_to_period": 2025 + }, + { + "name": "dfe.funded_childcare.universal_nursery_children_age_3", + "ledger_selector": { + "source_name": "dfe", + "source_concept": "dfe.number_of_registered_children_nursery", + "source_measure_id": "registered_children_nursery_count", + "entity_name": "person", + "dimension_values": { + "entitlement_type": "Universal", + "age": "3 years", + "registration_basis": "registered_children", + "provision": "nursery" + }, + "geography_level": "country", + "geography_id": "E92000001" + }, + "entity": "person", + "measure": "dfe/funded_childcare/universal_nursery_children_age_3", + "family": "dfe_funded_childcare", + "period": 2025, + "metadata": { + "contract_target_id": "dfe.funded_childcare.universal_nursery_children_age_3", + "measure_kind": "prepared_column", + "observation_basis": "january_stock" + }, + "uprating_from_period": "2025-01", + "uprating_to_period": 2025 + }, { "name": "dft.bus_fare_receipts.england", "ledger_selector": { 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 c58047140..1d4311161 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 @@ -872,10 +872,11 @@ "ons.population.england_age_4": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): England's funded childcare is costed on England's children, whose single years the UK rows and the region 0_9 cells leave free, so the contract binds England's ages 0 to 6 for all persons, read from the ONS mid-year estimate for England (E92000001) by single year of age. Wales, Scotland and Northern Ireland get no single-year rows: each nation's single year rests on too few FRS households, and the UK rows bind their sum. No incumbent row has this row's definition.", "ons.population.england_age_5": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): England's funded childcare is costed on England's children, whose single years the UK rows and the region 0_9 cells leave free, so the contract binds England's ages 0 to 6 for all persons, read from the ONS mid-year estimate for England (E92000001) by single year of age. Wales, Scotland and Northern Ireland get no single-year rows: each nation's single year rests on too few FRS households, and the UK rows bind their sum. No incumbent row has this row's definition.", "ons.population.england_age_6": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): England's funded childcare is costed on England's children, whose single years the UK rows and the region 0_9 cells leave free, so the contract binds England's ages 0 to 6 for all persons, read from the ONS mid-year estimate for England (E92000001) by single year of age. Wales, Scotland and Northern Ireland get no single-year rows: each nation's single year rests on too few FRS households, and the UK rows bind their sum. No incumbent row has this row's definition.", - "dfe.funded_childcare.working_parent_children_age_1": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. The working parent registrations by single year of age (1, 2 and 3) from the DfE January census, England; age 4 is signed out for its reference date (accounting note dfe_funded_childcare_single_ages). The 2 to 4 row stays bound beside them. No incumbent row has this row's definition.", - "dfe.funded_childcare.working_parent_children_age_2": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. The working parent registrations by single year of age (1, 2 and 3) from the DfE January census, England; age 4 is signed out for its reference date (accounting note dfe_funded_childcare_single_ages). The 2 to 4 row stays bound beside them. No incumbent row has this row's definition.", - "dfe.funded_childcare.working_parent_children_age_3": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. The working parent registrations by single year of age (1, 2 and 3) from the DfE January census, England; age 4 is signed out for its reference date (accounting note dfe_funded_childcare_single_ages). The 2 to 4 row stays bound beside them. No incumbent row has this row's definition.", - "dfe.funded_childcare.universal_nursery_children_age_3": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. The universal registrations in nursery provision at age 3 from the DfE January census, England; age 4 is signed out for its reference date (accounting note dfe_funded_childcare_single_ages). No incumbent row has this row's definition." + "dfe.funded_childcare.working_parent_children_9_to_11_months": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. The working parent registrations at 9 to 11 months and by single year of age (1, 2 and 3) and the universal registrations in nursery at age 3, from the DfE January census, England, measured at the spring term (María's ruling of 2026-10-22); the age-4 cells are signed out, as the bound rows fix them (accounting note dfe_funded_childcare_single_ages). No incumbent row has this row's definition.", + "dfe.funded_childcare.working_parent_children_age_1": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. The working parent registrations at 9 to 11 months and by single year of age (1, 2 and 3) and the universal registrations in nursery at age 3, from the DfE January census, England, measured at the spring term (María's ruling of 2026-10-22); the age-4 cells are signed out, as the bound rows fix them (accounting note dfe_funded_childcare_single_ages). No incumbent row has this row's definition.", + "dfe.funded_childcare.working_parent_children_age_2": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. The working parent registrations at 9 to 11 months and by single year of age (1, 2 and 3) and the universal registrations in nursery at age 3, from the DfE January census, England, measured at the spring term (María's ruling of 2026-10-22); the age-4 cells are signed out, as the bound rows fix them (accounting note dfe_funded_childcare_single_ages). No incumbent row has this row's definition.", + "dfe.funded_childcare.working_parent_children_age_3": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. The working parent registrations at 9 to 11 months and by single year of age (1, 2 and 3) and the universal registrations in nursery at age 3, from the DfE January census, England, measured at the spring term (María's ruling of 2026-10-22); the age-4 cells are signed out, as the bound rows fix them (accounting note dfe_funded_childcare_single_ages). No incumbent row has this row's definition.", + "dfe.funded_childcare.universal_nursery_children_age_3": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. The working parent registrations at 9 to 11 months and by single year of age (1, 2 and 3) and the universal registrations in nursery at age 3, from the DfE January census, England, measured at the spring term (María's ruling of 2026-10-22); the age-4 cells are signed out, as the bound rows fix them (accounting note dfe_funded_childcare_single_ages). No incumbent row has this row's definition." }, "suppressed_ancestors": { "hmrc/salary_sacrifice_it_relief_basic_rate": { @@ -909,8 +910,8 @@ "cgt_band_promotion": "The 18 banded CGT registry names (hmrc/cgt_taxpayers_band_ and hmrc/capital_gains_band_, nine bands from 12,300) move from excluded to mapped: Chronicle now carries HMRC Table 2.1a for 2024-25 (cgt_size_of_gain_2026), so the incumbent's unpackaged uk-data CSV is superseded by published individual rows bound at identity; the 3,000 and 6,000 bands the incumbent never carried are authored under the same naming form and the 0-2,999 band below the 2024 AEA is signed out (microcosm#467, #725). Chronicle's Table 2.1a package emits taxpayers and gains only, although the published sheet carries an amounts-of-tax column, so no liability-by-band target exists yet; it becomes possible once Chronicle emits that column.", "ons_15_19_sex_band_split": "María's ruling of 2026-10-13 (microcosm#1095, uk-data#563): the two national 15_19 sex bands are split into ages 15, 16-17 and 18-19. uk-data#563 found weights that fit the five-year band while holding too many 16-year-olds and too few 18- and 19-year-olds, and nothing in this contract bound the mix inside the band either. The six rows partition the two bands and read the same ONS mid-year estimate by single year of age, so each sex's three rows sum to the band they replace. The incumbent ons/female_15_19 and ons/male_15_19 rows move from mapped to excluded: no single contract row has their definition.", "ons_single_year_ages_0_2": "microcosm#1278 (the pre-Budget PR's plan, approved by María on 2026-10-20; microcosm#1095): three all-persons rows bind ages 0, 1 and 2, read from the same ONS mid-year estimate by single year of age as the 0_4 sex bands. Unlike the 15_19 split, whose pieces replaced the bands, the 0_4 sex bands keep their incumbent mapping and stay bound: the three rows cover ages 0 to 2 for both sexes together, so neither band is their sum. The three are contract-only declarations; no incumbent row moves.", - "ons_single_year_ages_0_6": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095). Eleven all-persons rows extend the single years of age: the UK rows go on from age 2 to age 6, and England binds ages 0 to 6 at E92000001. Every row reads the ONS mid-2025 estimate by single year of age, the series the 0_4 and 5_9 sex bands and the region 0_9 cells sum, so the nested rows are consistent: the UK rows for ages 0 to 4 sum to the two 0_4 sex bands, and England's rows sit inside England's nine region 0_9 cells. Every band stays bound; the eleven are contract-only declarations and no incumbent row moves. Scotland's age 0 is already bound as ons.population.scotland_babies_under_1; Wales and Northern Ireland are left to the UK rows, as each nation's single year rests on too few FRS households.", - "dfe_funded_childcare_single_ages": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. Four England rows read the January 2025 census (Funded early education and childcare, headline figures): working parent registrations at single ages 1, 2 and 3, and universal registrations in nursery at age 3. They are four contract-only declarations; the three earlier DfE rows stay bound. The working parent 2 to 4 row, the take-up fitter's anchor, and universal_only_children stay bound beside them, unaffected by the age-4 sign-out below: the 2 to 4 row is the bound ages 2 and 3 plus the signed-out age 4 cell (fact and measure), and universal_only_children is the nursery ages 3 and 4 less the working parent ages 3 and 4 on the facts, and on the measures wherever a working parent child keeps the universal hours (policyengine-uk 2.128.1). Signed out, each for its reason: the three age-4 cells, the working parent registrations, the universal registrations in nursery and the 4-year-olds in reception (María's ruling of 2026-10-21: DfE's January census reports ages as at 31 December, when about two-thirds of funded 4-year-olds are already in reception, while the model's whole-year age is the age at interview spread over the survey year, so fewer of its 4-year-olds are in primary education, and binding the single age-4 cells would move weight between 4-year-olds in school and in nursery because of the reference date, not the data); the working parent 9 to 11 months cell (policyengine-uk gives a child of whole-year age 0 no working parent hours, so no record carries it); reception at age 3 (the FRS codes no 3-year-old in primary education, so no record carries it); the 9 months to 2 years, 3 to 4 years and Total working parent cells, the nursery and reception Totals, the early learning for 2-year-olds Total and the all-entitlements Total (sums or copies of bound cells, or sums that include an uncarried or signed-out cell); the universal all-provision cells at ages 3, 4 and Total (nursery plus reception, whose single cells are bound, uncarried or signed out above, a few children off their sum in DfE's own table); the estimated eligible children, eligible nursery children and all-children estimates (DfE builds them from population and survey-based inputs, not administrative counts, and the all-children estimates restate the ONS England single years already bound at a different reference date); and the registered percentages (ratios of a bound count to one of those estimates)." + "ons_single_year_ages_0_6": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095). Eleven all-persons rows extend the single years of age: the UK rows go on from age 2 to age 6, and England binds ages 0 to 6 at E92000001. Every row reads the ONS mid-2025 estimate by single year of age (Population estimates for the UK, England, Wales, Scotland and Northern Ireland: mid-2025, published 1 October 2026; on the feed since the 942a1fa re-pin, microcosm#1123), the series the 0_4 and 5_9 sex bands and the region 0_9 cells sum, so the nested rows are consistent: the UK rows for ages 0 to 4 sum to the two 0_4 sex bands, and England's rows sit inside England's nine region 0_9 cells. Every band stays bound; the eleven are contract-only declarations and no incumbent row moves. Scotland's age 0 is already bound as ons.population.scotland_babies_under_1; Wales and Northern Ireland are left to the UK rows, as each nation's single year rests on too few FRS households.", + "dfe_funded_childcare_single_ages": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): bind every DfE funded-childcare count the model can carry, even on few records, and sign out only those with a real reason. María's ruling of 2026-10-22 (Vahid's round-2 finding A on microcosm#1338) measures every DfE row at the spring term. DfE counts the children registered in its January census by their age on the preceding 31 December, so each row counts the children funded in the term that starts on 1 January of the model year's April-to-March span, by their age on 31 December (uk_runtime/dfe_spring_term.py). policyengine-uk 2.147.2 stops the free hours when a child starts school, from its date of birth (reception the September after the fourth birthday), and starts working parent hours the term after the minimum age; the universal and 2-year-old measures count every child of the DfE age, as the term after the birthday does, where the engine still gates them on the age on 6 October. No row reads current_education. Bound, England, January 2025 census: working parent registrations at 9 to 11 months and at ages 1, 2 and 3; universal registrations in nursery at age 3; and the three earlier rows, working parent 2 to 4, early learning for 2-year-olds and universal-only (nursery ages 3 and 4 less working parent ages 3 and 4). The under-2 rows take their own take-up: a child under 2 in a family that claims working-parent hours draws whether it uses them, at its own contract rate, as DfE registers far fewer of the youngest eligible children (parental leave) than of those aged 2 to 4. The model year is 2025, so its spring term is January 2026: the January 2025 census is the same classification one birth cohort earlier, the in-year snapshot the holds record. Signed out, each for its reason: the three age-4 cells (working parent and universal in nursery: the bound 2 to 4 and universal-only rows, less the bound ages 2 and 3, already fix them on the facts and on the measures; universal in reception: the school place meets those children's entitlement, the model funds no early-years hours for them, and who is in reception follows only the date of birth, which the survey does not record); reception at age 3 (the same reason, and DfE records a handful); the 9 months to 2 years, 3 to 4 years and Total working parent cells, the nursery and reception Totals, the early learning for 2-year-olds Total and the all-entitlements Total (sums or copies of bound cells, or sums that include a signed-out cell); the universal all-provision cells at ages 3, 4 and Total (nursery plus reception, a few children off their sum in DfE's own table); the estimated eligible children, eligible nursery children and all-children estimates (DfE builds them from population and survey-based inputs, not administrative counts, and the all-children estimates restate the ONS England single years already bound at a different reference date); and the registered percentages (ratios of a bound count to one of those estimates). The FRS records no deferred school start and no council-funded independent reception place, so the model starts every child at school on the date its date of birth implies, which slightly undercounts the 4-year-olds in nursery; DfE notes that in 2025 some 2-year-olds eligible for both entitlements were recorded under working parents rather than early learning." }, "scope_target_ids": [ "obr.income_tax", @@ -1133,6 +1134,7 @@ "dfe.funded_childcare.working_parent_children_2_to_4", "dfe.funded_childcare.early_learning_2_year_olds", "dfe.funded_childcare.universal_only_children", + "dfe.funded_childcare.working_parent_children_9_to_11_months", "dfe.funded_childcare.working_parent_children_age_1", "dfe.funded_childcare.working_parent_children_age_2", "dfe.funded_childcare.working_parent_children_age_3", @@ -16077,19 +16079,14 @@ "observation_basis": "january_stock", "filters": [ { - "concept": "uk.childcare.is_child_receiving_extended_childcare", + "concept": "uk.childcare.dfe_spring_working_parent", "equals": true }, { - "concept": "uk.demographics.age", + "concept": "uk.childcare.dfe_age_at_31_december", "operator": ">=", "value": 2 }, - { - "concept": "uk.education.current_education", - "operator": "!=", - "value": "PRIMARY" - }, { "concept": "uk.geography.country", "equals": "ENGLAND" @@ -16104,25 +16101,20 @@ "map_to": "household", "filters": [ { - "variable": "is_child_receiving_extended_childcare", + "variable": "dfe_spring_working_parent", "equals": true }, { - "variable": "age", + "variable": "dfe_age_at_31_december", "operator": ">=", "value": 2 }, - { - "variable": "current_education", - "operator": "!=", - "value": "PRIMARY" - }, { "variable": "country", "equals": "ENGLAND" } ], - "notes": "Caseload only: entitlement spending is not bound because caseload multiplied by full-usage ceilings would double count assumptions. DfE's January registrations leave out children in reception, so a child in primary education (current_education PRIMARY) is not counted." + "notes": "Caseload only: entitlement spending is not bound because caseload multiplied by full-usage ceilings would double count assumptions. Counted at the spring term, as DfE's January census counts: a child registered in the term that starts on 1 January of the model year's April-to-March span, by its age on 31 December (uk_runtime/dfe_spring_term.py; accounting note dfe_funded_childcare_single_ages). A child already in reception by January is not funded then, so it is not counted; with the single ages 2 and 3 bound, this row fixes age 4." }, "axiom": { "metric_name": "dfe/funded_childcare/working_parent_children_2_to_4", @@ -16161,7 +16153,7 @@ "observation_basis": "january_stock", "filters": [ { - "concept": "uk.childcare.is_child_receiving_targeted_childcare", + "concept": "uk.childcare.dfe_spring_early_learning_2", "equals": true }, { @@ -16178,7 +16170,7 @@ "map_to": "household", "filters": [ { - "variable": "is_child_receiving_targeted_childcare", + "variable": "dfe_spring_early_learning_2", "equals": true }, { @@ -16186,7 +16178,7 @@ "equals": "ENGLAND" } ], - "notes": "Caseload only; the published 74.8% denominator is not transferred into the model take-up rate." + "notes": "Caseload only; the published 74.8% denominator is not transferred into the model take-up rate. Counted at the spring term, as DfE's January census counts: a child registered in the term that starts on 1 January of the model year's April-to-March span, by its age on 31 December (uk_runtime/dfe_spring_term.py; accounting note dfe_funded_childcare_single_ages). Funding starts the term after the second birthday, so every child of DfE age 2 in a qualifying family that claims is counted, where policyengine-uk still reads the age on 6 October." }, "axiom": { "metric_name": "dfe/funded_childcare/early_learning_2_year_olds", @@ -16242,18 +16234,13 @@ "observation_basis": "january_stock", "filters": [ { - "concept": "uk.childcare.is_child_receiving_universal_childcare", + "concept": "uk.childcare.dfe_spring_universal", "equals": true }, { - "concept": "uk.childcare.is_child_receiving_extended_childcare", + "concept": "uk.childcare.dfe_spring_working_parent", "equals": false }, - { - "concept": "uk.education.current_education", - "operator": "!=", - "value": "PRIMARY" - }, { "concept": "uk.geography.country", "equals": "ENGLAND" @@ -16268,24 +16255,19 @@ "map_to": "household", "filters": [ { - "variable": "is_child_receiving_universal_childcare", + "variable": "dfe_spring_universal", "equals": true }, { - "variable": "is_child_receiving_extended_childcare", + "variable": "dfe_spring_working_parent", "equals": false }, - { - "variable": "current_education", - "operator": "!=", - "value": "PRIMARY" - }, { "variable": "country", "equals": "ENGLAND" } ], - "notes": "Universal-only caseload is the declared difference between the overlapping published universes; no entitlement spending row is bound. DfE's January registrations leave out children in reception, so a child in primary education (current_education PRIMARY) is not counted. From policyengine-uk 2.128.1 a child on the working parent entitlement keeps the universal hours (Childcare Act 2016 s.1(6)(a); pe-uk#2177), so the measure counts children on the universal hours who are not receiving the extended entitlement, as the published difference does." + "notes": "Universal-only caseload is the declared difference between the overlapping published universes; no entitlement spending row is bound. Counted at the spring term, as DfE's January census counts: a child registered in the term that starts on 1 January of the model year's April-to-March span, by its age on 31 December (uk_runtime/dfe_spring_term.py; accounting note dfe_funded_childcare_single_ages). Nursery registrations at DfE ages 3 and 4 less working parent registrations at those ages: a working parent child keeps the universal hours (Childcare Act 2016 s.1(6)(a); policyengine-uk 2.128.1), so every working parent child of those ages is a universal child too. Universal hours start the term after the third birthday, so every child of DfE age 3 is counted, where policyengine-uk still reads the age on 6 October. With the nursery age 3 row bound, this row fixes the nursery age 4 cell." }, "axiom": { "metric_name": "dfe/funded_childcare/universal_only_children", @@ -16300,6 +16282,87 @@ "category_id": "dfe.funded_childcare", "label": "Universal only children" }, + { + "target_id": "dfe.funded_childcare.working_parent_children_9_to_11_months", + "family": "dfe_funded_childcare", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "observation_basis": "january_stock", + "filters": [ + { + "concept": "uk.childcare.dfe_spring_working_parent", + "equals": true + }, + { + "concept": "uk.childcare.dfe_age_at_31_december", + "operator": ">=", + "value": 0 + }, + { + "concept": "uk.childcare.dfe_age_at_31_december", + "operator": "<", + "value": 1 + }, + { + "concept": "uk.geography.country", + "equals": "ENGLAND" + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dfe/funded_childcare/working_parent_children_9_to_11_months", + "value_variable": "person_count", + "from_entity": "person", + "map_to": "household", + "filters": [ + { + "variable": "dfe_spring_working_parent", + "equals": true + }, + { + "variable": "dfe_age_at_31_december", + "operator": ">=", + "value": 0 + }, + { + "variable": "dfe_age_at_31_december", + "operator": "<", + "value": 1 + }, + { + "variable": "country", + "equals": "ENGLAND" + } + ], + "notes": "Caseload only: working parent registrations at 9 to 11 months in the January census, the 15 hours for children from 9 months from September 2024. Counted at the spring term, as DfE's January census counts: a child registered in the term that starts on 1 January of the model year's April-to-March span, by its age on 31 December (uk_runtime/dfe_spring_term.py; accounting note dfe_funded_childcare_single_ages). From policyengine-uk 2.147.2 a child is funded from the term after it reaches 9 months (SI 2022/1134 reg 27), so a child of DfE age 0 born from January to March is funded in the spring term." + }, + "axiom": { + "metric_name": "dfe/funded_childcare/working_parent_children_9_to_11_months", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "dfe", + "source_concept": "dfe.number_of_registered_children", + "source_measure_id": "registered_children_count", + "entity_name": "person", + "dimension_values": { + "entitlement_type": "Working parents", + "age": "9 to 11 months", + "registration_basis": "registered_children", + "provision": "all" + } + }, + "category_id": "dfe.funded_childcare", + "label": "Working parent children 9 to 11 months" + }, { "target_id": "dfe.funded_childcare.working_parent_children_age_1", "family": "dfe_funded_childcare", @@ -16313,16 +16376,16 @@ "observation_basis": "january_stock", "filters": [ { - "concept": "uk.childcare.is_child_receiving_extended_childcare", + "concept": "uk.childcare.dfe_spring_working_parent", "equals": true }, { - "concept": "uk.demographics.age", + "concept": "uk.childcare.dfe_age_at_31_december", "operator": ">=", "value": 1 }, { - "concept": "uk.demographics.age", + "concept": "uk.childcare.dfe_age_at_31_december", "operator": "<", "value": 2 }, @@ -16340,16 +16403,16 @@ "map_to": "household", "filters": [ { - "variable": "is_child_receiving_extended_childcare", + "variable": "dfe_spring_working_parent", "equals": true }, { - "variable": "age", + "variable": "dfe_age_at_31_december", "operator": ">=", "value": 1 }, { - "variable": "age", + "variable": "dfe_age_at_31_december", "operator": "<", "value": 2 }, @@ -16358,7 +16421,7 @@ "equals": "ENGLAND" } ], - "notes": "Caseload only, by single year of age: working parent registrations at age 1 in the January census (the 15 hours for children from 9 months from September 2024). DfE's separate 9 to 11 months cell is not bound: policyengine-uk gives a child of whole-year age 0 no working parent hours." + "notes": "Caseload only, by single year of age: working parent registrations at age 1 in the January census. Counted at the spring term, as DfE's January census counts: a child registered in the term that starts on 1 January of the model year's April-to-March span, by its age on 31 December (uk_runtime/dfe_spring_term.py; accounting note dfe_funded_childcare_single_ages)." }, "axiom": { "metric_name": "dfe/funded_childcare/working_parent_children_age_1", @@ -16394,24 +16457,19 @@ "observation_basis": "january_stock", "filters": [ { - "concept": "uk.childcare.is_child_receiving_extended_childcare", + "concept": "uk.childcare.dfe_spring_working_parent", "equals": true }, { - "concept": "uk.demographics.age", + "concept": "uk.childcare.dfe_age_at_31_december", "operator": ">=", "value": 2 }, { - "concept": "uk.demographics.age", + "concept": "uk.childcare.dfe_age_at_31_december", "operator": "<", "value": 3 }, - { - "concept": "uk.education.current_education", - "operator": "!=", - "value": "PRIMARY" - }, { "concept": "uk.geography.country", "equals": "ENGLAND" @@ -16426,30 +16484,25 @@ "map_to": "household", "filters": [ { - "variable": "is_child_receiving_extended_childcare", + "variable": "dfe_spring_working_parent", "equals": true }, { - "variable": "age", + "variable": "dfe_age_at_31_december", "operator": ">=", "value": 2 }, { - "variable": "age", + "variable": "dfe_age_at_31_december", "operator": "<", "value": 3 }, - { - "variable": "current_education", - "operator": "!=", - "value": "PRIMARY" - }, { "variable": "country", "equals": "ENGLAND" } ], - "notes": "Caseload only, by single year of age: working parent registrations at age 2 in the January census. DfE's January registrations leave out children in reception, so a child in primary education (current_education PRIMARY) is not counted. The 2 to 4 row stays bound beside the single years: its measure and its fact cover ages 2 and 3 and age 4, whose single-age cell is signed out for its 31 December reference date." + "notes": "Caseload only, by single year of age: working parent registrations at age 2 in the January census. Counted at the spring term, as DfE's January census counts: a child registered in the term that starts on 1 January of the model year's April-to-March span, by its age on 31 December (uk_runtime/dfe_spring_term.py; accounting note dfe_funded_childcare_single_ages)." }, "axiom": { "metric_name": "dfe/funded_childcare/working_parent_children_age_2", @@ -16485,24 +16538,19 @@ "observation_basis": "january_stock", "filters": [ { - "concept": "uk.childcare.is_child_receiving_extended_childcare", + "concept": "uk.childcare.dfe_spring_working_parent", "equals": true }, { - "concept": "uk.demographics.age", + "concept": "uk.childcare.dfe_age_at_31_december", "operator": ">=", "value": 3 }, { - "concept": "uk.demographics.age", + "concept": "uk.childcare.dfe_age_at_31_december", "operator": "<", "value": 4 }, - { - "concept": "uk.education.current_education", - "operator": "!=", - "value": "PRIMARY" - }, { "concept": "uk.geography.country", "equals": "ENGLAND" @@ -16517,30 +16565,25 @@ "map_to": "household", "filters": [ { - "variable": "is_child_receiving_extended_childcare", + "variable": "dfe_spring_working_parent", "equals": true }, { - "variable": "age", + "variable": "dfe_age_at_31_december", "operator": ">=", "value": 3 }, { - "variable": "age", + "variable": "dfe_age_at_31_december", "operator": "<", "value": 4 }, - { - "variable": "current_education", - "operator": "!=", - "value": "PRIMARY" - }, { "variable": "country", "equals": "ENGLAND" } ], - "notes": "Caseload only, by single year of age: working parent registrations at age 3 in the January census. DfE's January registrations leave out children in reception, so a child in primary education (current_education PRIMARY) is not counted. The 2 to 4 row stays bound beside the single years: its measure and its fact cover ages 2 and 3 and age 4, whose single-age cell is signed out for its 31 December reference date." + "notes": "Caseload only, by single year of age: working parent registrations at age 3 in the January census. Counted at the spring term, as DfE's January census counts: a child registered in the term that starts on 1 January of the model year's April-to-March span, by its age on 31 December (uk_runtime/dfe_spring_term.py; accounting note dfe_funded_childcare_single_ages)." }, "axiom": { "metric_name": "dfe/funded_childcare/working_parent_children_age_3", @@ -16576,24 +16619,19 @@ "observation_basis": "january_stock", "filters": [ { - "concept": "uk.childcare.is_child_receiving_universal_childcare", + "concept": "uk.childcare.dfe_spring_universal", "equals": true }, { - "concept": "uk.demographics.age", + "concept": "uk.childcare.dfe_age_at_31_december", "operator": ">=", "value": 3 }, { - "concept": "uk.demographics.age", + "concept": "uk.childcare.dfe_age_at_31_december", "operator": "<", "value": 4 }, - { - "concept": "uk.education.current_education", - "operator": "!=", - "value": "PRIMARY" - }, { "concept": "uk.geography.country", "equals": "ENGLAND" @@ -16608,30 +16646,25 @@ "map_to": "household", "filters": [ { - "variable": "is_child_receiving_universal_childcare", + "variable": "dfe_spring_universal", "equals": true }, { - "variable": "age", + "variable": "dfe_age_at_31_december", "operator": ">=", "value": 3 }, { - "variable": "age", + "variable": "dfe_age_at_31_december", "operator": "<", "value": 4 }, - { - "variable": "current_education", - "operator": "!=", - "value": "PRIMARY" - }, { "variable": "country", "equals": "ENGLAND" } ], - "notes": "Universal hours registrations at age 3 outside reception (DfE's nursery provision), counting working parent children too, as DfE's universal counts do. DfE's January registrations leave out children in reception, so a child in primary education (current_education PRIMARY) is not counted. The nursery total is the age 3 and age 4 cells and is not bound; the age 4 cell is signed out for its 31 December reference date, and universal_only_children is that total less the working parent ages 3 and 4." + "notes": "Universal hours registrations at age 3 outside reception (DfE's nursery provision), counting working parent children too, as DfE's universal counts do. Counted at the spring term, as DfE's January census counts: a child registered in the term that starts on 1 January of the model year's April-to-March span, by its age on 31 December (uk_runtime/dfe_spring_term.py; accounting note dfe_funded_childcare_single_ages). Universal hours start the term after the third birthday, so every child of DfE age 3 is counted, where policyengine-uk still reads the age on 6 October." }, "axiom": { "metric_name": "dfe/funded_childcare/universal_nursery_children_age_3", diff --git a/packages/microcosm-build/src/microcosm/build/uk/uprating_holds.json b/packages/microcosm-build/src/microcosm/build/uk/uprating_holds.json index 6965eee5d..3594e4578 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/uprating_holds.json +++ b/packages/microcosm-build/src/microcosm/build/uk/uprating_holds.json @@ -33,6 +33,19 @@ "status": "approved", "expires_on": "2026-12-11" }, + { + "scope": "national", + "kind": "in_year_snapshot", + "target_ids": [ + "dfe.funded_childcare.working_parent_children_9_to_11_months" + ], + "reason": "DfE funded early-education working parent registrations at 9 to 11 months counted in the January 2025 census: a count at a date inside the calibration year, not a lagged period. Requested by María on 2026-10-22 with the row, which the spring-term measures and its own under-2 take-up let the model carry (microcosm#1338).", + "tracking": "microcosm#1278", + "approved_by": "juaristi22", + "approved_on": "2026-10-22", + "status": "approved", + "expires_on": "2026-12-11" + }, { "scope": "national", "kind": "in_year_snapshot", diff --git a/packages/microcosm-build/tests/engine/uk/test_uk_childcare_targets.py b/packages/microcosm-build/tests/engine/uk/test_uk_childcare_targets.py index b48e99fe7..ff16c0ad3 100644 --- a/packages/microcosm-build/tests/engine/uk/test_uk_childcare_targets.py +++ b/packages/microcosm-build/tests/engine/uk/test_uk_childcare_targets.py @@ -20,7 +20,7 @@ def test_childcare_target_formula_contracts_match_the_installed_engine() -> None # From 2.128.1 a child on the working parent entitlement keeps the # universal hours (pe-uk#2177), so the universal-only row must leave the - # extended entitlement out itself. + # working-parent children out itself. assert "has_extended_childcare" not in universal_source universal_only = next( target @@ -32,11 +32,19 @@ def test_childcare_target_formula_contracts_match_the_installed_engine() -> None if target["target_id"] == "dfe.funded_childcare.universal_only_children" ) assert { - "variable": "is_child_receiving_extended_childcare", + "variable": "dfe_spring_working_parent", "equals": False, } in universal_only["bindings"]["policyengine"]["filters"] assert "tax_free_childcare_spend_routed_share" in tax_free_source + # The spring-term measures (dfe_spring_term.py) count a family that does + # not claim the universal or targeted hours on their own when the engine + # allocates them from the child's gross working-parent hours. Pin that + # allocation, so an engine that moved it would fail here. + for name in ("universal_childcare_entitlement", "targeted_childcare_entitlement"): + source = inspect.getsource(system.variables[name].formula) + assert "extended_childcare_entitlement_total_per_child" in source, name + for name in ( "is_child_receiving_tax_free_childcare", "is_child_receiving_extended_childcare", diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_measurement_period.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_measurement_period.py index 2212dbfcb..54b55332b 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_measurement_period.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_measurement_period.py @@ -352,11 +352,12 @@ def test_a_frame_without_a_period_label_keeps_the_frame_route(): #: reads. They keep their stored reads (microcosm#1324): who a row counts is #: fixed at the frame. Each is engine-computed (measured at the calibration #: period through the provider) or a stored input that does not change between -#: the frame's period and the calibration period (ages and sex are static, and -#: so is current_education, which the DfE childcare rows read beside age to -#: leave out reception; sign filters keep their sign under uprating, the -#: student-loan plan and the private-school flag are stored at the calibration -#: year). A new name here is +#: the frame's period and the calibration period (ages and sex are static; sign +#: filters keep their sign under uprating, the student-loan plan and the +#: private-school flag are stored at the calibration year). The DfE childcare +#: rows read the four spring-term measures (dfe_spring_term.py), which are +#: never stored (the resolver refuses them as columns), so they are computed +#: at the calibration period. A new name here is #: a stored read to review: route it, or measure the row at the frame period. REVIEWED_PLAIN_COLUMN_POPULATION_VARIABLES = frozenset( { @@ -368,7 +369,10 @@ def test_a_frame_without_a_period_label_keeps_the_frame_route(): "benunit_tenure_type", "council_tax_band", "country", - "current_education", + "dfe_age_at_31_december", + "dfe_spring_early_learning_2", + "dfe_spring_universal", + "dfe_spring_working_parent", "dividend_income", "eldest_adult_age", "employment_income", @@ -383,10 +387,7 @@ def test_a_frame_without_a_period_label_keeps_the_frame_route(): "housing_benefit", "income_tax", "is_child", - "is_child_receiving_extended_childcare", - "is_child_receiving_targeted_childcare", "is_child_receiving_tax_free_childcare", - "is_child_receiving_universal_childcare", "jsa_contrib", "main_residence_value", "maintenance_loan", 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 be86fb3a3..e4861a8df 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 @@ -241,10 +241,11 @@ def test_uk_population_targets_shape_order_and_registry_accounting() -> None: # microcosm#1262 binds Scotland's PIPR rents at BRMA grain; microcosm#1278 # adds the ONS single years 0, 1 and 2 for all persons inside the 0_4 sex # bands, and the childcare costing fixes (item 6) the UK's single years 3 - # to 6 and England's 0 to 6, and the DfE single-age rows four more - # funded-childcare counts (working parent ages 1-3, nursery age 3; the - # age-4 cells are signed out for their 31 December reference date). - assert len(resource["targets"]) == 436 + # to 6 and England's 0 to 6, and the DfE single-age rows five more + # funded-childcare counts (working parent 9 to 11 months and ages 1-3, + # nursery age 3; the age-4 cells are signed out, as the bound rows fix + # them). + assert len(resource["targets"]) == 437 providers = resource["hierarchy"]["providers"] categories = resource["hierarchy"]["categories"] @@ -258,10 +259,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) == 377 + assert len(registry_scope) == 378 assert len(profile_scope) == 59 - assert target_ids[:377] == registry_scope - assert target_ids[377:] == profile_scope + assert target_ids[:378] == registry_scope + assert target_ids[378:] == profile_scope parity = resource["registry_parity"] assert parity["pinned_ref"] == "12a1e028afeef08d8b2d74ee03fd9de3a78b2dd3" @@ -281,9 +282,9 @@ def test_uk_population_targets_shape_order_and_registry_accounting() -> None: # microcosm#1301's three high-value homes region rows have no uk-data # metric, nor do microcosm#1278's three single years of age or the eleven # the childcare costing fixes add (UK 3 to 6, England 0 to 6), nor the - # four DfE funded-childcare single-age rows. + # five DfE funded-childcare single-age rows. assert len(mapped_target_ids) == 186 - assert len(unmapped_declarations) == 191 + assert len(unmapped_declarations) == 192 suppressed_ancestors = parity["suppressed_ancestors"] assert len(suppressed_ancestors) == 5 assert set(suppressed_ancestors).isdisjoint(parity["mapped"]) @@ -558,24 +559,43 @@ def test_uk_population_targets_bind_england_single_years_0_to_6() -> None: DFE_SINGLE_AGE_IDS = ( + "dfe.funded_childcare.working_parent_children_9_to_11_months", *(f"dfe.funded_childcare.working_parent_children_age_{age}" for age in (1, 2, 3)), "dfe.funded_childcare.universal_nursery_children_age_3", ) -# María's ruling (2026-10-21): the age-4 cells are signed out, not bound. +# The age-4 cells stay signed out: the bound 2 to 4 and universal-only rows, +# less the bound ages 2 and 3, already fix them. DFE_SIGNED_OUT_AGE_4_IDS = ( "dfe.funded_childcare.working_parent_children_age_4", "dfe.funded_childcare.universal_nursery_children_age_4", "dfe.funded_childcare.universal_reception_children_age_4", ) -_DFE_AGE_LABEL = {1: "1 year", 2: "2 years", 3: "3 years"} +_DFE_AGE_LABEL = {0: "9 to 11 months", 1: "1 year", 2: "2 years", 3: "3 years"} +#: The spring-term measures every DfE row binds through (dfe_spring_term.py). +_DFE_SPRING_MEASURES = { + "dfe_age_at_31_december", + "dfe_spring_working_parent", + "dfe_spring_universal", + "dfe_spring_early_learning_2", +} -def _dfe_age_filters(key: str, age: int) -> list[dict]: - name = "uk.demographics.age" if key == "concept" else "age" - return [ - {key: name, "operator": ">=", "value": age}, - {key: name, "operator": "<", "value": age + 1}, - ] +def _dfe_age(target_id: str) -> int: + if target_id.endswith("_9_to_11_months"): + return 0 + return int(target_id.rsplit("_", 1)[1]) + + +def _dfe_age_filters(key: str, lower: int, upper: int | None = None) -> list[dict]: + name = ( + "uk.childcare.dfe_age_at_31_december" + if key == "concept" + else "dfe_age_at_31_december" + ) + filters = [{key: name, "operator": ">=", "value": lower}] + if upper is not None: + filters.append({key: name, "operator": "<", "value": upper}) + return filters def _dfe_country(key: str) -> dict: @@ -583,47 +603,52 @@ def _dfe_country(key: str) -> dict: return {key: name, "equals": "ENGLAND"} -def _dfe_not_primary(key: str) -> dict: - name = "uk.education.current_education" if key == "concept" else "current_education" - return {key: name, "operator": "!=", "value": "PRIMARY"} - - -def _dfe_flag(key: str, variable: str) -> dict: - name = f"uk.childcare.{variable}" if key == "concept" else variable - return {key: name, "equals": True} +def _dfe_flag(key: str, measure: str, value: bool = True) -> dict: + name = f"uk.childcare.{measure}" if key == "concept" else measure + return {key: name, "equals": value} def _dfe_expected_filters(target_id: str, key: str) -> list[dict]: - age = int(target_id.rsplit("_", 1)[1]) - if "working_parent" in target_id: + slug = target_id.removeprefix("dfe.funded_childcare.") + if slug == "working_parent_children_2_to_4": + return [ + _dfe_flag(key, "dfe_spring_working_parent"), + *_dfe_age_filters(key, 2), + _dfe_country(key), + ] + if slug == "early_learning_2_year_olds": + return [_dfe_flag(key, "dfe_spring_early_learning_2"), _dfe_country(key)] + if slug == "universal_only_children": return [ - _dfe_flag(key, "is_child_receiving_extended_childcare"), - *_dfe_age_filters(key, age), - *([_dfe_not_primary(key)] if age >= 2 else []), + _dfe_flag(key, "dfe_spring_universal"), + _dfe_flag(key, "dfe_spring_working_parent", False), _dfe_country(key), ] + age = _dfe_age(target_id) + measure = ( + "dfe_spring_working_parent" + if "working_parent" in slug + else "dfe_spring_universal" + ) return [ - _dfe_flag(key, "is_child_receiving_universal_childcare"), - *_dfe_age_filters(key, age), - _dfe_not_primary(key), + _dfe_flag(key, measure), + *_dfe_age_filters(key, age, age + 1), _dfe_country(key), ] def test_uk_population_targets_bind_dfe_funded_childcare_by_single_age() -> None: - """DfE's January census binds by single year of age beside the 2 to 4 row. + """DfE's January census binds by single age beside the 2 to 4 row. María's ruling (2026-10-21) binds every DfE funded-childcare count the model can carry, even on few records, and signs out only those with a real - reason: working parent registrations at ages 1, 2 and 3, and universal - nursery registrations at age 3, are bound. The working parent 2 to 4 row, - the take-up fitter's anchor, and the universal-only row stay bound. Each - row counts persons in English households with whole-year age ``k``, - outside reception (``current_education != PRIMARY``) from age 2, as DfE's - registrations leave reception out. The three age-4 cells are signed out: - DfE's ages are as at 31 December, the model's are interview ages, so - binding them would move weight between 4-year-olds in school and in - nursery because of the reference date, not the data. + reason: working parent registrations at 9 to 11 months and at ages 1, 2 + and 3, and universal nursery registrations at age 3, are bound beside the + working parent 2 to 4, early learning and universal-only rows. Her ruling + of 2026-10-22 counts every row at the spring term, by the age on 31 + December, through the spring-term measures (Vahid's round-2 finding A); + the under-2 rows take their own take-up. The three age-4 cells stay + signed out: the bound rows fix them. """ resource = _load() @@ -643,7 +668,7 @@ def test_uk_population_targets_bind_dfe_funded_childcare_by_single_age() -> None ) assert target_id not in set(parity["mapped"].values()) target = _target_by_id(resource, target_id) - age = int(target_id.rsplit("_", 1)[1]) + age = _dfe_age(target_id) assert target["family"] == "dfe_funded_childcare" assert target["category_id"] == "dfe.funded_childcare" assert target["geography_levels"] == ["country"] @@ -691,7 +716,19 @@ def test_uk_population_targets_bind_dfe_funded_childcare_by_single_age() -> None assert target_id not in parity["scope_target_ids"] assert target_id not in parity["unmapped_declarations"] - # The combined row and the universal-only difference stay as they were. + # The three earlier rows keep their facts and move to the spring term. + for slug in ( + "working_parent_children_2_to_4", + "early_learning_2_year_olds", + "universal_only_children", + ): + target = _target_by_id(resource, f"dfe.funded_childcare.{slug}") + assert target["measurement"]["filters"] == _dfe_expected_filters( + target["target_id"], "concept" + ) + assert target["bindings"]["policyengine"]["filters"] == ( + _dfe_expected_filters(target["target_id"], "variable") + ) combined = _target_by_id( resource, "dfe.funded_childcare.working_parent_children_2_to_4" ) @@ -702,39 +739,59 @@ def test_uk_population_targets_bind_dfe_funded_childcare_by_single_age() -> None note = parity["accounting_notes"]["dfe_funded_childcare_single_ages"] assert note.startswith("Requested by María on 2026-10-21") for reason in ( + "measures every DfE row at the spring term", + "by their age on the preceding 31 December", + "No row reads current_education", + "one birth cohort earlier", "the three age-4 cells", - "as at 31 December", - "because of the reference date, not the data", - "9 to 11 months", + "already fix them", "reception at age 3", "survey-based inputs", "registered percentages", + "their own take-up", ): - assert reason in note + assert reason in note, reason + + +def test_dfe_rows_read_the_spring_term_measures_only() -> None: + """The January-stock label is backed by the measure (finding A).""" + + for target in _load()["targets"]: + if target["family"] != "dfe_funded_childcare": + continue + assert target["measurement"]["observation_basis"] == "january_stock" + binding = target["bindings"]["policyengine"] + names = {predicate["variable"] for predicate in binding["filters"]} + assert names - {"country"} <= _DFE_SPRING_MEASURES, target["target_id"] + assert names & (_DFE_SPRING_MEASURES - {"dfe_age_at_31_december"}) + assert not names & {"age", "current_education"}, target["target_id"] def test_dfe_single_age_rows_hold_the_january_2025_census() -> None: - """The four rows read the January 2025 census, a signed in-year snapshot.""" + """The rows read the January 2025 census, signed in-year snapshots.""" holds = load_uk_uprating_holds()["holds"] - (entry,) = [ + entries = [ entry for entry in holds if set(DFE_SINGLE_AGE_IDS) & set(entry["target_ids"]) ] - assert sorted(entry["target_ids"]) == sorted(DFE_SINGLE_AGE_IDS) + assert sorted( + target_id for entry in entries for target_id in entry["target_ids"] + ) == sorted(DFE_SINGLE_AGE_IDS) assert not any( set(DFE_SIGNED_OUT_AGE_4_IDS) & set(hold["target_ids"]) for hold in holds ) - assert entry["scope"] == "national" - assert entry["kind"] == "in_year_snapshot" - assert uk_hold_is_signed(entry) - assert entry["approved_on"] == "2026-10-21" + for entry in entries: + assert entry["scope"] == "national" + assert entry["kind"] == "in_year_snapshot" + assert uk_hold_is_signed(entry) + assert {entry["approved_on"] for entry in entries} == {"2026-10-21", "2026-10-22"} 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) == 436 + assert len(target_ids) == 437 assert len(target_ids) == len(set(target_ids)) @@ -847,8 +904,8 @@ def test_childcare_bus_observation_basis_and_entity_pins_are_closed_world() -> N if target["family"] == "dfe_funded_childcare" ] # The working parent 2 to 4, early learning 2-year-olds and universal-only - # rows, and the four single-age rows of the DfE single-age binding. - assert len(childcare) == 7 + # rows, and the five single-age rows of the DfE single-age binding. + assert len(childcare) == 8 assert all( not target["measurement"]["concept"].endswith(".amount") for target in childcare ) @@ -1237,7 +1294,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) == 436 + assert len(targets) == 437 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_target_references.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_target_references.py index b9273117e..615c30c25 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 @@ -72,7 +72,7 @@ _TEST_PATHS = paths_for("microcosm-build") -ACTIVE_REFERENCE_COUNT = 1337 +ACTIVE_REFERENCE_COUNT = 1338 REGION_TIER_LEVEL = {code: level for level, code in UK_REGION_TIER} @@ -537,6 +537,7 @@ def test_childcare_and_bus_references_compile_with_declared_provenance() -> None "dfe.funded_childcare.working_parent_children_2_to_4": 621_482.0, "dfe.funded_childcare.early_learning_2_year_olds": 95_031.0, "dfe.funded_childcare.universal_only_children": 396_965.0, + "dfe.funded_childcare.working_parent_children_9_to_11_months": 29_155.0, "dfe.funded_childcare.working_parent_children_age_1": 195_104.0, "dfe.funded_childcare.working_parent_children_age_2": 242_453.0, "dfe.funded_childcare.working_parent_children_age_3": 278_640.0, @@ -760,6 +761,7 @@ def test_ons_single_year_age_references_pin_the_uk_and_england() -> None: DFE_SINGLE_AGE_IDS = ( + "dfe.funded_childcare.working_parent_children_9_to_11_months", *(f"dfe.funded_childcare.working_parent_children_age_{age}" for age in (1, 2, 3)), "dfe.funded_childcare.universal_nursery_children_age_3", ) @@ -771,13 +773,14 @@ def test_ons_single_year_age_references_pin_the_uk_and_england() -> None: def test_dfe_single_age_references_pin_england_at_the_january_2025_census() -> None: - """The four DfE single-age rows resolve one England fact each. + """The five DfE single-age rows resolve one England fact each. The ``dfe.`` prefix pins every DfE row to England (E92000001); each new row selects one age cell of its census table, January 2025, held to the - 2025 calibration year (María's ruling, 2026-10-21). The age-4 cells are - signed out for their 31 December reference date, so they have no - reference and no membership entry. + 2025 calibration year (María's rulings, 2026-10-21 and 2026-10-22, the + 9 to 11 months row with its own hold). The age-4 cells are signed out, as + the bound rows fix them, so they have no reference and no membership + entry. """ references = { @@ -1004,7 +1007,7 @@ 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": 1337, + "active": 1338, "no_fact_at_or_before_period": 5, "signed_excluded": 17, } diff --git a/tools/build_uk_ledger_compile_parity_signed_differences.py b/tools/build_uk_ledger_compile_parity_signed_differences.py index b4941d4e8..f52b46ad6 100644 --- a/tools/build_uk_ledger_compile_parity_signed_differences.py +++ b/tools/build_uk_ledger_compile_parity_signed_differences.py @@ -356,15 +356,18 @@ class ParityReceiptSpec: _DFE_SINGLE_AGE_LEDGER_ONLY_RATIONALE = ( "Requested by María on 2026-10-21 for the £100k childcare costing fixes " - "(microcosm#1278, #1095): one of the four DfE funded-childcare counts by " - "single year of age from the January 2025 census, England (working parent " - "registrations at ages 1, 2 and 3, and universal nursery registrations at " - "age 3), bound beside the working parent 2 to 4 and universal-only rows, which " - "stay bound. The age-4 cells are signed out for their 31 December reference " - "date. The incumbent binds no DfE row, so this row has no fixture counterpart." + "(microcosm#1278, #1095): one of the five DfE funded-childcare counts by " + "single age from the January 2025 census, England (working parent " + "registrations at 9 to 11 months and at ages 1, 2 and 3, and universal " + "nursery registrations at age 3), bound beside the working parent 2 to 4, " + "early learning and universal-only rows and, with them, measured at the " + "spring term by the age on 31 December (María's ruling of 2026-10-22). The " + "age-4 cells are signed out, as the bound rows fix them. The incumbent binds " + "no DfE row, so this row has no fixture counterpart." ) _DFE_SINGLE_AGE_ROWS = frozenset( ( + "dfe.funded_childcare.working_parent_children_9_to_11_months", *( f"dfe.funded_childcare.working_parent_children_age_{age}" for age in (1, 2, 3) From fe4ccde929822c9494fc48034b2ec6f8c2337a86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 22 Oct 2026 22:57:23 +0100 Subject: [PATCH 15/25] Count the 9 to 11 months reference in the remaining reference counts Two more tests pin the active reference count, which the 9 to 11 months row takes from 1,337 to 1,338. Co-Authored-By: Claude Opus 5.5 --- .../tests/engine_free/shared/test_country_spec.py | 4 ++-- .../tests/engine_free/uk/test_uk_national_calibration.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) 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 b8d272b70..f926eaa00 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 @@ -1175,8 +1175,8 @@ def test_uk_target_references_accept_regenerated_contract_fields(self) -> None: references = {reference.name: reference for reference in spec.target_references} assert ( - len(references) == 1337 - ) # childcare costing fixes: + 4, DfE funded childcare by single year of age (working parent 1-3, universal nursery 3; the age-4 cells are signed out); item 6: + 11, the UK's ONS single years 3 to 6 and England's 0 to 6; microcosm#1278: + 3, the ONS single years 0, 1 and 2 for all persons; microcosm#1095: + 4, the two national 15_19 sex bands split into ages 15, 16-17 and 18-19; microcosm#1106: + 13 SPI property amounts; microcosm#1113: + 1 ONS 07.2.2 household road fuel; PolicyEngine/chronicle#280 lane: 705 + 33 HMRC liabilities rows (Table 2.5, three + len(references) == 1338 + ) # childcare costing fixes: + 5, DfE funded childcare by single age (working parent 9-11 months and 1-3, universal nursery 3; the age-4 cells are signed out); item 6: + 11, the UK's ONS single years 3 to 6 and England's 0 to 6; microcosm#1278: + 3, the ONS single years 0, 1 and 2 for all persons; microcosm#1095: + 4, the two national 15_19 sex bands split into ages 15, 16-17 and 18-19; microcosm#1106: + 13 SPI property amounts; microcosm#1113: + 1 ONS 07.2.2 household road fuel; 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 # ten regional bands over twelve areas); microcosm#905: 424 - 18 country 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 0a95994c3..6d2a6edb4 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 @@ -58,9 +58,9 @@ # load_uk_national_target_inputs drops after the compile; microcosm#1278 adds # the ONS single years 0, 1 and 2 for all persons, and the childcare costing # fixes (item 6) the UK's single years 3 to 6 and England's 0 to 6, and the -# DfE single-age rows four funded-childcare counts (the age-4 cells are signed -# out). -ACTIVE_REFERENCE_COUNT = 1337 +# DfE single-age rows five funded-childcare counts (working parent 9 to 11 +# months and ages 1-3, universal nursery 3; the age-4 cells are signed out). +ACTIVE_REFERENCE_COUNT = 1338 def _uc_reference(**overrides) -> LedgerTargetReference: From 6aea1ec0019d3444b29afbc43014a25ac22d4c95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 22 Oct 2026 23:03:49 +0100 Subject: [PATCH 16/25] Give children under 2 their own working-parent take-up MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DfE registers far fewer of the youngest eligible children than of those aged 2 to 4, so one family rate fitted at 2 to 4 funded too many of them (María's ruling of 2026-10-22: "bind them with their own take up"). frs_take_up now draws, for each child of whole-year age 0 or 1 in a unit claiming the working-parent hours, whether it uses them, at the contract's extended_childcare_under_2_usage rate (provisional 0.75 until the v6 refit); a non-user gets max_free_entitlement_hours_used 0 and every other person the engine's default of 30. childcare_copy_take_up re-draws the copies' children on their own person ids against their own unit's flag. The stage manifests, graph cells, export allow-lists, signal gate (share over claiming children under 2), identity receipt and coverage manifest follow. The fitter scales the under-2 share only on the claiming-world sides. Co-Authored-By: Claude Opus 5.5 --- .../uk-childcare-under-2-usage.added.md | 1 + .../src/microcosm/build/uk/gates.json | 1 + .../uk/release_input_coverage_manifest.json | 44 +++---- .../src/microcosm/build/uk/source_stages.json | 33 +++++- .../src/microcosm/build/uk/spec/sources.yaml | 23 +++- .../microcosm/build/uk/take_up_contract.json | 20 ++++ .../uk_runtime/childcare_copy_take_up.py | 46 +++++++- .../microcosm/build/uk_runtime/frs_take_up.py | 110 +++++++++++++++++- .../src/microcosm/build/uk_runtime/graph.py | 2 + .../build/uk_runtime/terminal_gates.py | 1 + .../engine/uk/test_uk_dfe_spring_term.py | 23 ++++ .../uk/test_uk_childcare_copy_take_up.py | 59 +++++++++- .../engine_free/uk/test_uk_frs_stochastic.py | 34 ++++++ .../engine_free/uk/test_uk_source_stages.py | 8 +- .../uk/test_uk_take_up_contract.py | 3 + .../engine_free/uk/test_uk_take_up_gate.py | 49 ++++++-- .../microcosm_build/uk_frs_stochastic.py | 1 + tools/fit_uk_childcare_takeup.py | 15 +-- tools/verify_uk_identity_stability.py | 12 ++ 19 files changed, 431 insertions(+), 54 deletions(-) create mode 100644 changelog.d/uk-childcare-under-2-usage.added.md diff --git a/changelog.d/uk-childcare-under-2-usage.added.md b/changelog.d/uk-childcare-under-2-usage.added.md new file mode 100644 index 000000000..1a4398a66 --- /dev/null +++ b/changelog.d/uk-childcare-under-2-usage.added.md @@ -0,0 +1 @@ +Children under 2 take their own working-parent take-up. `frs_take_up` draws, for each child of whole-year age 0 or 1 in a benefit unit that claims the working-parent hours, whether it uses them, at the new contract rate `extended_childcare_under_2_usage` (keyed on `person_id`, seed 0, salt the output); a child that does not gets `max_free_entitlement_hours_used` 0, so policyengine-uk funds it no hours, and every other person keeps the engine's default of 30. DfE registers far fewer of the youngest eligible children than of those aged 2 to 4 (mostly parental leave), so one family rate fitted at 2 to 4 funded too many of them. `childcare_copy_take_up` re-draws the copies' children against their own unit's re-drawn flag. The take-up signal gate measures the share over the children under 2 in claiming units; the column is allowed on the export surface. The rate is provisional (0.75) until the tool-version-6 childcare refit fits it against DfE's working parent rows at 9 to 11 months and age 1. diff --git a/packages/microcosm-build/src/microcosm/build/uk/gates.json b/packages/microcosm-build/src/microcosm/build/uk/gates.json index 81359a7ad..c5c62d525 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/gates.json +++ b/packages/microcosm-build/src/microcosm/build/uk/gates.json @@ -1067,6 +1067,7 @@ "person.would_claim_carers_allowance", "person.would_claim_marriage_allowance", "person.would_claim_scp", + "person.max_free_entitlement_hours_used", "person.person_is_spi_income_band_carrier", "person.person_is_spi_income_recipient", "benunit.benunit_source_id", 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 cc8619359..4e3fe7894 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 @@ -470,7 +470,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": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", + "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", "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" @@ -493,7 +493,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", + "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", "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" @@ -516,7 +516,7 @@ "required_mass_change_reason": "Capital-gains residential split divides every household carrying liable gainers into arms weighted by the solved residential probabilities, one arm per subset of residential gainers; every household's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", + "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", "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) on the amounts the Table 3 redraw placed" @@ -538,7 +538,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": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", + "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", "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)" @@ -567,7 +567,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": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", + "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", "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" @@ -587,7 +587,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": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", + "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", "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" @@ -609,7 +609,7 @@ "required_mass_change_reason": "High-value home support divides every owner household in the top value stratum of its region 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": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", + "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", "source_vintages": { "source": "Microcosm structural operator (microcosm#1240 fix 1); no publisher input", "survey": "Family Resources Survey 2024-25 and SPI synthetic support, after the WAS wealth draw and the regional property uprating" @@ -630,7 +630,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": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", + "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", "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" @@ -654,7 +654,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", + "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", "source_vintages": { "conditioning_resource": "hmrc_cgt_conditioning_facts.json", "conditioning_resource_sha256": "054b1ee1a66cae6ed3793053eb0d3b9eea6b3f8976953479948ae11f7eedcd35", @@ -743,7 +743,7 @@ "full_frs_tei_band_unavailable" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", + "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", "source_vintages": { "hmrc_surface": "2023-24", "mapped_build_period": "2024", @@ -785,7 +785,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": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", + "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", "source_vintages": { "source": "UK Data Service SN 9603 Living Costs and Food Survey 2024-25 (2nd edition) household/person tabs and the vendored Chronicle facts for NEED 2024 mean kWh, DESNZ Energy Trends and QEP average prices paid for calendar 2024, road-fuel outturn (DESNZ, HMRC, ONS Consumer Trends) and road fuel by vehicle type (DESNZ), ONS Consumer Trends household spending by COICOP division, the DfT VEH1103 licensed-car stock, NTS bus use, and the DfT and devolved bus finance tables and fares indices.", "survey": "Living Costs and Food Survey 2024-25" @@ -811,7 +811,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": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", + "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", "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" @@ -831,7 +831,7 @@ "required_mass_change_reason": "Private-school attendance stored on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", + "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", "source_vintages": { "source": "policyengine-uk attends_private_school (the gov.simulation.private_school_vat attendance rates and factor), evaluated by the pinned engine", "survey": "policyengine-uk private-school attendance imputation, stored at the spine's weights" @@ -854,7 +854,7 @@ "property_finance_costs" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", + "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", "source_vintages": { "source": "https://www.gov.uk/government/statistics/property-rental-income-statistics", "survey": "Survey of Personal Incomes Public Use Tape 2022-23 and HMRC Property Rental Income Statistics 2026 (tax year 2024-25)" @@ -875,7 +875,7 @@ "required_mass_change_reason": "Annual property purchases imputed on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", + "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", "source_vintages": { "source": "https://www.gov.uk/government/statistics/uk-stamp-tax-statistics", "survey": "HMRC Annual Stamp Tax Statistics 2024 to 2025 (corrected 11 March 2026), Tables 6b, 8a and 8b" @@ -898,7 +898,7 @@ "property_wealth" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", + "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", "source_vintages": { "source": "uk/high_value_home_value_knots.json, built by tools/build_uk_high_value_home_stock.py from PolicyEngine/chronicle#343's registrations", "survey": "HM Land Registry Price Paid latest sales uprated with the UK House Price Index, owner-weighted by region (the dense value node's knots, region level)" @@ -922,7 +922,7 @@ "non_residential_property_value" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", + "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", "source_vintages": { "source": "MHCLG dwellings and the UK House Price Index regional average price averaged over the twelve months of calendar 2024 from the July 2026 full file, the frame's valuation basis, so the engine's annual uprating from 2024 projects the value once (microcosm#1240 fix 5).", "survey": "Public regional property reference" @@ -949,7 +949,7 @@ "employment_income" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", + "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", "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" @@ -982,7 +982,7 @@ "household_source_id" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", + "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", "source_vintages": { "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).", "survey": "Survey of Personal Incomes Public Use Tape 2022-23 and HMRC Income Tax liabilities statistics July 2026 Table 2.5" @@ -1004,7 +1004,7 @@ "student_loan_plan" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", + "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", "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" @@ -1026,7 +1026,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": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", + "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", "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" @@ -1061,7 +1061,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": "cc95c014e918dfd6d530335d5988897485d96052b832522bb5817fbdba2430e2", + "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", "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/source_stages.json b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json index 3b5e593f4..80fc20772 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json +++ b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json @@ -1092,6 +1092,16 @@ "draw": "maximum_extended_childcare_hours_usage", "distribution_key": "maximum_extended_childcare_hours_usage", "seed": 0 + }, + { + "kind": "assign_binary_from_rate", + "output": "max_free_entitlement_hours_used", + "draw": "max_free_entitlement_hours_used", + "rate_key": "extended_childcare_under_2_usage", + "eligibility": "persons of whole-year age 0 or 1 in benefit units that claim the working-parent hours (would_claim_extended_childcare)", + "assignment_unit": "person", + "rate_derivation": "a child under 2 in a claiming unit uses the working-parent hours where u < rate and gets max_free_entitlement_hours_used 0 otherwise; every other person keeps the engine's default of 30", + "seed": 0 } ], "outputs": [ @@ -1104,12 +1114,14 @@ "would_claim_universal_childcare", "would_claim_targeted_childcare", "would_claim_uc_childcare", - "maximum_extended_childcare_hours_usage" + "maximum_extended_childcare_hours_usage", + "max_free_entitlement_hours_used" ], "nonnegative_outputs": [ - "maximum_extended_childcare_hours_usage" + "maximum_extended_childcare_hours_usage", + "max_free_entitlement_hours_used" ], - "notes": "Identity-keyed seed 0 streams replace the incumbent sequential take-up seed 100; salts are output variable names. Reported positive receipt anchors are transient and consumed only. The Universal Credit draw's population is the benefit units with a UC claimant or partner (is_uc_claimant) aged 18 or over and under Pension Credit qualifying age (66 for everyone who can reach it in this release), the age and role conditions of policyengine-uk 2.147.2's is_uc_eligible; the engine lockstep test pins it and names the three engine cases not mirrored (16- and 17-year-old claimants under the UC Regs 2013 reg 8 exceptions, mixed-age couples on the Pension Credit route, and from 2.128.0 pension-age families moved onto Universal Credit when their legacy benefit closes, SI 2014/1230 reg 60A). So the contract rate is a share of those units, an anchor outside them stays true, and any other unit is never drawn; a unit with no claimant or partner of that age keeps its reported Housing Benefit, which a claim it cannot make no longer zeroes (#882, microcosm#867, microcosm#1095). The universal childcare flag is nested under the working-parent one. A unit that claims the extended hours claims the universal hours, and any other unit claims them at the contract's universal_childcare rate, the rate conditional on not claiming the extended hours; the extended draw is unchanged. childcare_copy_take_up later re-draws the childcare flags and hours of the support and CGT copies on their own benefit units." + "notes": "Identity-keyed seed 0 streams replace the incumbent sequential take-up seed 100; salts are output variable names. Reported positive receipt anchors are transient and consumed only. The Universal Credit draw's population is the benefit units with a UC claimant or partner (is_uc_claimant) aged 18 or over and under Pension Credit qualifying age (66 for everyone who can reach it in this release), the age and role conditions of policyengine-uk 2.147.2's is_uc_eligible; the engine lockstep test pins it and names the three engine cases not mirrored (16- and 17-year-old claimants under the UC Regs 2013 reg 8 exceptions, mixed-age couples on the Pension Credit route, and from 2.128.0 pension-age families moved onto Universal Credit when their legacy benefit closes, SI 2014/1230 reg 60A). So the contract rate is a share of those units, an anchor outside them stays true, and any other unit is never drawn; a unit with no claimant or partner of that age keeps its reported Housing Benefit, which a claim it cannot make no longer zeroes (#882, microcosm#867, microcosm#1095). The universal childcare flag is nested under the working-parent one. A unit that claims the extended hours claims the universal hours, and any other unit claims them at the contract's universal_childcare rate, the rate conditional on not claiming the extended hours; the extended draw is unchanged. childcare_copy_take_up later re-draws the childcare flags and hours of the support and CGT copies on their own benefit units. A child of whole-year age 0 or 1 in a unit that claims the working-parent hours uses them at the contract's extended_childcare_under_2_usage rate (DfE registers far fewer of the youngest eligible children than of those aged 2 to 4); a child that does not gets max_free_entitlement_hours_used 0, so the engine funds it no hours, and every other person keeps the engine's default of 30." }, { "stage": "frs_person_draws", @@ -6530,6 +6542,16 @@ "distribution_key": "maximum_extended_childcare_hours_usage", "eligibility": "copy benefit units only, a unit whose household has a non-empty clone path (SPI support channel or income-band donor, CGT support split, high-value home support, CGT incidence clone, residential arm) or whose benunit_support_clone_index is positive; native units keep their frs_take_up draw", "seed": 0 + }, + { + "kind": "assign_binary_from_rate", + "output": "max_free_entitlement_hours_used", + "draw": "max_free_entitlement_hours_used", + "rate_key": "extended_childcare_under_2_usage", + "eligibility": "children of whole-year age 0 or 1 in copy benefit units that claim the working-parent hours, against the copy's re-drawn would_claim_extended_childcare; native persons keep their frs_take_up draws", + "assignment_unit": "person", + "rate_derivation": "as in frs_take_up, keyed on the copy's own person_id", + "seed": 0 } ], "outputs": [], @@ -6538,9 +6560,10 @@ "would_claim_extended_childcare", "would_claim_universal_childcare", "would_claim_targeted_childcare", - "maximum_extended_childcare_hours_usage" + "maximum_extended_childcare_hours_usage", + "max_free_entitlement_hours_used" ], - "notes": "Runs after the last copy stage and before private_school_attendance, whose net-income ranking counts the childcare entitlements and Tax-Free Childcare. frs_take_up draws the childcare flags and the extended-hours usage on FRS benefit units before any copy exists, so every SPI support copy, income-band donor, high-value home support copy, CGT support copy, CGT incidence clone and residential arm inherited its host's draws, and a cell with few hosts fixed the take-up of all their copies. This stage re-draws would_claim_tfc, would_claim_extended_childcare, would_claim_universal_childcare (nested under the extended flag) and would_claim_targeted_childcare at the contract rates, and maximum_extended_childcare_hours_usage from the contract's clipped normal, for the copies only, with frs_take_up's own helper, seed 0 and output-name salts, keyed on the copy's own benunit_id. A copy's structural id is its source id plus a multiple of an offset above every id in the frame, so it is unique, differs from every native id and gives the copy streams independent of its host's; a rebuild of the same frame draws the same values. Native benefit units keep their frs_take_up draws. The anchored Child Benefit, Pension Credit and Universal Credit flags and would_claim_uc_childcare are left as they are." + "notes": "Runs after the last copy stage and before private_school_attendance, whose net-income ranking counts the childcare entitlements and Tax-Free Childcare. frs_take_up draws the childcare flags and the extended-hours usage on FRS benefit units before any copy exists, so every SPI support copy, income-band donor, high-value home support copy, CGT support copy, CGT incidence clone and residential arm inherited its host's draws, and a cell with few hosts fixed the take-up of all their copies. This stage re-draws would_claim_tfc, would_claim_extended_childcare, would_claim_universal_childcare (nested under the extended flag) and would_claim_targeted_childcare at the contract rates, and maximum_extended_childcare_hours_usage from the contract's clipped normal, for the copies only, with frs_take_up's own helper, seed 0 and output-name salts, keyed on the copy's own benunit_id. A copy's structural id is its source id plus a multiple of an offset above every id in the frame, so it is unique, differs from every native id and gives the copy streams independent of its host's; a rebuild of the same frame draws the same values. Native benefit units keep their frs_take_up draws. The anchored Child Benefit, Pension Credit and Universal Credit flags and would_claim_uc_childcare are left as they are. It also re-draws the copies' children's max_free_entitlement_hours_used, the under-2 usage, against their own unit's re-drawn working-parent flag, keyed on their own person_id." }, { "stage": "private_school_attendance", 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 9185e865b..0dfc6068a 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml +++ b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml @@ -998,6 +998,14 @@ stages: draw: maximum_extended_childcare_hours_usage distribution_key: maximum_extended_childcare_hours_usage seed: 0 + - kind: assign_binary_from_rate + output: max_free_entitlement_hours_used + draw: max_free_entitlement_hours_used + rate_key: extended_childcare_under_2_usage + eligibility: persons of whole-year age 0 or 1 in benefit units that claim the working-parent hours (would_claim_extended_childcare) + assignment_unit: person + rate_derivation: a child under 2 in a claiming unit uses the working-parent hours where u < rate and gets max_free_entitlement_hours_used 0 otherwise; every other person keeps the engine's default of 30 + seed: 0 outputs: - would_claim_child_benefit - child_benefit_opts_out @@ -1009,9 +1017,11 @@ stages: - would_claim_targeted_childcare - would_claim_uc_childcare - maximum_extended_childcare_hours_usage + - max_free_entitlement_hours_used nonnegative_outputs: - maximum_extended_childcare_hours_usage - notes: Identity-keyed seed 0 streams replace the incumbent sequential take-up seed 100; salts are output variable names. Reported positive receipt anchors are transient and consumed only. The Universal Credit draw's population is the benefit units with a UC claimant or partner (is_uc_claimant) aged 18 or over and under Pension Credit qualifying age (66 for everyone who can reach it in this release), the age and role conditions of policyengine-uk 2.147.2's is_uc_eligible; the engine lockstep test pins it and names the three engine cases not mirrored (16- and 17-year-old claimants under the UC Regs 2013 reg 8 exceptions, mixed-age couples on the Pension Credit route, and from 2.128.0 pension-age families moved onto Universal Credit when their legacy benefit closes, SI 2014/1230 reg 60A). So the contract rate is a share of those units, an anchor outside them stays true, and any other unit is never drawn; a unit with no claimant or partner of that age keeps its reported Housing Benefit, which a claim it cannot make no longer zeroes (#882, microcosm#867, microcosm#1095). The universal childcare flag is nested under the working-parent one. A unit that claims the extended hours claims the universal hours, and any other unit claims them at the contract's universal_childcare rate, the rate conditional on not claiming the extended hours; the extended draw is unchanged. childcare_copy_take_up later re-draws the childcare flags and hours of the support and CGT copies on their own benefit units. + - max_free_entitlement_hours_used + notes: Identity-keyed seed 0 streams replace the incumbent sequential take-up seed 100; salts are output variable names. Reported positive receipt anchors are transient and consumed only. The Universal Credit draw's population is the benefit units with a UC claimant or partner (is_uc_claimant) aged 18 or over and under Pension Credit qualifying age (66 for everyone who can reach it in this release), the age and role conditions of policyengine-uk 2.147.2's is_uc_eligible; the engine lockstep test pins it and names the three engine cases not mirrored (16- and 17-year-old claimants under the UC Regs 2013 reg 8 exceptions, mixed-age couples on the Pension Credit route, and from 2.128.0 pension-age families moved onto Universal Credit when their legacy benefit closes, SI 2014/1230 reg 60A). So the contract rate is a share of those units, an anchor outside them stays true, and any other unit is never drawn; a unit with no claimant or partner of that age keeps its reported Housing Benefit, which a claim it cannot make no longer zeroes (#882, microcosm#867, microcosm#1095). The universal childcare flag is nested under the working-parent one. A unit that claims the extended hours claims the universal hours, and any other unit claims them at the contract's universal_childcare rate, the rate conditional on not claiming the extended hours; the extended draw is unchanged. childcare_copy_take_up later re-draws the childcare flags and hours of the support and CGT copies on their own benefit units. A child of whole-year age 0 or 1 in a unit that claims the working-parent hours uses them at the contract's extended_childcare_under_2_usage rate (DfE registers far fewer of the youngest eligible children than of those aged 2 to 4); a child that does not gets max_free_entitlement_hours_used 0, so the engine funds it no hours, and every other person keeps the engine's default of 30. - stage: frs_person_draws survey: Family Resources Survey 2024-25 source: Sourced UK take-up contract rates and identity-keyed deterministic draws. @@ -5268,6 +5278,14 @@ stages: distribution_key: maximum_extended_childcare_hours_usage eligibility: copy benefit units only, a unit whose household has a non-empty clone path (SPI support channel or income-band donor, CGT support split, high-value home support, CGT incidence clone, residential arm) or whose benunit_support_clone_index is positive; native units keep their frs_take_up draw seed: 0 + - kind: assign_binary_from_rate + output: max_free_entitlement_hours_used + draw: max_free_entitlement_hours_used + rate_key: extended_childcare_under_2_usage + eligibility: children of whole-year age 0 or 1 in copy benefit units that claim the working-parent hours, against the copy's re-drawn would_claim_extended_childcare; native persons keep their frs_take_up draws + assignment_unit: person + rate_derivation: as in frs_take_up, keyed on the copy's own person_id + seed: 0 outputs: [] rewrites: - would_claim_tfc @@ -5275,7 +5293,8 @@ stages: - would_claim_universal_childcare - would_claim_targeted_childcare - maximum_extended_childcare_hours_usage - notes: Runs after the last copy stage and before private_school_attendance, whose net-income ranking counts the childcare entitlements and Tax-Free Childcare. frs_take_up draws the childcare flags and the extended-hours usage on FRS benefit units before any copy exists, so every SPI support copy, income-band donor, high-value home support copy, CGT support copy, CGT incidence clone and residential arm inherited its host's draws, and a cell with few hosts fixed the take-up of all their copies. This stage re-draws would_claim_tfc, would_claim_extended_childcare, would_claim_universal_childcare (nested under the extended flag) and would_claim_targeted_childcare at the contract rates, and maximum_extended_childcare_hours_usage from the contract's clipped normal, for the copies only, with frs_take_up's own helper, seed 0 and output-name salts, keyed on the copy's own benunit_id. A copy's structural id is its source id plus a multiple of an offset above every id in the frame, so it is unique, differs from every native id and gives the copy streams independent of its host's; a rebuild of the same frame draws the same values. Native benefit units keep their frs_take_up draws. The anchored Child Benefit, Pension Credit and Universal Credit flags and would_claim_uc_childcare are left as they are. + - max_free_entitlement_hours_used + notes: Runs after the last copy stage and before private_school_attendance, whose net-income ranking counts the childcare entitlements and Tax-Free Childcare. frs_take_up draws the childcare flags and the extended-hours usage on FRS benefit units before any copy exists, so every SPI support copy, income-band donor, high-value home support copy, CGT support copy, CGT incidence clone and residential arm inherited its host's draws, and a cell with few hosts fixed the take-up of all their copies. This stage re-draws would_claim_tfc, would_claim_extended_childcare, would_claim_universal_childcare (nested under the extended flag) and would_claim_targeted_childcare at the contract rates, and maximum_extended_childcare_hours_usage from the contract's clipped normal, for the copies only, with frs_take_up's own helper, seed 0 and output-name salts, keyed on the copy's own benunit_id. A copy's structural id is its source id plus a multiple of an offset above every id in the frame, so it is unique, differs from every native id and gives the copy streams independent of its host's; a rebuild of the same frame draws the same values. Native benefit units keep their frs_take_up draws. The anchored Child Benefit, Pension Credit and Universal Credit flags and would_claim_uc_childcare are left as they are. It also re-draws the copies' children's max_free_entitlement_hours_used, the under-2 usage, against their own unit's re-drawn working-parent flag, keyed on their own person_id. - stage: private_school_attendance survey: policyengine-uk private-school attendance imputation, stored at the spine's weights source: policyengine-uk attends_private_school (the gov.simulation.private_school_vat attendance rates and factor), evaluated by the pinned engine 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 5a4c892cd..e8e39938f 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 @@ -290,6 +290,26 @@ "status": "fitted at the 2024 base year with the expectation basis of tool version 5: universal take-up nested under working-parent take-up (its rate is conditional on not claiming extended hours), targeted hours allocated from working-parent hours (pe-uk#2177), reception-age children (current_education PRIMARY) left out of the DfE working-parent and universal-only rows, and the DfE extended-hours anchor (#1126) in the simulation. At a bound: universal_childcare. The conditional universal rate stops at its lower bound of 0 (universal take-up fully nested under working-parent take-up): with reception children out, the nested floor already gives more universal-only children than DfE's January count, because the model's interview-date ages hold more 4-year-olds outside reception than DfE's 31 December ages; per María's U2c ruling the rate keeps its bound and the receipt records the residual, and the national calibration binds the DfE rows." } }, + { + "key": "extended_childcare_under_2_usage", + "output": "max_free_entitlement_hours_used", + "entity": "person", + "values": { + "2024-04-06": 0.75 + }, + "source": { + "source": "DfE Funded early education and childcare, January 2025 (reporting year 2025 headline figures)", + "agency": "DfE", + "citation": "The share of children under 2 in benefit units that claim the working-parent hours who use them. DfE registers far fewer of the youngest eligible children than of those aged 2 to 4, mostly for parental leave: in January 2025, 29,155 working parent registrations at 9 to 11 months and 195,104 at age 1, against 621,482 at ages 2 to 4. 0.75 is provisional, the registrations per eligible child at 9 to 11 months and age 1 relative to ages 2 to 4 in DfE's own estimates, until tools/fit_uk_childcare_takeup.py (tool version 6) fits it with the other childcare rates against the working parent rows at 9 to 11 months and age 1. Applied by frs_take_up (and childcare_copy_take_up for the copies) to each child of whole-year age 0 or 1 in a unit that claims the working-parent hours: a child that does not use them gets max_free_entitlement_hours_used 0, every other person the engine's default of 30.", + "url": "https://explore-education-statistics.service.gov.uk/find-statistics/funded-early-education-and-childcare/2025", + "status": "frozen_by_adjudication", + "freeze": { + "decision": "María's ruling of 2026-10-22 on Vahid's round-2 review of microcosm#1338 (\"bind them with their own take up\"): the under-2 working parent rows are bound with their own usage rate, provisional until the tool-version-6 refit", + "followup": "microcosm#1338" + } + }, + "population": "children of whole-year age 0 or 1 in benefit units that claim the working-parent hours (would_claim_extended_childcare)" + }, { "key": "universal_childcare", "output": "would_claim_universal_childcare", diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/childcare_copy_take_up.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/childcare_copy_take_up.py index 82459143e..e5f9ad19b 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/childcare_copy_take_up.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/childcare_copy_take_up.py @@ -12,7 +12,10 @@ ``would_claim_universal_childcare`` (nested under the extended flag), ``would_claim_targeted_childcare`` and ``maximum_extended_childcare_hours_usage`` for the copies only, through ``frs_take_up``'s own -``derive_childcare_take_up`` at the same contract rates, seed and salts. +``derive_childcare_take_up`` at the same contract rates, seed and salts, and +the copies' children's ``max_free_entitlement_hours_used`` (the under-2 usage +draw) against their own unit's re-drawn working-parent flag, through +``derive_under_two_childcare_usage`` keyed on the copy's own ``person_id``. The draws are keyed on the copy's own ``benunit_id``. Every copy stage gives a copy the structural id ``source id + k × offset`` with an offset above every @@ -41,8 +44,13 @@ UK_CHILDCARE_HOURS_OUTPUT, UK_CHILDCARE_TAKE_UP_FLAGS, UK_CHILDCARE_TAKE_UP_OUTPUTS, + UK_EXTENDED_CHILDCARE_OUTPUT, + UK_UNDER_TWO_USAGE_OUTPUT, + assert_under_two_usage_declaration, assert_universal_childcare_nesting_declaration, derive_childcare_take_up, + derive_under_two_childcare_usage, + person_unit_flag, ) from microcosm.build.uk_runtime.household_lineage import ( uk_household_clone_paths, @@ -58,6 +66,7 @@ from microcosm.frame import Frame __all__ = [ + "CHILDCARE_COPY_TAKE_UP_REWRITES", "CHILDCARE_COPY_TAKE_UP_STAGE_NAME", "UKChildcareCopyTakeUpStageTransform", "copy_benunits", @@ -66,6 +75,12 @@ CHILDCARE_COPY_TAKE_UP_STAGE_NAME = "childcare_copy_take_up" BENUNIT_SUPPORT_CLONE_INDEX = "benunit_support_clone_index" +#: The columns the stage rewrites: the benefit-unit childcare draws, then the +#: children's under-2 usage. +CHILDCARE_COPY_TAKE_UP_REWRITES = ( + *UK_CHILDCARE_TAKE_UP_OUTPUTS, + UK_UNDER_TWO_USAGE_OUTPUT, +) @dataclass(frozen=True) @@ -77,11 +92,12 @@ class UKChildcareCopyTakeUpStageTransform: def __call__(self, frame: Frame) -> Frame: assert_universal_childcare_nesting_declaration(self.stage) + assert_under_two_usage_declaration(self.stage) declared = tuple(self.stage.rewrites) - if declared != UK_CHILDCARE_TAKE_UP_OUTPUTS: + if declared != CHILDCARE_COPY_TAKE_UP_REWRITES: raise ValueError( f"stage {self.stage.stage!r} must declare the rewrites " - f"{list(UK_CHILDCARE_TAKE_UP_OUTPUTS)}; declared {list(declared)}" + f"{list(CHILDCARE_COPY_TAKE_UP_REWRITES)}; declared {list(declared)}" ) return redraw_childcare_copy_take_up(frame, contract=self.contract) @@ -131,6 +147,11 @@ def redraw_childcare_copy_take_up(frame: Frame, *, contract: UKTakeUpContract) - f"benunit columns {missing} are missing; frs_take_up must draw them " "before the copies' childcare take-up is re-drawn" ) + if UK_UNDER_TWO_USAGE_OUTPUT not in person: + raise KeyError( + f"person.{UK_UNDER_TWO_USAGE_OUTPUT} is missing; frs_take_up must draw " + "it before the copies' childcare take-up is re-drawn" + ) copies = copy_benunits(person, benunit, household) ids = benunit["benunit_id"].to_numpy() if pd.Series(ids).duplicated().any(): @@ -146,6 +167,25 @@ def redraw_childcare_copy_take_up(frame: Frame, *, contract: UKTakeUpContract) - hours = benunit[UK_CHILDCARE_HOURS_OUTPUT].to_numpy(dtype=np.float64, copy=True) hours[copies] = redrawn[UK_CHILDCARE_HOURS_OUTPUT] benunit[UK_CHILDCARE_HOURS_OUTPUT] = hours + # The copies' children draw their usage against their own unit's + # re-drawn flag, keyed on their own person_id; natives keep theirs. + copy_people = person_unit_flag(person, benunit, copies) + if pd.Series(person["person_id"]).duplicated().any(): + raise ValueError( + "person_id must be unique: the copies' under-2 usage draws are " + "keyed on it" + ) + usage = person[UK_UNDER_TWO_USAGE_OUTPUT].to_numpy(dtype=np.float64, copy=True) + usage[copy_people] = derive_under_two_childcare_usage( + person.loc[copy_people], + claiming=person_unit_flag( + person.loc[copy_people], + benunit, + benunit[UK_EXTENDED_CHILDCARE_OUTPUT].to_numpy(), + ), + contract=contract, + ) + person[UK_UNDER_TWO_USAGE_OUTPUT] = usage result = uk_national_frame( person=person, benunit=benunit, 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 2f9754726..2cb35194b 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 @@ -41,13 +41,34 @@ "would_claim_uc_childcare", "maximum_extended_childcare_hours_usage", ) -FRS_TAKE_UP_NONNEGATIVE_OUTPUT_COLUMNS = ("maximum_extended_childcare_hours_usage",) +# A child under 2 in a benefit unit that claims the working-parent hours uses +# them at the contract's under-2 usage rate: DfE registers far fewer of the +# youngest eligible children than of those aged 2 to 4, mostly for parental +# leave, so one family rate fitted at 2 to 4 would fund too many of them. A +# child that does not use them gets no funded hours from the engine +# (max_free_entitlement_hours_used 0); every other person keeps the engine's +# default of 30. The draw is keyed on the person (seed 0, salt the output); +# ``childcare_copy_take_up`` re-draws the copies' children against their own +# unit's flag. The stage manifest declares the operation; +# ``assert_under_two_usage_declaration`` refuses a manifest that drops it. +UK_UNDER_TWO_USAGE_OUTPUT = "max_free_entitlement_hours_used" +UK_UNDER_TWO_USAGE_KEY = "extended_childcare_under_2_usage" +UK_UNDER_TWO_AGE = 2 +UK_ENGINE_FREE_HOURS_DEFAULT = 30.0 +FRS_TAKE_UP_PERSON_OUTPUT_COLUMNS = (UK_UNDER_TWO_USAGE_OUTPUT,) +FRS_TAKE_UP_NONNEGATIVE_OUTPUT_COLUMNS = ( + "maximum_extended_childcare_hours_usage", + UK_UNDER_TWO_USAGE_OUTPUT, +) UK_TAKE_UP_ANCHOR_AGGREGATES = { "child_benefit_reported_anchor": "child_benefit_reported", "pension_credit_reported_anchor": "pension_credit_reported", "universal_credit_reported_anchor": "universal_credit_reported", } -UK_TAKE_UP_DECLARED_SEEDS = {output: 0 for output in FRS_TAKE_UP_OUTPUT_COLUMNS} +UK_TAKE_UP_DECLARED_SEEDS = { + output: 0 + for output in (*FRS_TAKE_UP_OUTPUT_COLUMNS, *FRS_TAKE_UP_PERSON_OUTPUT_COLUMNS) +} # Universal Credit is claimable only by a benefit unit whose claimant or # partner meets its age conditions: policyengine-uk 2.147.2's ``is_uc_eligible`` # (capital aside) needs a single or joint claimant, taken from @@ -125,6 +146,7 @@ ("benunit", "would_claim_universal_childcare", "universal_childcare"), ("benunit", "would_claim_targeted_childcare", "targeted_childcare"), ("benunit", "would_claim_uc_childcare", "uc_childcare"), + ("person", UK_UNDER_TWO_USAGE_OUTPUT, UK_UNDER_TWO_USAGE_KEY), ("person", "would_claim_marriage_allowance", "marriage_allowance"), ("person", "would_claim_scp", "scp"), ("household", "household_owns_tv", "tv_ownership_rate"), @@ -263,6 +285,27 @@ def assert_universal_childcare_nesting_declaration(stage: SourceStageSpec) -> No ) +def assert_under_two_usage_declaration(stage: SourceStageSpec) -> None: + """Refuse a manifest that does not declare the under-2 usage draw.""" + + declared = [ + dict(op.parameters) + for op in stage.operations + if op.parameters.get("output") == UK_UNDER_TWO_USAGE_OUTPUT + ] + expected = {"rate_key": UK_UNDER_TWO_USAGE_KEY, "assignment_unit": "person"} + if not declared or any( + any(params.get(key) != value for key, value in expected.items()) + for params in declared + ): + raise ValueError( + f"stage {stage.stage!r} must declare the {UK_UNDER_TWO_USAGE_OUTPUT!r} " + f"operation with {expected!r}; the code draws whether each child under " + f"{UK_UNDER_TWO_AGE} in a unit claiming the working-parent hours uses " + f"them and refuses a manifest that says otherwise (declared: {declared!r})" + ) + + @dataclass(frozen=True) class UKFRSTakeUpStageTransform: """Whole-stage callable for UK benefit-unit take-up assignments.""" @@ -274,6 +317,7 @@ class UKFRSTakeUpStageTransform: def __call__(self, frame: Frame) -> Frame: assert_take_up_stage_population_declaration(self.stage) assert_universal_childcare_nesting_declaration(self.stage) + assert_under_two_usage_declaration(self.stage) policy = self.population_policy or uk_take_up_population_policy( uk_time_period(frame) ) @@ -281,7 +325,7 @@ def __call__(self, frame: Frame) -> Frame: @staticmethod def output_columns() -> tuple[str, ...]: - return FRS_TAKE_UP_OUTPUT_COLUMNS + return (*FRS_TAKE_UP_OUTPUT_COLUMNS, *FRS_TAKE_UP_PERSON_OUTPUT_COLUMNS) def add_frs_take_up( @@ -299,6 +343,13 @@ def add_frs_take_up( ) for column in FRS_TAKE_UP_OUTPUT_COLUMNS: benunit[column] = derived[column].to_numpy() + person[UK_UNDER_TWO_USAGE_OUTPUT] = derive_under_two_childcare_usage( + person, + claiming=person_unit_flag( + person, benunit, benunit[UK_EXTENDED_CHILDCARE_OUTPUT].to_numpy() + ), + contract=contract, + ) result = uk_national_frame( person=person, benunit=benunit, @@ -450,6 +501,50 @@ def derive_childcare_take_up( return values +def person_unit_flag( + person: pd.DataFrame, benunit: pd.DataFrame, flag: np.ndarray +) -> np.ndarray: + """Each person's benefit-unit ``flag``, through ``person_benunit_id``.""" + + lookup = pd.Series( + np.asarray(flag, dtype=bool), index=benunit["benunit_id"].to_numpy() + ) + mapped = lookup.reindex(person["person_benunit_id"].to_numpy()) + if mapped.isna().any(): + raise ValueError("every person must belong to a benefit unit in the frame") + return mapped.to_numpy(dtype=bool) + + +def under_two_children(person: pd.DataFrame) -> np.ndarray: + """Persons of whole-year age under ``UK_UNDER_TWO_AGE``.""" + + if "age" not in person.columns: + raise KeyError("person.age is missing; the under-2 usage draw needs it") + age = pd.to_numeric(person["age"], errors="coerce") + if age.isna().any(): + raise ValueError("person.age must be numeric for the under-2 usage draw") + return age.to_numpy(dtype=float) < UK_UNDER_TWO_AGE + + +def derive_under_two_childcare_usage( + person: pd.DataFrame, *, claiming: np.ndarray, contract: UKTakeUpContract +) -> np.ndarray: + """``max_free_entitlement_hours_used`` for every person in ``person``. + + A child under 2 whose unit claims the working-parent hours uses them where + its draw (keyed on ``person_id``) falls under the contract's under-2 usage + rate and gets 0 hours otherwise; every other person keeps the engine's + default. + """ + + ids = person["person_id"].to_numpy() + uses = assign_binary_from_rate( + _draws(ids, UK_UNDER_TWO_USAGE_OUTPUT), contract.rate(UK_UNDER_TWO_USAGE_KEY) + ) + drawn = under_two_children(person) & np.asarray(claiming, dtype=bool) + return np.where(drawn & ~uses, 0.0, UK_ENGINE_FREE_HOURS_DEFAULT) + + def universal_childcare_marginal_rate(contract: UKTakeUpContract) -> float: """The universal flag's expected share: r_e + (1 - r_e) * r_u_cond.""" @@ -515,6 +610,15 @@ def uk_take_up_signal_gate( "instant": policy.instant, "source": policy.source, } + if key == UK_UNDER_TWO_USAGE_KEY: + # The rate is a share of the children under 2 in units that claim + # the working-parent hours; every other person keeps 30 hours. + benunit_table = frame.table("benunit") + population = under_two_children(table) & person_unit_flag( + table, + benunit_table, + benunit_table[UK_EXTENDED_CHILDCARE_OUTPUT].to_numpy(), + ) if not population.any() or float(weights[population].sum()) <= 0.0: failures.append( f"{entity}.{output}: no unit in the draw's population carries " 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 7f340df67..e2830af84 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/graph.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/graph.py @@ -771,6 +771,7 @@ def _cells( "bool", ), _Cell("benunit", "maximum_extended_childcare_hours_usage", "float64"), + _Cell("person", "max_free_entitlement_hours_used", "float64"), ), "frs_person_draws": ( _Cell("person", "would_claim_marriage_allowance", "bool"), @@ -1092,6 +1093,7 @@ def _cells( "bool", ), _Cell("benunit", "maximum_extended_childcare_hours_usage", "float64"), + _Cell("person", "max_free_entitlement_hours_used", "float64"), ), "age_tail": (_Cell("person", "age", "int64"),), } diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/terminal_gates.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/terminal_gates.py index a5542a61a..136b0fe25 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/terminal_gates.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/terminal_gates.py @@ -323,6 +323,7 @@ def __post_init__(self) -> None: "person.would_claim_carers_allowance", "person.would_claim_marriage_allowance", "person.would_claim_scp", + "person.max_free_entitlement_hours_used", "person.person_is_spi_income_band_carrier", "person.person_is_spi_income_recipient", # microcosm#1063 c9 (ruling 2026-10-02): every declared stage output the diff --git a/packages/microcosm-build/tests/engine/uk/test_uk_dfe_spring_term.py b/packages/microcosm-build/tests/engine/uk/test_uk_dfe_spring_term.py index 712049d77..c1b03da52 100644 --- a/packages/microcosm-build/tests/engine/uk/test_uk_dfe_spring_term.py +++ b/packages/microcosm-build/tests/engine/uk/test_uk_dfe_spring_term.py @@ -225,3 +225,26 @@ def test_a_child_placed_by_age_alone_is_classified() -> None: assert child[DFE_AGE_AT_31_DECEMBER] == 3 assert child[DFE_SPRING_UNIVERSAL] == 1 assert child[DFE_SPRING_WORKING_PARENT] == 1 + + +def test_a_child_under_two_that_does_not_use_its_hours_gets_none() -> None: + """The under-2 usage draw writes max_free_entitlement_hours_used 0 for a + child that does not use the working-parent hours (frs_take_up).""" + + from policyengine_uk import CountryTaxBenefitSystem + + from microcosm.build.uk_runtime.frs_take_up import ( + UK_ENGINE_FREE_HOURS_DEFAULT, + UK_UNDER_TWO_USAGE_OUTPUT, + ) + + variable = CountryTaxBenefitSystem().variables[UK_UNDER_TWO_USAGE_OUTPUT] + assert variable.entity.key == "person" + assert not variable.formulas + assert variable.default_value == UK_ENGINE_FREE_HOURS_DEFAULT + (uses,) = _children(20240515) + (does_not,) = _children(20240515, hours=0.0) + assert uses["extended_childcare_entitlement_per_child"] > 0 + assert uses[DFE_SPRING_WORKING_PARENT] == 1 + assert does_not["extended_childcare_entitlement_per_child"] == 0 + assert does_not[DFE_SPRING_WORKING_PARENT] == 0 diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_copy_take_up.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_copy_take_up.py index 1bf39833a..c932b53e6 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_copy_take_up.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_copy_take_up.py @@ -20,8 +20,10 @@ from microcosm.build.uk_runtime.frs_take_up import ( UK_CHILDCARE_HOURS_OUTPUT, UK_CHILDCARE_TAKE_UP_OUTPUTS, + UK_UNDER_TWO_USAGE_OUTPUT, assert_universal_childcare_nesting_declaration, derive_childcare_take_up, + derive_under_two_childcare_usage, uk_take_up_signal_gate, universal_childcare_marginal_rate, ) @@ -97,12 +99,14 @@ def _frame(contract, *, natives: int = _NATIVES): household["region"] = "LONDON" ids = household["household_id"].to_numpy(dtype=np.int64) sources = household["source_household_id"].to_numpy(dtype=np.int64) + # Every other host's child is under 2, and its copies inherit its age. + ages = np.where(sources % 2 == 0, 1, 3) person = pd.DataFrame( { "person_id": ids, "person_benunit_id": ids, "person_household_id": ids, - "age": 3, + "age": ages, } ) benunit = pd.DataFrame( @@ -119,6 +123,13 @@ def _frame(contract, *, natives: int = _NATIVES): benunit[output] = inherited[output] benunit["would_claim_uc_childcare"] = True benunit["is_married"] = False + # frs_take_up drew each host child's usage keyed on the host's person and + # unit; the copies inherit it. + person[UK_UNDER_TWO_USAGE_OUTPUT] = derive_under_two_childcare_usage( + pd.DataFrame({"person_id": sources, "age": ages}), + claiming=inherited["would_claim_extended_childcare"], + contract=contract, + ) return uk_national_frame( person=person, benunit=benunit, household=household, time_period="2024" ) @@ -286,3 +297,49 @@ def test_signal_gate_targets_the_nested_marginal_and_refuses_violations() -> Non ) failures = uk_take_up_signal_gate(broken_frame, contract=contract).failures assert any("without the universal hours" in failure for failure in failures) + + +def test_copies_children_redraw_their_under_two_usage_on_their_own_draws() -> None: + contract = load_uk_take_up_contract() + frame = _frame(contract) + before = frame.table("person") + after_frame = UKChildcareCopyTakeUpStageTransform( + contract=contract, stage=_stage() + )(frame) + after = after_frame.table("person") + benunit = after_frame.table("benunit") + native = (after["person_id"] <= _NATIVES).to_numpy() + + # Natives keep their frs_take_up draws. + np.testing.assert_array_equal( + after.loc[native, UK_UNDER_TWO_USAGE_OUTPUT].to_numpy(), + before.loc[native, UK_UNDER_TWO_USAGE_OUTPUT].to_numpy(), + ) + # A copy's child draws against its own unit's re-drawn flag, keyed on its + # own person_id. + copies = ~native + claiming = benunit.set_index("benunit_id").loc[ + after.loc[copies, "person_benunit_id"], "would_claim_extended_childcare" + ] + expected = derive_under_two_childcare_usage( + after.loc[copies].reset_index(drop=True), + claiming=claiming.to_numpy(dtype=bool), + contract=contract, + ) + np.testing.assert_array_equal( + after.loc[copies, UK_UNDER_TWO_USAGE_OUTPUT].to_numpy(), expected + ) + under_two = (after["age"] < 2).to_numpy() + drawn = ( + copies + & under_two + & np.isin( + after["person_benunit_id"], + benunit.loc[benunit["would_claim_extended_childcare"], "benunit_id"], + ) + ) + usage = after.loc[drawn, UK_UNDER_TWO_USAGE_OUTPUT].to_numpy() > 0 + assert usage.mean() == pytest.approx( + contract.rate("extended_childcare_under_2_usage"), abs=0.03 + ) + assert (after.loc[~under_two, UK_UNDER_TWO_USAGE_OUTPUT] == 30.0).all() diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_frs_stochastic.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_frs_stochastic.py index 5e2556a42..34d0b3b8b 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_frs_stochastic.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_frs_stochastic.py @@ -33,6 +33,40 @@ def test_take_up_anchors_or_over_persons_and_stage_writes_outputs() -> None: (0 <= benunit["maximum_extended_childcare_hours_usage"]) & (benunit["maximum_extended_childcare_hours_usage"] <= 30) ).all() + # No child under 2 here: every person keeps the engine's 30 hours. + person = transformed.table("person") + assert (person["max_free_entitlement_hours_used"] == 30.0).all() + + +def test_under_two_usage_draws_children_in_claiming_units_only() -> None: + from microcosm.build.uk_runtime.frs_take_up import ( + UK_ENGINE_FREE_HOURS_DEFAULT, + UK_UNDER_TWO_USAGE_OUTPUT, + derive_under_two_childcare_usage, + ) + + person = pd.DataFrame( + { + "person_id": np.arange(1, 4001), + "age": np.tile([0, 1, 2, 35], 1000), + } + ) + claiming = np.repeat([True, False], 2000) + usage = derive_under_two_childcare_usage( + person, claiming=claiming, contract=_Contract() + ) + draws = stable_identity_uniforms( + person["person_id"].to_numpy(), seed=0, salt=UK_UNDER_TWO_USAGE_OUTPUT + ) + under_two = person["age"].to_numpy() < 2 + expected = np.where( + under_two & claiming & (draws >= 0.5), 0.0, UK_ENGINE_FREE_HOURS_DEFAULT + ) + np.testing.assert_array_equal(usage, expected) + # Only claiming children under 2 can lose their hours, at about the rate. + assert (usage[~(under_two & claiming)] == 30.0).all() + share = float((usage[under_two & claiming] > 0).mean()) + assert abs(share - 0.5) < 0.05 def test_person_draws_pin_scp_age_six_boundary_and_uniform_draw() -> None: 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 9d9b8fcad..0c0267359 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 @@ -381,6 +381,7 @@ def test_e3_outputs_are_backed_by_runtime_written_columns(self) -> None: from microcosm.build.uk_runtime.frs_take_up import ( FRS_TAKE_UP_NONNEGATIVE_OUTPUT_COLUMNS, FRS_TAKE_UP_OUTPUT_COLUMNS, + FRS_TAKE_UP_PERSON_OUTPUT_COLUMNS, ) from microcosm.build.uk_runtime.lcfs_consumption import ( UK_LCFS_CONSUMPTION_NONNEGATIVE_OUTPUT_COLUMNS, @@ -417,7 +418,10 @@ def test_e3_outputs_are_backed_by_runtime_written_columns(self) -> None: assert ( stages["frs_education_grant_split"].rewrites == FRS_EDUCATION_GRANT_REWRITES ) - assert stages["frs_take_up"].outputs == FRS_TAKE_UP_OUTPUT_COLUMNS + assert stages["frs_take_up"].outputs == ( + *FRS_TAKE_UP_OUTPUT_COLUMNS, + *FRS_TAKE_UP_PERSON_OUTPUT_COLUMNS, + ) assert ( stages["frs_take_up"].nonnegative_outputs == FRS_TAKE_UP_NONNEGATIVE_OUTPUT_COLUMNS @@ -596,6 +600,7 @@ def test_e3_operation_kinds_are_declared_in_order(self) -> None: "assign_binary_from_rate", "assign_binary_from_banded_rates", "assign_clipped_normal", + "assign_binary_from_rate", ] assert [op.kind for op in stages["frs_person_draws"].operations] == [ "assign_binary_from_rate", @@ -919,6 +924,7 @@ def test_engine_predictor_and_rewrite_constants_match_manifest(self) -> None: "extended_childcare", "universal_childcare", "targeted_childcare", + "extended_childcare_under_2_usage", "marriage_allowance", "tv_ownership_rate", "tv_licence_evasion_rate", 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 dfcaf8d13..3e749f852 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 @@ -26,6 +26,7 @@ def test_uk_contract_loads_and_selects_build_year_rates() -> None: "marriage_allowance", "tax_free_childcare", "extended_childcare", + "extended_childcare_under_2_usage", "universal_childcare", "targeted_childcare", "uc_childcare_single", @@ -47,6 +48,8 @@ def test_uk_contract_loads_and_selects_build_year_rates() -> None: # The v5 refit (nested universal, reception out) on the childcare-fix spine. 0.9912, 0.7594, + # Provisional until the tool-version-6 refit (María, 2026-10-22). + 0.75, 0.0, 0.8478, 0.441, diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_take_up_gate.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_take_up_gate.py index f830b66f1..6299ec821 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_take_up_gate.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_take_up_gate.py @@ -30,6 +30,7 @@ def rate(self, key: str, build_year: int | None = None) -> float: "universal_credit": 0.5, "tax_free_childcare": 0.5, "extended_childcare": 0.5, + "extended_childcare_under_2_usage": 0.5, # Conditional on not claiming the extended hours: the fixture's # universal flag is its extended flag, so the nested marginal is # 0.5 + 0.5 * 0.0. @@ -51,13 +52,15 @@ def rate(self, key: str, build_year: int | None = None) -> float: def _frame(*, brma_values=("LONDON_A", "LONDON_B")): n = 10 household_ids = np.arange(1, n + 1) + # Ten adults, one per unit, and four children under 2: two in units that + # claim the working-parent hours (201 and 203), two in units that do not. person = pd.DataFrame( { - "person_id": np.arange(101, 101 + n), - "person_benunit_id": np.arange(201, 201 + n), - "person_household_id": household_ids, - "age": [30, 40] * 5, - "is_uc_claimant": [True] * n, + "person_id": np.arange(101, 101 + n + 4), + "person_benunit_id": [*range(201, 201 + n), 201, 203, 202, 204], + "person_household_id": [*household_ids, 1, 3, 2, 4], + "age": [30, 40] * 5 + [0, 1, 0, 1], + "is_uc_claimant": [True] * n + [False] * 4, } ) benunit = pd.DataFrame( @@ -74,9 +77,12 @@ def _frame(*, brma_values=("LONDON_A", "LONDON_B")): for column in FRS_TAKE_UP_OUTPUT_COLUMNS: if column != "maximum_extended_childcare_hours_usage": benunit[column] = alternating - person["would_claim_marriage_allowance"] = alternating - person["would_claim_scp"] = alternating - person["attends_private_school_random_draw"] = np.linspace(0.05, 0.95, n) + people = np.array([True, False] * 7) + person["would_claim_marriage_allowance"] = people + person["would_claim_scp"] = people + person["attends_private_school_random_draw"] = np.linspace(0.05, 0.95, n + 4) + # One of the two claiming children uses the hours. + person["max_free_entitlement_hours_used"] = [30.0] * n + [30.0, 0.0, 30.0, 30.0] for column in FRS_HOUSEHOLD_DRAW_OUTPUT_COLUMNS: household[column] = alternating return uk_national_frame( @@ -140,7 +146,7 @@ def test_brma_enum_domain_binding_fails_off_domain() -> None: def test_student_loan_enum_domain_binding_resolves_person_column() -> None: frame = _frame() - frame.table("person")["student_loan_plan"] = ["NONE"] * 9 + ["PLAN_4"] + frame.table("person")["student_loan_plan"] = ["NONE"] * 13 + ["PLAN_4"] binding = UK_GATE_REGISTRY["enum_domain"] result = binding.evaluate( @@ -175,7 +181,7 @@ def test_take_up_gate_measures_uc_share_over_units_with_a_working_age_adult() -> person = frame.table("person") # Persons 101-110 sit one per benefit unit; make the last four benefit # units all-pension-age and mark them as claimants: they must not count. - person.loc[person["person_id"] >= 107, "age"] = 70 + person.loc[person["person_id"].between(107, 110), "age"] = 70 benunit = frame.table("benunit") benunit.loc[benunit["benunit_id"] >= 207, "would_claim_uc"] = True @@ -201,3 +207,26 @@ def test_take_up_gate_fails_when_the_uc_population_is_empty() -> None: assert "would_claim_uc: no unit in the draw's population" in " ".join( result.failures ) + + +def test_take_up_gate_measures_under_two_usage_over_claiming_children() -> None: + result = uk_take_up_signal_gate( + _frame(), contract=_Contract(), population_policy=_POLICY + ) + + details = result.details["person.max_free_entitlement_hours_used"] + # Two children under 2 in claiming units, one of whom uses the hours; the + # children in units that do not claim keep 30 hours and are not counted. + assert details["population_units"] == 2 + assert details["weighted_share"] == 0.5 + assert details["target"] == 0.5 + + frame = _frame() + frame.table("person").drop( + columns=["max_free_entitlement_hours_used"], inplace=True + ) + missing = uk_take_up_signal_gate( + frame, contract=_Contract(), population_policy=_POLICY + ) + assert missing.passed is False + assert "max_free_entitlement_hours_used: missing" in " ".join(missing.failures) diff --git a/test_support/microcosm_build/uk_frs_stochastic.py b/test_support/microcosm_build/uk_frs_stochastic.py index a67742912..d022d3c7b 100644 --- a/test_support/microcosm_build/uk_frs_stochastic.py +++ b/test_support/microcosm_build/uk_frs_stochastic.py @@ -69,6 +69,7 @@ class _Contract: "universal_credit": 0.5, "tax_free_childcare": 0.5, "extended_childcare": 0.5, + "extended_childcare_under_2_usage": 0.5, "universal_childcare": 0.5, "targeted_childcare": 0.5, "uc_childcare_single": 0.5, diff --git a/tools/fit_uk_childcare_takeup.py b/tools/fit_uk_childcare_takeup.py index 9e70a3856..1ba848d16 100644 --- a/tools/fit_uk_childcare_takeup.py +++ b/tools/fit_uk_childcare_takeup.py @@ -395,9 +395,11 @@ class ChildcareExpectationBasis: nesting a family claiming the extended hours never has the universal flag off, so the row has no allocated term. From tool version 6 the DfE rows are measured at the spring term by the age on 31 December - (dfe_spring_term.py), and ``under_two`` holds each side's contributions - from children under 2, whom the under-2 usage share ``s`` scales: every - ``sum`` above is ``sum(rest) + s * sum(under_two)``. The expectation is the + (dfe_spring_term.py), and ``under_two`` holds the claiming-world sides' + contributions from children under 2, whom the under-2 usage share ``s`` + scales (the draw applies only where the unit claims the working-parent + hours): each ``with_ext`` and ``allocated`` sum above is + ``sum(rest) + s * sum(under_two)``. The expectation is the quantity a take-up *rate* controls: the spine's persisted flags are one draw from it, and later stages clone and re-key rows, so no re-drawn realisation can sit on the @@ -671,9 +673,9 @@ def compute_childcare_basis( with_extended, with_under_two = _basis_side( input_h5, target_period, contract, extended=True ) - without_extended, without_under_two = _basis_side( - input_h5, target_period, contract, extended=False - ) + # The usage draw applies only where the unit claims the working-parent + # hours, so the without-extended side keeps every child's hours. + without_extended, _ = _basis_side(input_h5, target_period, contract, extended=False) allocation, allocation_under_two = _basis_side( input_h5, target_period, contract, extended=True, allocated=True ) @@ -690,7 +692,6 @@ def compute_childcare_basis( }, under_two={ "with_extended": with_under_two, - "without_extended": without_under_two, "allocated_from_extended": { target: allocation_under_two[target] for target in allocated_targets diff --git a/tools/verify_uk_identity_stability.py b/tools/verify_uk_identity_stability.py index 182fca704..ca1a685ce 100644 --- a/tools/verify_uk_identity_stability.py +++ b/tools/verify_uk_identity_stability.py @@ -29,8 +29,12 @@ from microcosm.build.uk_runtime.frs_household_draws import derive_frs_household_draws from microcosm.build.uk_runtime.frs_person_draws import derive_frs_person_draws from microcosm.build.uk_runtime.frs_take_up import ( + UK_EXTENDED_CHILDCARE_OUTPUT, + UK_UNDER_TWO_USAGE_OUTPUT, aggregate_person_reported_to_benunit, derive_frs_take_up, + derive_under_two_childcare_usage, + person_unit_flag, uc_age_eligible_benunits, uk_take_up_population_policy, ) @@ -127,8 +131,16 @@ def recompute(person_t, benunit_t, household_t) -> dict[str, pd.DataFrame]: person_t, benunit_t, population_policy ), ) + claiming = person_unit_flag( + person_t, + benunit_t, + take_up[UK_EXTENDED_CHILDCARE_OUTPUT].to_numpy(), + ) take_up.index = benunit_t["benunit_id"].to_numpy() person_draws = derive_frs_person_draws(person_t, contract=contract) + person_draws[UK_UNDER_TWO_USAGE_OUTPUT] = derive_under_two_childcare_usage( + person_t, claiming=claiming, contract=contract + ) person_draws.index = person_t["person_id"].to_numpy() household_draws = derive_frs_household_draws(household_t, contract=contract) household_draws.index = household_t["household_id"].to_numpy() From 3549ae3fceb6da001962fe63dadb54abd4541cac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 22 Oct 2026 23:09:21 +0100 Subject: [PATCH 17/25] Re-pin the UK gate-battery digests after the take-up and export-surface changes The take-up signal gate's note now names the under-2 usage population, and the export surface allows person.max_free_entitlement_hours_used, so the gate policy, gates manifest, spec fingerprint and the release_cut part's digests move; contract.py and its test mirror follow (test_gate_battery_contract_pins recomputes them). Co-Authored-By: Claude Opus 5.5 --- .../microcosm-build/src/microcosm/build/uk/gates.json | 2 +- packages/microcosm-data/src/microcosm/data/contract.py | 10 +++++----- .../tests/engine_free/shared/test_contract.py | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/microcosm-build/src/microcosm/build/uk/gates.json b/packages/microcosm-build/src/microcosm/build/uk/gates.json index c5c62d525..9e4b7ecfe 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/gates.json +++ b/packages/microcosm-build/src/microcosm/build/uk/gates.json @@ -1134,7 +1134,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. would_claim_pc is measured by uk_stage_pension_credit_take_up instead (microcosm#1069 R9), and would_claim_child_benefit and child_benefit_opts_out by uk_stage_child_benefit_take_up (microcosm#1063). would_claim_uc is drawn for FRS benefit units by frs_take_up and redrawn for SPI-channel units by spi_benefit_coherence on the same rule (microcosm#1095), so the gate measures both channels at the contract rate. would_claim_universal_childcare is nested under would_claim_extended_childcare, so its target is the nested marginal r_e + (1 - r_e) * r_u of the contract's conditional universal rate, and the gate fails on any benefit unit that claims the extended hours without the universal ones." + "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), and would_claim_child_benefit and child_benefit_opts_out by uk_stage_child_benefit_take_up (microcosm#1063). would_claim_uc is drawn for FRS benefit units by frs_take_up and redrawn for SPI-channel units by spi_benefit_coherence on the same rule (microcosm#1095), so the gate measures both channels at the contract rate. would_claim_universal_childcare is nested under would_claim_extended_childcare, so its target is the nested marginal r_e + (1 - r_e) * r_u of the contract's conditional universal rate, and the gate fails on any benefit unit that claims the extended hours without the universal ones. max_free_entitlement_hours_used carries the under-2 usage draw: its share of persons with hours is measured over the children of whole-year age 0 or 1 in units that claim the extended hours, against the contract's extended_childcare_under_2_usage rate." }, { "id": "uk_brma_enum_domain", diff --git a/packages/microcosm-data/src/microcosm/data/contract.py b/packages/microcosm-data/src/microcosm/data/contract.py index 6e7e9d22f..d8bebd805 100644 --- a/packages/microcosm-data/src/microcosm/data/contract.py +++ b/packages/microcosm-data/src/microcosm/data/contract.py @@ -451,13 +451,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 = ( - "3e9896aa61e9d9340a3cf6ce4a7b85626288b4312f59b795a7aef77fb4c111d6" + "845d8d2f2330eab015e71d9abd3642ef3304731e557ec88f5a23f2f65c545cdb" ) _UK_GATE_BATTERY_GATES_MANIFEST_SHA256 = ( - "2054ed4194fac38952f51832c7a30ca81abfec177dff0f22c3d34acf4e63a779" + "22bf1eb3c3419ae8cab50b3573e146e1d8fc41f619d532e6db8af032647fc218" ) _UK_GATE_BATTERY_SPEC_FINGERPRINT = ( - "a6d9b3f1dcaeea839af81fda2388e60736fd41c1c7b2e9d23af9b9dbca4e8886" + "72b3fef9b92daf87752cfa1bd8ca51d1c33891d8778d9869336de7cf3f174537" ) #: Spec entry id -> the legacy gate name whose observable detail checks #: apply unchanged (the battery re-keys the report by entry id; the gate @@ -947,10 +947,10 @@ def _uk_line_cut_tag_re(release_id: str) -> re.Pattern[str] | None: }, "release_cut": { "gates_manifest_sha256": ( - "da420e28423aa685d82d65ff3367401b63be7dd37edcc4574bdd7d38faac5c19" + "fc2f70870397e5574370a8be140a97f51704a91d365a34957fc80ff4780bc7b1" ), "policy_sha256": ( - "939309226c43641ded9402ab47b7b12b0c46fa5165f73da5ced9d97a38985d02" + "124f6307524d5ed568e927c279bcab70bff1491afadce4b08f748b822ca8da62" ), }, } 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 b648a84da..4ca64caaf 100644 --- a/packages/microcosm-data/tests/engine_free/shared/test_contract.py +++ b/packages/microcosm-data/tests/engine_free/shared/test_contract.py @@ -213,13 +213,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 = ( - "3e9896aa61e9d9340a3cf6ce4a7b85626288b4312f59b795a7aef77fb4c111d6" + "845d8d2f2330eab015e71d9abd3642ef3304731e557ec88f5a23f2f65c545cdb" ) UK_GATE_BATTERY_GATES_MANIFEST_SHA256 = ( - "2054ed4194fac38952f51832c7a30ca81abfec177dff0f22c3d34acf4e63a779" + "22bf1eb3c3419ae8cab50b3573e146e1d8fc41f619d532e6db8af032647fc218" ) UK_GATE_BATTERY_SPEC_FINGERPRINT = ( - "a6d9b3f1dcaeea839af81fda2388e60736fd41c1c7b2e9d23af9b9dbca4e8886" + "72b3fef9b92daf87752cfa1bd8ca51d1c33891d8778d9869336de7cf3f174537" ) UK_GATE_BATTERY_DEGENERATE_EVIDENCE_SHA256 = ( "6a179222c6b6058ad9caacfd347f7bdb8cb98a62237b50d1fc1136df09337251" From 7c865a9598ff9436686d0e5d9c1662aedadafaeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 22 Oct 2026 23:11:55 +0100 Subject: [PATCH 18/25] Report the childcare take-up a built file realises at its final weights MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Calibration moves weight toward the units the DfE and HMRC rows need, so the take-up a costing uses can differ from the contract rate the spine drew at (Vahid's round-2 review of #1338, item 3). The new engine-free tool reads a built H5's frame and final weights and writes, for each childcare flag, the contract rate beside the realised unweighted and weighted shares over units with a child under 5 (all, natives and copies, and a pay-over-£100k cell), and the under-2 usage share over claiming units' children under 2. Cells under 10 source households read "<10". The receipt belongs in the run tree, never in the take-up contract. Co-Authored-By: Claude Opus 5.5 --- .../uk/test_uk_childcare_realised_take_up.py | 109 ++++++++++ tools/report_uk_childcare_realised_take_up.py | 201 ++++++++++++++++++ 2 files changed, 310 insertions(+) create mode 100644 packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_realised_take_up.py create mode 100644 tools/report_uk_childcare_realised_take_up.py diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_realised_take_up.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_realised_take_up.py new file mode 100644 index 000000000..3376f26ce --- /dev/null +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_realised_take_up.py @@ -0,0 +1,109 @@ +"""The realised childcare take-up report (Vahid's round-2 review of #1338, item 3).""" + +from __future__ import annotations + +import importlib.util + +import numpy as np +import pandas as pd +import pytest + +from test_support.paths import paths_for + +ROOT = paths_for("microcosm-build").repository + + +def _tool(): + path = ROOT / "tools" / "report_uk_childcare_realised_take_up.py" + spec = importlib.util.spec_from_file_location("realised", path) + assert spec is not None and spec.loader is not None + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +class _Contract: + rates = { + "tax_free_childcare": 0.9, + "extended_childcare": 0.5, + "universal_childcare": 0.2, + "targeted_childcare": 0.6, + "extended_childcare_under_2_usage": 0.7, + } + + def rate(self, key: str, build_year: int | None = None) -> float: + return self.rates[key] + + +def _tables(units: int = 30, high_pay: int = 3): + ids = np.arange(1, units + 1) + # One adult and one child per unit; the child is under 2 in every unit. + person = pd.DataFrame( + { + "person_id": np.concatenate([ids * 10, ids * 10 + 1]), + "person_benunit_id": np.concatenate([ids, ids]), + "person_household_id": np.concatenate([ids, ids]), + "age": np.concatenate([np.full(units, 35), np.full(units, 1)]), + "employment_income": np.concatenate( + [np.where(ids <= high_pay, 150_000.0, 30_000.0), np.zeros(units)] + ), + "max_free_entitlement_hours_used": np.concatenate( + [np.full(units, 30.0), np.where(ids % 2 == 0, 0.0, 30.0)] + ), + } + ) + extended = ids % 3 != 0 + benunit = pd.DataFrame( + { + "benunit_id": ids, + "would_claim_tfc": ids % 2 == 0, + "would_claim_extended_childcare": extended, + "would_claim_universal_childcare": extended | (ids % 5 == 0), + "would_claim_targeted_childcare": ids % 4 == 0, + } + ) + household = pd.DataFrame({"household_id": ids, "source_household_id": ids}) + weights = np.where(ids % 2 == 0, 3.0, 1.0) + return person, benunit, household, weights + + +def test_realised_take_up_reports_shares_beside_the_contract_rates() -> None: + tool = _tool() + person, benunit, household, weights = _tables() + receipt = tool.realised_childcare_take_up( + person, benunit, household, weights, contract=_Contract() + ) + + tfc = receipt["flags"]["would_claim_tfc"] + assert tfc["contract_rate"] == 0.9 + cell = tfc["cells"]["units_with_a_child_under_5"] + assert cell["source_households"] == 30 + assert cell["unweighted_share"] == pytest.approx(0.5) + # Even units claim and carry weight 3: 45 / 60. + assert cell["weighted_share"] == pytest.approx(0.75) + universal = receipt["flags"]["would_claim_universal_childcare"] + assert universal["contract_rate"] == pytest.approx(0.5 + 0.5 * 0.2) + # Three high-pay units: under the floor, so no share is written. + assert universal["cells"]["units_with_a_child_under_5_and_pay_over_100k"] == { + "source_households": "<10" + } + usage = receipt["flags"]["max_free_entitlement_hours_used"] + assert usage["contract_key"] == "extended_childcare_under_2_usage" + children = usage["cells"]["children_under_2_in_claiming_units"] + claiming = benunit["would_claim_extended_childcare"].to_numpy() + assert children["source_households"] == int(claiming.sum()) + odd = (benunit["benunit_id"].to_numpy() % 2 == 1) & claiming + assert children["unweighted_share"] == pytest.approx(odd.sum() / claiming.sum()) + + +def test_realised_take_up_splits_natives_and_copies_when_known() -> None: + tool = _tool() + person, benunit, household, weights = _tables() + copies = benunit["benunit_id"].to_numpy() > 15 + receipt = tool.realised_childcare_take_up( + person, benunit, household, weights, contract=_Contract(), copies=copies + ) + + cells = receipt["flags"]["would_claim_extended_childcare"]["cells"] + assert cells["native_units_with_a_child_under_5"]["source_households"] == 15 + assert cells["copy_units_with_a_child_under_5"]["source_households"] == 15 diff --git a/tools/report_uk_childcare_realised_take_up.py b/tools/report_uk_childcare_realised_take_up.py new file mode 100644 index 000000000..379dc016a --- /dev/null +++ b/tools/report_uk_childcare_realised_take_up.py @@ -0,0 +1,201 @@ +#!/usr/bin/env python +"""Report the childcare take-up a built UK file realises at its final weights. + +The take-up contract holds the rates the spine draws at (``frs_take_up``); a +costing reads the calibrated file, whose weights move toward the units the DfE +and HMRC rows need, so the share a reform actually uses can differ from the +contract rate (Vahid's round-2 review of microcosm#1338, item 3). This tool +reads a built H5's frame tables and final household weights (no engine) and +writes, for each childcare flag, the contract rate beside the realised share, +unweighted and weighted, over: + +- benefit units with a child under 5; +- the same split into native units and copies, where the file keeps lineage; +- benefit units with a child under 5 and an adult whose employment plus + self-employment income exceeds £100,000 (a pay proxy, not adjusted net + income); + +and the under-2 usage share over the children under 2 in units that claim the +working-parent hours. Every cell names its carriers as distinct source +households and reads "<10" in place of its shares when fewer than 10 carry it +(UKDS disclosure control). The receipt belongs in the run tree; it is never +written into the take-up contract, a hashed build input. + + uv run python tools/report_uk_childcare_realised_take_up.py \\ + --h5 /microcosm_uk_2024_25.h5 --output /childcare_realised_take_up.json +""" + +from __future__ import annotations + +import argparse +import json +from collections.abc import Mapping +from pathlib import Path + +import numpy as np +import pandas as pd + +from microcosm.build.uk_runtime.frs_take_up import ( + UK_CHILDCARE_TAKE_UP_FLAGS, + UK_EXTENDED_CHILDCARE_OUTPUT, + UK_UNDER_TWO_USAGE_KEY, + UK_UNDER_TWO_USAGE_OUTPUT, + person_unit_flag, + under_two_children, + universal_childcare_marginal_rate, +) +from microcosm.build.uk_runtime.take_up_contract import ( + UKTakeUpContract, + load_uk_take_up_contract, +) + +MINIMUM_CARRIERS = 10 +HIGH_PAY_THRESHOLD = 100_000.0 +YOUNG_CHILD_AGE = 5 +_PAY_COLUMNS = ("employment_income", "self_employment_income") + + +def _contract_rate(key: str, contract: UKTakeUpContract) -> float: + if key == "universal_childcare": + return universal_childcare_marginal_rate(contract) + return contract.rate(key) + + +def _cell( + values: np.ndarray, + weights: np.ndarray, + sources: np.ndarray, + mask: np.ndarray, +) -> Mapping[str, object]: + carriers = int(np.unique(sources[mask]).size) + if carriers < MINIMUM_CARRIERS: + return {"source_households": "<10"} + chosen = np.asarray(values, dtype=float)[mask] + return { + "source_households": carriers, + "unweighted_share": float(chosen.mean()), + "weighted_share": float(np.average(chosen, weights=weights[mask])), + } + + +def realised_childcare_take_up( + person: pd.DataFrame, + benunit: pd.DataFrame, + household: pd.DataFrame, + household_weights: np.ndarray, + *, + contract: UKTakeUpContract, + copies: np.ndarray | None = None, +) -> dict[str, object]: + """The receipt's body for one file (frame tables and final weights).""" + + weight_of = pd.Series( + np.asarray(household_weights, dtype=float), + index=household["household_id"].to_numpy(), + ) + source_of = household.set_index("household_id")["source_household_id"] + unit_household = ( + person.drop_duplicates("person_benunit_id") + .set_index("person_benunit_id")["person_household_id"] + .reindex(benunit["benunit_id"].to_numpy()) + ) + unit_weights = weight_of.loc[unit_household.to_numpy()].to_numpy() + unit_sources = source_of.loc[unit_household.to_numpy()].to_numpy() + age = pd.to_numeric(person["age"], errors="coerce").to_numpy(dtype=float) + young = ( + pd.Series(age < YOUNG_CHILD_AGE) + .groupby(person["person_benunit_id"].to_numpy()) + .any() + .reindex(benunit["benunit_id"].to_numpy(), fill_value=False) + .to_numpy(dtype=bool) + ) + pay = sum( + pd.to_numeric(person[column], errors="coerce").fillna(0.0).to_numpy() + for column in _PAY_COLUMNS + if column in person.columns + ) + high_pay = ( + pd.Series(np.asarray(pay) > HIGH_PAY_THRESHOLD) + .groupby(person["person_benunit_id"].to_numpy()) + .any() + .reindex(benunit["benunit_id"].to_numpy(), fill_value=False) + .to_numpy(dtype=bool) + ) + cells = { + "units_with_a_child_under_5": young, + "units_with_a_child_under_5_and_pay_over_100k": young & high_pay, + } + if copies is not None: + cells["native_units_with_a_child_under_5"] = young & ~copies + cells["copy_units_with_a_child_under_5"] = young & copies + flags = {} + for output, key in UK_CHILDCARE_TAKE_UP_FLAGS: + values = benunit[output].to_numpy(dtype=bool) + flags[output] = { + "contract_key": key, + "contract_rate": _contract_rate(key, contract), + "cells": { + name: _cell(values, unit_weights, unit_sources, mask) + for name, mask in cells.items() + }, + } + person_weights = weight_of.loc[person["person_household_id"].to_numpy()].to_numpy() + person_sources = source_of.loc[person["person_household_id"].to_numpy()].to_numpy() + claiming = person_unit_flag( + person, benunit, benunit[UK_EXTENDED_CHILDCARE_OUTPUT].to_numpy() + ) + uses = person[UK_UNDER_TWO_USAGE_OUTPUT].to_numpy(dtype=float) > 0 + flags[UK_UNDER_TWO_USAGE_OUTPUT] = { + "contract_key": UK_UNDER_TWO_USAGE_KEY, + "contract_rate": contract.rate(UK_UNDER_TWO_USAGE_KEY), + "cells": { + "children_under_2_in_claiming_units": _cell( + uses, + person_weights, + person_sources, + under_two_children(person) & claiming, + ) + }, + } + return { + "minimum_carriers": MINIMUM_CARRIERS, + "weights": "final household weights of the built file", + "pay_proxy": "employment plus self-employment income over £100,000 for any " + "adult of the unit (not adjusted net income)", + "flags": flags, + } + + +def main(argv: list[str] | None = None) -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--h5", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True) + args = parser.parse_args(argv) + + from microcosm.build.uk_runtime.childcare_copy_take_up import copy_benunits + from microcosm.build.uk_runtime.national_frame import load_uk_national_frame + + frame, _ = load_uk_national_frame(args.h5) + person = frame.table("person") + benunit = frame.table("benunit") + household = frame.table("household") + try: + copies = copy_benunits(person, benunit, household) + except (KeyError, ValueError): + copies = None # a release file without lineage columns + receipt = realised_childcare_take_up( + person, + benunit, + household, + frame.weights_for("household").values, + contract=load_uk_take_up_contract(), + copies=copies, + ) + receipt["h5"] = str(args.h5) + args.output.write_text(json.dumps(receipt, indent=2, sort_keys=True) + "\n") + print(f"wrote {args.output}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From eeee8659853c7043998754e6ff11aa09941432af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 22 Oct 2026 23:33:00 +0100 Subject: [PATCH 19/25] Give children aged 0 and 1 a usage rate each The first v6 refit, with one under-2 usage share, left the working parent rows at 9 to 11 months 16% over DfE and at age 1 24% under: DfE registers 44% of eligible 9 to 11 month olds against 69% at age 1, so one share cannot carry both. The draw now uses the rate of the child's whole-year age (extended_childcare_age_0_usage, extended_childcare_age_1_usage; provisional 0.51 and 0.81 until the refit), declared as one operation per age; the fitter fits one share per age, each scaling its own age's contributions. The take-up gate targets the children's weighted rate; its note, the gate digests, the coverage manifest, the realised-take-up report and the tests follow. Co-Authored-By: Claude Opus 5.5 --- .../uk-childcare-under-2-usage.added.md | 2 +- .../src/microcosm/build/uk/gates.json | 2 +- .../uk/release_input_coverage_manifest.json | 44 +++++------ .../src/microcosm/build/uk/source_stages.json | 32 ++++++-- .../src/microcosm/build/uk/spec/sources.yaml | 28 +++++-- .../microcosm/build/uk/take_up_contract.json | 30 ++++++-- .../microcosm/build/uk_runtime/frs_take_up.py | 77 +++++++++++++------ .../uk/test_uk_childcare_copy_take_up.py | 3 +- .../uk/test_uk_childcare_realised_take_up.py | 10 ++- .../engine_free/uk/test_uk_source_stages.py | 4 +- .../uk/test_uk_stochastic_tools.py | 17 ++-- .../uk/test_uk_take_up_contract.py | 6 +- .../engine_free/uk/test_uk_take_up_gate.py | 3 +- .../src/microcosm/data/contract.py | 6 +- .../tests/engine_free/shared/test_contract.py | 4 +- .../microcosm_build/uk_frs_stochastic.py | 3 +- tools/fit_uk_childcare_takeup.py | 52 +++++++------ tools/report_uk_childcare_realised_take_up.py | 32 ++++---- 18 files changed, 229 insertions(+), 126 deletions(-) diff --git a/changelog.d/uk-childcare-under-2-usage.added.md b/changelog.d/uk-childcare-under-2-usage.added.md index 1a4398a66..76eaf928b 100644 --- a/changelog.d/uk-childcare-under-2-usage.added.md +++ b/changelog.d/uk-childcare-under-2-usage.added.md @@ -1 +1 @@ -Children under 2 take their own working-parent take-up. `frs_take_up` draws, for each child of whole-year age 0 or 1 in a benefit unit that claims the working-parent hours, whether it uses them, at the new contract rate `extended_childcare_under_2_usage` (keyed on `person_id`, seed 0, salt the output); a child that does not gets `max_free_entitlement_hours_used` 0, so policyengine-uk funds it no hours, and every other person keeps the engine's default of 30. DfE registers far fewer of the youngest eligible children than of those aged 2 to 4 (mostly parental leave), so one family rate fitted at 2 to 4 funded too many of them. `childcare_copy_take_up` re-draws the copies' children against their own unit's re-drawn flag. The take-up signal gate measures the share over the children under 2 in claiming units; the column is allowed on the export surface. The rate is provisional (0.75) until the tool-version-6 childcare refit fits it against DfE's working parent rows at 9 to 11 months and age 1. +Children under 2 take their own working-parent take-up, one rate per whole-year age. `frs_take_up` draws, for each child of whole-year age 0 or 1 in a benefit unit that claims the working-parent hours, whether it uses them, at its age's contract rate (`extended_childcare_age_0_usage`, `extended_childcare_age_1_usage`; keyed on `person_id`, seed 0, salt the output); a child that does not gets `max_free_entitlement_hours_used` 0, so policyengine-uk funds it no hours, and every other person keeps the engine's default of 30. DfE registers far fewer of the youngest eligible children than of those aged 2 to 4, and fewer at 9 to 11 months than at age 1 (mostly parental leave), so one family rate fitted at 2 to 4, or one rate for both ages, funded the wrong number of them. `childcare_copy_take_up` re-draws the copies' children against their own unit's re-drawn flag. The take-up signal gate measures the share over the children under 2 in claiming units against their ages' weighted rate; the column is allowed on the export surface. The tool-version-6 childcare refit fits both rates against DfE's working parent rows at 9 to 11 months and age 1. diff --git a/packages/microcosm-build/src/microcosm/build/uk/gates.json b/packages/microcosm-build/src/microcosm/build/uk/gates.json index 9e4b7ecfe..9a8166541 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/gates.json +++ b/packages/microcosm-build/src/microcosm/build/uk/gates.json @@ -1134,7 +1134,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. would_claim_pc is measured by uk_stage_pension_credit_take_up instead (microcosm#1069 R9), and would_claim_child_benefit and child_benefit_opts_out by uk_stage_child_benefit_take_up (microcosm#1063). would_claim_uc is drawn for FRS benefit units by frs_take_up and redrawn for SPI-channel units by spi_benefit_coherence on the same rule (microcosm#1095), so the gate measures both channels at the contract rate. would_claim_universal_childcare is nested under would_claim_extended_childcare, so its target is the nested marginal r_e + (1 - r_e) * r_u of the contract's conditional universal rate, and the gate fails on any benefit unit that claims the extended hours without the universal ones. max_free_entitlement_hours_used carries the under-2 usage draw: its share of persons with hours is measured over the children of whole-year age 0 or 1 in units that claim the extended hours, against the contract's extended_childcare_under_2_usage rate." + "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), and would_claim_child_benefit and child_benefit_opts_out by uk_stage_child_benefit_take_up (microcosm#1063). would_claim_uc is drawn for FRS benefit units by frs_take_up and redrawn for SPI-channel units by spi_benefit_coherence on the same rule (microcosm#1095), so the gate measures both channels at the contract rate. would_claim_universal_childcare is nested under would_claim_extended_childcare, so its target is the nested marginal r_e + (1 - r_e) * r_u of the contract's conditional universal rate, and the gate fails on any benefit unit that claims the extended hours without the universal ones. max_free_entitlement_hours_used carries the under-2 usage draw: its share of persons with hours is measured over the children of whole-year age 0 or 1 in units that claim the extended hours, against the weighted mean of their ages' contract rates (extended_childcare_age_0_usage, extended_childcare_age_1_usage)." }, { "id": "uk_brma_enum_domain", 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 4e3fe7894..63f70ee3d 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 @@ -470,7 +470,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": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", + "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", "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" @@ -493,7 +493,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", + "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", "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" @@ -516,7 +516,7 @@ "required_mass_change_reason": "Capital-gains residential split divides every household carrying liable gainers into arms weighted by the solved residential probabilities, one arm per subset of residential gainers; every household's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", + "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", "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) on the amounts the Table 3 redraw placed" @@ -538,7 +538,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": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", + "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", "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)" @@ -567,7 +567,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": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", + "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", "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" @@ -587,7 +587,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": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", + "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", "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" @@ -609,7 +609,7 @@ "required_mass_change_reason": "High-value home support divides every owner household in the top value stratum of its region 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": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", + "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", "source_vintages": { "source": "Microcosm structural operator (microcosm#1240 fix 1); no publisher input", "survey": "Family Resources Survey 2024-25 and SPI synthetic support, after the WAS wealth draw and the regional property uprating" @@ -630,7 +630,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": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", + "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", "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" @@ -654,7 +654,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", + "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", "source_vintages": { "conditioning_resource": "hmrc_cgt_conditioning_facts.json", "conditioning_resource_sha256": "054b1ee1a66cae6ed3793053eb0d3b9eea6b3f8976953479948ae11f7eedcd35", @@ -743,7 +743,7 @@ "full_frs_tei_band_unavailable" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", + "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", "source_vintages": { "hmrc_surface": "2023-24", "mapped_build_period": "2024", @@ -785,7 +785,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": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", + "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", "source_vintages": { "source": "UK Data Service SN 9603 Living Costs and Food Survey 2024-25 (2nd edition) household/person tabs and the vendored Chronicle facts for NEED 2024 mean kWh, DESNZ Energy Trends and QEP average prices paid for calendar 2024, road-fuel outturn (DESNZ, HMRC, ONS Consumer Trends) and road fuel by vehicle type (DESNZ), ONS Consumer Trends household spending by COICOP division, the DfT VEH1103 licensed-car stock, NTS bus use, and the DfT and devolved bus finance tables and fares indices.", "survey": "Living Costs and Food Survey 2024-25" @@ -811,7 +811,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": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", + "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", "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" @@ -831,7 +831,7 @@ "required_mass_change_reason": "Private-school attendance stored on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", + "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", "source_vintages": { "source": "policyengine-uk attends_private_school (the gov.simulation.private_school_vat attendance rates and factor), evaluated by the pinned engine", "survey": "policyengine-uk private-school attendance imputation, stored at the spine's weights" @@ -854,7 +854,7 @@ "property_finance_costs" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", + "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", "source_vintages": { "source": "https://www.gov.uk/government/statistics/property-rental-income-statistics", "survey": "Survey of Personal Incomes Public Use Tape 2022-23 and HMRC Property Rental Income Statistics 2026 (tax year 2024-25)" @@ -875,7 +875,7 @@ "required_mass_change_reason": "Annual property purchases imputed on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", + "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", "source_vintages": { "source": "https://www.gov.uk/government/statistics/uk-stamp-tax-statistics", "survey": "HMRC Annual Stamp Tax Statistics 2024 to 2025 (corrected 11 March 2026), Tables 6b, 8a and 8b" @@ -898,7 +898,7 @@ "property_wealth" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", + "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", "source_vintages": { "source": "uk/high_value_home_value_knots.json, built by tools/build_uk_high_value_home_stock.py from PolicyEngine/chronicle#343's registrations", "survey": "HM Land Registry Price Paid latest sales uprated with the UK House Price Index, owner-weighted by region (the dense value node's knots, region level)" @@ -922,7 +922,7 @@ "non_residential_property_value" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", + "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", "source_vintages": { "source": "MHCLG dwellings and the UK House Price Index regional average price averaged over the twelve months of calendar 2024 from the July 2026 full file, the frame's valuation basis, so the engine's annual uprating from 2024 projects the value once (microcosm#1240 fix 5).", "survey": "Public regional property reference" @@ -949,7 +949,7 @@ "employment_income" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", + "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", "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" @@ -982,7 +982,7 @@ "household_source_id" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", + "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", "source_vintages": { "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).", "survey": "Survey of Personal Incomes Public Use Tape 2022-23 and HMRC Income Tax liabilities statistics July 2026 Table 2.5" @@ -1004,7 +1004,7 @@ "student_loan_plan" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", + "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", "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" @@ -1026,7 +1026,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": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", + "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", "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" @@ -1061,7 +1061,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": "13ee621a64ac98d476f5c1045805ac244a9b3f9457d4ac71e8b32ee0a326af3f", + "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", "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/source_stages.json b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json index 80fc20772..09e740821 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json +++ b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json @@ -1097,10 +1097,20 @@ "kind": "assign_binary_from_rate", "output": "max_free_entitlement_hours_used", "draw": "max_free_entitlement_hours_used", - "rate_key": "extended_childcare_under_2_usage", - "eligibility": "persons of whole-year age 0 or 1 in benefit units that claim the working-parent hours (would_claim_extended_childcare)", + "rate_key": "extended_childcare_age_0_usage", + "eligibility": "persons of whole-year age 0 in benefit units that claim the working-parent hours (would_claim_extended_childcare)", "assignment_unit": "person", - "rate_derivation": "a child under 2 in a claiming unit uses the working-parent hours where u < rate and gets max_free_entitlement_hours_used 0 otherwise; every other person keeps the engine's default of 30", + "rate_derivation": "a child of whole-year age 0 in a claiming unit uses the working-parent hours where u < its age's rate and gets max_free_entitlement_hours_used 0 otherwise; every other person keeps the engine's default of 30; one draw per person serves both ages' operations", + "seed": 0 + }, + { + "kind": "assign_binary_from_rate", + "output": "max_free_entitlement_hours_used", + "draw": "max_free_entitlement_hours_used", + "rate_key": "extended_childcare_age_1_usage", + "eligibility": "persons of whole-year age 1 in benefit units that claim the working-parent hours (would_claim_extended_childcare)", + "assignment_unit": "person", + "rate_derivation": "a child of whole-year age 1 in a claiming unit uses the working-parent hours where u < its age's rate and gets max_free_entitlement_hours_used 0 otherwise; every other person keeps the engine's default of 30; one draw per person serves both ages' operations", "seed": 0 } ], @@ -1121,7 +1131,7 @@ "maximum_extended_childcare_hours_usage", "max_free_entitlement_hours_used" ], - "notes": "Identity-keyed seed 0 streams replace the incumbent sequential take-up seed 100; salts are output variable names. Reported positive receipt anchors are transient and consumed only. The Universal Credit draw's population is the benefit units with a UC claimant or partner (is_uc_claimant) aged 18 or over and under Pension Credit qualifying age (66 for everyone who can reach it in this release), the age and role conditions of policyengine-uk 2.147.2's is_uc_eligible; the engine lockstep test pins it and names the three engine cases not mirrored (16- and 17-year-old claimants under the UC Regs 2013 reg 8 exceptions, mixed-age couples on the Pension Credit route, and from 2.128.0 pension-age families moved onto Universal Credit when their legacy benefit closes, SI 2014/1230 reg 60A). So the contract rate is a share of those units, an anchor outside them stays true, and any other unit is never drawn; a unit with no claimant or partner of that age keeps its reported Housing Benefit, which a claim it cannot make no longer zeroes (#882, microcosm#867, microcosm#1095). The universal childcare flag is nested under the working-parent one. A unit that claims the extended hours claims the universal hours, and any other unit claims them at the contract's universal_childcare rate, the rate conditional on not claiming the extended hours; the extended draw is unchanged. childcare_copy_take_up later re-draws the childcare flags and hours of the support and CGT copies on their own benefit units. A child of whole-year age 0 or 1 in a unit that claims the working-parent hours uses them at the contract's extended_childcare_under_2_usage rate (DfE registers far fewer of the youngest eligible children than of those aged 2 to 4); a child that does not gets max_free_entitlement_hours_used 0, so the engine funds it no hours, and every other person keeps the engine's default of 30." + "notes": "Identity-keyed seed 0 streams replace the incumbent sequential take-up seed 100; salts are output variable names. Reported positive receipt anchors are transient and consumed only. The Universal Credit draw's population is the benefit units with a UC claimant or partner (is_uc_claimant) aged 18 or over and under Pension Credit qualifying age (66 for everyone who can reach it in this release), the age and role conditions of policyengine-uk 2.147.2's is_uc_eligible; the engine lockstep test pins it and names the three engine cases not mirrored (16- and 17-year-old claimants under the UC Regs 2013 reg 8 exceptions, mixed-age couples on the Pension Credit route, and from 2.128.0 pension-age families moved onto Universal Credit when their legacy benefit closes, SI 2014/1230 reg 60A). So the contract rate is a share of those units, an anchor outside them stays true, and any other unit is never drawn; a unit with no claimant or partner of that age keeps its reported Housing Benefit, which a claim it cannot make no longer zeroes (#882, microcosm#867, microcosm#1095). The universal childcare flag is nested under the working-parent one. A unit that claims the extended hours claims the universal hours, and any other unit claims them at the contract's universal_childcare rate, the rate conditional on not claiming the extended hours; the extended draw is unchanged. childcare_copy_take_up later re-draws the childcare flags and hours of the support and CGT copies on their own benefit units. A child of whole-year age 0 or 1 in a unit that claims the working-parent hours uses them at its age's contract rate, extended_childcare_age_0_usage or extended_childcare_age_1_usage (DfE registers far fewer of the youngest eligible children than of those aged 2 to 4, and fewer at 9 to 11 months than at age 1); a child that does not gets max_free_entitlement_hours_used 0, so the engine funds it no hours, and every other person keeps the engine's default of 30." }, { "stage": "frs_person_draws", @@ -6547,8 +6557,18 @@ "kind": "assign_binary_from_rate", "output": "max_free_entitlement_hours_used", "draw": "max_free_entitlement_hours_used", - "rate_key": "extended_childcare_under_2_usage", - "eligibility": "children of whole-year age 0 or 1 in copy benefit units that claim the working-parent hours, against the copy's re-drawn would_claim_extended_childcare; native persons keep their frs_take_up draws", + "rate_key": "extended_childcare_age_0_usage", + "eligibility": "children of whole-year age 0 in copy benefit units that claim the working-parent hours, against the copy's re-drawn would_claim_extended_childcare; native persons keep their frs_take_up draws", + "assignment_unit": "person", + "rate_derivation": "as in frs_take_up, keyed on the copy's own person_id", + "seed": 0 + }, + { + "kind": "assign_binary_from_rate", + "output": "max_free_entitlement_hours_used", + "draw": "max_free_entitlement_hours_used", + "rate_key": "extended_childcare_age_1_usage", + "eligibility": "children of whole-year age 1 in copy benefit units that claim the working-parent hours, against the copy's re-drawn would_claim_extended_childcare; native persons keep their frs_take_up draws", "assignment_unit": "person", "rate_derivation": "as in frs_take_up, keyed on the copy's own person_id", "seed": 0 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 0dfc6068a..157db7e30 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml +++ b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml @@ -1001,10 +1001,18 @@ stages: - kind: assign_binary_from_rate output: max_free_entitlement_hours_used draw: max_free_entitlement_hours_used - rate_key: extended_childcare_under_2_usage - eligibility: persons of whole-year age 0 or 1 in benefit units that claim the working-parent hours (would_claim_extended_childcare) + rate_key: extended_childcare_age_0_usage + eligibility: persons of whole-year age 0 in benefit units that claim the working-parent hours (would_claim_extended_childcare) assignment_unit: person - rate_derivation: a child under 2 in a claiming unit uses the working-parent hours where u < rate and gets max_free_entitlement_hours_used 0 otherwise; every other person keeps the engine's default of 30 + rate_derivation: a child of whole-year age 0 in a claiming unit uses the working-parent hours where u < its age's rate and gets max_free_entitlement_hours_used 0 otherwise; every other person keeps the engine's default of 30; one draw per person serves both ages' operations + seed: 0 + - kind: assign_binary_from_rate + output: max_free_entitlement_hours_used + draw: max_free_entitlement_hours_used + rate_key: extended_childcare_age_1_usage + eligibility: persons of whole-year age 1 in benefit units that claim the working-parent hours (would_claim_extended_childcare) + assignment_unit: person + rate_derivation: a child of whole-year age 1 in a claiming unit uses the working-parent hours where u < its age's rate and gets max_free_entitlement_hours_used 0 otherwise; every other person keeps the engine's default of 30; one draw per person serves both ages' operations seed: 0 outputs: - would_claim_child_benefit @@ -1021,7 +1029,7 @@ stages: nonnegative_outputs: - maximum_extended_childcare_hours_usage - max_free_entitlement_hours_used - notes: Identity-keyed seed 0 streams replace the incumbent sequential take-up seed 100; salts are output variable names. Reported positive receipt anchors are transient and consumed only. The Universal Credit draw's population is the benefit units with a UC claimant or partner (is_uc_claimant) aged 18 or over and under Pension Credit qualifying age (66 for everyone who can reach it in this release), the age and role conditions of policyengine-uk 2.147.2's is_uc_eligible; the engine lockstep test pins it and names the three engine cases not mirrored (16- and 17-year-old claimants under the UC Regs 2013 reg 8 exceptions, mixed-age couples on the Pension Credit route, and from 2.128.0 pension-age families moved onto Universal Credit when their legacy benefit closes, SI 2014/1230 reg 60A). So the contract rate is a share of those units, an anchor outside them stays true, and any other unit is never drawn; a unit with no claimant or partner of that age keeps its reported Housing Benefit, which a claim it cannot make no longer zeroes (#882, microcosm#867, microcosm#1095). The universal childcare flag is nested under the working-parent one. A unit that claims the extended hours claims the universal hours, and any other unit claims them at the contract's universal_childcare rate, the rate conditional on not claiming the extended hours; the extended draw is unchanged. childcare_copy_take_up later re-draws the childcare flags and hours of the support and CGT copies on their own benefit units. A child of whole-year age 0 or 1 in a unit that claims the working-parent hours uses them at the contract's extended_childcare_under_2_usage rate (DfE registers far fewer of the youngest eligible children than of those aged 2 to 4); a child that does not gets max_free_entitlement_hours_used 0, so the engine funds it no hours, and every other person keeps the engine's default of 30. + notes: Identity-keyed seed 0 streams replace the incumbent sequential take-up seed 100; salts are output variable names. Reported positive receipt anchors are transient and consumed only. The Universal Credit draw's population is the benefit units with a UC claimant or partner (is_uc_claimant) aged 18 or over and under Pension Credit qualifying age (66 for everyone who can reach it in this release), the age and role conditions of policyengine-uk 2.147.2's is_uc_eligible; the engine lockstep test pins it and names the three engine cases not mirrored (16- and 17-year-old claimants under the UC Regs 2013 reg 8 exceptions, mixed-age couples on the Pension Credit route, and from 2.128.0 pension-age families moved onto Universal Credit when their legacy benefit closes, SI 2014/1230 reg 60A). So the contract rate is a share of those units, an anchor outside them stays true, and any other unit is never drawn; a unit with no claimant or partner of that age keeps its reported Housing Benefit, which a claim it cannot make no longer zeroes (#882, microcosm#867, microcosm#1095). The universal childcare flag is nested under the working-parent one. A unit that claims the extended hours claims the universal hours, and any other unit claims them at the contract's universal_childcare rate, the rate conditional on not claiming the extended hours; the extended draw is unchanged. childcare_copy_take_up later re-draws the childcare flags and hours of the support and CGT copies on their own benefit units. A child of whole-year age 0 or 1 in a unit that claims the working-parent hours uses them at its age's contract rate, extended_childcare_age_0_usage or extended_childcare_age_1_usage (DfE registers far fewer of the youngest eligible children than of those aged 2 to 4, and fewer at 9 to 11 months than at age 1); a child that does not gets max_free_entitlement_hours_used 0, so the engine funds it no hours, and every other person keeps the engine's default of 30. - stage: frs_person_draws survey: Family Resources Survey 2024-25 source: Sourced UK take-up contract rates and identity-keyed deterministic draws. @@ -5281,8 +5289,16 @@ stages: - kind: assign_binary_from_rate output: max_free_entitlement_hours_used draw: max_free_entitlement_hours_used - rate_key: extended_childcare_under_2_usage - eligibility: children of whole-year age 0 or 1 in copy benefit units that claim the working-parent hours, against the copy's re-drawn would_claim_extended_childcare; native persons keep their frs_take_up draws + rate_key: extended_childcare_age_0_usage + eligibility: children of whole-year age 0 in copy benefit units that claim the working-parent hours, against the copy's re-drawn would_claim_extended_childcare; native persons keep their frs_take_up draws + assignment_unit: person + rate_derivation: as in frs_take_up, keyed on the copy's own person_id + seed: 0 + - kind: assign_binary_from_rate + output: max_free_entitlement_hours_used + draw: max_free_entitlement_hours_used + rate_key: extended_childcare_age_1_usage + eligibility: children of whole-year age 1 in copy benefit units that claim the working-parent hours, against the copy's re-drawn would_claim_extended_childcare; native persons keep their frs_take_up draws assignment_unit: person rate_derivation: as in frs_take_up, keyed on the copy's own person_id seed: 0 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 e8e39938f..b6cc5e5a7 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 @@ -291,24 +291,44 @@ } }, { - "key": "extended_childcare_under_2_usage", + "key": "extended_childcare_age_0_usage", "output": "max_free_entitlement_hours_used", "entity": "person", "values": { - "2024-04-06": 0.75 + "2024-04-06": 0.51 }, "source": { "source": "DfE Funded early education and childcare, January 2025 (reporting year 2025 headline figures)", "agency": "DfE", - "citation": "The share of children under 2 in benefit units that claim the working-parent hours who use them. DfE registers far fewer of the youngest eligible children than of those aged 2 to 4, mostly for parental leave: in January 2025, 29,155 working parent registrations at 9 to 11 months and 195,104 at age 1, against 621,482 at ages 2 to 4. 0.75 is provisional, the registrations per eligible child at 9 to 11 months and age 1 relative to ages 2 to 4 in DfE's own estimates, until tools/fit_uk_childcare_takeup.py (tool version 6) fits it with the other childcare rates against the working parent rows at 9 to 11 months and age 1. Applied by frs_take_up (and childcare_copy_take_up for the copies) to each child of whole-year age 0 or 1 in a unit that claims the working-parent hours: a child that does not use them gets max_free_entitlement_hours_used 0, every other person the engine's default of 30.", + "citation": "The share of children of whole-year age 0 in benefit units that claim the working-parent hours who use them. DfE registers far fewer of the youngest eligible children than of those aged 2 to 4, and fewer at 9 to 11 months than at age 1, mostly for parental leave: in January 2025, 29,155 working parent registrations at 9 to 11 months and 195,104 at age 1, against 621,482 at ages 2 to 4. 0.51 is provisional, DfE's registrations per eligible child at 9 to 11 months relative to ages 2 to 4 in its own estimates, until tools/fit_uk_childcare_takeup.py (tool version 6) fits both age rates with the other childcare rates against the working parent rows at 9 to 11 months and age 1. Applied by frs_take_up (and childcare_copy_take_up for the copies) to each child of whole-year age 0 in a unit that claims the working-parent hours: a child that does not use them gets max_free_entitlement_hours_used 0, every other person the engine's default of 30.", "url": "https://explore-education-statistics.service.gov.uk/find-statistics/funded-early-education-and-childcare/2025", "status": "frozen_by_adjudication", "freeze": { - "decision": "María's ruling of 2026-10-22 on Vahid's round-2 review of microcosm#1338 (\"bind them with their own take up\"): the under-2 working parent rows are bound with their own usage rate, provisional until the tool-version-6 refit", + "decision": "María's ruling of 2026-10-22 on Vahid's round-2 review of microcosm#1338 (\"bind them with their own take up\"): the under-2 working parent rows are bound with their own usage rates, one per whole-year age, provisional until the tool-version-6 refit", "followup": "microcosm#1338" } }, - "population": "children of whole-year age 0 or 1 in benefit units that claim the working-parent hours (would_claim_extended_childcare)" + "population": "children of whole-year age 0 in benefit units that claim the working-parent hours (would_claim_extended_childcare)" + }, + { + "key": "extended_childcare_age_1_usage", + "output": "max_free_entitlement_hours_used", + "entity": "person", + "values": { + "2024-04-06": 0.81 + }, + "source": { + "source": "DfE Funded early education and childcare, January 2025 (reporting year 2025 headline figures)", + "agency": "DfE", + "citation": "The share of children of whole-year age 1 in benefit units that claim the working-parent hours who use them. DfE registers far fewer of the youngest eligible children than of those aged 2 to 4, and fewer at 9 to 11 months than at age 1, mostly for parental leave: in January 2025, 29,155 working parent registrations at 9 to 11 months and 195,104 at age 1, against 621,482 at ages 2 to 4. 0.81 is provisional, DfE's registrations per eligible child at age 1 relative to ages 2 to 4 in its own estimates, until tools/fit_uk_childcare_takeup.py (tool version 6) fits both age rates with the other childcare rates against the working parent rows at 9 to 11 months and age 1. Applied by frs_take_up (and childcare_copy_take_up for the copies) to each child of whole-year age 1 in a unit that claims the working-parent hours: a child that does not use them gets max_free_entitlement_hours_used 0, every other person the engine's default of 30.", + "url": "https://explore-education-statistics.service.gov.uk/find-statistics/funded-early-education-and-childcare/2025", + "status": "frozen_by_adjudication", + "freeze": { + "decision": "María's ruling of 2026-10-22 on Vahid's round-2 review of microcosm#1338 (\"bind them with their own take up\"): the under-2 working parent rows are bound with their own usage rates, one per whole-year age, provisional until the tool-version-6 refit", + "followup": "microcosm#1338" + } + }, + "population": "children of whole-year age 1 in benefit units that claim the working-parent hours (would_claim_extended_childcare)" }, { "key": "universal_childcare", 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 2cb35194b..697a5b6d4 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 @@ -42,17 +42,25 @@ "maximum_extended_childcare_hours_usage", ) # A child under 2 in a benefit unit that claims the working-parent hours uses -# them at the contract's under-2 usage rate: DfE registers far fewer of the -# youngest eligible children than of those aged 2 to 4, mostly for parental -# leave, so one family rate fitted at 2 to 4 would fund too many of them. A -# child that does not use them gets no funded hours from the engine -# (max_free_entitlement_hours_used 0); every other person keeps the engine's -# default of 30. The draw is keyed on the person (seed 0, salt the output); +# them at its own age's contract rate: DfE registers far fewer of the youngest +# eligible children than of those aged 2 to 4, and fewer at 9 to 11 months +# than at age 1, mostly for parental leave, so one family rate fitted at 2 to 4 +# would fund too many of them. A child that does not use them gets no funded +# hours from the engine (max_free_entitlement_hours_used 0); every other person +# keeps the engine's default of 30. The draw is keyed on the person (seed 0, +# salt the output) at the rate of the child's whole-year age (0 or 1); # ``childcare_copy_take_up`` re-draws the copies' children against their own -# unit's flag. The stage manifest declares the operation; -# ``assert_under_two_usage_declaration`` refuses a manifest that drops it. +# unit's flag. The stage manifest declares one operation per age; +# ``assert_under_two_usage_declaration`` refuses a manifest that drops either. UK_UNDER_TWO_USAGE_OUTPUT = "max_free_entitlement_hours_used" -UK_UNDER_TWO_USAGE_KEY = "extended_childcare_under_2_usage" +#: The usage rate's contract key by whole-year age. +UK_UNDER_TWO_USAGE_KEYS = { + 0: "extended_childcare_age_0_usage", + 1: "extended_childcare_age_1_usage", +} +#: The take-up signal gate's name for the draw: its target is the population's +#: weighted mean of the two age rates. +UK_UNDER_TWO_USAGE_SIGNAL_KEY = "extended_childcare_under_2_usage" UK_UNDER_TWO_AGE = 2 UK_ENGINE_FREE_HOURS_DEFAULT = 30.0 FRS_TAKE_UP_PERSON_OUTPUT_COLUMNS = (UK_UNDER_TWO_USAGE_OUTPUT,) @@ -146,7 +154,7 @@ ("benunit", "would_claim_universal_childcare", "universal_childcare"), ("benunit", "would_claim_targeted_childcare", "targeted_childcare"), ("benunit", "would_claim_uc_childcare", "uc_childcare"), - ("person", UK_UNDER_TWO_USAGE_OUTPUT, UK_UNDER_TWO_USAGE_KEY), + ("person", UK_UNDER_TWO_USAGE_OUTPUT, UK_UNDER_TWO_USAGE_SIGNAL_KEY), ("person", "would_claim_marriage_allowance", "marriage_allowance"), ("person", "would_claim_scp", "scp"), ("household", "household_owns_tv", "tv_ownership_rate"), @@ -293,16 +301,17 @@ def assert_under_two_usage_declaration(stage: SourceStageSpec) -> None: for op in stage.operations if op.parameters.get("output") == UK_UNDER_TWO_USAGE_OUTPUT ] - expected = {"rate_key": UK_UNDER_TWO_USAGE_KEY, "assignment_unit": "person"} - if not declared or any( - any(params.get(key) != value for key, value in expected.items()) - for params in declared + rate_keys = sorted(str(params.get("rate_key")) for params in declared) + if rate_keys != sorted(UK_UNDER_TWO_USAGE_KEYS.values()) or any( + params.get("assignment_unit") != "person" for params in declared ): raise ValueError( - f"stage {stage.stage!r} must declare the {UK_UNDER_TWO_USAGE_OUTPUT!r} " - f"operation with {expected!r}; the code draws whether each child under " - f"{UK_UNDER_TWO_AGE} in a unit claiming the working-parent hours uses " - f"them and refuses a manifest that says otherwise (declared: {declared!r})" + f"stage {stage.stage!r} must declare one {UK_UNDER_TWO_USAGE_OUTPUT!r} " + "operation per whole-year age with assignment_unit person and the rate " + f"keys {sorted(UK_UNDER_TWO_USAGE_KEYS.values())!r}; the code draws " + f"whether each child under {UK_UNDER_TWO_AGE} in a unit claiming the " + "working-parent hours uses them at its age's rate and refuses a " + f"manifest that says otherwise (declared: {declared!r})" ) @@ -526,20 +535,33 @@ def under_two_children(person: pd.DataFrame) -> np.ndarray: return age.to_numpy(dtype=float) < UK_UNDER_TWO_AGE +def under_two_usage_rates( + person: pd.DataFrame, contract: UKTakeUpContract +) -> np.ndarray: + """Each person's usage rate by whole-year age (age 1's rate from 1 up).""" + + age = pd.to_numeric(person["age"], errors="coerce").to_numpy(dtype=float) + return np.where( + age < 1, + contract.rate(UK_UNDER_TWO_USAGE_KEYS[0]), + contract.rate(UK_UNDER_TWO_USAGE_KEYS[1]), + ) + + def derive_under_two_childcare_usage( person: pd.DataFrame, *, claiming: np.ndarray, contract: UKTakeUpContract ) -> np.ndarray: """``max_free_entitlement_hours_used`` for every person in ``person``. A child under 2 whose unit claims the working-parent hours uses them where - its draw (keyed on ``person_id``) falls under the contract's under-2 usage + its draw (keyed on ``person_id``) falls under its whole-year age's usage rate and gets 0 hours otherwise; every other person keeps the engine's default. """ ids = person["person_id"].to_numpy() - uses = assign_binary_from_rate( - _draws(ids, UK_UNDER_TWO_USAGE_OUTPUT), contract.rate(UK_UNDER_TWO_USAGE_KEY) + uses = _draws(ids, UK_UNDER_TWO_USAGE_OUTPUT) < under_two_usage_rates( + person, contract ) drawn = under_two_children(person) & np.asarray(claiming, dtype=bool) return np.where(drawn & ~uses, 0.0, UK_ENGINE_FREE_HOURS_DEFAULT) @@ -610,7 +632,7 @@ def uk_take_up_signal_gate( "instant": policy.instant, "source": policy.source, } - if key == UK_UNDER_TWO_USAGE_KEY: + if key == UK_UNDER_TWO_USAGE_SIGNAL_KEY: # The rate is a share of the children under 2 in units that claim # the working-parent hours; every other person keeps 30 hours. benunit_table = frame.table("benunit") @@ -628,7 +650,16 @@ def uk_take_up_signal_gate( share = float( np.average(values[population].astype(float), weights=weights[population]) ) - target = _target_share(table, key, resolved, weights) + if key == UK_UNDER_TWO_USAGE_SIGNAL_KEY: + # Each child's rate is its age's: the target is their weighted mean. + target = float( + np.average( + under_two_usage_rates(table, resolved)[population], + weights=weights[population], + ) + ) + else: + target = _target_share(table, key, resolved, weights) details[f"{entity}.{output}"] = { "weighted_share": share, "target": target, diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_copy_take_up.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_copy_take_up.py index c932b53e6..03313ce5e 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_copy_take_up.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_copy_take_up.py @@ -339,7 +339,8 @@ def test_copies_children_redraw_their_under_two_usage_on_their_own_draws() -> No ) ) usage = after.loc[drawn, UK_UNDER_TWO_USAGE_OUTPUT].to_numpy() > 0 + # Every under-2 child here is aged 1. assert usage.mean() == pytest.approx( - contract.rate("extended_childcare_under_2_usage"), abs=0.03 + contract.rate("extended_childcare_age_1_usage"), abs=0.03 ) assert (after.loc[~under_two, UK_UNDER_TWO_USAGE_OUTPUT] == 30.0).all() diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_realised_take_up.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_realised_take_up.py index 3376f26ce..e1b0e4ab4 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_realised_take_up.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_realised_take_up.py @@ -28,7 +28,8 @@ class _Contract: "extended_childcare": 0.5, "universal_childcare": 0.2, "targeted_childcare": 0.6, - "extended_childcare_under_2_usage": 0.7, + "extended_childcare_age_0_usage": 0.5, + "extended_childcare_age_1_usage": 0.7, } def rate(self, key: str, build_year: int | None = None) -> float: @@ -87,9 +88,10 @@ def test_realised_take_up_reports_shares_beside_the_contract_rates() -> None: assert universal["cells"]["units_with_a_child_under_5_and_pay_over_100k"] == { "source_households": "<10" } - usage = receipt["flags"]["max_free_entitlement_hours_used"] - assert usage["contract_key"] == "extended_childcare_under_2_usage" - children = usage["cells"]["children_under_2_in_claiming_units"] + usage = receipt["flags"]["max_free_entitlement_hours_used.age_1"] + assert usage["contract_key"] == "extended_childcare_age_1_usage" + assert usage["contract_rate"] == 0.7 + children = usage["cells"]["children_aged_1_in_claiming_units"] claiming = benunit["would_claim_extended_childcare"].to_numpy() assert children["source_households"] == int(claiming.sum()) odd = (benunit["benunit_id"].to_numpy() % 2 == 1) & claiming 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 0c0267359..2dd920dc6 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 @@ -601,6 +601,7 @@ def test_e3_operation_kinds_are_declared_in_order(self) -> None: "assign_binary_from_banded_rates", "assign_clipped_normal", "assign_binary_from_rate", + "assign_binary_from_rate", ] assert [op.kind for op in stages["frs_person_draws"].operations] == [ "assign_binary_from_rate", @@ -924,7 +925,8 @@ def test_engine_predictor_and_rewrite_constants_match_manifest(self) -> None: "extended_childcare", "universal_childcare", "targeted_childcare", - "extended_childcare_under_2_usage", + "extended_childcare_age_0_usage", + "extended_childcare_age_1_usage", "marriage_allowance", "tv_ownership_rate", "tv_licence_evasion_rate", diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_stochastic_tools.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_stochastic_tools.py index da083ee04..dbb2391a4 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_stochastic_tools.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_stochastic_tools.py @@ -52,7 +52,7 @@ def forbidden_seed(*args, **kwargs): & ~first["would_claim_universal_childcare"] ).any() nested = tool.draw_childcare_inputs( - ids, np.array([0.5, 1.0, 0.5, 0.0, 0.5]), seed=42, contract=contract + ids, np.array([0.5, 1.0, 0.5, 0.0, 0.5, 0.5]), seed=42, contract=contract ) assert nested["would_claim_universal_childcare"].all() @@ -93,7 +93,7 @@ def runner(path: Path, params: np.ndarray, seed: int, period: int, contract): assert first["input_sha256"] assert first["seed"] == 42 assert set(first["params"]) == set(tool.RATE_KEYS) - assert len(first["params"]) == 5 + assert len(first["params"]) == 6 assert set(first["achieved"]) == set(tool.TARGET_IDS) assert first["tool_version"] == 6 assert first["expectation_basis"] == "dfe_spring_term" @@ -182,10 +182,11 @@ def test_childcare_expected_counts_scale_under_two_children_by_their_usage() -> two_to_four: np.array([1.0, 1.0, 0.0]), nine_to_eleven: np.array([0.0, 0.0, 1.0]), } + # The first child is aged 1, the baby aged 0: each age has its share. under_two = { "with_extended": { - two_to_four: np.array([1.0, 0.0, 0.0]), - nine_to_eleven: np.array([0.0, 0.0, 1.0]), + two_to_four: {0: np.zeros(3), 1: np.array([1.0, 0.0, 0.0])}, + nine_to_eleven: {0: np.array([0.0, 0.0, 1.0]), 1: np.zeros(3)}, } } basis = tool.ChildcareExpectationBasis( @@ -196,11 +197,11 @@ def test_childcare_expected_counts_scale_under_two_children_by_their_usage() -> under_two=under_two, ) expected = tool.expected_childcare_counts( - basis, np.array([1.0, 0.8, 1.0, 1.0, 0.5]) + basis, np.array([1.0, 0.8, 1.0, 1.0, 0.4, 0.6]) ) - assert expected[two_to_four] == pytest.approx(0.8 * (1.0 + 0.5 * 1.0)) - assert expected[nine_to_eleven] == pytest.approx(0.8 * 0.5) - assert basis.total("with_extended", two_to_four, 0.0) == 1.0 + assert expected[two_to_four] == pytest.approx(0.8 * (1.0 + 0.6 * 1.0)) + assert expected[nine_to_eleven] == pytest.approx(0.8 * 0.4) + assert basis.total("with_extended", two_to_four, {0: 0.0, 1: 0.0}) == 1.0 def test_the_fit_draws_extended_hours_at_the_contract_anchor() -> None: 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 3e749f852..a6d9073d9 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 @@ -26,7 +26,8 @@ def test_uk_contract_loads_and_selects_build_year_rates() -> None: "marriage_allowance", "tax_free_childcare", "extended_childcare", - "extended_childcare_under_2_usage", + "extended_childcare_age_0_usage", + "extended_childcare_age_1_usage", "universal_childcare", "targeted_childcare", "uc_childcare_single", @@ -49,7 +50,8 @@ def test_uk_contract_loads_and_selects_build_year_rates() -> None: 0.9912, 0.7594, # Provisional until the tool-version-6 refit (María, 2026-10-22). - 0.75, + 0.51, + 0.81, 0.0, 0.8478, 0.441, diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_take_up_gate.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_take_up_gate.py index 6299ec821..1dee21ba7 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_take_up_gate.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_take_up_gate.py @@ -30,7 +30,8 @@ def rate(self, key: str, build_year: int | None = None) -> float: "universal_credit": 0.5, "tax_free_childcare": 0.5, "extended_childcare": 0.5, - "extended_childcare_under_2_usage": 0.5, + "extended_childcare_age_0_usage": 0.5, + "extended_childcare_age_1_usage": 0.5, # Conditional on not claiming the extended hours: the fixture's # universal flag is its extended flag, so the nested marginal is # 0.5 + 0.5 * 0.0. diff --git a/packages/microcosm-data/src/microcosm/data/contract.py b/packages/microcosm-data/src/microcosm/data/contract.py index d8bebd805..c20bc8b6e 100644 --- a/packages/microcosm-data/src/microcosm/data/contract.py +++ b/packages/microcosm-data/src/microcosm/data/contract.py @@ -454,10 +454,10 @@ def compatibility_claim_declarer_error(declared_by: object) -> str | None: "845d8d2f2330eab015e71d9abd3642ef3304731e557ec88f5a23f2f65c545cdb" ) _UK_GATE_BATTERY_GATES_MANIFEST_SHA256 = ( - "22bf1eb3c3419ae8cab50b3573e146e1d8fc41f619d532e6db8af032647fc218" + "b93319166f46c05c2ea1a94bf3990ed9e849f6cd15bbe5e8d0eb183510c652d8" ) _UK_GATE_BATTERY_SPEC_FINGERPRINT = ( - "72b3fef9b92daf87752cfa1bd8ca51d1c33891d8778d9869336de7cf3f174537" + "4390edf8113a8ab2016c9eab7c4dfb4441c298772221b438f4b5d9c3a0e7ad07" ) #: Spec entry id -> the legacy gate name whose observable detail checks #: apply unchanged (the battery re-keys the report by entry id; the gate @@ -947,7 +947,7 @@ def _uk_line_cut_tag_re(release_id: str) -> re.Pattern[str] | None: }, "release_cut": { "gates_manifest_sha256": ( - "fc2f70870397e5574370a8be140a97f51704a91d365a34957fc80ff4780bc7b1" + "28fbf0d126281bdeea6c89114a550de8b815f1f6cd50a323baedb43eb637e8f6" ), "policy_sha256": ( "124f6307524d5ed568e927c279bcab70bff1491afadce4b08f748b822ca8da62" 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 4ca64caaf..0d11b7b44 100644 --- a/packages/microcosm-data/tests/engine_free/shared/test_contract.py +++ b/packages/microcosm-data/tests/engine_free/shared/test_contract.py @@ -216,10 +216,10 @@ def _trusted_terminal_gate_signing_key(monkeypatch) -> None: "845d8d2f2330eab015e71d9abd3642ef3304731e557ec88f5a23f2f65c545cdb" ) UK_GATE_BATTERY_GATES_MANIFEST_SHA256 = ( - "22bf1eb3c3419ae8cab50b3573e146e1d8fc41f619d532e6db8af032647fc218" + "b93319166f46c05c2ea1a94bf3990ed9e849f6cd15bbe5e8d0eb183510c652d8" ) UK_GATE_BATTERY_SPEC_FINGERPRINT = ( - "72b3fef9b92daf87752cfa1bd8ca51d1c33891d8778d9869336de7cf3f174537" + "4390edf8113a8ab2016c9eab7c4dfb4441c298772221b438f4b5d9c3a0e7ad07" ) UK_GATE_BATTERY_DEGENERATE_EVIDENCE_SHA256 = ( "6a179222c6b6058ad9caacfd347f7bdb8cb98a62237b50d1fc1136df09337251" diff --git a/test_support/microcosm_build/uk_frs_stochastic.py b/test_support/microcosm_build/uk_frs_stochastic.py index d022d3c7b..69e3b389a 100644 --- a/test_support/microcosm_build/uk_frs_stochastic.py +++ b/test_support/microcosm_build/uk_frs_stochastic.py @@ -69,7 +69,8 @@ class _Contract: "universal_credit": 0.5, "tax_free_childcare": 0.5, "extended_childcare": 0.5, - "extended_childcare_under_2_usage": 0.5, + "extended_childcare_age_0_usage": 0.5, + "extended_childcare_age_1_usage": 0.5, "universal_childcare": 0.5, "targeted_childcare": 0.5, "uc_childcare_single": 0.5, diff --git a/tools/fit_uk_childcare_takeup.py b/tools/fit_uk_childcare_takeup.py index 1ba848d16..d809fdad2 100644 --- a/tools/fit_uk_childcare_takeup.py +++ b/tools/fit_uk_childcare_takeup.py @@ -46,12 +46,11 @@ #: the next calendar year) is the term DfE's January census counts, and from #: it working-parent hours reach children from 9 months. DEFAULT_TARGET_PERIOD = 2025 -#: The share of children under 2 who use the hours their family's -#: working-parent claim gives them (DfE registers far fewer of the youngest -#: eligible children than of those aged 2 to 4). -UNDER_TWO_KEY = "childcare_under_two_usage" -#: Children of whole-year age under this take the under-2 usage draw. -UNDER_TWO_AGE = 2 +#: The shares of children aged 0 and 1 (whole-year age) who use the hours +#: their family's working-parent claim gives them (DfE registers far fewer of +#: the youngest eligible children than of those aged 2 to 4, and fewer at 9 to +#: 11 months than at age 1). +UNDER_TWO_KEYS = {0: "childcare_age_0_usage", 1: "childcare_age_1_usage"} #: The hours a child that uses its funded hours is given in the basis runs: #: policyengine-uk's own default for max_free_entitlement_hours_used. USES_HOURS = 30.0 @@ -76,9 +75,9 @@ "extended_childcare", "targeted_childcare", "universal_childcare", - UNDER_TWO_KEY, + *UNDER_TWO_KEYS.values(), ) -INITIAL_PARAMS = np.array([0.88, 0.812, 0.597, 0.563, 0.6], dtype=float) +INITIAL_PARAMS = np.array([0.88, 0.812, 0.597, 0.563, 0.5, 0.8], dtype=float) BOUNDS = ((0.0, 1.0),) * len(RATE_KEYS) #: What each fitted rate estimates, as the receipt records it. ESTIMANDS = { @@ -102,11 +101,15 @@ "hours (nested), fitted to DfE's universal-only registrations at the spring " "term." ), - UNDER_TWO_KEY: ( - "The share of children under 2 (whole-year age) who use the hours their " - "family's working-parent claim gives them, fitted to DfE's working parent " - "registrations at 9 to 11 months and at age 1 at the spring term." - ), + **{ + key: ( + f"The share of children of whole-year age {age} who use the hours their " + "family's working-parent claim gives them, fitted with the other age's " + "share to DfE's working parent registrations at 9 to 11 months and at " + "age 1 at the spring term." + ) + for age, key in UNDER_TWO_KEYS.items() + }, } AT_BOUND_TOLERANCE = 1e-4 SimulationRunner = Callable[ @@ -434,16 +437,17 @@ def __init__( } self.rows = int(rows) - def total(self, side: str, target: str, usage: float) -> float: - """A side's sum with the under-2 contributions scaled by ``usage``.""" + def total(self, side: str, target: str, usage: Mapping[int, float]) -> float: + """A side's sum with each age's under-2 contributions scaled by its + usage share (``usage`` maps whole-year age to share).""" values = getattr(self, side).get(target) if values is None: return 0.0 - under_two = self.under_two.get(side, {}).get(target) total = float(np.asarray(values).sum()) - if under_two is not None: - total -= (1.0 - usage) * float(np.asarray(under_two).sum()) + by_age = self.under_two.get(side, {}).get(target) or {} + for age, contribution in by_age.items(): + total -= (1.0 - usage[int(age)]) * float(np.asarray(contribution).sum()) return total @@ -458,12 +462,12 @@ def expected_childcare_counts( """ values = np.asarray(params, dtype=float) - if values.shape == (len(RATE_KEYS) - 1,): + if values.shape == (len(RATE_KEYS) - len(UNDER_TWO_KEYS),): # A basis without under-2 contributions needs no usage share. - values = np.append(values, 1.0) + values = np.append(values, np.ones(len(UNDER_TWO_KEYS))) rates = dict(zip(RATE_KEYS, map(float, values), strict=True)) extended = rates["extended_childcare"] - usage = rates[UNDER_TWO_KEY] + usage = {age: rates[key] for age, key in UNDER_TWO_KEYS.items()} expected: dict[str, float] = {} for target, own in OWN_RATE_BY_TARGET.items(): if target not in basis.with_extended: @@ -531,7 +535,7 @@ def _basis_side( *, extended: bool, allocated: bool = False, -) -> tuple[dict[str, np.ndarray], dict[str, np.ndarray]]: +) -> tuple[dict[str, np.ndarray], dict[str, dict[int, np.ndarray]]]: """One engine run's weighted rows, and their parts from children under 2. Every child uses its hours here (``USES_HOURS``), so the under-2 parts are @@ -620,9 +624,9 @@ def people(mask: np.ndarray) -> np.ndarray: ), } person_rows = np.asarray(sim.calculate("person_id", target_period)).shape[0] - under_two = np.asarray(sim.calculate("age", target_period)) < UNDER_TWO_AGE + whole_age = np.floor(np.asarray(sim.calculate("age", target_period), dtype=float)) under_two_rows = { - target: values * under_two + target: {age: values * (whole_age == age) for age in UNDER_TWO_KEYS} for target, values in result.items() if np.asarray(values).shape[0] == person_rows and target.startswith("dfe.") } diff --git a/tools/report_uk_childcare_realised_take_up.py b/tools/report_uk_childcare_realised_take_up.py index 379dc016a..421bef8d3 100644 --- a/tools/report_uk_childcare_realised_take_up.py +++ b/tools/report_uk_childcare_realised_take_up.py @@ -15,8 +15,8 @@ self-employment income exceeds £100,000 (a pay proxy, not adjusted net income); -and the under-2 usage share over the children under 2 in units that claim the -working-parent hours. Every cell names its carriers as distinct source +and each age's under-2 usage share over the children of that age in units that +claim the working-parent hours. Every cell names its carriers as distinct source households and reads "<10" in place of its shares when fewer than 10 carry it (UKDS disclosure control). The receipt belongs in the run tree; it is never written into the take-up contract, a hashed build input. @@ -38,7 +38,7 @@ from microcosm.build.uk_runtime.frs_take_up import ( UK_CHILDCARE_TAKE_UP_FLAGS, UK_EXTENDED_CHILDCARE_OUTPUT, - UK_UNDER_TWO_USAGE_KEY, + UK_UNDER_TWO_USAGE_KEYS, UK_UNDER_TWO_USAGE_OUTPUT, person_unit_flag, under_two_children, @@ -145,18 +145,20 @@ def realised_childcare_take_up( person, benunit, benunit[UK_EXTENDED_CHILDCARE_OUTPUT].to_numpy() ) uses = person[UK_UNDER_TWO_USAGE_OUTPUT].to_numpy(dtype=float) > 0 - flags[UK_UNDER_TWO_USAGE_OUTPUT] = { - "contract_key": UK_UNDER_TWO_USAGE_KEY, - "contract_rate": contract.rate(UK_UNDER_TWO_USAGE_KEY), - "cells": { - "children_under_2_in_claiming_units": _cell( - uses, - person_weights, - person_sources, - under_two_children(person) & claiming, - ) - }, - } + whole_age = np.floor(age) + for child_age, key in UK_UNDER_TWO_USAGE_KEYS.items(): + flags[f"{UK_UNDER_TWO_USAGE_OUTPUT}.age_{child_age}"] = { + "contract_key": key, + "contract_rate": contract.rate(key), + "cells": { + f"children_aged_{child_age}_in_claiming_units": _cell( + uses, + person_weights, + person_sources, + under_two_children(person) & claiming & (whole_age == child_age), + ) + }, + } return { "minimum_carriers": MINIMUM_CARRIERS, "weights": "final household weights of the built file", From b1501296c7c2555168c90c12a971ba23c4353b83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 22 Oct 2026 23:46:22 +0100 Subject: [PATCH 20/25] Refit the childcare take-up rates on the spring-term basis (tool version 6) The fitter ran at model year 2025 on a local spine built from this branch (6aea1ec00; the fit overrides the take-up columns, the only ones the later commits change), policyengine-uk 2.147.2, feed abf0921. Tax-Free Childcare 0.9697, working parent 0.8361, targeted 0.6547, universal 0 (at its lower bound: the claiming families alone exceed DfE's universal-only count), age-0 usage 0.698 and age-1 usage 1 (at its upper bound: the frame's 1-year-olds fall short of DfE's count at the 2-to-4 rate). The fitted rows are within 2% of DfE apart from universal-only (1.065), age 1 (0.894) and HMRC's two TFC rows (1.064 and 0.927), which calibration binds. Each receipt records its estimand and, at a bound, its reason; every row it carries rests on at least 10 FRS source households. Co-Authored-By: Claude Opus 5.5 --- .../microcosm/build/uk/take_up_contract.json | 526 ++++++++++++++---- .../uk/test_uk_childcare_copy_take_up.py | 6 +- .../uk/test_uk_take_up_contract.py | 17 +- 3 files changed, 417 insertions(+), 132 deletions(-) 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 b6cc5e5a7..f84c3c472 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 @@ -165,7 +165,7 @@ "entity": "benunit", "values": { "2015-01-01": 0.586, - "2024-04-06": 0.9912 + "2024-04-06": 0.9697 }, "source": { "source": "FRS empirical fit and HMRC Tax-Free Childcare statistics, June 2025 release", @@ -175,54 +175,85 @@ "status": "fitted_offline" }, "fitting_receipt": { - "source": "tools/fit_uk_childcare_takeup.py (childcare £100k-limit fixes, licensed lane)", - "tool_version": 5, - "receipt_sha256": "4c9a7b3b4e057e486a3bc8baa52e52b6c917979908026011f812039e55b25a4a", + "source": "tools/fit_uk_childcare_takeup.py (microcosm#1338 round 2, licensed lane)", + "tool_version": 6, + "receipt_sha256": "a8fea77b88e38f13eafbb4204aef97545e2c5d1599d84c4bd311ef6c57d3da00", "seed": 0, - "engine_version": "2.134.4", - "model_period": 2024, - "vintage_overrides": { - "dfe.funded_childcare.working_parent_children_2_to_4": 2025 - }, - "input_h5_sha256": "83c83f044606e915b1d8a85cbbdd16f689b88a82ec690e74dc08848e0759fb58", - "input_spine": "local unsigned spine built at 13307a64e (uk-childcare-100k-fixes on #1329, items 3 and 4 reverted; policyengine-uk 2.134.4, feed abf0921), sha256 83c83f044606e915b1d8a85cbbdd16f689b88a82ec690e74dc08848e0759fb58", + "engine_version": "2.147.2", + "model_period": 2025, + "vintage_overrides": {}, + "input_h5_sha256": "f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412", + "input_spine": "local unsigned spine built at 6aea1ec00 (uk-childcare-100k-fixes-v2 on main 8b0224e06; policyengine-uk 2.147.2, feed abf0921), sha256 f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412; the fit overrides the take-up columns, the only ones the later commits change", "ledger_facts_sha256": "2b64fecfe746164203dac1726aae6ffdb3e5d8e478bd3d64d118ac76cb00780b", - "stochastic_contract_sha256_at_fit": "54c65e6bbc2bd5612b8d4ec3254af78d1ca0d2c9bd5fcaaf05bbf69b75e2bea2", + "stochastic_contract_sha256_at_fit": "6b30ba258e9901d6aa139e4c3df227854e2c1aa1550ae514caeec3dfcfe4c1c1", + "expectation_basis": "dfe_spring_term", + "estimand": "The rate at which the spine reproduces HMRC's two Tax-Free Childcare rows (children with used accounts and the government top-up) given the other childcare rates: a fit across all users that trades the two rows against each other, not a take-up estimate for families newly eligible above £100,000, which a costing that removes the limit assumes equal to it.", + "params_at_bound": [ + "extended_childcare_age_1_usage", + "universal_childcare" + ], "optimizer": { "eps": 1e-06, - "loss": 0.03520654649905628, + "loss": 0.02521537026262977, "maxiter": 50, "method": "L-BFGS-B", "success": true }, "achieved": { "dfe.funded_childcare.early_learning_2_year_olds": { - "target": 115852.0, - "value": 115852.118, + "target": 95031.0, + "value": 95030.977, "ratio": 1.0 }, "dfe.funded_childcare.universal_only_children": { - "target": 416537.0, - "value": 431558.609, - "ratio": 1.0361 + "target": 396965.0, + "value": 422796.571, + "ratio": 1.0651 }, "dfe.funded_childcare.working_parent_children_2_to_4": { "target": 621482.0, - "value": 597323.794, - "ratio": 0.9611 + "value": 628071.593, + "ratio": 1.0106 + }, + "dfe.funded_childcare.working_parent_children_9_to_11_months": { + "target": 29155.0, + "value": 29581.118, + "ratio": 1.0146 + }, + "dfe.funded_childcare.working_parent_children_age_1": { + "target": 195104.0, + "value": 174400.612, + "ratio": 0.8939 }, "hmrc.tfc.children_with_used_accounts": { - "target": 1085020.0, - "value": 1204412.311, - "ratio": 1.11 + "target": 1151515.0, + "value": 1224841.088, + "ratio": 1.0637 }, "hmrc.tfc.government_top_up": { - "target": 632200000.0, - "value": 542154568.577, - "ratio": 0.8576 + "target": 599800000.0, + "value": 555970720.952, + "ratio": 0.9269 } }, - "status": "fitted at the 2024 base year with the expectation basis of tool version 5: universal take-up nested under working-parent take-up (its rate is conditional on not claiming extended hours), targeted hours allocated from working-parent hours (pe-uk#2177), reception-age children (current_education PRIMARY) left out of the DfE working-parent and universal-only rows, and the DfE extended-hours anchor (#1126) in the simulation. At a bound: universal_childcare. The conditional universal rate stops at its lower bound of 0 (universal take-up fully nested under working-parent take-up): with reception children out, the nested floor already gives more universal-only children than DfE's January count, because the model's interview-date ages hold more 4-year-olds outside reception than DfE's 31 December ages; per María's U2c ruling the rate keeps its bound and the receipt records the residual, and the national calibration binds the DfE rows." + "diagnostic_rows": { + "dfe.funded_childcare.universal_nursery_children_age_3": { + "target": 565954.0, + "value": 578014.513, + "ratio": 1.0213 + }, + "dfe.funded_childcare.working_parent_children_age_2": { + "target": 242453.0, + "value": 267809.94, + "ratio": 1.1046 + }, + "dfe.funded_childcare.working_parent_children_age_3": { + "target": 278640.0, + "value": 263213.198, + "ratio": 0.9446 + } + }, + "status": "fitted at model year 2025 with the expectation basis of tool version 6: the DfE rows measured at the spring term by the age on 31 December (dfe_spring_term.py, policyengine-uk 2.147.2's date-of-birth school start and working-parent term start), universal take-up nested under working-parent take-up, targeted and universal hours allocated from the gross working-parent hours, and the under-2 usage share scaling the claiming families' children under 2. At a bound: childcare_age_1_usage, universal_childcare." } }, { @@ -231,7 +262,7 @@ "entity": "benunit", "values": { "2015-01-01": 0.812, - "2024-04-06": 0.7594 + "2024-04-06": 0.8361 }, "source": { "source": "FRS empirical fit", @@ -240,54 +271,85 @@ "status": "fitted_offline" }, "fitting_receipt": { - "source": "tools/fit_uk_childcare_takeup.py (childcare £100k-limit fixes, licensed lane)", - "tool_version": 5, - "receipt_sha256": "4c9a7b3b4e057e486a3bc8baa52e52b6c917979908026011f812039e55b25a4a", + "source": "tools/fit_uk_childcare_takeup.py (microcosm#1338 round 2, licensed lane)", + "tool_version": 6, + "receipt_sha256": "a8fea77b88e38f13eafbb4204aef97545e2c5d1599d84c4bd311ef6c57d3da00", "seed": 0, - "engine_version": "2.134.4", - "model_period": 2024, - "vintage_overrides": { - "dfe.funded_childcare.working_parent_children_2_to_4": 2025 - }, - "input_h5_sha256": "83c83f044606e915b1d8a85cbbdd16f689b88a82ec690e74dc08848e0759fb58", - "input_spine": "local unsigned spine built at 13307a64e (uk-childcare-100k-fixes on #1329, items 3 and 4 reverted; policyengine-uk 2.134.4, feed abf0921), sha256 83c83f044606e915b1d8a85cbbdd16f689b88a82ec690e74dc08848e0759fb58", + "engine_version": "2.147.2", + "model_period": 2025, + "vintage_overrides": {}, + "input_h5_sha256": "f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412", + "input_spine": "local unsigned spine built at 6aea1ec00 (uk-childcare-100k-fixes-v2 on main 8b0224e06; policyengine-uk 2.147.2, feed abf0921), sha256 f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412; the fit overrides the take-up columns, the only ones the later commits change", "ledger_facts_sha256": "2b64fecfe746164203dac1726aae6ffdb3e5d8e478bd3d64d118ac76cb00780b", - "stochastic_contract_sha256_at_fit": "54c65e6bbc2bd5612b8d4ec3254af78d1ca0d2c9bd5fcaaf05bbf69b75e2bea2", + "stochastic_contract_sha256_at_fit": "6b30ba258e9901d6aa139e4c3df227854e2c1aa1550ae514caeec3dfcfe4c1c1", + "expectation_basis": "dfe_spring_term", + "estimand": "The share of benefit units that claim working-parent hours, fitted to DfE's working parent registrations aged 2 to 4 at the spring term.", + "params_at_bound": [ + "extended_childcare_age_1_usage", + "universal_childcare" + ], "optimizer": { "eps": 1e-06, - "loss": 0.03520654649905628, + "loss": 0.02521537026262977, "maxiter": 50, "method": "L-BFGS-B", "success": true }, "achieved": { "dfe.funded_childcare.early_learning_2_year_olds": { - "target": 115852.0, - "value": 115852.118, + "target": 95031.0, + "value": 95030.977, "ratio": 1.0 }, "dfe.funded_childcare.universal_only_children": { - "target": 416537.0, - "value": 431558.609, - "ratio": 1.0361 + "target": 396965.0, + "value": 422796.571, + "ratio": 1.0651 }, "dfe.funded_childcare.working_parent_children_2_to_4": { "target": 621482.0, - "value": 597323.794, - "ratio": 0.9611 + "value": 628071.593, + "ratio": 1.0106 + }, + "dfe.funded_childcare.working_parent_children_9_to_11_months": { + "target": 29155.0, + "value": 29581.118, + "ratio": 1.0146 + }, + "dfe.funded_childcare.working_parent_children_age_1": { + "target": 195104.0, + "value": 174400.612, + "ratio": 0.8939 }, "hmrc.tfc.children_with_used_accounts": { - "target": 1085020.0, - "value": 1204412.311, - "ratio": 1.11 + "target": 1151515.0, + "value": 1224841.088, + "ratio": 1.0637 }, "hmrc.tfc.government_top_up": { - "target": 632200000.0, - "value": 542154568.577, - "ratio": 0.8576 + "target": 599800000.0, + "value": 555970720.952, + "ratio": 0.9269 + } + }, + "diagnostic_rows": { + "dfe.funded_childcare.universal_nursery_children_age_3": { + "target": 565954.0, + "value": 578014.513, + "ratio": 1.0213 + }, + "dfe.funded_childcare.working_parent_children_age_2": { + "target": 242453.0, + "value": 267809.94, + "ratio": 1.1046 + }, + "dfe.funded_childcare.working_parent_children_age_3": { + "target": 278640.0, + "value": 263213.198, + "ratio": 0.9446 } }, - "status": "fitted at the 2024 base year with the expectation basis of tool version 5: universal take-up nested under working-parent take-up (its rate is conditional on not claiming extended hours), targeted hours allocated from working-parent hours (pe-uk#2177), reception-age children (current_education PRIMARY) left out of the DfE working-parent and universal-only rows, and the DfE extended-hours anchor (#1126) in the simulation. At a bound: universal_childcare. The conditional universal rate stops at its lower bound of 0 (universal take-up fully nested under working-parent take-up): with reception children out, the nested floor already gives more universal-only children than DfE's January count, because the model's interview-date ages hold more 4-year-olds outside reception than DfE's 31 December ages; per María's U2c ruling the rate keeps its bound and the receipt records the residual, and the national calibration binds the DfE rows." + "status": "fitted at model year 2025 with the expectation basis of tool version 6: the DfE rows measured at the spring term by the age on 31 December (dfe_spring_term.py, policyengine-uk 2.147.2's date-of-birth school start and working-parent term start), universal take-up nested under working-parent take-up, targeted and universal hours allocated from the gross working-parent hours, and the under-2 usage share scaling the claiming families' children under 2. At a bound: childcare_age_1_usage, universal_childcare." } }, { @@ -295,40 +357,195 @@ "output": "max_free_entitlement_hours_used", "entity": "person", "values": { - "2024-04-06": 0.51 + "2024-04-06": 0.698 }, "source": { "source": "DfE Funded early education and childcare, January 2025 (reporting year 2025 headline figures)", "agency": "DfE", - "citation": "The share of children of whole-year age 0 in benefit units that claim the working-parent hours who use them. DfE registers far fewer of the youngest eligible children than of those aged 2 to 4, and fewer at 9 to 11 months than at age 1, mostly for parental leave: in January 2025, 29,155 working parent registrations at 9 to 11 months and 195,104 at age 1, against 621,482 at ages 2 to 4. 0.51 is provisional, DfE's registrations per eligible child at 9 to 11 months relative to ages 2 to 4 in its own estimates, until tools/fit_uk_childcare_takeup.py (tool version 6) fits both age rates with the other childcare rates against the working parent rows at 9 to 11 months and age 1. Applied by frs_take_up (and childcare_copy_take_up for the copies) to each child of whole-year age 0 in a unit that claims the working-parent hours: a child that does not use them gets max_free_entitlement_hours_used 0, every other person the engine's default of 30.", + "citation": "The share of children of whole-year age 0 in benefit units that claim the working-parent hours who use them. DfE registers far fewer of the youngest eligible children than of those aged 2 to 4, and fewer at 9 to 11 months than at age 1, mostly for parental leave. Fitted by tools/fit_uk_childcare_takeup.py (tool version 6) with the other childcare rates, one share per whole-year age, against DfE's working parent registrations at 9 to 11 months and age 1 at the spring term (January 2025), as María ruled on 2026-10-22. Applied by frs_take_up (and childcare_copy_take_up for the copies) to each child of whole-year age 0 in a unit that claims the working-parent hours: a child that does not use them gets max_free_entitlement_hours_used 0, every other person the engine's default of 30.", "url": "https://explore-education-statistics.service.gov.uk/find-statistics/funded-early-education-and-childcare/2025", - "status": "frozen_by_adjudication", - "freeze": { - "decision": "María's ruling of 2026-10-22 on Vahid's round-2 review of microcosm#1338 (\"bind them with their own take up\"): the under-2 working parent rows are bound with their own usage rates, one per whole-year age, provisional until the tool-version-6 refit", - "followup": "microcosm#1338" - } + "status": "fitted_offline" }, - "population": "children of whole-year age 0 in benefit units that claim the working-parent hours (would_claim_extended_childcare)" + "population": "children of whole-year age 0 in benefit units that claim the working-parent hours (would_claim_extended_childcare)", + "fitting_receipt": { + "source": "tools/fit_uk_childcare_takeup.py (microcosm#1338 round 2, licensed lane)", + "tool_version": 6, + "receipt_sha256": "a8fea77b88e38f13eafbb4204aef97545e2c5d1599d84c4bd311ef6c57d3da00", + "seed": 0, + "engine_version": "2.147.2", + "model_period": 2025, + "vintage_overrides": {}, + "input_h5_sha256": "f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412", + "input_spine": "local unsigned spine built at 6aea1ec00 (uk-childcare-100k-fixes-v2 on main 8b0224e06; policyengine-uk 2.147.2, feed abf0921), sha256 f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412; the fit overrides the take-up columns, the only ones the later commits change", + "ledger_facts_sha256": "2b64fecfe746164203dac1726aae6ffdb3e5d8e478bd3d64d118ac76cb00780b", + "stochastic_contract_sha256_at_fit": "6b30ba258e9901d6aa139e4c3df227854e2c1aa1550ae514caeec3dfcfe4c1c1", + "expectation_basis": "dfe_spring_term", + "estimand": "The share of children of whole-year age 0 who use the hours their family's working-parent claim gives them, fitted with the other age's share to DfE's working parent registrations at 9 to 11 months and at age 1 at the spring term.", + "params_at_bound": [ + "extended_childcare_age_1_usage", + "universal_childcare" + ], + "optimizer": { + "eps": 1e-06, + "loss": 0.02521537026262977, + "maxiter": 50, + "method": "L-BFGS-B", + "success": true + }, + "achieved": { + "dfe.funded_childcare.early_learning_2_year_olds": { + "target": 95031.0, + "value": 95030.977, + "ratio": 1.0 + }, + "dfe.funded_childcare.universal_only_children": { + "target": 396965.0, + "value": 422796.571, + "ratio": 1.0651 + }, + "dfe.funded_childcare.working_parent_children_2_to_4": { + "target": 621482.0, + "value": 628071.593, + "ratio": 1.0106 + }, + "dfe.funded_childcare.working_parent_children_9_to_11_months": { + "target": 29155.0, + "value": 29581.118, + "ratio": 1.0146 + }, + "dfe.funded_childcare.working_parent_children_age_1": { + "target": 195104.0, + "value": 174400.612, + "ratio": 0.8939 + }, + "hmrc.tfc.children_with_used_accounts": { + "target": 1151515.0, + "value": 1224841.088, + "ratio": 1.0637 + }, + "hmrc.tfc.government_top_up": { + "target": 599800000.0, + "value": 555970720.952, + "ratio": 0.9269 + } + }, + "diagnostic_rows": { + "dfe.funded_childcare.universal_nursery_children_age_3": { + "target": 565954.0, + "value": 578014.513, + "ratio": 1.0213 + }, + "dfe.funded_childcare.working_parent_children_age_2": { + "target": 242453.0, + "value": 267809.94, + "ratio": 1.1046 + }, + "dfe.funded_childcare.working_parent_children_age_3": { + "target": 278640.0, + "value": 263213.198, + "ratio": 0.9446 + } + }, + "status": "fitted at model year 2025 with the expectation basis of tool version 6: the DfE rows measured at the spring term by the age on 31 December (dfe_spring_term.py, policyengine-uk 2.147.2's date-of-birth school start and working-parent term start), universal take-up nested under working-parent take-up, targeted and universal hours allocated from the gross working-parent hours, and the under-2 usage share scaling the claiming families' children under 2. At a bound: childcare_age_1_usage, universal_childcare." + } }, { "key": "extended_childcare_age_1_usage", "output": "max_free_entitlement_hours_used", "entity": "person", "values": { - "2024-04-06": 0.81 + "2024-04-06": 1.0 }, "source": { "source": "DfE Funded early education and childcare, January 2025 (reporting year 2025 headline figures)", "agency": "DfE", - "citation": "The share of children of whole-year age 1 in benefit units that claim the working-parent hours who use them. DfE registers far fewer of the youngest eligible children than of those aged 2 to 4, and fewer at 9 to 11 months than at age 1, mostly for parental leave: in January 2025, 29,155 working parent registrations at 9 to 11 months and 195,104 at age 1, against 621,482 at ages 2 to 4. 0.81 is provisional, DfE's registrations per eligible child at age 1 relative to ages 2 to 4 in its own estimates, until tools/fit_uk_childcare_takeup.py (tool version 6) fits both age rates with the other childcare rates against the working parent rows at 9 to 11 months and age 1. Applied by frs_take_up (and childcare_copy_take_up for the copies) to each child of whole-year age 1 in a unit that claims the working-parent hours: a child that does not use them gets max_free_entitlement_hours_used 0, every other person the engine's default of 30.", + "citation": "The share of children of whole-year age 1 in benefit units that claim the working-parent hours who use them. DfE registers far fewer of the youngest eligible children than of those aged 2 to 4, and fewer at 9 to 11 months than at age 1, mostly for parental leave. Fitted by tools/fit_uk_childcare_takeup.py (tool version 6) with the other childcare rates, one share per whole-year age, against DfE's working parent registrations at 9 to 11 months and age 1 at the spring term (January 2025), as María ruled on 2026-10-22. Applied by frs_take_up (and childcare_copy_take_up for the copies) to each child of whole-year age 1 in a unit that claims the working-parent hours: a child that does not use them gets max_free_entitlement_hours_used 0, every other person the engine's default of 30.", "url": "https://explore-education-statistics.service.gov.uk/find-statistics/funded-early-education-and-childcare/2025", - "status": "frozen_by_adjudication", - "freeze": { - "decision": "María's ruling of 2026-10-22 on Vahid's round-2 review of microcosm#1338 (\"bind them with their own take up\"): the under-2 working parent rows are bound with their own usage rates, one per whole-year age, provisional until the tool-version-6 refit", - "followup": "microcosm#1338" - } + "status": "fitted_offline" }, - "population": "children of whole-year age 1 in benefit units that claim the working-parent hours (would_claim_extended_childcare)" + "population": "children of whole-year age 1 in benefit units that claim the working-parent hours (would_claim_extended_childcare)", + "fitting_receipt": { + "source": "tools/fit_uk_childcare_takeup.py (microcosm#1338 round 2, licensed lane)", + "tool_version": 6, + "receipt_sha256": "a8fea77b88e38f13eafbb4204aef97545e2c5d1599d84c4bd311ef6c57d3da00", + "seed": 0, + "engine_version": "2.147.2", + "model_period": 2025, + "vintage_overrides": {}, + "input_h5_sha256": "f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412", + "input_spine": "local unsigned spine built at 6aea1ec00 (uk-childcare-100k-fixes-v2 on main 8b0224e06; policyengine-uk 2.147.2, feed abf0921), sha256 f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412; the fit overrides the take-up columns, the only ones the later commits change", + "ledger_facts_sha256": "2b64fecfe746164203dac1726aae6ffdb3e5d8e478bd3d64d118ac76cb00780b", + "stochastic_contract_sha256_at_fit": "6b30ba258e9901d6aa139e4c3df227854e2c1aa1550ae514caeec3dfcfe4c1c1", + "expectation_basis": "dfe_spring_term", + "estimand": "The share of children of whole-year age 1 who use the hours their family's working-parent claim gives them, fitted with the other age's share to DfE's working parent registrations at 9 to 11 months and at age 1 at the spring term.", + "params_at_bound": [ + "extended_childcare_age_1_usage", + "universal_childcare" + ], + "optimizer": { + "eps": 1e-06, + "loss": 0.02521537026262977, + "maxiter": 50, + "method": "L-BFGS-B", + "success": true + }, + "achieved": { + "dfe.funded_childcare.early_learning_2_year_olds": { + "target": 95031.0, + "value": 95030.977, + "ratio": 1.0 + }, + "dfe.funded_childcare.universal_only_children": { + "target": 396965.0, + "value": 422796.571, + "ratio": 1.0651 + }, + "dfe.funded_childcare.working_parent_children_2_to_4": { + "target": 621482.0, + "value": 628071.593, + "ratio": 1.0106 + }, + "dfe.funded_childcare.working_parent_children_9_to_11_months": { + "target": 29155.0, + "value": 29581.118, + "ratio": 1.0146 + }, + "dfe.funded_childcare.working_parent_children_age_1": { + "target": 195104.0, + "value": 174400.612, + "ratio": 0.8939 + }, + "hmrc.tfc.children_with_used_accounts": { + "target": 1151515.0, + "value": 1224841.088, + "ratio": 1.0637 + }, + "hmrc.tfc.government_top_up": { + "target": 599800000.0, + "value": 555970720.952, + "ratio": 0.9269 + } + }, + "diagnostic_rows": { + "dfe.funded_childcare.universal_nursery_children_age_3": { + "target": 565954.0, + "value": 578014.513, + "ratio": 1.0213 + }, + "dfe.funded_childcare.working_parent_children_age_2": { + "target": 242453.0, + "value": 267809.94, + "ratio": 1.1046 + }, + "dfe.funded_childcare.working_parent_children_age_3": { + "target": 278640.0, + "value": 263213.198, + "ratio": 0.9446 + } + }, + "status": "fitted at model year 2025 with the expectation basis of tool version 6: the DfE rows measured at the spring term by the age on 31 December (dfe_spring_term.py, policyengine-uk 2.147.2's date-of-birth school start and working-parent term start), universal take-up nested under working-parent take-up, targeted and universal hours allocated from the gross working-parent hours, and the under-2 usage share scaling the claiming families' children under 2. At a bound: childcare_age_1_usage, universal_childcare.", + "at_bound_reason": "The age-1 usage share stops at its upper bound of 1: even with every 1-year-old of a claiming family using the hours, the frame's working-parent children at DfE age 1 fall short of DfE's January count at the 2-to-4 rate (ratio 0.894). The bound is kept and the residual recorded; the national calibration binds the row." + } }, { "key": "universal_childcare", @@ -346,54 +563,86 @@ "status": "fitted_offline" }, "fitting_receipt": { - "source": "tools/fit_uk_childcare_takeup.py (childcare £100k-limit fixes, licensed lane)", - "tool_version": 5, - "receipt_sha256": "4c9a7b3b4e057e486a3bc8baa52e52b6c917979908026011f812039e55b25a4a", + "source": "tools/fit_uk_childcare_takeup.py (microcosm#1338 round 2, licensed lane)", + "tool_version": 6, + "receipt_sha256": "a8fea77b88e38f13eafbb4204aef97545e2c5d1599d84c4bd311ef6c57d3da00", "seed": 0, - "engine_version": "2.134.4", - "model_period": 2024, - "vintage_overrides": { - "dfe.funded_childcare.working_parent_children_2_to_4": 2025 - }, - "input_h5_sha256": "83c83f044606e915b1d8a85cbbdd16f689b88a82ec690e74dc08848e0759fb58", - "input_spine": "local unsigned spine built at 13307a64e (uk-childcare-100k-fixes on #1329, items 3 and 4 reverted; policyengine-uk 2.134.4, feed abf0921), sha256 83c83f044606e915b1d8a85cbbdd16f689b88a82ec690e74dc08848e0759fb58", + "engine_version": "2.147.2", + "model_period": 2025, + "vintage_overrides": {}, + "input_h5_sha256": "f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412", + "input_spine": "local unsigned spine built at 6aea1ec00 (uk-childcare-100k-fixes-v2 on main 8b0224e06; policyengine-uk 2.147.2, feed abf0921), sha256 f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412; the fit overrides the take-up columns, the only ones the later commits change", "ledger_facts_sha256": "2b64fecfe746164203dac1726aae6ffdb3e5d8e478bd3d64d118ac76cb00780b", - "stochastic_contract_sha256_at_fit": "54c65e6bbc2bd5612b8d4ec3254af78d1ca0d2c9bd5fcaaf05bbf69b75e2bea2", + "stochastic_contract_sha256_at_fit": "6b30ba258e9901d6aa139e4c3df227854e2c1aa1550ae514caeec3dfcfe4c1c1", + "expectation_basis": "dfe_spring_term", + "estimand": "The universal claim rate among benefit units that do not claim working-parent hours (nested), fitted to DfE's universal-only registrations at the spring term.", + "params_at_bound": [ + "extended_childcare_age_1_usage", + "universal_childcare" + ], "optimizer": { "eps": 1e-06, - "loss": 0.03520654649905628, + "loss": 0.02521537026262977, "maxiter": 50, "method": "L-BFGS-B", "success": true }, "achieved": { "dfe.funded_childcare.early_learning_2_year_olds": { - "target": 115852.0, - "value": 115852.118, + "target": 95031.0, + "value": 95030.977, "ratio": 1.0 }, "dfe.funded_childcare.universal_only_children": { - "target": 416537.0, - "value": 431558.609, - "ratio": 1.0361 + "target": 396965.0, + "value": 422796.571, + "ratio": 1.0651 }, "dfe.funded_childcare.working_parent_children_2_to_4": { "target": 621482.0, - "value": 597323.794, - "ratio": 0.9611 + "value": 628071.593, + "ratio": 1.0106 + }, + "dfe.funded_childcare.working_parent_children_9_to_11_months": { + "target": 29155.0, + "value": 29581.118, + "ratio": 1.0146 + }, + "dfe.funded_childcare.working_parent_children_age_1": { + "target": 195104.0, + "value": 174400.612, + "ratio": 0.8939 }, "hmrc.tfc.children_with_used_accounts": { - "target": 1085020.0, - "value": 1204412.311, - "ratio": 1.11 + "target": 1151515.0, + "value": 1224841.088, + "ratio": 1.0637 }, "hmrc.tfc.government_top_up": { - "target": 632200000.0, - "value": 542154568.577, - "ratio": 0.8576 + "target": 599800000.0, + "value": 555970720.952, + "ratio": 0.9269 } }, - "status": "fitted at the 2024 base year with the expectation basis of tool version 5: universal take-up nested under working-parent take-up (its rate is conditional on not claiming extended hours), targeted hours allocated from working-parent hours (pe-uk#2177), reception-age children (current_education PRIMARY) left out of the DfE working-parent and universal-only rows, and the DfE extended-hours anchor (#1126) in the simulation. At a bound: universal_childcare. The conditional universal rate stops at its lower bound of 0 (universal take-up fully nested under working-parent take-up): with reception children out, the nested floor already gives more universal-only children than DfE's January count, because the model's interview-date ages hold more 4-year-olds outside reception than DfE's 31 December ages; per María's U2c ruling the rate keeps its bound and the receipt records the residual, and the national calibration binds the DfE rows." + "diagnostic_rows": { + "dfe.funded_childcare.universal_nursery_children_age_3": { + "target": 565954.0, + "value": 578014.513, + "ratio": 1.0213 + }, + "dfe.funded_childcare.working_parent_children_age_2": { + "target": 242453.0, + "value": 267809.94, + "ratio": 1.1046 + }, + "dfe.funded_childcare.working_parent_children_age_3": { + "target": 278640.0, + "value": 263213.198, + "ratio": 0.9446 + } + }, + "status": "fitted at model year 2025 with the expectation basis of tool version 6: the DfE rows measured at the spring term by the age on 31 December (dfe_spring_term.py, policyengine-uk 2.147.2's date-of-birth school start and working-parent term start), universal take-up nested under working-parent take-up, targeted and universal hours allocated from the gross working-parent hours, and the under-2 usage share scaling the claiming families' children under 2. At a bound: childcare_age_1_usage, universal_childcare.", + "at_bound_reason": "The conditional universal rate stops at its lower bound of 0: universal take-up is nested under the working-parent flag, and the claiming families alone already give more universal-only children at the spring term than DfE's January count (ratio 1.065 at a rate of 0). The bound is kept and the residual recorded; the national calibration binds the row." } }, { @@ -402,7 +651,7 @@ "entity": "benunit", "values": { "2015-01-01": 0.597, - "2024-04-06": 0.8478 + "2024-04-06": 0.6547 }, "source": { "source": "FRS empirical fit", @@ -411,54 +660,85 @@ "status": "fitted_offline" }, "fitting_receipt": { - "source": "tools/fit_uk_childcare_takeup.py (childcare £100k-limit fixes, licensed lane)", - "tool_version": 5, - "receipt_sha256": "4c9a7b3b4e057e486a3bc8baa52e52b6c917979908026011f812039e55b25a4a", + "source": "tools/fit_uk_childcare_takeup.py (microcosm#1338 round 2, licensed lane)", + "tool_version": 6, + "receipt_sha256": "a8fea77b88e38f13eafbb4204aef97545e2c5d1599d84c4bd311ef6c57d3da00", "seed": 0, - "engine_version": "2.134.4", - "model_period": 2024, - "vintage_overrides": { - "dfe.funded_childcare.working_parent_children_2_to_4": 2025 - }, - "input_h5_sha256": "83c83f044606e915b1d8a85cbbdd16f689b88a82ec690e74dc08848e0759fb58", - "input_spine": "local unsigned spine built at 13307a64e (uk-childcare-100k-fixes on #1329, items 3 and 4 reverted; policyengine-uk 2.134.4, feed abf0921), sha256 83c83f044606e915b1d8a85cbbdd16f689b88a82ec690e74dc08848e0759fb58", + "engine_version": "2.147.2", + "model_period": 2025, + "vintage_overrides": {}, + "input_h5_sha256": "f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412", + "input_spine": "local unsigned spine built at 6aea1ec00 (uk-childcare-100k-fixes-v2 on main 8b0224e06; policyengine-uk 2.147.2, feed abf0921), sha256 f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412; the fit overrides the take-up columns, the only ones the later commits change", "ledger_facts_sha256": "2b64fecfe746164203dac1726aae6ffdb3e5d8e478bd3d64d118ac76cb00780b", - "stochastic_contract_sha256_at_fit": "54c65e6bbc2bd5612b8d4ec3254af78d1ca0d2c9bd5fcaaf05bbf69b75e2bea2", + "stochastic_contract_sha256_at_fit": "6b30ba258e9901d6aa139e4c3df227854e2c1aa1550ae514caeec3dfcfe4c1c1", + "expectation_basis": "dfe_spring_term", + "estimand": "The share of qualifying benefit units that claim early learning for 2-year-olds on their own, fitted to DfE's registrations at the spring term.", + "params_at_bound": [ + "extended_childcare_age_1_usage", + "universal_childcare" + ], "optimizer": { "eps": 1e-06, - "loss": 0.03520654649905628, + "loss": 0.02521537026262977, "maxiter": 50, "method": "L-BFGS-B", "success": true }, "achieved": { "dfe.funded_childcare.early_learning_2_year_olds": { - "target": 115852.0, - "value": 115852.118, + "target": 95031.0, + "value": 95030.977, "ratio": 1.0 }, "dfe.funded_childcare.universal_only_children": { - "target": 416537.0, - "value": 431558.609, - "ratio": 1.0361 + "target": 396965.0, + "value": 422796.571, + "ratio": 1.0651 }, "dfe.funded_childcare.working_parent_children_2_to_4": { "target": 621482.0, - "value": 597323.794, - "ratio": 0.9611 + "value": 628071.593, + "ratio": 1.0106 + }, + "dfe.funded_childcare.working_parent_children_9_to_11_months": { + "target": 29155.0, + "value": 29581.118, + "ratio": 1.0146 + }, + "dfe.funded_childcare.working_parent_children_age_1": { + "target": 195104.0, + "value": 174400.612, + "ratio": 0.8939 }, "hmrc.tfc.children_with_used_accounts": { - "target": 1085020.0, - "value": 1204412.311, - "ratio": 1.11 + "target": 1151515.0, + "value": 1224841.088, + "ratio": 1.0637 }, "hmrc.tfc.government_top_up": { - "target": 632200000.0, - "value": 542154568.577, - "ratio": 0.8576 + "target": 599800000.0, + "value": 555970720.952, + "ratio": 0.9269 + } + }, + "diagnostic_rows": { + "dfe.funded_childcare.universal_nursery_children_age_3": { + "target": 565954.0, + "value": 578014.513, + "ratio": 1.0213 + }, + "dfe.funded_childcare.working_parent_children_age_2": { + "target": 242453.0, + "value": 267809.94, + "ratio": 1.1046 + }, + "dfe.funded_childcare.working_parent_children_age_3": { + "target": 278640.0, + "value": 263213.198, + "ratio": 0.9446 } }, - "status": "fitted at the 2024 base year with the expectation basis of tool version 5: universal take-up nested under working-parent take-up (its rate is conditional on not claiming extended hours), targeted hours allocated from working-parent hours (pe-uk#2177), reception-age children (current_education PRIMARY) left out of the DfE working-parent and universal-only rows, and the DfE extended-hours anchor (#1126) in the simulation. At a bound: universal_childcare. The conditional universal rate stops at its lower bound of 0 (universal take-up fully nested under working-parent take-up): with reception children out, the nested floor already gives more universal-only children than DfE's January count, because the model's interview-date ages hold more 4-year-olds outside reception than DfE's 31 December ages; per María's U2c ruling the rate keeps its bound and the receipt records the residual, and the national calibration binds the DfE rows." + "status": "fitted at model year 2025 with the expectation basis of tool version 6: the DfE rows measured at the spring term by the age on 31 December (dfe_spring_term.py, policyengine-uk 2.147.2's date-of-birth school start and working-parent term start), universal take-up nested under working-parent take-up, targeted and universal hours allocated from the gross working-parent hours, and the under-2 usage share scaling the claiming families' children under 2. At a bound: childcare_age_1_usage, universal_childcare." } }, { diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_copy_take_up.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_copy_take_up.py index 03313ce5e..fc5241787 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_copy_take_up.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_copy_take_up.py @@ -166,7 +166,11 @@ def test_natives_keep_their_draws_and_copies_are_redrawn_deterministically() -> after.loc[copies, output].to_numpy(), redrawn[output] ) inherited = before.loc[copies, "would_claim_extended_childcare"].to_numpy() - assert (redrawn["would_claim_extended_childcare"] != inherited).mean() > 0.3 + # Independent draws at rate r disagree with probability 2r(1 - r). + rate = contract.rate("extended_childcare") + assert (redrawn["would_claim_extended_childcare"] != inherited).mean() == ( + pytest.approx(2 * rate * (1 - rate), abs=0.03) + ) extended = after.loc[copies, "would_claim_extended_childcare"].to_numpy() expected = stable_identity_uniforms( after.loc[copies, "benunit_id"].to_numpy(), 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 a6d9073d9..c0122c3cc 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 @@ -46,14 +46,15 @@ def test_uk_contract_loads_and_selects_build_year_rates() -> None: 0.6, 0.55, 0.5, - # The v5 refit (nested universal, reception out) on the childcare-fix spine. - 0.9912, - 0.7594, - # Provisional until the tool-version-6 refit (María, 2026-10-22). - 0.51, - 0.81, + # The tool-version-6 refit: the DfE rows at the spring term, universal + # nested under working parent (at its lower bound), one usage share per + # under-2 age (age 1 at its upper bound). + 0.9697, + 0.8361, + 0.698, + 1.0, 0.0, - 0.8478, + 0.6547, 0.441, 0.2682, 0.97, @@ -138,7 +139,7 @@ def test_year_selection_uses_latest_value_at_or_before_build_year() -> None: assert contract.rate("child_benefit", 2021) == 0.97 assert contract.rate("child_benefit", 2023) == 0.89 - assert contract.rate("tax_free_childcare", 2024) == 0.9912 + assert contract.rate("tax_free_childcare", 2024) == 0.9697 assert contract.rate("tax_free_childcare", 2023) == 0.586 assert contract.rate("tv_licence_evasion_rate", 2024) == 0.1252 assert contract.rate("tax_free_childcare_spend_routed_share", 2017) == 0.359 From f05f6ec9e6c456e3f1cb67d7e1266dbc1042f1b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Fri, 23 Oct 2026 00:43:49 +0100 Subject: [PATCH 21/25] Say that Carer Support Payment now applies its earnings limit policyengine-uk 2.146.1 applies Carer Support Payment's earnings limit (PolicyEngine/policyengine-uk#2473), so the Carer's Allowance take-up stage's reason for leaving Scotland closed (the engine did not apply the limit) no longer holds. The stage still leaves Scotland closed, as before; its text says the engine applies the limit and that opening Scotland is a follow-up (microcosm#1319). The engine test now pins the limit. Co-Authored-By: Claude Opus 5.5 --- .../src/microcosm/build/uk/source_stages.json | 4 ++-- .../src/microcosm/build/uk/spec/sources.yaml | 4 ++-- .../build/uk_runtime/carers_allowance_take_up.py | 15 +++++++++------ .../engine/uk/test_uk_carers_allowance_take_up.py | 11 +++++++---- 4 files changed, 20 insertions(+), 14 deletions(-) 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 09e740821..49d97a937 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json +++ b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json @@ -5576,7 +5576,7 @@ "output": "would_claim_carers_allowance", "draw": "would_claim_carers_allowance", "assignment_unit": "person", - "eligibility": "persons outside Scotland whose care_hours reach policyengine-uk's gov.dwp.carers_allowance.min_hours, who report no Carer's Allowance, and whom is_gainfully_employed_for_carers_allowance holds gainfully employed at the survey year: the carers the earnings limit alone keeps from the allowance. Scotland stays closed, since Carer Support Payment reads the same flag and policyengine-uk does not yet apply its earnings limit", + "eligibility": "persons outside Scotland whose care_hours reach policyengine-uk's gov.dwp.carers_allowance.min_hours, who report no Carer's Allowance, and whom is_gainfully_employed_for_carers_allowance holds gainfully employed at the survey year: the carers the earnings limit alone keeps from the allowance. Scotland stays closed, since Carer Support Payment reads the same flag; policyengine-uk applies its earnings limit from 2.146.1, and opening Scotland is a follow-up (microcosm#1319)", "reported_true_anchor": "carers_allowance_reported > 0", "rate_key": "carers_allowance_newly_entitled", "rate_derivation": "the take-up contract's carers_allowance_newly_entitled rate, drawn flat over the eligible persons; would_claim = reported OR (eligible AND u < rate), so a reporter stays true and every other person false", @@ -5587,7 +5587,7 @@ "rewrites": [ "would_claim_carers_allowance" ], - "notes": "Runs after the SPI income chain, UC capital coherence and the Pension Credit and Child Benefit redraws, before CGT cloning, so every clone carries its source's draw (microcosm#1319). frs_spine sets would_claim_carers_allowance from reported receipt and the SPI income chain re-derives it from the refilled receipt on the rows it redraws, so that care_hours qualifies a carer for the Universal Credit carer element without paying the allowance to every carer (#882). A carer above the earnings limit cannot report the allowance, so no reform that widens it reached a carer who would claim once entitled: the April 2025 rise of the limit from £151 to £196 a week brought an estimated 61,000 more people into eligibility (Independent Review of Carer's Allowance Overpayments, July 2025, chapter 7). One temporary engine materialization at the survey year, on the frame's own values, gives each person's is_gainfully_employed_for_carers_allowance (consumed only); the engine reads a year's parameters at 30 April, so the limit is 2024-25's £151. A person outside Scotland whose care_hours reach the engine's gov.dwp.carers_allowance.min_hours (35), who reports no allowance and whom that test holds gainfully employed claims at the take-up contract's carers_allowance_newly_entitled rate (0.6, María's ruling of 2026-10-20, sensitivity 0.45 to 0.75) on the person's identity-keyed uniform (seed 0, salt would_claim_carers_allowance): would_claim = reported OR (eligible AND u < rate). A reporter stays true; a carer under the limit who reports no allowance stays false, as the survey records them entitled and not claiming. Scotland stays closed, since Carer Support Payment reads the same flag and policyengine-uk does not yet apply its earnings limit. The earnings test is read before salary_sacrifice moves some contributors' pension amounts out of their pay, so a drawn carer whom that conversion takes under the survey year's limit keeps the flag although the file then shows them entitled and not reporting. The stage rebuilds the flag from reported receipt and refuses a frame whose flag no longer follows it. Its receipt bands support on distinct source households (household_source_id), and gives a weighted total only where ten or more carry it and the realised share only where neither side rests on one to nine; the stage has no health gate." + "notes": "Runs after the SPI income chain, UC capital coherence and the Pension Credit and Child Benefit redraws, before CGT cloning, so every clone carries its source's draw (microcosm#1319). frs_spine sets would_claim_carers_allowance from reported receipt and the SPI income chain re-derives it from the refilled receipt on the rows it redraws, so that care_hours qualifies a carer for the Universal Credit carer element without paying the allowance to every carer (#882). A carer above the earnings limit cannot report the allowance, so no reform that widens it reached a carer who would claim once entitled: the April 2025 rise of the limit from £151 to £196 a week brought an estimated 61,000 more people into eligibility (Independent Review of Carer's Allowance Overpayments, July 2025, chapter 7). One temporary engine materialization at the survey year, on the frame's own values, gives each person's is_gainfully_employed_for_carers_allowance (consumed only); the engine reads a year's parameters at 30 April, so the limit is 2024-25's £151. A person outside Scotland whose care_hours reach the engine's gov.dwp.carers_allowance.min_hours (35), who reports no allowance and whom that test holds gainfully employed claims at the take-up contract's carers_allowance_newly_entitled rate (0.6, María's ruling of 2026-10-20, sensitivity 0.45 to 0.75) on the person's identity-keyed uniform (seed 0, salt would_claim_carers_allowance): would_claim = reported OR (eligible AND u < rate). A reporter stays true; a carer under the limit who reports no allowance stays false, as the survey records them entitled and not claiming. Scotland stays closed, since Carer Support Payment reads the same flag; policyengine-uk applies its earnings limit from 2.146.1, and opening Scotland is a follow-up (microcosm#1319). The earnings test is read before salary_sacrifice moves some contributors' pension amounts out of their pay, so a drawn carer whom that conversion takes under the survey year's limit keeps the flag although the file then shows them entitled and not reporting. The stage rebuilds the flag from reported receipt and refuses a frame whose flag no longer follows it. Its receipt bands support on distinct source households (household_source_id), and gives a weighted total only where ten or more carry it and the realised share only where neither side rests on one to nine; the stage has no health gate." }, { "stage": "uc_deduction_attributes", 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 157db7e30..1f3ecc494 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml +++ b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml @@ -4501,7 +4501,7 @@ stages: output: would_claim_carers_allowance draw: would_claim_carers_allowance assignment_unit: person - eligibility: 'persons outside Scotland whose care_hours reach policyengine-uk''s gov.dwp.carers_allowance.min_hours, who report no Carer''s Allowance, and whom is_gainfully_employed_for_carers_allowance holds gainfully employed at the survey year: the carers the earnings limit alone keeps from the allowance. Scotland stays closed, since Carer Support Payment reads the same flag and policyengine-uk does not yet apply its earnings limit' + eligibility: 'persons outside Scotland whose care_hours reach policyengine-uk''s gov.dwp.carers_allowance.min_hours, who report no Carer''s Allowance, and whom is_gainfully_employed_for_carers_allowance holds gainfully employed at the survey year: the carers the earnings limit alone keeps from the allowance. Scotland stays closed, since Carer Support Payment reads the same flag; policyengine-uk applies its earnings limit from 2.146.1, and opening Scotland is a follow-up (microcosm#1319)' reported_true_anchor: carers_allowance_reported > 0 rate_key: carers_allowance_newly_entitled rate_derivation: 'the take-up contract''s carers_allowance_newly_entitled rate, drawn flat over the eligible persons; would_claim = reported OR (eligible AND u < rate), so a reporter stays true and every other person false' @@ -4509,7 +4509,7 @@ stages: outputs: [] rewrites: - would_claim_carers_allowance - notes: 'Runs after the SPI income chain, UC capital coherence and the Pension Credit and Child Benefit redraws, before CGT cloning, so every clone carries its source''s draw (microcosm#1319). frs_spine sets would_claim_carers_allowance from reported receipt and the SPI income chain re-derives it from the refilled receipt on the rows it redraws, so that care_hours qualifies a carer for the Universal Credit carer element without paying the allowance to every carer (#882). A carer above the earnings limit cannot report the allowance, so no reform that widens it reached a carer who would claim once entitled: the April 2025 rise of the limit from £151 to £196 a week brought an estimated 61,000 more people into eligibility (Independent Review of Carer''s Allowance Overpayments, July 2025, chapter 7). One temporary engine materialization at the survey year, on the frame''s own values, gives each person''s is_gainfully_employed_for_carers_allowance (consumed only); the engine reads a year''s parameters at 30 April, so the limit is 2024-25''s £151. A person outside Scotland whose care_hours reach the engine''s gov.dwp.carers_allowance.min_hours (35), who reports no allowance and whom that test holds gainfully employed claims at the take-up contract''s carers_allowance_newly_entitled rate (0.6, María''s ruling of 2026-10-20, sensitivity 0.45 to 0.75) on the person''s identity-keyed uniform (seed 0, salt would_claim_carers_allowance): would_claim = reported OR (eligible AND u < rate). A reporter stays true; a carer under the limit who reports no allowance stays false, as the survey records them entitled and not claiming. Scotland stays closed, since Carer Support Payment reads the same flag and policyengine-uk does not yet apply its earnings limit. The earnings test is read before salary_sacrifice moves some contributors'' pension amounts out of their pay, so a drawn carer whom that conversion takes under the survey year''s limit keeps the flag although the file then shows them entitled and not reporting. The stage rebuilds the flag from reported receipt and refuses a frame whose flag no longer follows it. Its receipt bands support on distinct source households (household_source_id), and gives a weighted total only where ten or more carry it and the realised share only where neither side rests on one to nine; the stage has no health gate.' + notes: 'Runs after the SPI income chain, UC capital coherence and the Pension Credit and Child Benefit redraws, before CGT cloning, so every clone carries its source''s draw (microcosm#1319). frs_spine sets would_claim_carers_allowance from reported receipt and the SPI income chain re-derives it from the refilled receipt on the rows it redraws, so that care_hours qualifies a carer for the Universal Credit carer element without paying the allowance to every carer (#882). A carer above the earnings limit cannot report the allowance, so no reform that widens it reached a carer who would claim once entitled: the April 2025 rise of the limit from £151 to £196 a week brought an estimated 61,000 more people into eligibility (Independent Review of Carer''s Allowance Overpayments, July 2025, chapter 7). One temporary engine materialization at the survey year, on the frame''s own values, gives each person''s is_gainfully_employed_for_carers_allowance (consumed only); the engine reads a year''s parameters at 30 April, so the limit is 2024-25''s £151. A person outside Scotland whose care_hours reach the engine''s gov.dwp.carers_allowance.min_hours (35), who reports no allowance and whom that test holds gainfully employed claims at the take-up contract''s carers_allowance_newly_entitled rate (0.6, María''s ruling of 2026-10-20, sensitivity 0.45 to 0.75) on the person''s identity-keyed uniform (seed 0, salt would_claim_carers_allowance): would_claim = reported OR (eligible AND u < rate). A reporter stays true; a carer under the limit who reports no allowance stays false, as the survey records them entitled and not claiming. Scotland stays closed, since Carer Support Payment reads the same flag; policyengine-uk applies its earnings limit from 2.146.1, and opening Scotland is a follow-up (microcosm#1319). The earnings test is read before salary_sacrifice moves some contributors'' pension amounts out of their pay, so a drawn carer whom that conversion takes under the survey year''s limit keeps the flag although the file then shows them entitled and not reporting. The stage rebuilds the flag from reported receipt and refuses a frame whose flag no longer follows it. Its receipt bands support on distinct source households (household_source_id), and gives a weighted total only where ten or more carry it and the realised share only where neither side rests on one to nine; the stage has no health gate.' - 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. diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/carers_allowance_take_up.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/carers_allowance_take_up.py index 55edf50b6..78546b053 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/carers_allowance_take_up.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/carers_allowance_take_up.py @@ -23,9 +23,11 @@ A reporter stays true. A carer under the limit who reports no allowance stays false, as the survey records them entitled and not claiming. Scotland -is left closed: Carer Support Payment reads the same flag, and in law it has -the allowance's earnings limit, but policyengine-uk does not yet apply that -limit, so a draw there would pay it to carers over the limit. The incoming flag +is left closed: Carer Support Payment reads the same flag, and until +policyengine-uk 2.146.1 the engine did not apply its earnings limit, so a draw +there would have paid it to carers over the limit. The engine applies the limit +now (PolicyEngine/policyengine-uk#2473); opening Scotland is a follow-up +(microcosm#1319). The incoming flag must still follow reported receipt, since the stage rebuilds it from that anchor. @@ -100,8 +102,8 @@ CARERS_ALLOWANCE_YEAR_RULE = "survey_year" CARERS_ALLOWANCE_NEWLY_ENTITLED_RATE_KEY = "carers_allowance_newly_entitled" #: Carer Support Payment replaces the allowance in Scotland and reads the same -#: flag; policyengine-uk does not yet apply its earnings limit, so Scotland is -#: never drawn. +#: flag; policyengine-uk applies its earnings limit from 2.146.1, and until a +#: follow-up opens it (microcosm#1319) Scotland is never drawn. CARERS_ALLOWANCE_CLOSED_REGION = "SCOTLAND" CARERS_ALLOWANCE_PARAMETERS = "gov.dwp.carers_allowance" CARERS_ALLOWANCE_REPORTED_ANCHOR = "carers_allowance_reported > 0" @@ -111,7 +113,8 @@ "whom is_gainfully_employed_for_carers_allowance holds gainfully employed at " "the survey year: the carers the earnings limit alone keeps from the " "allowance. Scotland stays closed, since Carer Support Payment reads the same " - "flag and policyengine-uk does not yet apply its earnings limit" + "flag; policyengine-uk applies its earnings limit from 2.146.1, and opening " + "Scotland is a follow-up (microcosm#1319)" ) CARERS_ALLOWANCE_RATE_DERIVATION = ( "the take-up contract's carers_allowance_newly_entitled rate, drawn flat over " diff --git a/packages/microcosm-build/tests/engine/uk/test_uk_carers_allowance_take_up.py b/packages/microcosm-build/tests/engine/uk/test_uk_carers_allowance_take_up.py index ed3a65eff..03cbc7619 100644 --- a/packages/microcosm-build/tests/engine/uk/test_uk_carers_allowance_take_up.py +++ b/packages/microcosm-build/tests/engine/uk/test_uk_carers_allowance_take_up.py @@ -112,7 +112,7 @@ def test_the_earnings_limit_is_the_only_bar_left_for_a_non_reporting_carer() -> assert (entitled_2025[weekly_pay > 196.0] == 0).all() -def test_scotland_stays_closed_because_carer_support_payment_has_no_earnings_test() -> ( +def test_scotland_stays_closed_though_carer_support_payment_now_tests_earnings() -> ( None ): simulation = _simulation(_carers([400.0]), 2025, region="SCOTLAND") @@ -121,15 +121,18 @@ def test_scotland_stays_closed_because_carer_support_payment_has_no_earnings_tes country = simulation.calculate("country", 2025, decode_enums=True) assert [str(value) for value in country] == ["SCOTLAND"] assert np.asarray(simulation.calculate(_TEST, 2025)).all() - # Gainfully employed, yet paid Carer Support Payment once the flag is - # true: a draw in Scotland would pay it. + # From policyengine-uk 2.146.1 Carer Support Payment applies the earnings + # limit (PolicyEngine/policyengine-uk#2473): a gainfully employed carer is + # paid neither benefit with the flag true. Scotland stays closed until a + # follow-up opens it (microcosm#1319). assert ( np.asarray(simulation.calculate("carer_support_payment_pre_overlap", 2025))[0] - > 0 + == 0 ) assert ( np.asarray(simulation.calculate("carers_allowance_pre_overlap", 2025))[0] == 0 ) + assert "applies its earnings limit from 2.146.1" in ca.CARERS_ALLOWANCE_ELIGIBILITY class _CertainContract: From 148d04559bb73babb107341358715d23300836d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Fri, 23 Oct 2026 01:05:53 +0100 Subject: [PATCH 22/25] Declare the under-2 usage draws on the synthetic FRS spine's take-up stage The spine driver tests build a synthetic frs_take_up stage; it now declares the two per-age max_free_entitlement_hours_used operations the stage requires, and the person table is checked for the column. Co-Authored-By: Claude Opus 5.5 --- .../tests/engine_free/uk/test_uk_frs_spine.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) 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 b97faa4bb..42de08b89 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 @@ -814,6 +814,16 @@ def source_stage( "output": "maximum_extended_childcare_hours_usage", "seed": 0, }, + *( + { + "kind": "assign_binary_from_rate", + "output": "max_free_entitlement_hours_used", + "rate_key": f"extended_childcare_age_{age}_usage", + "assignment_unit": "person", + "seed": 0, + } + for age in (0, 1) + ), ], outputs=( "would_claim_child_benefit", @@ -826,8 +836,12 @@ def source_stage( "would_claim_targeted_childcare", "would_claim_uc_childcare", "maximum_extended_childcare_hours_usage", + "max_free_entitlement_hours_used", + ), + nonnegative_outputs=( + "maximum_extended_childcare_hours_usage", + "max_free_entitlement_hours_used", ), - nonnegative_outputs=("maximum_extended_childcare_hours_usage",), ), source_stage( "frs_person_draws", @@ -2283,6 +2297,7 @@ def test_driver_writes_spine_h5_sidecars_and_logbook( "would_claim_marriage_allowance", "would_claim_scp", "attends_private_school_random_draw", + "max_free_entitlement_hours_used", } <= set(frame.table("person")) assert { "household_owns_tv", From 94273927dad1129cde3eb6a2036feaf975a9d074 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Fri, 23 Oct 2026 01:05:53 +0100 Subject: [PATCH 23/25] Regenerate the UK compile-parity receipts, coverage manifest and spine fixture (pin pass) Co-Authored-By: Claude Opus 5.5 --- ...ity_incumbent_2025_signed_differences.json | 118 +++++++++++++++- .../uk/release_input_coverage_manifest.json | 44 +++--- .../sources/cgt_asset_type_facts.json | 48 +++---- .../parity/uk_spine/sources/fixture.json | 126 ++++++++++++++++-- .../fixtures/parity/uk_spine/uk_spine.json | 2 +- 5 files changed, 280 insertions(+), 58 deletions(-) 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 097726560..7242857ec 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": 1322, + "compiled_count": 1338, "counts_by_kind": { "calibration_drift": 561, "fixture_only": 46, - "ledger_only": 731 + "ledger_only": 747 }, - "difference_count": 1338, + "difference_count": 1354, "differences": [ { "fixture_value": 1608000.0, @@ -357,6 +357,13 @@ "period": 2025, "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." }, + { + "kind": "ledger_only", + "ledger_value": 565954.0, + "name": "dfe.funded_childcare.universal_nursery_children_age_3", + "period": 2025, + "reason": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): one of the five DfE funded-childcare counts by single age from the January 2025 census, England (working parent registrations at 9 to 11 months and at ages 1, 2 and 3, and universal nursery registrations at age 3), bound beside the working parent 2 to 4, early learning and universal-only rows and, with them, measured at the spring term by the age on 31 December (María's ruling of 2026-10-22). The age-4 cells are signed out, as the bound rows fix them. The incumbent binds no DfE row, so this row has no fixture counterpart." + }, { "kind": "ledger_only", "ledger_value": 396965.0, @@ -371,6 +378,34 @@ "period": 2025, "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." }, + { + "kind": "ledger_only", + "ledger_value": 29155.0, + "name": "dfe.funded_childcare.working_parent_children_9_to_11_months", + "period": 2025, + "reason": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): one of the five DfE funded-childcare counts by single age from the January 2025 census, England (working parent registrations at 9 to 11 months and at ages 1, 2 and 3, and universal nursery registrations at age 3), bound beside the working parent 2 to 4, early learning and universal-only rows and, with them, measured at the spring term by the age on 31 December (María's ruling of 2026-10-22). The age-4 cells are signed out, as the bound rows fix them. The incumbent binds no DfE row, so this row has no fixture counterpart." + }, + { + "kind": "ledger_only", + "ledger_value": 195104.0, + "name": "dfe.funded_childcare.working_parent_children_age_1", + "period": 2025, + "reason": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): one of the five DfE funded-childcare counts by single age from the January 2025 census, England (working parent registrations at 9 to 11 months and at ages 1, 2 and 3, and universal nursery registrations at age 3), bound beside the working parent 2 to 4, early learning and universal-only rows and, with them, measured at the spring term by the age on 31 December (María's ruling of 2026-10-22). The age-4 cells are signed out, as the bound rows fix them. The incumbent binds no DfE row, so this row has no fixture counterpart." + }, + { + "kind": "ledger_only", + "ledger_value": 242453.0, + "name": "dfe.funded_childcare.working_parent_children_age_2", + "period": 2025, + "reason": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): one of the five DfE funded-childcare counts by single age from the January 2025 census, England (working parent registrations at 9 to 11 months and at ages 1, 2 and 3, and universal nursery registrations at age 3), bound beside the working parent 2 to 4, early learning and universal-only rows and, with them, measured at the spring term by the age on 31 December (María's ruling of 2026-10-22). The age-4 cells are signed out, as the bound rows fix them. The incumbent binds no DfE row, so this row has no fixture counterpart." + }, + { + "kind": "ledger_only", + "ledger_value": 278640.0, + "name": "dfe.funded_childcare.working_parent_children_age_3", + "period": 2025, + "reason": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (microcosm#1278, #1095): one of the five DfE funded-childcare counts by single age from the January 2025 census, England (working parent registrations at 9 to 11 months and at ages 1, 2 and 3, and universal nursery registrations at age 3), bound beside the working parent 2 to 4, early learning and universal-only rows and, with them, measured at the spring term by the age on 31 December (María's ruling of 2026-10-22). The age-4 cells are signed out, as the bound rows fix them. The incumbent binds no DfE row, so this row has no fixture counterpart." + }, { "kind": "ledger_only", "ledger_value": 152500000.0, @@ -5348,6 +5383,83 @@ "period": 2025, "reason": "microcosm#1278 (the pre-Budget PR's plan, approved by María on 2026-10-20; microcosm#1095): one of the three all-persons rows for ages 0, 1 and 2, bound so the fit holds the single years inside the 0_4 sex bands, which stay bound beside them. The incumbent binds only the five-year bands, so this row has no fixture counterpart." }, + { + "kind": "ledger_only", + "ledger_value": 735292.0, + "name": "ons.population.age_3", + "period": 2025, + "reason": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): one of the eleven all-persons rows that extend the single years of age, the UK's ages 3 to 6 and England's ages 0 to 6, bound so the fit holds the single years inside the 0_4 and 5_9 sex bands and the region 0_9 cells, which stay bound beside them. The incumbent binds only the bands, so this row has no fixture counterpart." + }, + { + "kind": "ledger_only", + "ledger_value": 723859.0, + "name": "ons.population.age_4", + "period": 2025, + "reason": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): one of the eleven all-persons rows that extend the single years of age, the UK's ages 3 to 6 and England's ages 0 to 6, bound so the fit holds the single years inside the 0_4 and 5_9 sex bands and the region 0_9 cells, which stay bound beside them. The incumbent binds only the bands, so this row has no fixture counterpart." + }, + { + "kind": "ledger_only", + "ledger_value": 745129.0, + "name": "ons.population.age_5", + "period": 2025, + "reason": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): one of the eleven all-persons rows that extend the single years of age, the UK's ages 3 to 6 and England's ages 0 to 6, bound so the fit holds the single years inside the 0_4 and 5_9 sex bands and the region 0_9 cells, which stay bound beside them. The incumbent binds only the bands, so this row has no fixture counterpart." + }, + { + "kind": "ledger_only", + "ledger_value": 760014.0, + "name": "ons.population.age_6", + "period": 2025, + "reason": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): one of the eleven all-persons rows that extend the single years of age, the UK's ages 3 to 6 and England's ages 0 to 6, bound so the fit holds the single years inside the 0_4 and 5_9 sex bands and the region 0_9 cells, which stay bound beside them. The incumbent binds only the bands, so this row has no fixture counterpart." + }, + { + "kind": "ledger_only", + "ledger_value": 566856.0, + "name": "ons.population.england_age_0", + "period": 2025, + "reason": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): one of the eleven all-persons rows that extend the single years of age, the UK's ages 3 to 6 and England's ages 0 to 6, bound so the fit holds the single years inside the 0_4 and 5_9 sex bands and the region 0_9 cells, which stay bound beside them. The incumbent binds only the bands, so this row has no fixture counterpart." + }, + { + "kind": "ledger_only", + "ledger_value": 583995.0, + "name": "ons.population.england_age_1", + "period": 2025, + "reason": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): one of the eleven all-persons rows that extend the single years of age, the UK's ages 3 to 6 and England's ages 0 to 6, bound so the fit holds the single years inside the 0_4 and 5_9 sex bands and the region 0_9 cells, which stay bound beside them. The incumbent binds only the bands, so this row has no fixture counterpart." + }, + { + "kind": "ledger_only", + "ledger_value": 598812.0, + "name": "ons.population.england_age_2", + "period": 2025, + "reason": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): one of the eleven all-persons rows that extend the single years of age, the UK's ages 3 to 6 and England's ages 0 to 6, bound so the fit holds the single years inside the 0_4 and 5_9 sex bands and the region 0_9 cells, which stay bound beside them. The incumbent binds only the bands, so this row has no fixture counterpart." + }, + { + "kind": "ledger_only", + "ledger_value": 632519.0, + "name": "ons.population.england_age_3", + "period": 2025, + "reason": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): one of the eleven all-persons rows that extend the single years of age, the UK's ages 3 to 6 and England's ages 0 to 6, bound so the fit holds the single years inside the 0_4 and 5_9 sex bands and the region 0_9 cells, which stay bound beside them. The incumbent binds only the bands, so this row has no fixture counterpart." + }, + { + "kind": "ledger_only", + "ledger_value": 621735.0, + "name": "ons.population.england_age_4", + "period": 2025, + "reason": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): one of the eleven all-persons rows that extend the single years of age, the UK's ages 3 to 6 and England's ages 0 to 6, bound so the fit holds the single years inside the 0_4 and 5_9 sex bands and the region 0_9 cells, which stay bound beside them. The incumbent binds only the bands, so this row has no fixture counterpart." + }, + { + "kind": "ledger_only", + "ledger_value": 639573.0, + "name": "ons.population.england_age_5", + "period": 2025, + "reason": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): one of the eleven all-persons rows that extend the single years of age, the UK's ages 3 to 6 and England's ages 0 to 6, bound so the fit holds the single years inside the 0_4 and 5_9 sex bands and the region 0_9 cells, which stay bound beside them. The incumbent binds only the bands, so this row has no fixture counterpart." + }, + { + "kind": "ledger_only", + "ledger_value": 649939.0, + "name": "ons.population.england_age_6", + "period": 2025, + "reason": "Requested by María on 2026-10-21 for the £100k childcare costing fixes (item 6; microcosm#1278, #1095): one of the eleven all-persons rows that extend the single years of age, the UK's ages 3 to 6 and England's ages 0 to 6, bound so the fit holds the single years inside the 0_4 and 5_9 sex bands and the region 0_9 cells, which stay bound beside them. The incumbent binds only the bands, so this row has no fixture counterpart." + }, { "kind": "ledger_only", "ledger_value": 408119.0, 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 63f70ee3d..d1fd3f972 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 @@ -470,7 +470,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": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", + "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", "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" @@ -493,7 +493,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", + "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", "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" @@ -516,7 +516,7 @@ "required_mass_change_reason": "Capital-gains residential split divides every household carrying liable gainers into arms weighted by the solved residential probabilities, one arm per subset of residential gainers; every household's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", + "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", "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) on the amounts the Table 3 redraw placed" @@ -538,7 +538,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": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", + "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", "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)" @@ -567,7 +567,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": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", + "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", "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" @@ -587,7 +587,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": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", + "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", "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" @@ -609,7 +609,7 @@ "required_mass_change_reason": "High-value home support divides every owner household in the top value stratum of its region 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": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", + "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", "source_vintages": { "source": "Microcosm structural operator (microcosm#1240 fix 1); no publisher input", "survey": "Family Resources Survey 2024-25 and SPI synthetic support, after the WAS wealth draw and the regional property uprating" @@ -630,7 +630,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": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", + "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", "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" @@ -654,7 +654,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", + "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", "source_vintages": { "conditioning_resource": "hmrc_cgt_conditioning_facts.json", "conditioning_resource_sha256": "054b1ee1a66cae6ed3793053eb0d3b9eea6b3f8976953479948ae11f7eedcd35", @@ -743,7 +743,7 @@ "full_frs_tei_band_unavailable" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", + "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", "source_vintages": { "hmrc_surface": "2023-24", "mapped_build_period": "2024", @@ -785,7 +785,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": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", + "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", "source_vintages": { "source": "UK Data Service SN 9603 Living Costs and Food Survey 2024-25 (2nd edition) household/person tabs and the vendored Chronicle facts for NEED 2024 mean kWh, DESNZ Energy Trends and QEP average prices paid for calendar 2024, road-fuel outturn (DESNZ, HMRC, ONS Consumer Trends) and road fuel by vehicle type (DESNZ), ONS Consumer Trends household spending by COICOP division, the DfT VEH1103 licensed-car stock, NTS bus use, and the DfT and devolved bus finance tables and fares indices.", "survey": "Living Costs and Food Survey 2024-25" @@ -811,7 +811,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": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", + "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", "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" @@ -831,7 +831,7 @@ "required_mass_change_reason": "Private-school attendance stored on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", + "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", "source_vintages": { "source": "policyengine-uk attends_private_school (the gov.simulation.private_school_vat attendance rates and factor), evaluated by the pinned engine", "survey": "policyengine-uk private-school attendance imputation, stored at the spine's weights" @@ -854,7 +854,7 @@ "property_finance_costs" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", + "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", "source_vintages": { "source": "https://www.gov.uk/government/statistics/property-rental-income-statistics", "survey": "Survey of Personal Incomes Public Use Tape 2022-23 and HMRC Property Rental Income Statistics 2026 (tax year 2024-25)" @@ -875,7 +875,7 @@ "required_mass_change_reason": "Annual property purchases imputed on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", + "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", "source_vintages": { "source": "https://www.gov.uk/government/statistics/uk-stamp-tax-statistics", "survey": "HMRC Annual Stamp Tax Statistics 2024 to 2025 (corrected 11 March 2026), Tables 6b, 8a and 8b" @@ -898,7 +898,7 @@ "property_wealth" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", + "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", "source_vintages": { "source": "uk/high_value_home_value_knots.json, built by tools/build_uk_high_value_home_stock.py from PolicyEngine/chronicle#343's registrations", "survey": "HM Land Registry Price Paid latest sales uprated with the UK House Price Index, owner-weighted by region (the dense value node's knots, region level)" @@ -922,7 +922,7 @@ "non_residential_property_value" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", + "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", "source_vintages": { "source": "MHCLG dwellings and the UK House Price Index regional average price averaged over the twelve months of calendar 2024 from the July 2026 full file, the frame's valuation basis, so the engine's annual uprating from 2024 projects the value once (microcosm#1240 fix 5).", "survey": "Public regional property reference" @@ -949,7 +949,7 @@ "employment_income" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", + "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", "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" @@ -982,7 +982,7 @@ "household_source_id" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", + "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", "source_vintages": { "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).", "survey": "Survey of Personal Incomes Public Use Tape 2022-23 and HMRC Income Tax liabilities statistics July 2026 Table 2.5" @@ -1004,7 +1004,7 @@ "student_loan_plan" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", + "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", "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" @@ -1026,7 +1026,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": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", + "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", "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" @@ -1061,7 +1061,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": "6bee385b771553dfea313a566da7dbaacdf1e48596a249db249ef6eb4d730b78", + "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", "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-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 6ec576e48..adb11cb62 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": 6509588.154029989, + "table4_all_gains": 6543361.536228343, "table4_all_tax": 0.0, - "table4_all_taxpayers": 15.64584768489452, + "table4_all_taxpayers": 15.645847684894521, "table4_bands": [ { - "gains": 6044.921017395652, + "gains": 6262.397159008047, "lower_bound": 0, "tax": null, - "taxpayers": 1.3781098872785849, + "taxpayers": 1.4320098873007394, "upper_bound": 10000 }, { - "gains": 24922.967696084444, + "gains": 24822.654876166478, "lower_bound": 10000, "tax": null, - "taxpayers": 1.5208346263072319, + "taxpayers": 1.5147322556160423, "upper_bound": 25000 }, { - "gains": 79282.68292974937, + "gains": 79283.34035328866, "lower_bound": 25000, "tax": null, - "taxpayers": 2.1786247372384744, + "taxpayers": 2.178624737238577, "upper_bound": 50000 }, { - "gains": 137743.4527659259, + "gains": 132688.53820392478, "lower_bound": 50000, "tax": null, - "taxpayers": 1.97394515547429, + "taxpayers": 1.901735026156099, "upper_bound": 100000 }, { - "gains": 151515.32471723968, + "gains": 146476.1345210153, "lower_bound": 100000, "tax": null, - "taxpayers": 0.9626944897911075, + "taxpayers": 0.9308528178709959, "upper_bound": 250000 }, { - "gains": 648737.6777786638, + "gains": 661905.7509932889, "lower_bound": 250000, "tax": null, - "taxpayers": 1.8012777557759854, + "taxpayers": 1.8388639901748962, "upper_bound": 500000 }, { - "gains": 840435.5717438484, + "gains": 812463.3906394695, "lower_bound": 500000, "tax": null, - "taxpayers": 1.2094554776477642, + "taxpayers": 1.1695696410549907, "upper_bound": 1000000 }, { - "gains": 4620905.555381081, + "gains": 4679459.329482181, "lower_bound": 1000000, "tax": null, - "taxpayers": 4.620905555381081, + "taxpayers": 4.679459329482181, "upper_bound": null } ], - "table4_individuals_gains": 6509588.154029989, + "table4_individuals_gains": 6543361.536228343, "table4_individuals_tax": 0.0, - "table4_individuals_taxpayers": 15.64584768489452, + "table4_individuals_taxpayers": 15.645847684894521, "table4_trusts_gains": 0.0, "table4_trusts_tax": 0.0, "table7_total_disposals": 2743095.2380952383, @@ -115,11 +115,11 @@ } ], "table8a_disposals_total": 29.50359849151538, - "table8a_gains_total": 36565227.645255364, - "table8a_tax_total": 7313045.529051073, + "table8a_gains_total": 36979426.86475159, + "table8a_tax_total": 7395885.372950319, "table8a_taxpayers_total": 26.82145317410489, - "table8b_all_gains": 36565227.645255364, + "table8b_all_gains": 36979426.86475159, "table8b_all_taxpayers": 26.82145317410489, - "table8b_individuals_gains": 36565227.645255364, + "table8b_individuals_gains": 36979426.86475159, "table8b_individuals_taxpayers": 26.82145317410489 } 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 f86286e49..7b53cb65b 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 @@ -98,7 +98,7 @@ "artifacts": [], "grain": "person", "nonnegative_outputs": [], - "notes": "Runs after the SPI income chain, UC capital coherence and the Pension Credit and Child Benefit redraws, before CGT cloning, so every clone carries its source's draw (microcosm#1319). frs_spine sets would_claim_carers_allowance from reported receipt and the SPI income chain re-derives it from the refilled receipt on the rows it redraws, so that care_hours qualifies a carer for the Universal Credit carer element without paying the allowance to every carer (#882). A carer above the earnings limit cannot report the allowance, so no reform that widens it reached a carer who would claim once entitled: the April 2025 rise of the limit from \u00a3151 to \u00a3196 a week brought an estimated 61,000 more people into eligibility (Independent Review of Carer's Allowance Overpayments, July 2025, chapter 7). One temporary engine materialization at the survey year, on the frame's own values, gives each person's is_gainfully_employed_for_carers_allowance (consumed only); the engine reads a year's parameters at 30 April, so the limit is 2024-25's \u00a3151. A person outside Scotland whose care_hours reach the engine's gov.dwp.carers_allowance.min_hours (35), who reports no allowance and whom that test holds gainfully employed claims at the take-up contract's carers_allowance_newly_entitled rate (0.6, Mar\u00eda's ruling of 2026-10-20, sensitivity 0.45 to 0.75) on the person's identity-keyed uniform (seed 0, salt would_claim_carers_allowance): would_claim = reported OR (eligible AND u < rate). A reporter stays true; a carer under the limit who reports no allowance stays false, as the survey records them entitled and not claiming. Scotland stays closed, since Carer Support Payment reads the same flag and policyengine-uk does not yet apply its earnings limit. The earnings test is read before salary_sacrifice moves some contributors' pension amounts out of their pay, so a drawn carer whom that conversion takes under the survey year's limit keeps the flag although the file then shows them entitled and not reporting. The stage rebuilds the flag from reported receipt and refuses a frame whose flag no longer follows it. Its receipt bands support on distinct source households (household_source_id), and gives a weighted total only where ten or more carry it and the realised share only where neither side rests on one to nine; the stage has no health gate.", + "notes": "Runs after the SPI income chain, UC capital coherence and the Pension Credit and Child Benefit redraws, before CGT cloning, so every clone carries its source's draw (microcosm#1319). frs_spine sets would_claim_carers_allowance from reported receipt and the SPI income chain re-derives it from the refilled receipt on the rows it redraws, so that care_hours qualifies a carer for the Universal Credit carer element without paying the allowance to every carer (#882). A carer above the earnings limit cannot report the allowance, so no reform that widens it reached a carer who would claim once entitled: the April 2025 rise of the limit from \u00a3151 to \u00a3196 a week brought an estimated 61,000 more people into eligibility (Independent Review of Carer's Allowance Overpayments, July 2025, chapter 7). One temporary engine materialization at the survey year, on the frame's own values, gives each person's is_gainfully_employed_for_carers_allowance (consumed only); the engine reads a year's parameters at 30 April, so the limit is 2024-25's \u00a3151. A person outside Scotland whose care_hours reach the engine's gov.dwp.carers_allowance.min_hours (35), who reports no allowance and whom that test holds gainfully employed claims at the take-up contract's carers_allowance_newly_entitled rate (0.6, Mar\u00eda's ruling of 2026-10-20, sensitivity 0.45 to 0.75) on the person's identity-keyed uniform (seed 0, salt would_claim_carers_allowance): would_claim = reported OR (eligible AND u < rate). A reporter stays true; a carer under the limit who reports no allowance stays false, as the survey records them entitled and not claiming. Scotland stays closed, since Carer Support Payment reads the same flag; policyengine-uk applies its earnings limit from 2.146.1, and opening Scotland is a follow-up (microcosm#1319). The earnings test is read before salary_sacrifice moves some contributors' pension amounts out of their pay, so a drawn carer whom that conversion takes under the survey year's limit keeps the flag although the file then shows them entitled and not reporting. The stage rebuilds the flag from reported receipt and refuses a frame whose flag no longer follows it. Its receipt bands support on distinct source households (household_source_id), and gives a weighted total only where ten or more carry it and the realised share only where neither side rests on one to nine; the stage has no health gate.", "operations": [ { "consumed_only": true, @@ -111,7 +111,7 @@ { "assignment_unit": "person", "draw": "would_claim_carers_allowance", - "eligibility": "persons outside Scotland whose care_hours reach policyengine-uk's gov.dwp.carers_allowance.min_hours, who report no Carer's Allowance, and whom is_gainfully_employed_for_carers_allowance holds gainfully employed at the survey year: the carers the earnings limit alone keeps from the allowance. Scotland stays closed, since Carer Support Payment reads the same flag and policyengine-uk does not yet apply its earnings limit", + "eligibility": "persons outside Scotland whose care_hours reach policyengine-uk's gov.dwp.carers_allowance.min_hours, who report no Carer's Allowance, and whom is_gainfully_employed_for_carers_allowance holds gainfully employed at the survey year: the carers the earnings limit alone keeps from the allowance. Scotland stays closed, since Carer Support Payment reads the same flag; policyengine-uk applies its earnings limit from 2.146.1, and opening Scotland is a follow-up (microcosm#1319)", "kind": "assign_binary_from_rate", "output": "would_claim_carers_allowance", "rate_derivation": "the take-up contract's carers_allowance_newly_entitled rate, drawn flat over the eligible persons; would_claim = reported OR (eligible AND u < rate), so a reporter stays true and every other person false", @@ -288,7 +288,7 @@ "cgt_residential_split": { "artifacts": [ { - "dependency": "policyengine-uk>=2.145.0 via microcosm-build[uk]", + "dependency": "policyengine-uk>=2.147.2 via microcosm-build[uk]", "dependency_discipline": "deferred inside uk_cgt_policy_parameters; the base package never imports policyengine-uk at import time", "instant_rule": "raw dated parameter files evaluated at 1 June of the build period's tax year", "kind": "versioned_parameter_tree", @@ -532,6 +532,92 @@ "stage": "child_benefit_take_up", "survey": "Family Resources Survey 2024-25" }, + "childcare_copy_take_up": { + "artifacts": [], + "grain": "benunit", + "nonnegative_outputs": [], + "notes": "Runs after the last copy stage and before private_school_attendance, whose net-income ranking counts the childcare entitlements and Tax-Free Childcare. frs_take_up draws the childcare flags and the extended-hours usage on FRS benefit units before any copy exists, so every SPI support copy, income-band donor, high-value home support copy, CGT support copy, CGT incidence clone and residential arm inherited its host's draws, and a cell with few hosts fixed the take-up of all their copies. This stage re-draws would_claim_tfc, would_claim_extended_childcare, would_claim_universal_childcare (nested under the extended flag) and would_claim_targeted_childcare at the contract rates, and maximum_extended_childcare_hours_usage from the contract's clipped normal, for the copies only, with frs_take_up's own helper, seed 0 and output-name salts, keyed on the copy's own benunit_id. A copy's structural id is its source id plus a multiple of an offset above every id in the frame, so it is unique, differs from every native id and gives the copy streams independent of its host's; a rebuild of the same frame draws the same values. Native benefit units keep their frs_take_up draws. The anchored Child Benefit, Pension Credit and Universal Credit flags and would_claim_uc_childcare are left as they are. It also re-draws the copies' children's max_free_entitlement_hours_used, the under-2 usage, against their own unit's re-drawn working-parent flag, keyed on their own person_id.", + "operations": [ + { + "assignment_unit": "benunit_id", + "draw": "would_claim_tfc", + "eligibility": "copy benefit units only, a unit whose household has a non-empty clone path (SPI support channel or income-band donor, CGT support split, high-value home support, CGT incidence clone, residential arm) or whose benunit_support_clone_index is positive; native units keep their frs_take_up draw", + "kind": "assign_binary_from_rate", + "output": "would_claim_tfc", + "rate_key": "tax_free_childcare", + "seed": 0 + }, + { + "assignment_unit": "benunit_id", + "draw": "would_claim_extended_childcare", + "eligibility": "copy benefit units only, a unit whose household has a non-empty clone path (SPI support channel or income-band donor, CGT support split, high-value home support, CGT incidence clone, residential arm) or whose benunit_support_clone_index is positive; native units keep their frs_take_up draw", + "kind": "assign_binary_from_rate", + "output": "would_claim_extended_childcare", + "rate_key": "extended_childcare", + "seed": 0 + }, + { + "assignment_unit": "benunit_id", + "draw": "would_claim_universal_childcare", + "eligibility": "copy benefit units only, a unit whose household has a non-empty clone path (SPI support channel or income-band donor, CGT support split, high-value home support, CGT incidence clone, residential arm) or whose benunit_support_clone_index is positive; native units keep their frs_take_up draw", + "kind": "assign_binary_from_rate", + "nested_under": "would_claim_extended_childcare", + "output": "would_claim_universal_childcare", + "rate_derivation": "the contract's universal_childcare rate is the rate among benefit units not claiming the extended hours; would_claim_universal_childcare = would_claim_extended_childcare OR u < rate, as in frs_take_up", + "rate_key": "universal_childcare", + "seed": 0 + }, + { + "assignment_unit": "benunit_id", + "draw": "would_claim_targeted_childcare", + "eligibility": "copy benefit units only, a unit whose household has a non-empty clone path (SPI support channel or income-band donor, CGT support split, high-value home support, CGT incidence clone, residential arm) or whose benunit_support_clone_index is positive; native units keep their frs_take_up draw", + "kind": "assign_binary_from_rate", + "output": "would_claim_targeted_childcare", + "rate_key": "targeted_childcare", + "seed": 0 + }, + { + "distribution_key": "maximum_extended_childcare_hours_usage", + "draw": "maximum_extended_childcare_hours_usage", + "eligibility": "copy benefit units only, a unit whose household has a non-empty clone path (SPI support channel or income-band donor, CGT support split, high-value home support, CGT incidence clone, residential arm) or whose benunit_support_clone_index is positive; native units keep their frs_take_up draw", + "kind": "assign_clipped_normal", + "output": "maximum_extended_childcare_hours_usage", + "seed": 0 + }, + { + "assignment_unit": "person", + "draw": "max_free_entitlement_hours_used", + "eligibility": "children of whole-year age 0 in copy benefit units that claim the working-parent hours, against the copy's re-drawn would_claim_extended_childcare; native persons keep their frs_take_up draws", + "kind": "assign_binary_from_rate", + "output": "max_free_entitlement_hours_used", + "rate_derivation": "as in frs_take_up, keyed on the copy's own person_id", + "rate_key": "extended_childcare_age_0_usage", + "seed": 0 + }, + { + "assignment_unit": "person", + "draw": "max_free_entitlement_hours_used", + "eligibility": "children of whole-year age 1 in copy benefit units that claim the working-parent hours, against the copy's re-drawn would_claim_extended_childcare; native persons keep their frs_take_up draws", + "kind": "assign_binary_from_rate", + "output": "max_free_entitlement_hours_used", + "rate_derivation": "as in frs_take_up, keyed on the copy's own person_id", + "rate_key": "extended_childcare_age_1_usage", + "seed": 0 + } + ], + "outputs": [], + "rewrites": [ + "would_claim_tfc", + "would_claim_extended_childcare", + "would_claim_universal_childcare", + "would_claim_targeted_childcare", + "maximum_extended_childcare_hours_usage", + "max_free_entitlement_hours_used" + ], + "source": "The UK take-up contract's childcare rates and extended-hours usage distribution, as frs_take_up draws them, applied to the support and CGT copies on their own benefit units.", + "stage": "childcare_copy_take_up", + "survey": "Family Resources Survey 2024-25" + }, "etb_services": { "artifacts": [ { @@ -2255,9 +2341,10 @@ "artifacts": [], "grain": "benunit", "nonnegative_outputs": [ - "maximum_extended_childcare_hours_usage" + "maximum_extended_childcare_hours_usage", + "max_free_entitlement_hours_used" ], - "notes": "Identity-keyed seed 0 streams replace the incumbent sequential take-up seed 100; salts are output variable names. Reported positive receipt anchors are transient and consumed only. The Universal Credit draw's population is the benefit units with a UC claimant or partner (is_uc_claimant) aged 18 or over and under Pension Credit qualifying age (66 for everyone who can reach it in this release), the age and role conditions of policyengine-uk 2.145.0's is_uc_eligible; the engine lockstep test pins it and names the three engine cases not mirrored (16- and 17-year-old claimants under the UC Regs 2013 reg 8 exceptions, mixed-age couples on the Pension Credit route, and from 2.128.0 pension-age families moved onto Universal Credit when their legacy benefit closes, SI 2014/1230 reg 60A). So the contract rate is a share of those units, an anchor outside them stays true, and any other unit is never drawn; a unit with no claimant or partner of that age keeps its reported Housing Benefit, which a claim it cannot make no longer zeroes (#882, microcosm#867, microcosm#1095).", + "notes": "Identity-keyed seed 0 streams replace the incumbent sequential take-up seed 100; salts are output variable names. Reported positive receipt anchors are transient and consumed only. The Universal Credit draw's population is the benefit units with a UC claimant or partner (is_uc_claimant) aged 18 or over and under Pension Credit qualifying age (66 for everyone who can reach it in this release), the age and role conditions of policyengine-uk 2.147.2's is_uc_eligible; the engine lockstep test pins it and names the three engine cases not mirrored (16- and 17-year-old claimants under the UC Regs 2013 reg 8 exceptions, mixed-age couples on the Pension Credit route, and from 2.128.0 pension-age families moved onto Universal Credit when their legacy benefit closes, SI 2014/1230 reg 60A). So the contract rate is a share of those units, an anchor outside them stays true, and any other unit is never drawn; a unit with no claimant or partner of that age keeps its reported Housing Benefit, which a claim it cannot make no longer zeroes (#882, microcosm#867, microcosm#1095). The universal childcare flag is nested under the working-parent one. A unit that claims the extended hours claims the universal hours, and any other unit claims them at the contract's universal_childcare rate, the rate conditional on not claiming the extended hours; the extended draw is unchanged. childcare_copy_take_up later re-draws the childcare flags and hours of the support and CGT copies on their own benefit units. A child of whole-year age 0 or 1 in a unit that claims the working-parent hours uses them at its age's contract rate, extended_childcare_age_0_usage or extended_childcare_age_1_usage (DfE registers far fewer of the youngest eligible children than of those aged 2 to 4, and fewer at 9 to 11 months than at age 1); a child that does not gets max_free_entitlement_hours_used 0, so the engine funds it no hours, and every other person keeps the engine's default of 30.", "operations": [ { "aggregates": { @@ -2327,7 +2414,9 @@ { "draw": "would_claim_universal_childcare", "kind": "assign_binary_from_rate", + "nested_under": "would_claim_extended_childcare", "output": "would_claim_universal_childcare", + "rate_derivation": "the contract's universal_childcare rate is the rate among benefit units not claiming the extended hours; would_claim_universal_childcare = would_claim_extended_childcare OR u < rate, so every unit claiming the extended hours claims the universal hours", "rate_key": "universal_childcare", "seed": 0 }, @@ -2360,6 +2449,26 @@ "kind": "assign_clipped_normal", "output": "maximum_extended_childcare_hours_usage", "seed": 0 + }, + { + "assignment_unit": "person", + "draw": "max_free_entitlement_hours_used", + "eligibility": "persons of whole-year age 0 in benefit units that claim the working-parent hours (would_claim_extended_childcare)", + "kind": "assign_binary_from_rate", + "output": "max_free_entitlement_hours_used", + "rate_derivation": "a child of whole-year age 0 in a claiming unit uses the working-parent hours where u < its age's rate and gets max_free_entitlement_hours_used 0 otherwise; every other person keeps the engine's default of 30; one draw per person serves both ages' operations", + "rate_key": "extended_childcare_age_0_usage", + "seed": 0 + }, + { + "assignment_unit": "person", + "draw": "max_free_entitlement_hours_used", + "eligibility": "persons of whole-year age 1 in benefit units that claim the working-parent hours (would_claim_extended_childcare)", + "kind": "assign_binary_from_rate", + "output": "max_free_entitlement_hours_used", + "rate_derivation": "a child of whole-year age 1 in a claiming unit uses the working-parent hours where u < its age's rate and gets max_free_entitlement_hours_used 0 otherwise; every other person keeps the engine's default of 30; one draw per person serves both ages' operations", + "rate_key": "extended_childcare_age_1_usage", + "seed": 0 } ], "outputs": [ @@ -2372,7 +2481,8 @@ "would_claim_universal_childcare", "would_claim_targeted_childcare", "would_claim_uc_childcare", - "maximum_extended_childcare_hours_usage" + "maximum_extended_childcare_hours_usage", + "max_free_entitlement_hours_used" ], "rewrites": [], "source": "Family Resources Survey 2024-25 reported receipt anchors plus sourced UK take-up contract rates.", @@ -2415,7 +2525,7 @@ "hmrc_cgt_asset_type_spine": { "artifacts": [ { - "dependency": "policyengine-uk>=2.145.0 via microcosm-build[uk]", + "dependency": "policyengine-uk>=2.147.2 via microcosm-build[uk]", "dependency_discipline": "deferred inside uk_cgt_policy_parameters and uk_cgt_badr_parameters; the base package never imports policyengine-uk at import time", "instant_rule": "raw dated parameter files evaluated at 1 June of the build period's tax year", "kind": "versioned_parameter_tree", @@ -5768,7 +5878,7 @@ "artifacts": [], "grain": "benunit", "nonnegative_outputs": [], - "notes": "Runs after the last universal_credit_reported writer and before CGT cloning. Redraws every SPI benefit unit's capital, since the channel's incomes are SPI draws and the copied FRS answer no longer belongs to the unit (uk-data#495, microcosm#1095), from weighted base-FRS units with available capital in cells of UC reporter status by financial investment income band (interest, dividends and other investment income; property income is excluded because TOTCAPB4 counts accounts and assets) by is_uc_couple (two retained FRS claimant/partner roles, independently of legal is_married) by dependent-children band. A cell with fewer than 20 donors widens in the declared coarsening order, and reporter status is never coarsened. It then applies the monotone reported-UC OR refresh. The recorded capitals add property (uk-data#495, microcosm#1095), since policyengine-uk 2.145.0 replaces every capital source with a recorded figure of 0 or more and takes it as countable, and TOTCAPB4 has no property. WAS records the property for the household, and each means test counts the claimant's and partner's own capital (UC Regs 2013 reg 18; SPCA 2002 s.5). The household reference person's benefit unit therefore holds all of the household's property, and no other unit records any (Mar\u00eda's ruling of 2026-10-12), since that person is the one in whose name the home is owned or rented, the best single reading of the owner. The engine shares household property over every claimant or partner instead, which puts a parent's property on an adult child's claim; a recorded figure consumes its own unit's share, so the engine's shares reach only a unit on the unavailable sentinel, and since policyengine-uk 2.136.1 such a unit takes its share whatever a recording unit beside it holds (the receipt counts any unit left there). The property counts at 90% of its value, market value less 10% for the costs of sale (UC Regs 2013 reg 49; SPC Regs 2002 reg 19); debt secured on it is not on the frame and is not netted (pe-uk#1969). Universal Credit counts other residential and non-residential property, and Pension Credit counts those and owned land. A unit that reports Universal Credit keeps its receipt and records the carrier alone for Universal Credit, since DWP assessed its capital to pay it and the property is imputed without that receipt. frs_benunit_capital stays the financial carrier, and its unavailable sentinel -1 passes through to both. Both recorded figures project to later years by GDP per head, as financial capital does, while policyengine-uk 2.139.1 projects other residential property by house prices, so the other residential property in a recorded figure grows faster than the engine's own projection of it; by the OBR indices the engine carries, it grows 1.5% faster by 2025 and 2.0% by 2026 from a 2024 base.", + "notes": "Runs after the last universal_credit_reported writer and before CGT cloning. Redraws every SPI benefit unit's capital, since the channel's incomes are SPI draws and the copied FRS answer no longer belongs to the unit (uk-data#495, microcosm#1095), from weighted base-FRS units with available capital in cells of UC reporter status by financial investment income band (interest, dividends and other investment income; property income is excluded because TOTCAPB4 counts accounts and assets) by is_uc_couple (two retained FRS claimant/partner roles, independently of legal is_married) by dependent-children band. A cell with fewer than 20 donors widens in the declared coarsening order, and reporter status is never coarsened. It then applies the monotone reported-UC OR refresh. The recorded capitals add property (uk-data#495, microcosm#1095), since policyengine-uk 2.147.2 replaces every capital source with a recorded figure of 0 or more and takes it as countable, and TOTCAPB4 has no property. WAS records the property for the household, and each means test counts the claimant's and partner's own capital (UC Regs 2013 reg 18; SPCA 2002 s.5). The household reference person's benefit unit therefore holds all of the household's property, and no other unit records any (Mar\u00eda's ruling of 2026-10-12), since that person is the one in whose name the home is owned or rented, the best single reading of the owner. The engine shares household property over every claimant or partner instead, which puts a parent's property on an adult child's claim; a recorded figure consumes its own unit's share, so the engine's shares reach only a unit on the unavailable sentinel, and since policyengine-uk 2.136.1 such a unit takes its share whatever a recording unit beside it holds (the receipt counts any unit left there). The property counts at 90% of its value, market value less 10% for the costs of sale (UC Regs 2013 reg 49; SPC Regs 2002 reg 19); debt secured on it is not on the frame and is not netted (pe-uk#1969). Universal Credit counts other residential and non-residential property, and Pension Credit counts those and owned land. A unit that reports Universal Credit keeps its receipt and records the carrier alone for Universal Credit, since DWP assessed its capital to pay it and the property is imputed without that receipt. frs_benunit_capital stays the financial carrier, and its unavailable sentinel -1 passes through to both. Both recorded figures project to later years by GDP per head, as financial capital does, while policyengine-uk 2.139.1 projects other residential property by house prices, so the other residential property in a recorded figure grows faster than the engine's own projection of it; by the OBR indices the engine carries, it grows 1.5% faster by 2025 and 2.0% by 2026 from a 2024 base.", "operations": [ { "aggregates": { 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 8fdddd886..028a88d6b 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":"months_since_last_birthday","dtype":"float64","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_blind","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_uc_claimant","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_claimant_or_partner","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_hbai_dependent_child","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"uc_is_in_gainful_self_employment","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"rent_paid_as_boarder","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"rent_paid_as_lodger","dtype":"float64","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":"trading_loss","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"loss_relief","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ni_class_4_losses_brought_forward","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":"stands_as_sole_owner_or_partner_of_company","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_engaged_in_owned_company_trade","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"owned_company_is_main_employment","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"owned_company_carries_on_trade","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"owned_company_carries_on_property_business","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"owned_company_income_share","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"reports_rent_from_other_property","dtype":"bool","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":"statutory_paternity_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":"esa_includes_support_component","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"war_widows_pension_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":"liable_for_share_of_household_rent","dtype":"bool","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.145.0"],["policyengine-core","3.33.3"],["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":"d55388f70ca6ef871c31c5db68c274d848e6351a7c3faf8782a7df3922958c3d","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","liable_for_share_of_household_rent"],"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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_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":"months_since_last_birthday","dtype":"float64","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_blind","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":"is_claimant_or_partner","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_hbai_dependent_child","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_gainful_self_employment","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent_paid_as_boarder","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent_paid_as_lodger","dtype":"float64","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":"trading_loss","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"loss_relief","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ni_class_4_losses_brought_forward","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":"stands_as_sole_owner_or_partner_of_company","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_engaged_in_owned_company_trade","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_is_main_employment","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_carries_on_trade","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_carries_on_property_business","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_income_share","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"reports_rent_from_other_property","dtype":"bool","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":"statutory_paternity_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":"esa_includes_support_component","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"war_widows_pension_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":"liable_for_share_of_household_rent","dtype":"bool","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","liable_for_share_of_household_rent"],"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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_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.145.0"],["policyengine-core","3.33.3"],["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":"is_looked_after_by_local_authority","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_household_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.145.0"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_relationships","stage_contract_sha256":"85aca92dcc0590c2147cfc7e0886664f26cd8e1bc0b1de728d11fa567e9fd8b4","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.145.0"],["policyengine-core","3.33.3"],["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.145.0"],["policyengine-core","3.33.3"],["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":"f7465970190c74095a0f31fa7463bd28f5ca9b9e254b25a956246e642c8b7351","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.145.0"],["policyengine-core","3.33.3"],["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"},{"column":"reports_outstanding_student_loan","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"age_left_full_time_education","dtype":"int64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.145.0"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_education","stage_contract_sha256":"7ec718c35f8ab04c7dba62f5b5090161e1abace5d1c3bd313f05b0e584b7dcde","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","liable_for_share_of_household_rent"],"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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education"],"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.145.0"],["policyengine-core","3.33.3"],["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","liable_for_share_of_household_rent"],"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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","liable_for_share_of_household_rent"],"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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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.145.0"],["policyengine-core","3.33.3"],["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","is_uc_claimant","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.145.0"],["policyengine-core","3.33.3"],["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":"78b4ba120f353c529052389942945c6a3bd6a67e0e43085a3da81dce6101cb8c","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.145.0"],["policyengine-core","3.33.3"],["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":"e36cb854cc8961c0e67de880b771abc1e7b31cb83dacf922a733d9ecd8f4b427","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.145.0"],["policyengine-core","3.33.3"],["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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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.145.0"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_brma","stage_contract_sha256":"4285376b37299d375ed583b7f6b1747bd8b7cb1c8c0d19a36481156b5314a854","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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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.145.0"],["policyengine-core","3.33.3"],["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":"b7eb5ecf39ae82822a02d49cdc8edc00bedd77e091de1d98d38a8c180146b2c0","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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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.145.0"],["policyengine-core","3.33.3"],["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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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":"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","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.145.0"],["policyengine-core","3.33.3"],["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":"d86ab4a1f53cf097f42c9c047e7a3fbb5144dc88496b49cb846b3f8be0bbe0a1","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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","rent_paid_as_boarder","rent_paid_as_lodger","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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":"property_finance_costs","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":"war_widows_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":"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":"trading_loss","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"loss_relief","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ni_class_4_losses_brought_forward","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_income_share","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"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_gainful_self_employment","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_includes_support_component","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"reports_rent_from_other_property","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"stands_as_sole_owner_or_partner_of_company","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_engaged_in_owned_company_trade","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_is_main_employment","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_carries_on_trade","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_carries_on_property_business","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"person_is_spi_income_recipient","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.145.0"],["policyengine-core","3.33.3"],["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":"e1edc3e33b4c26b2b8ad29bf28498a44217670910f59dae58bac477a9ddff3a8","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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient"],"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","person_is_spi_income_recipient","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported"],"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.145.0"],["policyengine-core","3.33.3"],["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":"524549b7dfbd0fceb505311eb0c3b923cfe3b11a8acd5ecfbfbcbb477e142eb1","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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient"],"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.145.0"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"was_wealth","stage_contract_sha256":"9941b70870b0ced1ea1f51e9c9f12768005ea6c53ffdba1db3cb4e2ee030af87","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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","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.145.0"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"was_lisa","stage_contract_sha256":"46f12fdf9228f721d860ff7858b78b25406bb8737628acf63ac17d44d549f657","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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","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"},{"column":"owned_land","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"other_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"non_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.145.0"],["policyengine-core","3.33.3"],["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":"f45db95fde3f93731c0925b9bf8c12021921df2e4908770acdec1e3c97889277","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":"regional_property_uprating.boundary","citation":"","description":"Run structural UK stage high_value_home_support.","id":"high_value_home_support","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.high_value_home_support@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_high_value_support_copy","bool"],["household","high_value_support_copies","int64"],["household","high_value_support_copy_index","int64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.145.0"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"high_value_home_support","stage_contract_sha256":"174f4b38228d98107bee1639d1a297a2748bb618e87c7bd0a6c869c6ab06f8fa","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by high_value_home_support.","id":"high_value_home_support.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_high_value_support_copy","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"high_value_support_copies","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"high_value_support_copy_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_high_value_support_copy","household.high_value_support_copies","household.high_value_support_copy_index"]},"population":"high_value_home_support","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 regional_home_values.","id":"regional_home_values","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["high_value_support_copy_index","household_is_high_value_support_copy","household_source_id","region","tenure_type"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.regional_home_values@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"},{"column":"main_residence_value_rank_basis","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.145.0"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"regional_home_values","stage_contract_sha256":"48e8a622c8830a54a4c48d9d8cb4f011751aa05d7cb5f6c7f0e06e1121b720b1","time_period":"2024"},"population":"high_value_home_support","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 property_components.","id":"property_components","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["main_residence_value_rank_basis","non_residential_property_value","other_residential_property_value","region","subrent"],"entity":"household","rows":"all"},{"columns":["age","is_household_head","person_is_spi_income_recipient","person_support_channel"],"entity":"person","rows":"all"}],"kernel":"uk.stage.property_components@1","mass":"conserve","outputs":[{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_finance_costs","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_rental_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.145.0"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"property_components","stage_contract_sha256":"8c45b96e6c1cd6a3ec8080b674f06666b1bd1e86ecef4a654c18f9825977eb1b","time_period":"2024"},"population":"high_value_home_support","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 property_purchases.","id":"property_purchases","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["household_source_id","non_residential_property_value","other_residential_property_value","region"],"entity":"household","rows":"all"},{"columns":["age","property_rental_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.property_purchases@1","mass":"conserve","outputs":[{"column":"additional_residential_property_purchased","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"non_residential_property_purchased","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.145.0"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"property_purchases","stage_contract_sha256":"281fe34ea94f71ac1a0652bf3ec17922f0d46919bfb74ab7b367ba6e9d680826","time_period":"2024"},"population":"high_value_home_support","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","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income"],"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.145.0"],["policyengine-core","3.33.3"],["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":"ef04589ebb01746b996c466517b07cb718cf88febe8c2d6d69f6edf6b4b80f8b","time_period":"2024"},"population":"high_value_home_support","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","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","household_local_bus_trips"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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"},{"column":"uses_energy_prepayment_meter","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.145.0"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"lcfs_consumption","stage_contract_sha256":"a10aeec0491876f0906782a34e197bb52162f045678ca3c19769feabe14b09c6","time_period":"2024"},"population":"high_value_home_support","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","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.145.0"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"etb_vat","stage_contract_sha256":"01adfcc85d77f38fb9cc896e2e4b4c4752518d9e2aa69e6947832678c25ecf19","time_period":"2024"},"population":"high_value_home_support","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","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.145.0"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"etb_services","stage_contract_sha256":"85c52b57b06db2075b6422e8202b90eb70ebe60a3345e59cf48a4a0460f583e4","time_period":"2024"},"population":"high_value_home_support","sources":["frs"],"structural":"none","weights":null},{"base":"high_value_home_support","citation":"","description":"Ownership boundary before uc_reporter_redraw rewrites.","id":"uc_reporter_redraw.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.145.0"],["policyengine-core","3.33.3"],["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":"93b86a8b8bbb49caebab64381c716da2d78eb7cd43d0bf1ee9edbf3a07b64539","time_period":"2024"},"population":"uc_reporter_redraw.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_reporter_redraw.boundary","citation":"","description":"Ownership boundary before spi_benefit_coherence rewrites.","id":"spi_benefit_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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 spi_benefit_coherence.","id":"spi_benefit_coherence","inputs":[{"columns":["benunit_support_channel","frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["aa_category","age","attendance_allowance_reported","dla_m_category","dla_m_reported","dla_sc_category","dla_sc_reported","esa_contrib_reported","incapacity_benefit_reported","is_uc_claimant","person_source_id","person_support_channel","pip_dl_category","pip_dl_reported","pip_m_category","pip_m_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.spi_benefit_coherence@1","mass":"conserve","outputs":[{"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_income_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":"sda_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":"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":"war_widows_pension_reported","dtype":"float64","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":"receives_benefits_in_own_right","dtype":"bool","entity":"person","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.145.0"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_benefit_coherence","stage_contract_sha256":"c3ac21a6be06f16b6c20eb5b828e2335a7e3f63d1d5ba60505562c3e7d6a8f2d","time_period":"2024"},"population":"spi_benefit_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"spi_benefit_coherence.boundary","citation":"","description":"Ownership boundary before uc_capital_coherence rewrites.","id":"uc_capital_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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":["non_residential_property_value","other_residential_property_value","owned_land","region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","is_benunit_head","is_household_head","is_parent","other_investment_income","person_support_channel","savings_interest_income","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":"pension_credit_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.145.0"],["policyengine-core","3.33.3"],["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":"40440a087f84967c734a1204f1dedcc2432556c7ce2a41f3c38bc9055f324bfa","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_legacy_closure_take_up.","id":"uc_legacy_closure_take_up","inputs":[{"columns":["frs_benunit_capital","would_claim_uc"],"entity":"benunit","rows":"all"},{"columns":["household_source_id","region"],"entity":"household","rows":"all"},{"columns":["age","child_tax_credit_reported","esa_income_reported","housing_benefit_reported","income_support_reported","jsa_income_reported","universal_credit_reported","working_tax_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_legacy_closure_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_uc_at_legacy_closure","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.145.0"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_legacy_closure_take_up","stage_contract_sha256":"759eba9869bb39f43d0a881de8630c132751ecb9467d97e6558899cb390f38b2","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","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure"],"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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure"],"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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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"},{"column":"has_mixed_age_couple_pension_credit_saving","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.145.0"],["policyengine-core","3.33.3"],["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":"e887dbbb186cb79f6d3fc9a629269dbac4a43381b9574df65353b816f01a3a35","time_period":"2024"},"population":"pension_credit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"pension_credit_take_up.boundary","citation":"","description":"Ownership boundary before child_benefit_take_up rewrites.","id":"child_benefit_take_up.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving"],"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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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 child_benefit_take_up.","id":"child_benefit_take_up","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving"],"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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.child_benefit_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_child_benefit","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_opts_out","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.145.0"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"child_benefit_take_up","stage_contract_sha256":"6f1eac2609e868894a287254aac75ec57c0199783c6ae6cf4782f3fbb99f6e92","time_period":"2024"},"population":"child_benefit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"child_benefit_take_up.boundary","citation":"","description":"Ownership boundary before carers_allowance_take_up rewrites.","id":"carers_allowance_take_up.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving"],"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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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 carers_allowance_take_up.","id":"carers_allowance_take_up","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving"],"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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.carers_allowance_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.145.0"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"carers_allowance_take_up","stage_contract_sha256":"4dfdae3d83023d05754e668a81a6a85a674c88e56116f765431c525a47ce954f","time_period":"2024"},"population":"carers_allowance_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"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","would_claim_carers_allowance"],"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.145.0"],["policyengine-core","3.33.3"],["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":"carers_allowance_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"carers_allowance_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","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.145.0"],["policyengine-core","3.33.3"],["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":"f7ef8492bacde1607f24693d7362110ba55ad3d083688f3df61de40dbe65bdc0","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","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.145.0"],["policyengine-core","3.33.3"],["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","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.145.0"],["policyengine-core","3.33.3"],["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":"39011749dc0e95362e4ab606f09e95d457fdf3b40c66df9511d93dbb8208805d","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","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.145.0"],["policyengine-core","3.33.3"],["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":"cgt_incidence_anchor","citation":"","description":"Run structural UK stage cgt_residential_split.","id":"cgt_residential_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.stage.expand.cgt_residential_split@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_cgt_residential_clone","bool"],["household","cgt_residential_clone_index","int64"],["person","cgt_residential_probability","float64"],["person","capital_gains_residential_property","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.145.0"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_residential_split","stage_contract_sha256":"f08b5df5cc05ce9cc993b5804d43b11464de1e537dd4afd351a0b51c5a3bf657","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_residential_split.","id":"cgt_residential_split.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_cgt_residential_clone","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_residential_clone_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_residential_probability","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"capital_gains_residential_property","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_cgt_residential_clone","household.cgt_residential_clone_index","person.cgt_residential_probability","person.capital_gains_residential_property"]},"population":"cgt_residential_split","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_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","capital_gains_residential_property","dividend_income","property_income","reports_rent_from_other_property","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_badr","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.145.0"],["policyengine-core","3.33.3"],["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":"d7c86f73d91f5ced4a7a3b1474ef12a80648c9ba6b116eac2627ed82aaf3781c","time_period":"2024"},"population":"cgt_residential_split","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 salary_sacrifice.","id":"salary_sacrifice","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","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","household_is_cgt_residential_clone","cgt_residential_clone_index"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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","cgt_residential_probability","capital_gains_residential_property","capital_gains_asset_type","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"},{"column":"salary_sacrifice_pre_conversion_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.145.0"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"salary_sacrifice","stage_contract_sha256":"a64ac17ecb296b12171a1c5f3eb0b4dcaac9f32d08cffb95d7b87d094aeec693","time_period":"2024"},"population":"cgt_residential_split","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","age_left_full_time_education","current_education","highest_education","reports_outstanding_student_loan","salary_sacrifice_pre_conversion_pay","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.145.0"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"student_loans","stage_contract_sha256":"157d9ee607633e4246ed06eeee3aac3cdff98118e72400e18b84c11b3fd2b92b","time_period":"2024"},"population":"cgt_residential_split","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 private_school_attendance.","id":"private_school_attendance","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","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","household_is_cgt_residential_clone","cgt_residential_clone_index"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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","cgt_residential_probability","capital_gains_residential_property","capital_gains_asset_type","capital_gains_badr","salary_sacrifice_pre_conversion_pay","student_loan_plan"],"entity":"person","rows":"all"}],"kernel":"uk.stage.private_school_attendance@1","mass":"conserve","outputs":[{"column":"attends_private_school","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.145.0"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"private_school_attendance","stage_contract_sha256":"7e44379c0331fe4c9de05cd76a075c1a6aa22cf0dec6cd2f91b277e70f14a038","time_period":"2024"},"population":"cgt_residential_split","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":"months_since_last_birthday","dtype":"float64","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_blind","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_uc_claimant","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_claimant_or_partner","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_hbai_dependent_child","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"uc_is_in_gainful_self_employment","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"rent_paid_as_boarder","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"rent_paid_as_lodger","dtype":"float64","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":"trading_loss","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"loss_relief","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ni_class_4_losses_brought_forward","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":"stands_as_sole_owner_or_partner_of_company","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_engaged_in_owned_company_trade","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"owned_company_is_main_employment","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"owned_company_carries_on_trade","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"owned_company_carries_on_property_business","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"owned_company_income_share","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"reports_rent_from_other_property","dtype":"bool","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":"statutory_paternity_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":"esa_includes_support_component","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"war_widows_pension_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":"liable_for_share_of_household_rent","dtype":"bool","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.147.2"],["policyengine-core","3.33.3"],["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":"d55388f70ca6ef871c31c5db68c274d848e6351a7c3faf8782a7df3922958c3d","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","liable_for_share_of_household_rent"],"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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_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":"months_since_last_birthday","dtype":"float64","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_blind","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":"is_claimant_or_partner","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_hbai_dependent_child","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_gainful_self_employment","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent_paid_as_boarder","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent_paid_as_lodger","dtype":"float64","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":"trading_loss","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"loss_relief","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ni_class_4_losses_brought_forward","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":"stands_as_sole_owner_or_partner_of_company","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_engaged_in_owned_company_trade","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_is_main_employment","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_carries_on_trade","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_carries_on_property_business","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_income_share","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"reports_rent_from_other_property","dtype":"bool","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":"statutory_paternity_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":"esa_includes_support_component","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"war_widows_pension_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":"liable_for_share_of_household_rent","dtype":"bool","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","liable_for_share_of_household_rent"],"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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_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.147.2"],["policyengine-core","3.33.3"],["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":"is_looked_after_by_local_authority","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_household_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_relationships","stage_contract_sha256":"85aca92dcc0590c2147cfc7e0886664f26cd8e1bc0b1de728d11fa567e9fd8b4","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.147.2"],["policyengine-core","3.33.3"],["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.147.2"],["policyengine-core","3.33.3"],["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":"f7465970190c74095a0f31fa7463bd28f5ca9b9e254b25a956246e642c8b7351","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.147.2"],["policyengine-core","3.33.3"],["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"},{"column":"reports_outstanding_student_loan","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"age_left_full_time_education","dtype":"int64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_education","stage_contract_sha256":"7ec718c35f8ab04c7dba62f5b5090161e1abace5d1c3bd313f05b0e584b7dcde","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","liable_for_share_of_household_rent"],"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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education"],"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.147.2"],["policyengine-core","3.33.3"],["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","liable_for_share_of_household_rent"],"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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","liable_for_share_of_household_rent"],"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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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.147.2"],["policyengine-core","3.33.3"],["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","is_uc_claimant","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"},{"column":"max_free_entitlement_hours_used","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["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":"716a0c7fd7452f0a7c5fdd71b6104619b145e1cd1d5045278f72645be4757f91","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"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","max_free_entitlement_hours_used"],"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.147.2"],["policyengine-core","3.33.3"],["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":"122e6055bbb039de79bea512d6e4639283d9899c571be5e9fce4956637efedcc","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.147.2"],["policyengine-core","3.33.3"],["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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_brma","stage_contract_sha256":"4285376b37299d375ed583b7f6b1747bd8b7cb1c8c0d19a36481156b5314a854","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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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.147.2"],["policyengine-core","3.33.3"],["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":"b7eb5ecf39ae82822a02d49cdc8edc00bedd77e091de1d98d38a8c180146b2c0","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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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.147.2"],["policyengine-core","3.33.3"],["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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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":"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","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.147.2"],["policyengine-core","3.33.3"],["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":"d86ab4a1f53cf097f42c9c047e7a3fbb5144dc88496b49cb846b3f8be0bbe0a1","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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","rent_paid_as_boarder","rent_paid_as_lodger","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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":"property_finance_costs","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":"war_widows_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":"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":"trading_loss","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"loss_relief","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ni_class_4_losses_brought_forward","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_income_share","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"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_gainful_self_employment","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_includes_support_component","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"reports_rent_from_other_property","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"stands_as_sole_owner_or_partner_of_company","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_engaged_in_owned_company_trade","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_is_main_employment","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_carries_on_trade","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_carries_on_property_business","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"person_is_spi_income_recipient","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["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":"e1edc3e33b4c26b2b8ad29bf28498a44217670910f59dae58bac477a9ddff3a8","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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient"],"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","person_is_spi_income_recipient","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported"],"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.147.2"],["policyengine-core","3.33.3"],["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":"524549b7dfbd0fceb505311eb0c3b923cfe3b11a8acd5ecfbfbcbb477e142eb1","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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient"],"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.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"was_wealth","stage_contract_sha256":"9941b70870b0ced1ea1f51e9c9f12768005ea6c53ffdba1db3cb4e2ee030af87","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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","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.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"was_lisa","stage_contract_sha256":"46f12fdf9228f721d860ff7858b78b25406bb8737628acf63ac17d44d549f657","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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","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"},{"column":"owned_land","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"other_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"non_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["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":"f45db95fde3f93731c0925b9bf8c12021921df2e4908770acdec1e3c97889277","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":"regional_property_uprating.boundary","citation":"","description":"Run structural UK stage high_value_home_support.","id":"high_value_home_support","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.high_value_home_support@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_high_value_support_copy","bool"],["household","high_value_support_copies","int64"],["household","high_value_support_copy_index","int64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"high_value_home_support","stage_contract_sha256":"174f4b38228d98107bee1639d1a297a2748bb618e87c7bd0a6c869c6ab06f8fa","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by high_value_home_support.","id":"high_value_home_support.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_high_value_support_copy","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"high_value_support_copies","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"high_value_support_copy_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_high_value_support_copy","household.high_value_support_copies","household.high_value_support_copy_index"]},"population":"high_value_home_support","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 regional_home_values.","id":"regional_home_values","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["high_value_support_copy_index","household_is_high_value_support_copy","household_source_id","region","tenure_type"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.regional_home_values@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"},{"column":"main_residence_value_rank_basis","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"regional_home_values","stage_contract_sha256":"48e8a622c8830a54a4c48d9d8cb4f011751aa05d7cb5f6c7f0e06e1121b720b1","time_period":"2024"},"population":"high_value_home_support","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 property_components.","id":"property_components","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["main_residence_value_rank_basis","non_residential_property_value","other_residential_property_value","region","subrent"],"entity":"household","rows":"all"},{"columns":["age","is_household_head","person_is_spi_income_recipient","person_support_channel"],"entity":"person","rows":"all"}],"kernel":"uk.stage.property_components@1","mass":"conserve","outputs":[{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_finance_costs","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_rental_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"property_components","stage_contract_sha256":"8c45b96e6c1cd6a3ec8080b674f06666b1bd1e86ecef4a654c18f9825977eb1b","time_period":"2024"},"population":"high_value_home_support","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 property_purchases.","id":"property_purchases","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["household_source_id","non_residential_property_value","other_residential_property_value","region"],"entity":"household","rows":"all"},{"columns":["age","property_rental_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.property_purchases@1","mass":"conserve","outputs":[{"column":"additional_residential_property_purchased","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"non_residential_property_purchased","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"property_purchases","stage_contract_sha256":"281fe34ea94f71ac1a0652bf3ec17922f0d46919bfb74ab7b367ba6e9d680826","time_period":"2024"},"population":"high_value_home_support","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","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income"],"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.147.2"],["policyengine-core","3.33.3"],["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":"ef04589ebb01746b996c466517b07cb718cf88febe8c2d6d69f6edf6b4b80f8b","time_period":"2024"},"population":"high_value_home_support","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","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","household_local_bus_trips"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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"},{"column":"uses_energy_prepayment_meter","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"lcfs_consumption","stage_contract_sha256":"a10aeec0491876f0906782a34e197bb52162f045678ca3c19769feabe14b09c6","time_period":"2024"},"population":"high_value_home_support","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","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"etb_vat","stage_contract_sha256":"01adfcc85d77f38fb9cc896e2e4b4c4752518d9e2aa69e6947832678c25ecf19","time_period":"2024"},"population":"high_value_home_support","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","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"etb_services","stage_contract_sha256":"85c52b57b06db2075b6422e8202b90eb70ebe60a3345e59cf48a4a0460f583e4","time_period":"2024"},"population":"high_value_home_support","sources":["frs"],"structural":"none","weights":null},{"base":"high_value_home_support","citation":"","description":"Ownership boundary before uc_reporter_redraw rewrites.","id":"uc_reporter_redraw.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.147.2"],["policyengine-core","3.33.3"],["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":"93b86a8b8bbb49caebab64381c716da2d78eb7cd43d0bf1ee9edbf3a07b64539","time_period":"2024"},"population":"uc_reporter_redraw.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_reporter_redraw.boundary","citation":"","description":"Ownership boundary before spi_benefit_coherence rewrites.","id":"spi_benefit_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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 spi_benefit_coherence.","id":"spi_benefit_coherence","inputs":[{"columns":["benunit_support_channel","frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["aa_category","age","attendance_allowance_reported","dla_m_category","dla_m_reported","dla_sc_category","dla_sc_reported","esa_contrib_reported","incapacity_benefit_reported","is_uc_claimant","person_source_id","person_support_channel","pip_dl_category","pip_dl_reported","pip_m_category","pip_m_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.spi_benefit_coherence@1","mass":"conserve","outputs":[{"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_income_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":"sda_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":"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":"war_widows_pension_reported","dtype":"float64","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":"receives_benefits_in_own_right","dtype":"bool","entity":"person","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.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_benefit_coherence","stage_contract_sha256":"c3ac21a6be06f16b6c20eb5b828e2335a7e3f63d1d5ba60505562c3e7d6a8f2d","time_period":"2024"},"population":"spi_benefit_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"spi_benefit_coherence.boundary","citation":"","description":"Ownership boundary before uc_capital_coherence rewrites.","id":"uc_capital_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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":["non_residential_property_value","other_residential_property_value","owned_land","region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","is_benunit_head","is_household_head","is_parent","other_investment_income","person_support_channel","savings_interest_income","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":"pension_credit_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.147.2"],["policyengine-core","3.33.3"],["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":"40440a087f84967c734a1204f1dedcc2432556c7ce2a41f3c38bc9055f324bfa","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_legacy_closure_take_up.","id":"uc_legacy_closure_take_up","inputs":[{"columns":["frs_benunit_capital","would_claim_uc"],"entity":"benunit","rows":"all"},{"columns":["household_source_id","region"],"entity":"household","rows":"all"},{"columns":["age","child_tax_credit_reported","esa_income_reported","housing_benefit_reported","income_support_reported","jsa_income_reported","universal_credit_reported","working_tax_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_legacy_closure_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_uc_at_legacy_closure","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_legacy_closure_take_up","stage_contract_sha256":"759eba9869bb39f43d0a881de8630c132751ecb9467d97e6558899cb390f38b2","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","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure"],"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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure"],"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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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"},{"column":"has_mixed_age_couple_pension_credit_saving","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["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":"e887dbbb186cb79f6d3fc9a629269dbac4a43381b9574df65353b816f01a3a35","time_period":"2024"},"population":"pension_credit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"pension_credit_take_up.boundary","citation":"","description":"Ownership boundary before child_benefit_take_up rewrites.","id":"child_benefit_take_up.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving"],"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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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 child_benefit_take_up.","id":"child_benefit_take_up","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving"],"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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.child_benefit_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_child_benefit","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_opts_out","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"child_benefit_take_up","stage_contract_sha256":"6f1eac2609e868894a287254aac75ec57c0199783c6ae6cf4782f3fbb99f6e92","time_period":"2024"},"population":"child_benefit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"child_benefit_take_up.boundary","citation":"","description":"Ownership boundary before carers_allowance_take_up rewrites.","id":"carers_allowance_take_up.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving"],"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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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 carers_allowance_take_up.","id":"carers_allowance_take_up","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving"],"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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.carers_allowance_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"carers_allowance_take_up","stage_contract_sha256":"823cff5fdfb6c801c3301ddaeb0f20df438c4c3658faf71af07365419dc2d0c3","time_period":"2024"},"population":"carers_allowance_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"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","would_claim_carers_allowance"],"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.147.2"],["policyengine-core","3.33.3"],["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":"carers_allowance_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"carers_allowance_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","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.147.2"],["policyengine-core","3.33.3"],["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":"f7ef8492bacde1607f24693d7362110ba55ad3d083688f3df61de40dbe65bdc0","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","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.147.2"],["policyengine-core","3.33.3"],["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","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.147.2"],["policyengine-core","3.33.3"],["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":"39011749dc0e95362e4ab606f09e95d457fdf3b40c66df9511d93dbb8208805d","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","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.147.2"],["policyengine-core","3.33.3"],["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":"cgt_incidence_anchor","citation":"","description":"Run structural UK stage cgt_residential_split.","id":"cgt_residential_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.stage.expand.cgt_residential_split@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_cgt_residential_clone","bool"],["household","cgt_residential_clone_index","int64"],["person","cgt_residential_probability","float64"],["person","capital_gains_residential_property","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_residential_split","stage_contract_sha256":"554e05ecb984ae1a3262486aefbe6183496c4c03e201fe3fafb509648bd1777f","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_residential_split.","id":"cgt_residential_split.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_cgt_residential_clone","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_residential_clone_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_residential_probability","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"capital_gains_residential_property","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_cgt_residential_clone","household.cgt_residential_clone_index","person.cgt_residential_probability","person.capital_gains_residential_property"]},"population":"cgt_residential_split","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_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","capital_gains_residential_property","dividend_income","property_income","reports_rent_from_other_property","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_badr","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["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":"2c0e2b93ebef8e4f5ef5fcae0b0bf3270147f7d327a293686f5da2038d37ce5f","time_period":"2024"},"population":"cgt_residential_split","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 salary_sacrifice.","id":"salary_sacrifice","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","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","household_is_cgt_residential_clone","cgt_residential_clone_index"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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","cgt_residential_probability","capital_gains_residential_property","capital_gains_asset_type","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"},{"column":"salary_sacrifice_pre_conversion_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"salary_sacrifice","stage_contract_sha256":"a64ac17ecb296b12171a1c5f3eb0b4dcaac9f32d08cffb95d7b87d094aeec693","time_period":"2024"},"population":"cgt_residential_split","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","age_left_full_time_education","current_education","highest_education","reports_outstanding_student_loan","salary_sacrifice_pre_conversion_pay","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.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"student_loans","stage_contract_sha256":"157d9ee607633e4246ed06eeee3aac3cdff98118e72400e18b84c11b3fd2b92b","time_period":"2024"},"population":"cgt_residential_split","sources":["frs"],"structural":"none","weights":null},{"base":"cgt_residential_split","citation":"","description":"Ownership boundary before childcare_copy_take_up rewrites.","id":"childcare_copy_take_up.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","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","household_is_cgt_residential_clone","cgt_residential_clone_index"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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","cgt_residential_probability","capital_gains_residential_property","capital_gains_asset_type","capital_gains_badr","salary_sacrifice_pre_conversion_pay","student_loan_plan"],"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 childcare_copy_take_up.","id":"childcare_copy_take_up","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_uc_childcare","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","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","household_is_cgt_residential_clone","cgt_residential_clone_index"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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","cgt_residential_probability","capital_gains_residential_property","capital_gains_asset_type","capital_gains_badr","salary_sacrifice_pre_conversion_pay","student_loan_plan"],"entity":"person","rows":"all"}],"kernel":"uk.stage.childcare_copy_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_tfc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_extended_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_universal_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_targeted_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maximum_extended_childcare_hours_usage","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"max_free_entitlement_hours_used","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"childcare_copy_take_up","stage_contract_sha256":"39d4eb3281755ae0933dff426c64fe0fa7383c48b544d96223a875b78135633f","time_period":"2024"},"population":"childcare_copy_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 private_school_attendance.","id":"private_school_attendance","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","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","household_is_cgt_residential_clone","cgt_residential_clone_index"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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","cgt_residential_probability","capital_gains_residential_property","capital_gains_asset_type","capital_gains_badr","salary_sacrifice_pre_conversion_pay","student_loan_plan"],"entity":"person","rows":"all"}],"kernel":"uk.stage.private_school_attendance@1","mass":"conserve","outputs":[{"column":"attends_private_school","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"private_school_attendance","stage_contract_sha256":"7e44379c0331fe4c9de05cd76a075c1a6aa22cf0dec6cd2f91b277e70f14a038","time_period":"2024"},"population":"childcare_copy_take_up.boundary","sources":["frs"],"structural":"none","weights":null}],"sources":[{"codec":"csv-tables","description":"Content-bound UK FRS and donor fixture/source bundle.","name":"frs"}]} From 829c1bc26c0457c668fe1dfc1e866cb4a752654a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Fri, 23 Oct 2026 08:19:29 +0100 Subject: [PATCH 24/25] Allow war_widows_pension_reported on the UK release export surface The FRS spine has written War Widow's Pension to its own input since #1222, but the enhanced FRS still adds FRS benefit code 9 into bsp_reported, so the column is outside the reference surface. Without an allow-list entry, release-cut certification blocked on it (uk_export_surface). The entry goes in the allow-list tuple and its gates.json mirror; the battery and release-cut gate digests are re-pinned (the spine and calibration-seam digests do not move). A new engine-free test runs the export-surface gate on the spine's declared columns through the production export path, so the next such column fails CI rather than certification. Co-Authored-By: Claude Opus 5.5 --- ...war-widows-pension-export-surface.fixed.md | 1 + .../src/microcosm/build/uk/gates.json | 3 +- .../build/uk_runtime/terminal_gates.py | 4 ++ .../uk/test_uk_battery_bindings.py | 48 +++++++++++++++++++ .../src/microcosm/data/contract.py | 10 ++-- .../tests/engine_free/shared/test_contract.py | 6 +-- 6 files changed, 63 insertions(+), 9 deletions(-) create mode 100644 changelog.d/uk-war-widows-pension-export-surface.fixed.md diff --git a/changelog.d/uk-war-widows-pension-export-surface.fixed.md b/changelog.d/uk-war-widows-pension-export-surface.fixed.md new file mode 100644 index 000000000..0d1c06dd9 --- /dev/null +++ b/changelog.d/uk-war-widows-pension-export-surface.fixed.md @@ -0,0 +1 @@ +The release export surface allows `war_widows_pension_reported`, which the FRS spine writes since #1222 and the enhanced FRS lacks (it still adds FRS benefit code 9 into `bsp_reported`); without it, release-cut certification blocked every build from main. A new engine-free test runs the export-surface gate on the spine's declared columns, so a stage output outside the enhanced-FRS inputs and the allow-list now fails CI instead of certification. diff --git a/packages/microcosm-build/src/microcosm/build/uk/gates.json b/packages/microcosm-build/src/microcosm/build/uk/gates.json index 9a8166541..6516cf26a 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/gates.json +++ b/packages/microcosm-build/src/microcosm/build/uk/gates.json @@ -1117,7 +1117,8 @@ "household.itl1_code", "household.itl2_code", "household.itl3_code", - "household.ward_code" + "household.ward_code", + "person.war_widows_pension_reported" ], "reviewed_exclusions": { "person.incapacity_benefit_reported": "The enhanced FRS stores this legacy reported-benefit input as an all-zero layer; the candidate must drop dead zero layers.", diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/terminal_gates.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/terminal_gates.py index 136b0fe25..5fdd426d6 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/terminal_gates.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/terminal_gates.py @@ -392,6 +392,10 @@ def __post_init__(self) -> None: "household.itl2_code", "household.itl3_code", "household.ward_code", + # War Widow's or Widower's Pension, split out of bsp_reported (#1222, + # pe-uk#2382). The enhanced FRS still adds FRS benefit code 9 into + # bsp_reported, so its surface has no such input. + "person.war_widows_pension_reported", ) UK_KNOWN_MISSING_REFERENCE_EXPORT_COLUMNS: tuple[str, ...] = ( diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_battery_bindings.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_battery_bindings.py index caca7a8b0..b815f484e 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_battery_bindings.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_battery_bindings.py @@ -102,6 +102,54 @@ def test_declared_export_surface_preserves_claimants_and_matches_runtime(uk_gate assert outcome.status is GateStatus.PASSED +def test_spine_export_surface_is_reference_or_allow_listed(uk_gates): + """Every column the spine declares leaves through the release boundary as + an enhanced-FRS input, an allow-listed extra or a reviewed drop. + + The export-surface gate runs only at release-cut certification, on a built + file; war_widows_pension_reported (#1222) reached main without an + allow-list entry and blocked the first certification after it. This runs + the same gate on the spine's declared surface through the production + export path, against the checked-in enhanced-FRS reference. + """ + + from microcosm.build.uk_runtime.graph import uk_spine_endpoint, uk_spine_graph + from microcosm.build.uk_runtime.national_frame import ( + uk_national_frame, + uk_release_export_frame, + ) + from microcosm.build.uk_runtime.parity_reference import ( + load_efrs_parity_reference, + ) + from microcosm.build.uk_runtime.terminal_gates import ( + uk_export_candidate_columns, + uk_export_surface_gate, + ) + + columns = { + "person": ["person_id", "person_benunit_id", "person_household_id"], + "benunit": ["benunit_id"], + "household": ["household_id"], + } + for cells in uk_spine_endpoint(uk_spine_graph()).inputs: + columns[cells.entity] = list( + dict.fromkeys([*columns[cells.entity], *cells.columns]) + ) + tables = { + entity: pd.DataFrame({column: np.array([1]) for column in names}) + for entity, names in columns.items() + } + frame = uk_national_frame(**tables, time_period="2024", household_weights=[1.0]) + candidate = uk_export_candidate_columns(uk_release_export_frame(frame)) + reference = { + f"{entity}.{name}" + for name, entity in load_efrs_parity_reference().input_entities.items() + } + entry = next(entry for entry in uk_gates.gates if entry.id == "uk_export_surface") + result = uk_export_surface_gate(candidate, reference, **dict(entry.parameters)) + assert result.passed, result.failures + + def _tables(*, n: int = 4, weights=None): if weights is None: weights = np.ones(n, dtype=float) diff --git a/packages/microcosm-data/src/microcosm/data/contract.py b/packages/microcosm-data/src/microcosm/data/contract.py index c20bc8b6e..235dcca56 100644 --- a/packages/microcosm-data/src/microcosm/data/contract.py +++ b/packages/microcosm-data/src/microcosm/data/contract.py @@ -451,13 +451,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 = ( - "845d8d2f2330eab015e71d9abd3642ef3304731e557ec88f5a23f2f65c545cdb" + "f2d7e2ad1476cd25d251903c812a3674af8356d423efd08baeac2ab5fac679bf" ) _UK_GATE_BATTERY_GATES_MANIFEST_SHA256 = ( - "b93319166f46c05c2ea1a94bf3990ed9e849f6cd15bbe5e8d0eb183510c652d8" + "671b2c04a1139cae4afc8043332756fdbbbf2a3aabee90d8f6211f7126d54118" ) _UK_GATE_BATTERY_SPEC_FINGERPRINT = ( - "4390edf8113a8ab2016c9eab7c4dfb4441c298772221b438f4b5d9c3a0e7ad07" + "9d335e980b720a477d26805559f766a2f9adcaea06747e13a0801c2b69e0cf55" ) #: Spec entry id -> the legacy gate name whose observable detail checks #: apply unchanged (the battery re-keys the report by entry id; the gate @@ -947,10 +947,10 @@ def _uk_line_cut_tag_re(release_id: str) -> re.Pattern[str] | None: }, "release_cut": { "gates_manifest_sha256": ( - "28fbf0d126281bdeea6c89114a550de8b815f1f6cd50a323baedb43eb637e8f6" + "6093d00bef53a5bd369eb66f45074a97d6bca9b9d02eba96e99e38c3a867d073" ), "policy_sha256": ( - "124f6307524d5ed568e927c279bcab70bff1491afadce4b08f748b822ca8da62" + "623f6300975649f691ce239fd744cbcc05e3ec192a40a8121cc25f7a1b5903c5" ), }, } 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 0d11b7b44..8cb54de8b 100644 --- a/packages/microcosm-data/tests/engine_free/shared/test_contract.py +++ b/packages/microcosm-data/tests/engine_free/shared/test_contract.py @@ -213,13 +213,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 = ( - "845d8d2f2330eab015e71d9abd3642ef3304731e557ec88f5a23f2f65c545cdb" + "f2d7e2ad1476cd25d251903c812a3674af8356d423efd08baeac2ab5fac679bf" ) UK_GATE_BATTERY_GATES_MANIFEST_SHA256 = ( - "b93319166f46c05c2ea1a94bf3990ed9e849f6cd15bbe5e8d0eb183510c652d8" + "671b2c04a1139cae4afc8043332756fdbbbf2a3aabee90d8f6211f7126d54118" ) UK_GATE_BATTERY_SPEC_FINGERPRINT = ( - "4390edf8113a8ab2016c9eab7c4dfb4441c298772221b438f4b5d9c3a0e7ad07" + "9d335e980b720a477d26805559f766a2f9adcaea06747e13a0801c2b69e0cf55" ) UK_GATE_BATTERY_DEGENERATE_EVIDENCE_SHA256 = ( "6a179222c6b6058ad9caacfd347f7bdb8cb98a62237b50d1fc1136df09337251" From a12885f9ae375b2b1e5fcc234f131f5e00262cb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Fri, 23 Oct 2026 11:35:18 +0100 Subject: [PATCH 25/25] Key the under-2 childcare usage draw on the DfE age and refit (tool version 7) The DfE rows count children by their age on 31 December, but the under-2 usage draw picked each child's rate by its whole age on 6 October, so the age-0 rate blended 9-to-11-month-olds with 12-to-14-month-olds and some 2-year-olds took the age-1 rate (Vahid's round-3 finding E). dfe_spring_term.dfe_age_at_31_december restates policyengine-uk's date of birth (birth_instant_from_age, grid_months_to_yyyymmdd) so the engine-free stages key on the same age; an engine test holds it to the engine at 2024-2026. frs_take_up (and so the copies' re-draw, the take-up signal gate and the realised-take-up report) draws each child of DfE age 0 or 1 at its age's rate, and frs_take_up now reads months_since_last_birthday. The fitter (tool version 7) splits the under-2 contributions by the same age. Refit on the 6aea1ec00 fit spine: age-0 usage 0.6962, age 1 still at its bound, working parent 0.8262, early learning for 2-year-olds 0.6551; the 9-to-11-months row now fits exactly and the age-1 row's shortfall falls from 0.894 to 0.943. The coverage manifest and H2 fixture are regenerated; the gate pins do not move. Co-Authored-By: Claude Opus 5.5 --- .../uk-childcare-under-2-usage.added.md | 2 +- .../uk/release_input_coverage_manifest.json | 44 +-- .../src/microcosm/build/uk/source_stages.json | 14 +- .../src/microcosm/build/uk/spec/sources.yaml | 14 +- .../microcosm/build/uk/take_up_contract.json | 310 +++++++++--------- .../build/uk_runtime/dfe_spring_term.py | 62 +++- .../microcosm/build/uk_runtime/frs_take_up.py | 43 ++- .../src/microcosm/build/uk_runtime/graph.py | 3 + .../engine/uk/test_uk_dfe_spring_term.py | 36 ++ .../uk/test_uk_childcare_copy_take_up.py | 5 +- .../uk/test_uk_childcare_realised_take_up.py | 1 + .../engine_free/uk/test_uk_frs_stochastic.py | 15 +- .../uk/test_uk_stochastic_tools.py | 3 +- .../uk/test_uk_take_up_contract.py | 10 +- .../engine_free/uk/test_uk_take_up_gate.py | 1 + .../parity/uk_spine/sources/fixture.json | 14 +- .../fixtures/parity/uk_spine/uk_spine.json | 2 +- .../microcosm_build/uk_frs_stochastic.py | 1 + tools/fit_uk_childcare_takeup.py | 21 +- tools/report_uk_childcare_realised_take_up.py | 7 +- 20 files changed, 369 insertions(+), 239 deletions(-) diff --git a/changelog.d/uk-childcare-under-2-usage.added.md b/changelog.d/uk-childcare-under-2-usage.added.md index 76eaf928b..1c57a02b1 100644 --- a/changelog.d/uk-childcare-under-2-usage.added.md +++ b/changelog.d/uk-childcare-under-2-usage.added.md @@ -1 +1 @@ -Children under 2 take their own working-parent take-up, one rate per whole-year age. `frs_take_up` draws, for each child of whole-year age 0 or 1 in a benefit unit that claims the working-parent hours, whether it uses them, at its age's contract rate (`extended_childcare_age_0_usage`, `extended_childcare_age_1_usage`; keyed on `person_id`, seed 0, salt the output); a child that does not gets `max_free_entitlement_hours_used` 0, so policyengine-uk funds it no hours, and every other person keeps the engine's default of 30. DfE registers far fewer of the youngest eligible children than of those aged 2 to 4, and fewer at 9 to 11 months than at age 1 (mostly parental leave), so one family rate fitted at 2 to 4, or one rate for both ages, funded the wrong number of them. `childcare_copy_take_up` re-draws the copies' children against their own unit's re-drawn flag. The take-up signal gate measures the share over the children under 2 in claiming units against their ages' weighted rate; the column is allowed on the export surface. The tool-version-6 childcare refit fits both rates against DfE's working parent rows at 9 to 11 months and age 1. +Children under 2 take their own working-parent take-up, one rate per DfE age (the age on 31 December of the model year, as DfE counts registrations; computed without the engine from the stored age and months since the last birthday, as policyengine-uk places the date of birth). `frs_take_up` draws, for each child of DfE age 0 or 1 in a benefit unit that claims the working-parent hours, whether it uses them, at its age's contract rate (`extended_childcare_age_0_usage`, `extended_childcare_age_1_usage`; keyed on `person_id`, seed 0, salt the output); a child that does not gets `max_free_entitlement_hours_used` 0, so policyengine-uk funds it no hours, and every other person keeps the engine's default of 30. DfE registers far fewer of the youngest eligible children than of those aged 2 to 4, and fewer at 9 to 11 months than at age 1 (mostly parental leave), so one family rate fitted at 2 to 4, or one rate for both ages, funded the wrong number of them. `childcare_copy_take_up` re-draws the copies' children against their own unit's re-drawn flag. The take-up signal gate measures the share over the children of DfE age under 2 in claiming units against their ages' weighted rate; the column is allowed on the export surface. The tool-version-7 childcare refit fits both rates against DfE's working parent rows at 9 to 11 months and age 1, each child counted at its DfE age. 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 d1fd3f972..e041762f9 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 @@ -470,7 +470,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": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", + "source_manifest_sha256": "bd99f73a45d24b0770529dbd8713116fe97dac68ba248d5f52a1bd27b5981624", "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" @@ -493,7 +493,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", + "source_manifest_sha256": "bd99f73a45d24b0770529dbd8713116fe97dac68ba248d5f52a1bd27b5981624", "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" @@ -516,7 +516,7 @@ "required_mass_change_reason": "Capital-gains residential split divides every household carrying liable gainers into arms weighted by the solved residential probabilities, one arm per subset of residential gainers; every household's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", + "source_manifest_sha256": "bd99f73a45d24b0770529dbd8713116fe97dac68ba248d5f52a1bd27b5981624", "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) on the amounts the Table 3 redraw placed" @@ -538,7 +538,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": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", + "source_manifest_sha256": "bd99f73a45d24b0770529dbd8713116fe97dac68ba248d5f52a1bd27b5981624", "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)" @@ -567,7 +567,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": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", + "source_manifest_sha256": "bd99f73a45d24b0770529dbd8713116fe97dac68ba248d5f52a1bd27b5981624", "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" @@ -587,7 +587,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": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", + "source_manifest_sha256": "bd99f73a45d24b0770529dbd8713116fe97dac68ba248d5f52a1bd27b5981624", "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" @@ -609,7 +609,7 @@ "required_mass_change_reason": "High-value home support divides every owner household in the top value stratum of its region 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": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", + "source_manifest_sha256": "bd99f73a45d24b0770529dbd8713116fe97dac68ba248d5f52a1bd27b5981624", "source_vintages": { "source": "Microcosm structural operator (microcosm#1240 fix 1); no publisher input", "survey": "Family Resources Survey 2024-25 and SPI synthetic support, after the WAS wealth draw and the regional property uprating" @@ -630,7 +630,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": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", + "source_manifest_sha256": "bd99f73a45d24b0770529dbd8713116fe97dac68ba248d5f52a1bd27b5981624", "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" @@ -654,7 +654,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", + "source_manifest_sha256": "bd99f73a45d24b0770529dbd8713116fe97dac68ba248d5f52a1bd27b5981624", "source_vintages": { "conditioning_resource": "hmrc_cgt_conditioning_facts.json", "conditioning_resource_sha256": "054b1ee1a66cae6ed3793053eb0d3b9eea6b3f8976953479948ae11f7eedcd35", @@ -743,7 +743,7 @@ "full_frs_tei_band_unavailable" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", + "source_manifest_sha256": "bd99f73a45d24b0770529dbd8713116fe97dac68ba248d5f52a1bd27b5981624", "source_vintages": { "hmrc_surface": "2023-24", "mapped_build_period": "2024", @@ -785,7 +785,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": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", + "source_manifest_sha256": "bd99f73a45d24b0770529dbd8713116fe97dac68ba248d5f52a1bd27b5981624", "source_vintages": { "source": "UK Data Service SN 9603 Living Costs and Food Survey 2024-25 (2nd edition) household/person tabs and the vendored Chronicle facts for NEED 2024 mean kWh, DESNZ Energy Trends and QEP average prices paid for calendar 2024, road-fuel outturn (DESNZ, HMRC, ONS Consumer Trends) and road fuel by vehicle type (DESNZ), ONS Consumer Trends household spending by COICOP division, the DfT VEH1103 licensed-car stock, NTS bus use, and the DfT and devolved bus finance tables and fares indices.", "survey": "Living Costs and Food Survey 2024-25" @@ -811,7 +811,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": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", + "source_manifest_sha256": "bd99f73a45d24b0770529dbd8713116fe97dac68ba248d5f52a1bd27b5981624", "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" @@ -831,7 +831,7 @@ "required_mass_change_reason": "Private-school attendance stored on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", + "source_manifest_sha256": "bd99f73a45d24b0770529dbd8713116fe97dac68ba248d5f52a1bd27b5981624", "source_vintages": { "source": "policyengine-uk attends_private_school (the gov.simulation.private_school_vat attendance rates and factor), evaluated by the pinned engine", "survey": "policyengine-uk private-school attendance imputation, stored at the spine's weights" @@ -854,7 +854,7 @@ "property_finance_costs" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", + "source_manifest_sha256": "bd99f73a45d24b0770529dbd8713116fe97dac68ba248d5f52a1bd27b5981624", "source_vintages": { "source": "https://www.gov.uk/government/statistics/property-rental-income-statistics", "survey": "Survey of Personal Incomes Public Use Tape 2022-23 and HMRC Property Rental Income Statistics 2026 (tax year 2024-25)" @@ -875,7 +875,7 @@ "required_mass_change_reason": "Annual property purchases imputed on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", + "source_manifest_sha256": "bd99f73a45d24b0770529dbd8713116fe97dac68ba248d5f52a1bd27b5981624", "source_vintages": { "source": "https://www.gov.uk/government/statistics/uk-stamp-tax-statistics", "survey": "HMRC Annual Stamp Tax Statistics 2024 to 2025 (corrected 11 March 2026), Tables 6b, 8a and 8b" @@ -898,7 +898,7 @@ "property_wealth" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", + "source_manifest_sha256": "bd99f73a45d24b0770529dbd8713116fe97dac68ba248d5f52a1bd27b5981624", "source_vintages": { "source": "uk/high_value_home_value_knots.json, built by tools/build_uk_high_value_home_stock.py from PolicyEngine/chronicle#343's registrations", "survey": "HM Land Registry Price Paid latest sales uprated with the UK House Price Index, owner-weighted by region (the dense value node's knots, region level)" @@ -922,7 +922,7 @@ "non_residential_property_value" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", + "source_manifest_sha256": "bd99f73a45d24b0770529dbd8713116fe97dac68ba248d5f52a1bd27b5981624", "source_vintages": { "source": "MHCLG dwellings and the UK House Price Index regional average price averaged over the twelve months of calendar 2024 from the July 2026 full file, the frame's valuation basis, so the engine's annual uprating from 2024 projects the value once (microcosm#1240 fix 5).", "survey": "Public regional property reference" @@ -949,7 +949,7 @@ "employment_income" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", + "source_manifest_sha256": "bd99f73a45d24b0770529dbd8713116fe97dac68ba248d5f52a1bd27b5981624", "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" @@ -982,7 +982,7 @@ "household_source_id" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", + "source_manifest_sha256": "bd99f73a45d24b0770529dbd8713116fe97dac68ba248d5f52a1bd27b5981624", "source_vintages": { "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).", "survey": "Survey of Personal Incomes Public Use Tape 2022-23 and HMRC Income Tax liabilities statistics July 2026 Table 2.5" @@ -1004,7 +1004,7 @@ "student_loan_plan" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", + "source_manifest_sha256": "bd99f73a45d24b0770529dbd8713116fe97dac68ba248d5f52a1bd27b5981624", "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" @@ -1026,7 +1026,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": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", + "source_manifest_sha256": "bd99f73a45d24b0770529dbd8713116fe97dac68ba248d5f52a1bd27b5981624", "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" @@ -1061,7 +1061,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": "7c1cd4e8c5c875afb51655b175632dccad943c1d31de80d7e6e4295021ab8a9d", + "source_manifest_sha256": "bd99f73a45d24b0770529dbd8713116fe97dac68ba248d5f52a1bd27b5981624", "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/source_stages.json b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json index 49d97a937..93ed765d2 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json +++ b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json @@ -1098,9 +1098,9 @@ "output": "max_free_entitlement_hours_used", "draw": "max_free_entitlement_hours_used", "rate_key": "extended_childcare_age_0_usage", - "eligibility": "persons of whole-year age 0 in benefit units that claim the working-parent hours (would_claim_extended_childcare)", + "eligibility": "persons of DfE age 0 in benefit units that claim the working-parent hours (would_claim_extended_childcare)", "assignment_unit": "person", - "rate_derivation": "a child of whole-year age 0 in a claiming unit uses the working-parent hours where u < its age's rate and gets max_free_entitlement_hours_used 0 otherwise; every other person keeps the engine's default of 30; one draw per person serves both ages' operations", + "rate_derivation": "a child of DfE age 0 in a claiming unit uses the working-parent hours where u < its age's rate and gets max_free_entitlement_hours_used 0 otherwise; every other person keeps the engine's default of 30; one draw per person serves both ages' operations", "seed": 0 }, { @@ -1108,9 +1108,9 @@ "output": "max_free_entitlement_hours_used", "draw": "max_free_entitlement_hours_used", "rate_key": "extended_childcare_age_1_usage", - "eligibility": "persons of whole-year age 1 in benefit units that claim the working-parent hours (would_claim_extended_childcare)", + "eligibility": "persons of DfE age 1 in benefit units that claim the working-parent hours (would_claim_extended_childcare)", "assignment_unit": "person", - "rate_derivation": "a child of whole-year age 1 in a claiming unit uses the working-parent hours where u < its age's rate and gets max_free_entitlement_hours_used 0 otherwise; every other person keeps the engine's default of 30; one draw per person serves both ages' operations", + "rate_derivation": "a child of DfE age 1 in a claiming unit uses the working-parent hours where u < its age's rate and gets max_free_entitlement_hours_used 0 otherwise; every other person keeps the engine's default of 30; one draw per person serves both ages' operations", "seed": 0 } ], @@ -1131,7 +1131,7 @@ "maximum_extended_childcare_hours_usage", "max_free_entitlement_hours_used" ], - "notes": "Identity-keyed seed 0 streams replace the incumbent sequential take-up seed 100; salts are output variable names. Reported positive receipt anchors are transient and consumed only. The Universal Credit draw's population is the benefit units with a UC claimant or partner (is_uc_claimant) aged 18 or over and under Pension Credit qualifying age (66 for everyone who can reach it in this release), the age and role conditions of policyengine-uk 2.147.2's is_uc_eligible; the engine lockstep test pins it and names the three engine cases not mirrored (16- and 17-year-old claimants under the UC Regs 2013 reg 8 exceptions, mixed-age couples on the Pension Credit route, and from 2.128.0 pension-age families moved onto Universal Credit when their legacy benefit closes, SI 2014/1230 reg 60A). So the contract rate is a share of those units, an anchor outside them stays true, and any other unit is never drawn; a unit with no claimant or partner of that age keeps its reported Housing Benefit, which a claim it cannot make no longer zeroes (#882, microcosm#867, microcosm#1095). The universal childcare flag is nested under the working-parent one. A unit that claims the extended hours claims the universal hours, and any other unit claims them at the contract's universal_childcare rate, the rate conditional on not claiming the extended hours; the extended draw is unchanged. childcare_copy_take_up later re-draws the childcare flags and hours of the support and CGT copies on their own benefit units. A child of whole-year age 0 or 1 in a unit that claims the working-parent hours uses them at its age's contract rate, extended_childcare_age_0_usage or extended_childcare_age_1_usage (DfE registers far fewer of the youngest eligible children than of those aged 2 to 4, and fewer at 9 to 11 months than at age 1); a child that does not gets max_free_entitlement_hours_used 0, so the engine funds it no hours, and every other person keeps the engine's default of 30." + "notes": "Identity-keyed seed 0 streams replace the incumbent sequential take-up seed 100; salts are output variable names. Reported positive receipt anchors are transient and consumed only. The Universal Credit draw's population is the benefit units with a UC claimant or partner (is_uc_claimant) aged 18 or over and under Pension Credit qualifying age (66 for everyone who can reach it in this release), the age and role conditions of policyengine-uk 2.147.2's is_uc_eligible; the engine lockstep test pins it and names the three engine cases not mirrored (16- and 17-year-old claimants under the UC Regs 2013 reg 8 exceptions, mixed-age couples on the Pension Credit route, and from 2.128.0 pension-age families moved onto Universal Credit when their legacy benefit closes, SI 2014/1230 reg 60A). So the contract rate is a share of those units, an anchor outside them stays true, and any other unit is never drawn; a unit with no claimant or partner of that age keeps its reported Housing Benefit, which a claim it cannot make no longer zeroes (#882, microcosm#867, microcosm#1095). The universal childcare flag is nested under the working-parent one. A unit that claims the extended hours claims the universal hours, and any other unit claims them at the contract's universal_childcare rate, the rate conditional on not claiming the extended hours; the extended draw is unchanged. childcare_copy_take_up later re-draws the childcare flags and hours of the support and CGT copies on their own benefit units. A child of DfE age 0 or 1 (its age on 31 December of the fit's model year, the age DfE counts by) in a unit that claims the working-parent hours uses them at its age's contract rate, extended_childcare_age_0_usage or extended_childcare_age_1_usage (DfE registers far fewer of the youngest eligible children than of those aged 2 to 4, and fewer at 9 to 11 months than at age 1); a child that does not gets max_free_entitlement_hours_used 0, so the engine funds it no hours, and every other person keeps the engine's default of 30." }, { "stage": "frs_person_draws", @@ -6558,7 +6558,7 @@ "output": "max_free_entitlement_hours_used", "draw": "max_free_entitlement_hours_used", "rate_key": "extended_childcare_age_0_usage", - "eligibility": "children of whole-year age 0 in copy benefit units that claim the working-parent hours, against the copy's re-drawn would_claim_extended_childcare; native persons keep their frs_take_up draws", + "eligibility": "children of DfE age 0 in copy benefit units that claim the working-parent hours, against the copy's re-drawn would_claim_extended_childcare; native persons keep their frs_take_up draws", "assignment_unit": "person", "rate_derivation": "as in frs_take_up, keyed on the copy's own person_id", "seed": 0 @@ -6568,7 +6568,7 @@ "output": "max_free_entitlement_hours_used", "draw": "max_free_entitlement_hours_used", "rate_key": "extended_childcare_age_1_usage", - "eligibility": "children of whole-year age 1 in copy benefit units that claim the working-parent hours, against the copy's re-drawn would_claim_extended_childcare; native persons keep their frs_take_up draws", + "eligibility": "children of DfE age 1 in copy benefit units that claim the working-parent hours, against the copy's re-drawn would_claim_extended_childcare; native persons keep their frs_take_up draws", "assignment_unit": "person", "rate_derivation": "as in frs_take_up, keyed on the copy's own person_id", "seed": 0 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 1f3ecc494..5187ba99c 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml +++ b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml @@ -1002,17 +1002,17 @@ stages: output: max_free_entitlement_hours_used draw: max_free_entitlement_hours_used rate_key: extended_childcare_age_0_usage - eligibility: persons of whole-year age 0 in benefit units that claim the working-parent hours (would_claim_extended_childcare) + eligibility: persons of DfE age 0 in benefit units that claim the working-parent hours (would_claim_extended_childcare) assignment_unit: person - rate_derivation: a child of whole-year age 0 in a claiming unit uses the working-parent hours where u < its age's rate and gets max_free_entitlement_hours_used 0 otherwise; every other person keeps the engine's default of 30; one draw per person serves both ages' operations + rate_derivation: a child of DfE age 0 in a claiming unit uses the working-parent hours where u < its age's rate and gets max_free_entitlement_hours_used 0 otherwise; every other person keeps the engine's default of 30; one draw per person serves both ages' operations seed: 0 - kind: assign_binary_from_rate output: max_free_entitlement_hours_used draw: max_free_entitlement_hours_used rate_key: extended_childcare_age_1_usage - eligibility: persons of whole-year age 1 in benefit units that claim the working-parent hours (would_claim_extended_childcare) + eligibility: persons of DfE age 1 in benefit units that claim the working-parent hours (would_claim_extended_childcare) assignment_unit: person - rate_derivation: a child of whole-year age 1 in a claiming unit uses the working-parent hours where u < its age's rate and gets max_free_entitlement_hours_used 0 otherwise; every other person keeps the engine's default of 30; one draw per person serves both ages' operations + rate_derivation: a child of DfE age 1 in a claiming unit uses the working-parent hours where u < its age's rate and gets max_free_entitlement_hours_used 0 otherwise; every other person keeps the engine's default of 30; one draw per person serves both ages' operations seed: 0 outputs: - would_claim_child_benefit @@ -1029,7 +1029,7 @@ stages: nonnegative_outputs: - maximum_extended_childcare_hours_usage - max_free_entitlement_hours_used - notes: Identity-keyed seed 0 streams replace the incumbent sequential take-up seed 100; salts are output variable names. Reported positive receipt anchors are transient and consumed only. The Universal Credit draw's population is the benefit units with a UC claimant or partner (is_uc_claimant) aged 18 or over and under Pension Credit qualifying age (66 for everyone who can reach it in this release), the age and role conditions of policyengine-uk 2.147.2's is_uc_eligible; the engine lockstep test pins it and names the three engine cases not mirrored (16- and 17-year-old claimants under the UC Regs 2013 reg 8 exceptions, mixed-age couples on the Pension Credit route, and from 2.128.0 pension-age families moved onto Universal Credit when their legacy benefit closes, SI 2014/1230 reg 60A). So the contract rate is a share of those units, an anchor outside them stays true, and any other unit is never drawn; a unit with no claimant or partner of that age keeps its reported Housing Benefit, which a claim it cannot make no longer zeroes (#882, microcosm#867, microcosm#1095). The universal childcare flag is nested under the working-parent one. A unit that claims the extended hours claims the universal hours, and any other unit claims them at the contract's universal_childcare rate, the rate conditional on not claiming the extended hours; the extended draw is unchanged. childcare_copy_take_up later re-draws the childcare flags and hours of the support and CGT copies on their own benefit units. A child of whole-year age 0 or 1 in a unit that claims the working-parent hours uses them at its age's contract rate, extended_childcare_age_0_usage or extended_childcare_age_1_usage (DfE registers far fewer of the youngest eligible children than of those aged 2 to 4, and fewer at 9 to 11 months than at age 1); a child that does not gets max_free_entitlement_hours_used 0, so the engine funds it no hours, and every other person keeps the engine's default of 30. + notes: Identity-keyed seed 0 streams replace the incumbent sequential take-up seed 100; salts are output variable names. Reported positive receipt anchors are transient and consumed only. The Universal Credit draw's population is the benefit units with a UC claimant or partner (is_uc_claimant) aged 18 or over and under Pension Credit qualifying age (66 for everyone who can reach it in this release), the age and role conditions of policyengine-uk 2.147.2's is_uc_eligible; the engine lockstep test pins it and names the three engine cases not mirrored (16- and 17-year-old claimants under the UC Regs 2013 reg 8 exceptions, mixed-age couples on the Pension Credit route, and from 2.128.0 pension-age families moved onto Universal Credit when their legacy benefit closes, SI 2014/1230 reg 60A). So the contract rate is a share of those units, an anchor outside them stays true, and any other unit is never drawn; a unit with no claimant or partner of that age keeps its reported Housing Benefit, which a claim it cannot make no longer zeroes (#882, microcosm#867, microcosm#1095). The universal childcare flag is nested under the working-parent one. A unit that claims the extended hours claims the universal hours, and any other unit claims them at the contract's universal_childcare rate, the rate conditional on not claiming the extended hours; the extended draw is unchanged. childcare_copy_take_up later re-draws the childcare flags and hours of the support and CGT copies on their own benefit units. A child of DfE age 0 or 1 (its age on 31 December of the fit's model year, the age DfE counts by) in a unit that claims the working-parent hours uses them at its age's contract rate, extended_childcare_age_0_usage or extended_childcare_age_1_usage (DfE registers far fewer of the youngest eligible children than of those aged 2 to 4, and fewer at 9 to 11 months than at age 1); a child that does not gets max_free_entitlement_hours_used 0, so the engine funds it no hours, and every other person keeps the engine's default of 30. - stage: frs_person_draws survey: Family Resources Survey 2024-25 source: Sourced UK take-up contract rates and identity-keyed deterministic draws. @@ -5290,7 +5290,7 @@ stages: output: max_free_entitlement_hours_used draw: max_free_entitlement_hours_used rate_key: extended_childcare_age_0_usage - eligibility: children of whole-year age 0 in copy benefit units that claim the working-parent hours, against the copy's re-drawn would_claim_extended_childcare; native persons keep their frs_take_up draws + eligibility: children of DfE age 0 in copy benefit units that claim the working-parent hours, against the copy's re-drawn would_claim_extended_childcare; native persons keep their frs_take_up draws assignment_unit: person rate_derivation: as in frs_take_up, keyed on the copy's own person_id seed: 0 @@ -5298,7 +5298,7 @@ stages: output: max_free_entitlement_hours_used draw: max_free_entitlement_hours_used rate_key: extended_childcare_age_1_usage - eligibility: children of whole-year age 1 in copy benefit units that claim the working-parent hours, against the copy's re-drawn would_claim_extended_childcare; native persons keep their frs_take_up draws + eligibility: children of DfE age 1 in copy benefit units that claim the working-parent hours, against the copy's re-drawn would_claim_extended_childcare; native persons keep their frs_take_up draws assignment_unit: person rate_derivation: as in frs_take_up, keyed on the copy's own person_id seed: 0 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 f84c3c472..a5a469d00 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 @@ -175,17 +175,17 @@ "status": "fitted_offline" }, "fitting_receipt": { - "source": "tools/fit_uk_childcare_takeup.py (microcosm#1338 round 2, licensed lane)", - "tool_version": 6, - "receipt_sha256": "a8fea77b88e38f13eafbb4204aef97545e2c5d1599d84c4bd311ef6c57d3da00", + "source": "tools/fit_uk_childcare_takeup.py (microcosm#1338 round 3, licensed lane)", + "tool_version": 7, + "receipt_sha256": "7a9e44ff6d9da027199edb57ef529bbc82807dbc321d9ded00967a63afc573c6", "seed": 0, "engine_version": "2.147.2", "model_period": 2025, "vintage_overrides": {}, "input_h5_sha256": "f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412", - "input_spine": "local unsigned spine built at 6aea1ec00 (uk-childcare-100k-fixes-v2 on main 8b0224e06; policyengine-uk 2.147.2, feed abf0921), sha256 f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412; the fit overrides the take-up columns, the only ones the later commits change", + "input_spine": "local unsigned spine built at 6aea1ec00 (uk-childcare-100k-fixes-v2 on main 8b0224e06; policyengine-uk 2.147.2, feed abf0921), sha256 f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412; the fit overrides the take-up columns and reads only the stored ages and months, so the later commits leave it valid", "ledger_facts_sha256": "2b64fecfe746164203dac1726aae6ffdb3e5d8e478bd3d64d118ac76cb00780b", - "stochastic_contract_sha256_at_fit": "6b30ba258e9901d6aa139e4c3df227854e2c1aa1550ae514caeec3dfcfe4c1c1", + "stochastic_contract_sha256_at_fit": "1a9feb2bc9741b12c57d95f3c9c4364cad4cb43472782bb5be3bd19b410b44c5", "expectation_basis": "dfe_spring_term", "estimand": "The rate at which the spine reproduces HMRC's two Tax-Free Childcare rows (children with used accounts and the government top-up) given the other childcare rates: a fit across all users that trades the two rows against each other, not a take-up estimate for families newly eligible above £100,000, which a costing that removes the limit assumes equal to it.", "params_at_bound": [ @@ -194,7 +194,7 @@ ], "optimizer": { "eps": 1e-06, - "loss": 0.02521537026262977, + "loss": 0.01538992050511465, "maxiter": 50, "method": "L-BFGS-B", "success": true @@ -202,58 +202,58 @@ "achieved": { "dfe.funded_childcare.early_learning_2_year_olds": { "target": 95031.0, - "value": 95030.977, + "value": 95031.139, "ratio": 1.0 }, "dfe.funded_childcare.universal_only_children": { "target": 396965.0, - "value": 422796.571, - "ratio": 1.0651 + "value": 417767.817, + "ratio": 1.0524 }, "dfe.funded_childcare.working_parent_children_2_to_4": { "target": 621482.0, - "value": 628071.593, - "ratio": 1.0106 + "value": 620601.293, + "ratio": 0.9986 }, "dfe.funded_childcare.working_parent_children_9_to_11_months": { "target": 29155.0, - "value": 29581.118, - "ratio": 1.0146 + "value": 29154.994, + "ratio": 1.0 }, "dfe.funded_childcare.working_parent_children_age_1": { "target": 195104.0, - "value": 174400.612, - "ratio": 0.8939 + "value": 183986.326, + "ratio": 0.943 }, "hmrc.tfc.children_with_used_accounts": { "target": 1151515.0, - "value": 1224841.088, + "value": 1224841.813, "ratio": 1.0637 }, "hmrc.tfc.government_top_up": { "target": 599800000.0, - "value": 555970720.952, + "value": 555971050.246, "ratio": 0.9269 } }, "diagnostic_rows": { "dfe.funded_childcare.universal_nursery_children_age_3": { "target": 565954.0, - "value": 578014.513, - "ratio": 1.0213 + "value": 571139.593, + "ratio": 1.0092 }, "dfe.funded_childcare.working_parent_children_age_2": { "target": 242453.0, - "value": 267809.94, - "ratio": 1.1046 + "value": 264624.601, + "ratio": 1.0914 }, "dfe.funded_childcare.working_parent_children_age_3": { "target": 278640.0, - "value": 263213.198, - "ratio": 0.9446 + "value": 260082.533, + "ratio": 0.9334 } }, - "status": "fitted at model year 2025 with the expectation basis of tool version 6: the DfE rows measured at the spring term by the age on 31 December (dfe_spring_term.py, policyengine-uk 2.147.2's date-of-birth school start and working-parent term start), universal take-up nested under working-parent take-up, targeted and universal hours allocated from the gross working-parent hours, and the under-2 usage share scaling the claiming families' children under 2. At a bound: childcare_age_1_usage, universal_childcare." + "status": "fitted at model year 2025 with the expectation basis of tool version 7: the DfE rows measured at the spring term by the age on 31 December (dfe_spring_term.py, policyengine-uk 2.147.2's date-of-birth school start and working-parent term start), universal take-up nested under working-parent take-up, targeted and universal hours allocated from the gross working-parent hours, and each under-2 usage share scaling the claiming families' children of its DfE age (the age on 31 December, as DfE counts them). At a bound: childcare_age_1_usage, universal_childcare." } }, { @@ -262,7 +262,7 @@ "entity": "benunit", "values": { "2015-01-01": 0.812, - "2024-04-06": 0.8361 + "2024-04-06": 0.8262 }, "source": { "source": "FRS empirical fit", @@ -271,17 +271,17 @@ "status": "fitted_offline" }, "fitting_receipt": { - "source": "tools/fit_uk_childcare_takeup.py (microcosm#1338 round 2, licensed lane)", - "tool_version": 6, - "receipt_sha256": "a8fea77b88e38f13eafbb4204aef97545e2c5d1599d84c4bd311ef6c57d3da00", + "source": "tools/fit_uk_childcare_takeup.py (microcosm#1338 round 3, licensed lane)", + "tool_version": 7, + "receipt_sha256": "7a9e44ff6d9da027199edb57ef529bbc82807dbc321d9ded00967a63afc573c6", "seed": 0, "engine_version": "2.147.2", "model_period": 2025, "vintage_overrides": {}, "input_h5_sha256": "f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412", - "input_spine": "local unsigned spine built at 6aea1ec00 (uk-childcare-100k-fixes-v2 on main 8b0224e06; policyengine-uk 2.147.2, feed abf0921), sha256 f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412; the fit overrides the take-up columns, the only ones the later commits change", + "input_spine": "local unsigned spine built at 6aea1ec00 (uk-childcare-100k-fixes-v2 on main 8b0224e06; policyengine-uk 2.147.2, feed abf0921), sha256 f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412; the fit overrides the take-up columns and reads only the stored ages and months, so the later commits leave it valid", "ledger_facts_sha256": "2b64fecfe746164203dac1726aae6ffdb3e5d8e478bd3d64d118ac76cb00780b", - "stochastic_contract_sha256_at_fit": "6b30ba258e9901d6aa139e4c3df227854e2c1aa1550ae514caeec3dfcfe4c1c1", + "stochastic_contract_sha256_at_fit": "1a9feb2bc9741b12c57d95f3c9c4364cad4cb43472782bb5be3bd19b410b44c5", "expectation_basis": "dfe_spring_term", "estimand": "The share of benefit units that claim working-parent hours, fitted to DfE's working parent registrations aged 2 to 4 at the spring term.", "params_at_bound": [ @@ -290,7 +290,7 @@ ], "optimizer": { "eps": 1e-06, - "loss": 0.02521537026262977, + "loss": 0.01538992050511465, "maxiter": 50, "method": "L-BFGS-B", "success": true @@ -298,58 +298,58 @@ "achieved": { "dfe.funded_childcare.early_learning_2_year_olds": { "target": 95031.0, - "value": 95030.977, + "value": 95031.139, "ratio": 1.0 }, "dfe.funded_childcare.universal_only_children": { "target": 396965.0, - "value": 422796.571, - "ratio": 1.0651 + "value": 417767.817, + "ratio": 1.0524 }, "dfe.funded_childcare.working_parent_children_2_to_4": { "target": 621482.0, - "value": 628071.593, - "ratio": 1.0106 + "value": 620601.293, + "ratio": 0.9986 }, "dfe.funded_childcare.working_parent_children_9_to_11_months": { "target": 29155.0, - "value": 29581.118, - "ratio": 1.0146 + "value": 29154.994, + "ratio": 1.0 }, "dfe.funded_childcare.working_parent_children_age_1": { "target": 195104.0, - "value": 174400.612, - "ratio": 0.8939 + "value": 183986.326, + "ratio": 0.943 }, "hmrc.tfc.children_with_used_accounts": { "target": 1151515.0, - "value": 1224841.088, + "value": 1224841.813, "ratio": 1.0637 }, "hmrc.tfc.government_top_up": { "target": 599800000.0, - "value": 555970720.952, + "value": 555971050.246, "ratio": 0.9269 } }, "diagnostic_rows": { "dfe.funded_childcare.universal_nursery_children_age_3": { "target": 565954.0, - "value": 578014.513, - "ratio": 1.0213 + "value": 571139.593, + "ratio": 1.0092 }, "dfe.funded_childcare.working_parent_children_age_2": { "target": 242453.0, - "value": 267809.94, - "ratio": 1.1046 + "value": 264624.601, + "ratio": 1.0914 }, "dfe.funded_childcare.working_parent_children_age_3": { "target": 278640.0, - "value": 263213.198, - "ratio": 0.9446 + "value": 260082.533, + "ratio": 0.9334 } }, - "status": "fitted at model year 2025 with the expectation basis of tool version 6: the DfE rows measured at the spring term by the age on 31 December (dfe_spring_term.py, policyengine-uk 2.147.2's date-of-birth school start and working-parent term start), universal take-up nested under working-parent take-up, targeted and universal hours allocated from the gross working-parent hours, and the under-2 usage share scaling the claiming families' children under 2. At a bound: childcare_age_1_usage, universal_childcare." + "status": "fitted at model year 2025 with the expectation basis of tool version 7: the DfE rows measured at the spring term by the age on 31 December (dfe_spring_term.py, policyengine-uk 2.147.2's date-of-birth school start and working-parent term start), universal take-up nested under working-parent take-up, targeted and universal hours allocated from the gross working-parent hours, and each under-2 usage share scaling the claiming families' children of its DfE age (the age on 31 December, as DfE counts them). At a bound: childcare_age_1_usage, universal_childcare." } }, { @@ -357,37 +357,37 @@ "output": "max_free_entitlement_hours_used", "entity": "person", "values": { - "2024-04-06": 0.698 + "2024-04-06": 0.6962 }, "source": { "source": "DfE Funded early education and childcare, January 2025 (reporting year 2025 headline figures)", "agency": "DfE", - "citation": "The share of children of whole-year age 0 in benefit units that claim the working-parent hours who use them. DfE registers far fewer of the youngest eligible children than of those aged 2 to 4, and fewer at 9 to 11 months than at age 1, mostly for parental leave. Fitted by tools/fit_uk_childcare_takeup.py (tool version 6) with the other childcare rates, one share per whole-year age, against DfE's working parent registrations at 9 to 11 months and age 1 at the spring term (January 2025), as María ruled on 2026-10-22. Applied by frs_take_up (and childcare_copy_take_up for the copies) to each child of whole-year age 0 in a unit that claims the working-parent hours: a child that does not use them gets max_free_entitlement_hours_used 0, every other person the engine's default of 30.", + "citation": "The share of children of DfE age 0 (the age on 31 December of the model year, as DfE counts registrations) in benefit units that claim the working-parent hours who use them. DfE registers far fewer of the youngest eligible children than of those aged 2 to 4, and fewer at 9 to 11 months than at age 1, mostly for parental leave. Fitted by tools/fit_uk_childcare_takeup.py (tool version 7) with the other childcare rates, one share per DfE age, against DfE's working parent registrations at 9 to 11 months and age 1 at the spring term (January 2025), as María ruled on 2026-10-22, keyed on DfE age since round 3 of microcosm#1338. Applied by frs_take_up (and childcare_copy_take_up for the copies) to each child of DfE age 0 in a unit that claims the working-parent hours: a child that does not use them gets max_free_entitlement_hours_used 0, every other person the engine's default of 30.", "url": "https://explore-education-statistics.service.gov.uk/find-statistics/funded-early-education-and-childcare/2025", "status": "fitted_offline" }, - "population": "children of whole-year age 0 in benefit units that claim the working-parent hours (would_claim_extended_childcare)", + "population": "children of DfE age 0 (age on 31 December of the model year) in benefit units that claim the working-parent hours (would_claim_extended_childcare)", "fitting_receipt": { - "source": "tools/fit_uk_childcare_takeup.py (microcosm#1338 round 2, licensed lane)", - "tool_version": 6, - "receipt_sha256": "a8fea77b88e38f13eafbb4204aef97545e2c5d1599d84c4bd311ef6c57d3da00", + "source": "tools/fit_uk_childcare_takeup.py (microcosm#1338 round 3, licensed lane)", + "tool_version": 7, + "receipt_sha256": "7a9e44ff6d9da027199edb57ef529bbc82807dbc321d9ded00967a63afc573c6", "seed": 0, "engine_version": "2.147.2", "model_period": 2025, "vintage_overrides": {}, "input_h5_sha256": "f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412", - "input_spine": "local unsigned spine built at 6aea1ec00 (uk-childcare-100k-fixes-v2 on main 8b0224e06; policyengine-uk 2.147.2, feed abf0921), sha256 f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412; the fit overrides the take-up columns, the only ones the later commits change", + "input_spine": "local unsigned spine built at 6aea1ec00 (uk-childcare-100k-fixes-v2 on main 8b0224e06; policyengine-uk 2.147.2, feed abf0921), sha256 f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412; the fit overrides the take-up columns and reads only the stored ages and months, so the later commits leave it valid", "ledger_facts_sha256": "2b64fecfe746164203dac1726aae6ffdb3e5d8e478bd3d64d118ac76cb00780b", - "stochastic_contract_sha256_at_fit": "6b30ba258e9901d6aa139e4c3df227854e2c1aa1550ae514caeec3dfcfe4c1c1", + "stochastic_contract_sha256_at_fit": "1a9feb2bc9741b12c57d95f3c9c4364cad4cb43472782bb5be3bd19b410b44c5", "expectation_basis": "dfe_spring_term", - "estimand": "The share of children of whole-year age 0 who use the hours their family's working-parent claim gives them, fitted with the other age's share to DfE's working parent registrations at 9 to 11 months and at age 1 at the spring term.", + "estimand": "The share of children of DfE age 0 (age on 31 December of the model year) who use the hours their family's working-parent claim gives them, fitted with the other age's share to DfE's working parent registrations at 9 to 11 months and at age 1 at the spring term.", "params_at_bound": [ "extended_childcare_age_1_usage", "universal_childcare" ], "optimizer": { "eps": 1e-06, - "loss": 0.02521537026262977, + "loss": 0.01538992050511465, "maxiter": 50, "method": "L-BFGS-B", "success": true @@ -395,58 +395,58 @@ "achieved": { "dfe.funded_childcare.early_learning_2_year_olds": { "target": 95031.0, - "value": 95030.977, + "value": 95031.139, "ratio": 1.0 }, "dfe.funded_childcare.universal_only_children": { "target": 396965.0, - "value": 422796.571, - "ratio": 1.0651 + "value": 417767.817, + "ratio": 1.0524 }, "dfe.funded_childcare.working_parent_children_2_to_4": { "target": 621482.0, - "value": 628071.593, - "ratio": 1.0106 + "value": 620601.293, + "ratio": 0.9986 }, "dfe.funded_childcare.working_parent_children_9_to_11_months": { "target": 29155.0, - "value": 29581.118, - "ratio": 1.0146 + "value": 29154.994, + "ratio": 1.0 }, "dfe.funded_childcare.working_parent_children_age_1": { "target": 195104.0, - "value": 174400.612, - "ratio": 0.8939 + "value": 183986.326, + "ratio": 0.943 }, "hmrc.tfc.children_with_used_accounts": { "target": 1151515.0, - "value": 1224841.088, + "value": 1224841.813, "ratio": 1.0637 }, "hmrc.tfc.government_top_up": { "target": 599800000.0, - "value": 555970720.952, + "value": 555971050.246, "ratio": 0.9269 } }, "diagnostic_rows": { "dfe.funded_childcare.universal_nursery_children_age_3": { "target": 565954.0, - "value": 578014.513, - "ratio": 1.0213 + "value": 571139.593, + "ratio": 1.0092 }, "dfe.funded_childcare.working_parent_children_age_2": { "target": 242453.0, - "value": 267809.94, - "ratio": 1.1046 + "value": 264624.601, + "ratio": 1.0914 }, "dfe.funded_childcare.working_parent_children_age_3": { "target": 278640.0, - "value": 263213.198, - "ratio": 0.9446 + "value": 260082.533, + "ratio": 0.9334 } }, - "status": "fitted at model year 2025 with the expectation basis of tool version 6: the DfE rows measured at the spring term by the age on 31 December (dfe_spring_term.py, policyengine-uk 2.147.2's date-of-birth school start and working-parent term start), universal take-up nested under working-parent take-up, targeted and universal hours allocated from the gross working-parent hours, and the under-2 usage share scaling the claiming families' children under 2. At a bound: childcare_age_1_usage, universal_childcare." + "status": "fitted at model year 2025 with the expectation basis of tool version 7: the DfE rows measured at the spring term by the age on 31 December (dfe_spring_term.py, policyengine-uk 2.147.2's date-of-birth school start and working-parent term start), universal take-up nested under working-parent take-up, targeted and universal hours allocated from the gross working-parent hours, and each under-2 usage share scaling the claiming families' children of its DfE age (the age on 31 December, as DfE counts them). At a bound: childcare_age_1_usage, universal_childcare." } }, { @@ -459,32 +459,32 @@ "source": { "source": "DfE Funded early education and childcare, January 2025 (reporting year 2025 headline figures)", "agency": "DfE", - "citation": "The share of children of whole-year age 1 in benefit units that claim the working-parent hours who use them. DfE registers far fewer of the youngest eligible children than of those aged 2 to 4, and fewer at 9 to 11 months than at age 1, mostly for parental leave. Fitted by tools/fit_uk_childcare_takeup.py (tool version 6) with the other childcare rates, one share per whole-year age, against DfE's working parent registrations at 9 to 11 months and age 1 at the spring term (January 2025), as María ruled on 2026-10-22. Applied by frs_take_up (and childcare_copy_take_up for the copies) to each child of whole-year age 1 in a unit that claims the working-parent hours: a child that does not use them gets max_free_entitlement_hours_used 0, every other person the engine's default of 30.", + "citation": "The share of children of DfE age 1 (the age on 31 December of the model year, as DfE counts registrations) in benefit units that claim the working-parent hours who use them. DfE registers far fewer of the youngest eligible children than of those aged 2 to 4, and fewer at 9 to 11 months than at age 1, mostly for parental leave. Fitted by tools/fit_uk_childcare_takeup.py (tool version 7) with the other childcare rates, one share per DfE age, against DfE's working parent registrations at 9 to 11 months and age 1 at the spring term (January 2025), as María ruled on 2026-10-22, keyed on DfE age since round 3 of microcosm#1338. Applied by frs_take_up (and childcare_copy_take_up for the copies) to each child of DfE age 1 in a unit that claims the working-parent hours: a child that does not use them gets max_free_entitlement_hours_used 0, every other person the engine's default of 30.", "url": "https://explore-education-statistics.service.gov.uk/find-statistics/funded-early-education-and-childcare/2025", "status": "fitted_offline" }, - "population": "children of whole-year age 1 in benefit units that claim the working-parent hours (would_claim_extended_childcare)", + "population": "children of DfE age 1 (age on 31 December of the model year) in benefit units that claim the working-parent hours (would_claim_extended_childcare)", "fitting_receipt": { - "source": "tools/fit_uk_childcare_takeup.py (microcosm#1338 round 2, licensed lane)", - "tool_version": 6, - "receipt_sha256": "a8fea77b88e38f13eafbb4204aef97545e2c5d1599d84c4bd311ef6c57d3da00", + "source": "tools/fit_uk_childcare_takeup.py (microcosm#1338 round 3, licensed lane)", + "tool_version": 7, + "receipt_sha256": "7a9e44ff6d9da027199edb57ef529bbc82807dbc321d9ded00967a63afc573c6", "seed": 0, "engine_version": "2.147.2", "model_period": 2025, "vintage_overrides": {}, "input_h5_sha256": "f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412", - "input_spine": "local unsigned spine built at 6aea1ec00 (uk-childcare-100k-fixes-v2 on main 8b0224e06; policyengine-uk 2.147.2, feed abf0921), sha256 f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412; the fit overrides the take-up columns, the only ones the later commits change", + "input_spine": "local unsigned spine built at 6aea1ec00 (uk-childcare-100k-fixes-v2 on main 8b0224e06; policyengine-uk 2.147.2, feed abf0921), sha256 f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412; the fit overrides the take-up columns and reads only the stored ages and months, so the later commits leave it valid", "ledger_facts_sha256": "2b64fecfe746164203dac1726aae6ffdb3e5d8e478bd3d64d118ac76cb00780b", - "stochastic_contract_sha256_at_fit": "6b30ba258e9901d6aa139e4c3df227854e2c1aa1550ae514caeec3dfcfe4c1c1", + "stochastic_contract_sha256_at_fit": "1a9feb2bc9741b12c57d95f3c9c4364cad4cb43472782bb5be3bd19b410b44c5", "expectation_basis": "dfe_spring_term", - "estimand": "The share of children of whole-year age 1 who use the hours their family's working-parent claim gives them, fitted with the other age's share to DfE's working parent registrations at 9 to 11 months and at age 1 at the spring term.", + "estimand": "The share of children of DfE age 1 (age on 31 December of the model year) who use the hours their family's working-parent claim gives them, fitted with the other age's share to DfE's working parent registrations at 9 to 11 months and at age 1 at the spring term.", "params_at_bound": [ "extended_childcare_age_1_usage", "universal_childcare" ], "optimizer": { "eps": 1e-06, - "loss": 0.02521537026262977, + "loss": 0.01538992050511465, "maxiter": 50, "method": "L-BFGS-B", "success": true @@ -492,59 +492,59 @@ "achieved": { "dfe.funded_childcare.early_learning_2_year_olds": { "target": 95031.0, - "value": 95030.977, + "value": 95031.139, "ratio": 1.0 }, "dfe.funded_childcare.universal_only_children": { "target": 396965.0, - "value": 422796.571, - "ratio": 1.0651 + "value": 417767.817, + "ratio": 1.0524 }, "dfe.funded_childcare.working_parent_children_2_to_4": { "target": 621482.0, - "value": 628071.593, - "ratio": 1.0106 + "value": 620601.293, + "ratio": 0.9986 }, "dfe.funded_childcare.working_parent_children_9_to_11_months": { "target": 29155.0, - "value": 29581.118, - "ratio": 1.0146 + "value": 29154.994, + "ratio": 1.0 }, "dfe.funded_childcare.working_parent_children_age_1": { "target": 195104.0, - "value": 174400.612, - "ratio": 0.8939 + "value": 183986.326, + "ratio": 0.943 }, "hmrc.tfc.children_with_used_accounts": { "target": 1151515.0, - "value": 1224841.088, + "value": 1224841.813, "ratio": 1.0637 }, "hmrc.tfc.government_top_up": { "target": 599800000.0, - "value": 555970720.952, + "value": 555971050.246, "ratio": 0.9269 } }, "diagnostic_rows": { "dfe.funded_childcare.universal_nursery_children_age_3": { "target": 565954.0, - "value": 578014.513, - "ratio": 1.0213 + "value": 571139.593, + "ratio": 1.0092 }, "dfe.funded_childcare.working_parent_children_age_2": { "target": 242453.0, - "value": 267809.94, - "ratio": 1.1046 + "value": 264624.601, + "ratio": 1.0914 }, "dfe.funded_childcare.working_parent_children_age_3": { "target": 278640.0, - "value": 263213.198, - "ratio": 0.9446 + "value": 260082.533, + "ratio": 0.9334 } }, - "status": "fitted at model year 2025 with the expectation basis of tool version 6: the DfE rows measured at the spring term by the age on 31 December (dfe_spring_term.py, policyengine-uk 2.147.2's date-of-birth school start and working-parent term start), universal take-up nested under working-parent take-up, targeted and universal hours allocated from the gross working-parent hours, and the under-2 usage share scaling the claiming families' children under 2. At a bound: childcare_age_1_usage, universal_childcare.", - "at_bound_reason": "The age-1 usage share stops at its upper bound of 1: even with every 1-year-old of a claiming family using the hours, the frame's working-parent children at DfE age 1 fall short of DfE's January count at the 2-to-4 rate (ratio 0.894). The bound is kept and the residual recorded; the national calibration binds the row." + "status": "fitted at model year 2025 with the expectation basis of tool version 7: the DfE rows measured at the spring term by the age on 31 December (dfe_spring_term.py, policyengine-uk 2.147.2's date-of-birth school start and working-parent term start), universal take-up nested under working-parent take-up, targeted and universal hours allocated from the gross working-parent hours, and each under-2 usage share scaling the claiming families' children of its DfE age (the age on 31 December, as DfE counts them). At a bound: childcare_age_1_usage, universal_childcare.", + "at_bound_reason": "The age-1 usage share stops at its upper bound of 1: even with every child of DfE age 1 in a claiming family using the hours, the frame's working-parent children at DfE age 1 fall short of DfE's January count at the 2-to-4 rate (ratio 0.943). The bound is kept and the residual recorded; the national calibration binds the row." } }, { @@ -563,17 +563,17 @@ "status": "fitted_offline" }, "fitting_receipt": { - "source": "tools/fit_uk_childcare_takeup.py (microcosm#1338 round 2, licensed lane)", - "tool_version": 6, - "receipt_sha256": "a8fea77b88e38f13eafbb4204aef97545e2c5d1599d84c4bd311ef6c57d3da00", + "source": "tools/fit_uk_childcare_takeup.py (microcosm#1338 round 3, licensed lane)", + "tool_version": 7, + "receipt_sha256": "7a9e44ff6d9da027199edb57ef529bbc82807dbc321d9ded00967a63afc573c6", "seed": 0, "engine_version": "2.147.2", "model_period": 2025, "vintage_overrides": {}, "input_h5_sha256": "f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412", - "input_spine": "local unsigned spine built at 6aea1ec00 (uk-childcare-100k-fixes-v2 on main 8b0224e06; policyengine-uk 2.147.2, feed abf0921), sha256 f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412; the fit overrides the take-up columns, the only ones the later commits change", + "input_spine": "local unsigned spine built at 6aea1ec00 (uk-childcare-100k-fixes-v2 on main 8b0224e06; policyengine-uk 2.147.2, feed abf0921), sha256 f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412; the fit overrides the take-up columns and reads only the stored ages and months, so the later commits leave it valid", "ledger_facts_sha256": "2b64fecfe746164203dac1726aae6ffdb3e5d8e478bd3d64d118ac76cb00780b", - "stochastic_contract_sha256_at_fit": "6b30ba258e9901d6aa139e4c3df227854e2c1aa1550ae514caeec3dfcfe4c1c1", + "stochastic_contract_sha256_at_fit": "1a9feb2bc9741b12c57d95f3c9c4364cad4cb43472782bb5be3bd19b410b44c5", "expectation_basis": "dfe_spring_term", "estimand": "The universal claim rate among benefit units that do not claim working-parent hours (nested), fitted to DfE's universal-only registrations at the spring term.", "params_at_bound": [ @@ -582,7 +582,7 @@ ], "optimizer": { "eps": 1e-06, - "loss": 0.02521537026262977, + "loss": 0.01538992050511465, "maxiter": 50, "method": "L-BFGS-B", "success": true @@ -590,59 +590,59 @@ "achieved": { "dfe.funded_childcare.early_learning_2_year_olds": { "target": 95031.0, - "value": 95030.977, + "value": 95031.139, "ratio": 1.0 }, "dfe.funded_childcare.universal_only_children": { "target": 396965.0, - "value": 422796.571, - "ratio": 1.0651 + "value": 417767.817, + "ratio": 1.0524 }, "dfe.funded_childcare.working_parent_children_2_to_4": { "target": 621482.0, - "value": 628071.593, - "ratio": 1.0106 + "value": 620601.293, + "ratio": 0.9986 }, "dfe.funded_childcare.working_parent_children_9_to_11_months": { "target": 29155.0, - "value": 29581.118, - "ratio": 1.0146 + "value": 29154.994, + "ratio": 1.0 }, "dfe.funded_childcare.working_parent_children_age_1": { "target": 195104.0, - "value": 174400.612, - "ratio": 0.8939 + "value": 183986.326, + "ratio": 0.943 }, "hmrc.tfc.children_with_used_accounts": { "target": 1151515.0, - "value": 1224841.088, + "value": 1224841.813, "ratio": 1.0637 }, "hmrc.tfc.government_top_up": { "target": 599800000.0, - "value": 555970720.952, + "value": 555971050.246, "ratio": 0.9269 } }, "diagnostic_rows": { "dfe.funded_childcare.universal_nursery_children_age_3": { "target": 565954.0, - "value": 578014.513, - "ratio": 1.0213 + "value": 571139.593, + "ratio": 1.0092 }, "dfe.funded_childcare.working_parent_children_age_2": { "target": 242453.0, - "value": 267809.94, - "ratio": 1.1046 + "value": 264624.601, + "ratio": 1.0914 }, "dfe.funded_childcare.working_parent_children_age_3": { "target": 278640.0, - "value": 263213.198, - "ratio": 0.9446 + "value": 260082.533, + "ratio": 0.9334 } }, - "status": "fitted at model year 2025 with the expectation basis of tool version 6: the DfE rows measured at the spring term by the age on 31 December (dfe_spring_term.py, policyengine-uk 2.147.2's date-of-birth school start and working-parent term start), universal take-up nested under working-parent take-up, targeted and universal hours allocated from the gross working-parent hours, and the under-2 usage share scaling the claiming families' children under 2. At a bound: childcare_age_1_usage, universal_childcare.", - "at_bound_reason": "The conditional universal rate stops at its lower bound of 0: universal take-up is nested under the working-parent flag, and the claiming families alone already give more universal-only children at the spring term than DfE's January count (ratio 1.065 at a rate of 0). The bound is kept and the residual recorded; the national calibration binds the row." + "status": "fitted at model year 2025 with the expectation basis of tool version 7: the DfE rows measured at the spring term by the age on 31 December (dfe_spring_term.py, policyengine-uk 2.147.2's date-of-birth school start and working-parent term start), universal take-up nested under working-parent take-up, targeted and universal hours allocated from the gross working-parent hours, and each under-2 usage share scaling the claiming families' children of its DfE age (the age on 31 December, as DfE counts them). At a bound: childcare_age_1_usage, universal_childcare.", + "at_bound_reason": "The conditional universal rate stops at its lower bound of 0: universal take-up is nested under the working-parent flag, which is drawn for every benefit unit, including families that can never get working-parent hours, so no family's universal take-up falls below the working-parent rate. The claiming families alone already give more universal-only children at the spring term than DfE's January count (ratio 1.052 at a rate of 0). The bound is kept and the residual recorded; the national calibration binds the row." } }, { @@ -651,7 +651,7 @@ "entity": "benunit", "values": { "2015-01-01": 0.597, - "2024-04-06": 0.6547 + "2024-04-06": 0.6551 }, "source": { "source": "FRS empirical fit", @@ -660,17 +660,17 @@ "status": "fitted_offline" }, "fitting_receipt": { - "source": "tools/fit_uk_childcare_takeup.py (microcosm#1338 round 2, licensed lane)", - "tool_version": 6, - "receipt_sha256": "a8fea77b88e38f13eafbb4204aef97545e2c5d1599d84c4bd311ef6c57d3da00", + "source": "tools/fit_uk_childcare_takeup.py (microcosm#1338 round 3, licensed lane)", + "tool_version": 7, + "receipt_sha256": "7a9e44ff6d9da027199edb57ef529bbc82807dbc321d9ded00967a63afc573c6", "seed": 0, "engine_version": "2.147.2", "model_period": 2025, "vintage_overrides": {}, "input_h5_sha256": "f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412", - "input_spine": "local unsigned spine built at 6aea1ec00 (uk-childcare-100k-fixes-v2 on main 8b0224e06; policyengine-uk 2.147.2, feed abf0921), sha256 f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412; the fit overrides the take-up columns, the only ones the later commits change", + "input_spine": "local unsigned spine built at 6aea1ec00 (uk-childcare-100k-fixes-v2 on main 8b0224e06; policyengine-uk 2.147.2, feed abf0921), sha256 f8e02d9da1ad15ca03c77878c14d047bee738c0abb128ba3fc3836b997ac9412; the fit overrides the take-up columns and reads only the stored ages and months, so the later commits leave it valid", "ledger_facts_sha256": "2b64fecfe746164203dac1726aae6ffdb3e5d8e478bd3d64d118ac76cb00780b", - "stochastic_contract_sha256_at_fit": "6b30ba258e9901d6aa139e4c3df227854e2c1aa1550ae514caeec3dfcfe4c1c1", + "stochastic_contract_sha256_at_fit": "1a9feb2bc9741b12c57d95f3c9c4364cad4cb43472782bb5be3bd19b410b44c5", "expectation_basis": "dfe_spring_term", "estimand": "The share of qualifying benefit units that claim early learning for 2-year-olds on their own, fitted to DfE's registrations at the spring term.", "params_at_bound": [ @@ -679,7 +679,7 @@ ], "optimizer": { "eps": 1e-06, - "loss": 0.02521537026262977, + "loss": 0.01538992050511465, "maxiter": 50, "method": "L-BFGS-B", "success": true @@ -687,58 +687,58 @@ "achieved": { "dfe.funded_childcare.early_learning_2_year_olds": { "target": 95031.0, - "value": 95030.977, + "value": 95031.139, "ratio": 1.0 }, "dfe.funded_childcare.universal_only_children": { "target": 396965.0, - "value": 422796.571, - "ratio": 1.0651 + "value": 417767.817, + "ratio": 1.0524 }, "dfe.funded_childcare.working_parent_children_2_to_4": { "target": 621482.0, - "value": 628071.593, - "ratio": 1.0106 + "value": 620601.293, + "ratio": 0.9986 }, "dfe.funded_childcare.working_parent_children_9_to_11_months": { "target": 29155.0, - "value": 29581.118, - "ratio": 1.0146 + "value": 29154.994, + "ratio": 1.0 }, "dfe.funded_childcare.working_parent_children_age_1": { "target": 195104.0, - "value": 174400.612, - "ratio": 0.8939 + "value": 183986.326, + "ratio": 0.943 }, "hmrc.tfc.children_with_used_accounts": { "target": 1151515.0, - "value": 1224841.088, + "value": 1224841.813, "ratio": 1.0637 }, "hmrc.tfc.government_top_up": { "target": 599800000.0, - "value": 555970720.952, + "value": 555971050.246, "ratio": 0.9269 } }, "diagnostic_rows": { "dfe.funded_childcare.universal_nursery_children_age_3": { "target": 565954.0, - "value": 578014.513, - "ratio": 1.0213 + "value": 571139.593, + "ratio": 1.0092 }, "dfe.funded_childcare.working_parent_children_age_2": { "target": 242453.0, - "value": 267809.94, - "ratio": 1.1046 + "value": 264624.601, + "ratio": 1.0914 }, "dfe.funded_childcare.working_parent_children_age_3": { "target": 278640.0, - "value": 263213.198, - "ratio": 0.9446 + "value": 260082.533, + "ratio": 0.9334 } }, - "status": "fitted at model year 2025 with the expectation basis of tool version 6: the DfE rows measured at the spring term by the age on 31 December (dfe_spring_term.py, policyengine-uk 2.147.2's date-of-birth school start and working-parent term start), universal take-up nested under working-parent take-up, targeted and universal hours allocated from the gross working-parent hours, and the under-2 usage share scaling the claiming families' children under 2. At a bound: childcare_age_1_usage, universal_childcare." + "status": "fitted at model year 2025 with the expectation basis of tool version 7: the DfE rows measured at the spring term by the age on 31 December (dfe_spring_term.py, policyengine-uk 2.147.2's date-of-birth school start and working-parent term start), universal take-up nested under working-parent take-up, targeted and universal hours allocated from the gross working-parent hours, and each under-2 usage share scaling the claiming families' children of its DfE age (the age on 31 December, as DfE counts them). At a bound: childcare_age_1_usage, universal_childcare." } }, { diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/dfe_spring_term.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/dfe_spring_term.py index 68b2f128a..6f7a773ea 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/dfe_spring_term.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/dfe_spring_term.py @@ -30,7 +30,11 @@ claim on their own, or allocation from the gross working-parent hours, as the engine allocates them) and replace only that age gate, so they count the children DfE counts; they do not change what the engine pays. -- **DfE age** is ``Y - birth_year``, the age on 31 December Y. +- **DfE age** is ``Y - birth_year``, the age on 31 December Y. The engine + holds a person's age fixed across years and moves the date of birth with + the period, so the DfE age is the same at every model year; + :func:`dfe_age_at_31_december` restates the engine's date of birth so the + build stages, which run without the engine, key on the same age. The take-up flags and family conditions are annual and apply to the spring term unchanged. ``early_years_school_start_deferred`` is not supplied (the @@ -52,7 +56,10 @@ "DFE_SPRING_UNIVERSAL", "DFE_SPRING_WORKING_PARENT", "UNIVERSAL_WEEKLY_HOURS", + "UK_CHILDCARE_FIT_MODEL_YEAR", + "dfe_age_at_31_december", "dfe_spring_term_status", + "engine_birth_year", ] DFE_AGE_AT_31_DECEMBER = "dfe_age_at_31_december" @@ -85,6 +92,59 @@ #: (SI 2014/2147 regs 4 and 5). A working-parent child aged 3 or 4 is #: registered under working parents only if it uses more than these. UNIVERSAL_WEEKLY_HOURS = 15.0 +#: The childcare fit's model year (the fitter's target period and the take-up +#: contract's fitting receipt): its spring term starts in January of the next. +UK_CHILDCARE_FIT_MODEL_YEAR = 2025 + +# policyengine-uk 2.147.2 ``utils.dates``, restated so the build stages need no +# engine: a monthly grid whose months start on the 6th, with 6 October of Y at +# grid month 12 * Y + 9; ages and months since the last birthday are float32. +_MONTHS_BEFORE_1970 = 12 * 1970 +_MID_YEAR_GRID_MONTH = 9 +_LATEST_MONTHS_SINCE_BIRTHDAY = 12 - 1e-4 +_MIDNIGHT_TOLERANCE = 1e-3 + + +def _sixth_of(grid_months: np.ndarray) -> np.ndarray: + since_1970 = (grid_months - _MONTHS_BEFORE_1970).astype("datetime64[M]") + return since_1970.astype("datetime64[D]") + np.timedelta64(5, "D") + + +def engine_birth_year(age, months_since_last_birthday, model_year: int) -> np.ndarray: + """policyengine-uk's ``birth_year`` at ``model_year`` for people given an + age and months since the last birthday and no date of birth + (``birth_instant_from_age``, then ``grid_months_to_yyyymmdd``).""" + + age = np.asarray(age, dtype=np.float32).astype(np.float64) + months = np.asarray(months_since_last_birthday, dtype=np.float32).astype(np.float64) + whole_years = np.floor(age) + fraction = age - whole_years + exact_months = 12 * whole_years + np.clip( + np.where(fraction > 0, 12 * fraction, months), + 0, + _LATEST_MONTHS_SINCE_BIRTHDAY, + ) + instant = 12 * int(model_year) + _MID_YEAR_GRID_MONTH - exact_months + whole = np.floor(instant).astype(np.int64) + start = _sixth_of(whole) + length = (_sixth_of(whole + 1) - start).astype(np.int64) + elapsed = np.ceil((instant - whole) * length - _MIDNIGHT_TOLERANCE).astype(np.int64) + overflow = elapsed >= length + whole = np.where(overflow, whole + 1, whole) + elapsed = np.where(overflow, 0, elapsed) + day = _sixth_of(whole) + elapsed.astype("timedelta64[D]") + return day.astype("datetime64[Y]").astype(np.int64) + 1970 + + +def dfe_age_at_31_december( + age, months_since_last_birthday, model_year: int = UK_CHILDCARE_FIT_MODEL_YEAR +) -> np.ndarray: + """``Y - birth_year``, as :func:`dfe_spring_term_status` reads it: for a + whole age, the age plus one for a birthday from 7 October to 31 December.""" + + return int(model_year) - engine_birth_year( + age, months_since_last_birthday, model_year + ) def _spring_term_start(year: int) -> int: 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 697a5b6d4..c4f76cf19 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 @@ -17,6 +17,7 @@ clipped_normal_from_uniforms, stable_identity_uniforms, ) +from microcosm.build.uk_runtime.dfe_spring_term import dfe_age_at_31_december from microcosm.build.uk_runtime.national_frame import ( uk_household_weight_kind, uk_national_frame, @@ -48,12 +49,13 @@ # would fund too many of them. A child that does not use them gets no funded # hours from the engine (max_free_entitlement_hours_used 0); every other person # keeps the engine's default of 30. The draw is keyed on the person (seed 0, -# salt the output) at the rate of the child's whole-year age (0 or 1); +# salt the output) at the rate of the child's DfE age (0 or 1): its age on 31 +# December of the fit's model year, the age DfE counts registrations by; # ``childcare_copy_take_up`` re-draws the copies' children against their own # unit's flag. The stage manifest declares one operation per age; # ``assert_under_two_usage_declaration`` refuses a manifest that drops either. UK_UNDER_TWO_USAGE_OUTPUT = "max_free_entitlement_hours_used" -#: The usage rate's contract key by whole-year age. +#: The usage rate's contract key by DfE age (``dfe_age_at_31_december``). UK_UNDER_TWO_USAGE_KEYS = { 0: "extended_childcare_age_0_usage", 1: "extended_childcare_age_1_usage", @@ -307,7 +309,7 @@ def assert_under_two_usage_declaration(stage: SourceStageSpec) -> None: ): raise ValueError( f"stage {stage.stage!r} must declare one {UK_UNDER_TWO_USAGE_OUTPUT!r} " - "operation per whole-year age with assignment_unit person and the rate " + "operation per DfE age with assignment_unit person and the rate " f"keys {sorted(UK_UNDER_TWO_USAGE_KEYS.values())!r}; the code draws " f"whether each child under {UK_UNDER_TWO_AGE} in a unit claiming the " "working-parent hours uses them at its age's rate and refuses a " @@ -524,25 +526,36 @@ def person_unit_flag( return mapped.to_numpy(dtype=bool) +def person_dfe_age(person: pd.DataFrame) -> np.ndarray: + """Each person's DfE age at the fit's model year, from the stored age and + months since the last birthday, as the engine places the date of birth.""" + + columns = {} + for name in ("age", "months_since_last_birthday"): + if name not in person.columns: + raise KeyError(f"person.{name} is missing; the under-2 usage draw needs it") + values = pd.to_numeric(person[name], errors="coerce") + if values.isna().any(): + raise ValueError( + f"person.{name} must be numeric for the under-2 usage draw" + ) + columns[name] = values.to_numpy(dtype=float) + return dfe_age_at_31_december(columns["age"], columns["months_since_last_birthday"]) + + def under_two_children(person: pd.DataFrame) -> np.ndarray: - """Persons of whole-year age under ``UK_UNDER_TWO_AGE``.""" + """Persons of DfE age under ``UK_UNDER_TWO_AGE``.""" - if "age" not in person.columns: - raise KeyError("person.age is missing; the under-2 usage draw needs it") - age = pd.to_numeric(person["age"], errors="coerce") - if age.isna().any(): - raise ValueError("person.age must be numeric for the under-2 usage draw") - return age.to_numpy(dtype=float) < UK_UNDER_TWO_AGE + return person_dfe_age(person) < UK_UNDER_TWO_AGE def under_two_usage_rates( person: pd.DataFrame, contract: UKTakeUpContract ) -> np.ndarray: - """Each person's usage rate by whole-year age (age 1's rate from 1 up).""" + """Each person's usage rate by DfE age (age 1's rate from 1 up).""" - age = pd.to_numeric(person["age"], errors="coerce").to_numpy(dtype=float) return np.where( - age < 1, + person_dfe_age(person) < 1, contract.rate(UK_UNDER_TWO_USAGE_KEYS[0]), contract.rate(UK_UNDER_TWO_USAGE_KEYS[1]), ) @@ -553,8 +566,8 @@ def derive_under_two_childcare_usage( ) -> np.ndarray: """``max_free_entitlement_hours_used`` for every person in ``person``. - A child under 2 whose unit claims the working-parent hours uses them where - its draw (keyed on ``person_id``) falls under its whole-year age's usage + A child of DfE age under 2 whose unit claims the working-parent hours uses them where + its draw (keyed on ``person_id``) falls under its DfE age's usage rate and gets 0 hours otherwise; every other person keeps the engine's default. """ 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 e2830af84..080ae6f41 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/graph.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/graph.py @@ -243,6 +243,9 @@ # age (#882, microcosm#1095). "age", "is_uc_claimant", + # The under-2 usage draw keys on the DfE age, from the age and the + # months since the last birthday (microcosm#1338). + "months_since_last_birthday", ) ) | frozenset({("benunit", "is_married")}), diff --git a/packages/microcosm-build/tests/engine/uk/test_uk_dfe_spring_term.py b/packages/microcosm-build/tests/engine/uk/test_uk_dfe_spring_term.py index c1b03da52..e8a797bdf 100644 --- a/packages/microcosm-build/tests/engine/uk/test_uk_dfe_spring_term.py +++ b/packages/microcosm-build/tests/engine/uk/test_uk_dfe_spring_term.py @@ -248,3 +248,39 @@ def test_a_child_under_two_that_does_not_use_its_hours_gets_none() -> None: assert uses[DFE_SPRING_WORKING_PARENT] == 1 assert does_not["extended_childcare_entitlement_per_child"] == 0 assert does_not[DFE_SPRING_WORKING_PARENT] == 0 + + +def test_the_build_stages_dfe_age_is_the_engines() -> None: + """The under-2 usage draw runs without the engine, so it restates the + engine's date of birth; it must give the engine's Y - birth_year.""" + + from policyengine_uk.utils.dates import ( + birth_instant_from_age, + grid_months_to_yyyymmdd, + ) + + from microcosm.build.uk_runtime.dfe_spring_term import ( + dfe_age_at_31_december, + engine_birth_year, + ) + + rng = np.random.default_rng(7) + age = rng.integers(0, 6, 20_000).astype(float) + months = rng.uniform(0, 12, age.size) + # Around the 31 December boundary (a birthday on 7 October, about 9.19 + # months before 6 October). + months[:2_000] = np.linspace(9.18, 9.21, 2_000) + for year in (2024, 2025, 2026): + engine = ( + grid_months_to_yyyymmdd( + birth_instant_from_age( + year, age.astype(np.float32), months.astype(np.float32) + ) + ) + // 10_000 + ) + np.testing.assert_array_equal(engine_birth_year(age, months, year), engine) + np.testing.assert_array_equal( + dfe_age_at_31_december(age, months, year), + dfe_age_at_31_december(age, months, 2025), + ) diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_copy_take_up.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_copy_take_up.py index fc5241787..65047752f 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_copy_take_up.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_copy_take_up.py @@ -107,6 +107,7 @@ def _frame(contract, *, natives: int = _NATIVES): "person_benunit_id": ids, "person_household_id": ids, "age": ages, + "months_since_last_birthday": np.zeros(len(ids)), } ) benunit = pd.DataFrame( @@ -126,7 +127,9 @@ def _frame(contract, *, natives: int = _NATIVES): # frs_take_up drew each host child's usage keyed on the host's person and # unit; the copies inherit it. person[UK_UNDER_TWO_USAGE_OUTPUT] = derive_under_two_childcare_usage( - pd.DataFrame({"person_id": sources, "age": ages}), + pd.DataFrame( + {"person_id": sources, "age": ages, "months_since_last_birthday": 0.0} + ), claiming=inherited["would_claim_extended_childcare"], contract=contract, ) diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_realised_take_up.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_realised_take_up.py index e1b0e4ab4..0ef56f14b 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_realised_take_up.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_childcare_realised_take_up.py @@ -45,6 +45,7 @@ def _tables(units: int = 30, high_pay: int = 3): "person_benunit_id": np.concatenate([ids, ids]), "person_household_id": np.concatenate([ids, ids]), "age": np.concatenate([np.full(units, 35), np.full(units, 1)]), + "months_since_last_birthday": np.zeros(2 * units), "employment_income": np.concatenate( [np.where(ids <= high_pay, 150_000.0, 30_000.0), np.zeros(units)] ), diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_frs_stochastic.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_frs_stochastic.py index 34d0b3b8b..d424b44fc 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_frs_stochastic.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_frs_stochastic.py @@ -45,20 +45,27 @@ def test_under_two_usage_draws_children_in_claiming_units_only() -> None: derive_under_two_childcare_usage, ) + # The draw keys on the DfE age (31 December): a whole-year age plus one for + # a birthday from 7 October, more than about 9.19 months before 6 October. person = pd.DataFrame( { - "person_id": np.arange(1, 4001), - "age": np.tile([0, 1, 2, 35], 1000), + "person_id": np.arange(1, 6001), + "age": np.tile([0, 0, 1, 1, 2, 35], 1000), + "months_since_last_birthday": np.tile( + [3.0, 11.0, 3.0, 11.0, 3.0, 3.0], 1000 + ), } ) - claiming = np.repeat([True, False], 2000) + claiming = np.repeat([True, False], 3000) usage = derive_under_two_childcare_usage( person, claiming=claiming, contract=_Contract() ) draws = stable_identity_uniforms( person["person_id"].to_numpy(), seed=0, salt=UK_UNDER_TWO_USAGE_OUTPUT ) - under_two = person["age"].to_numpy() < 2 + # DfE ages 0, 1, 1, 2, 2, 35: a child of whole age 1 born from 7 October is + # a 2-year-old to DfE and is not drawn. + under_two = np.tile([True, True, True, False, False, False], 1000) expected = np.where( under_two & claiming & (draws >= 0.5), 0.0, UK_ENGINE_FREE_HOURS_DEFAULT ) diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_stochastic_tools.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_stochastic_tools.py index dbb2391a4..26e524d8b 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_stochastic_tools.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_stochastic_tools.py @@ -95,7 +95,7 @@ def runner(path: Path, params: np.ndarray, seed: int, period: int, contract): assert set(first["params"]) == set(tool.RATE_KEYS) assert len(first["params"]) == 6 assert set(first["achieved"]) == set(tool.TARGET_IDS) - assert first["tool_version"] == 6 + assert first["tool_version"] == 7 assert first["expectation_basis"] == "dfe_spring_term" assert set(first["estimands"]) == set(tool.RATE_KEYS) # Vahid's round-2 finding C: the receipt says the Tax-Free Childcare rate @@ -302,6 +302,7 @@ def continuous_entry(self, key: str): "person_benunit_id": [10, 10, 20, 30], "person_household_id": [1, 1, 1, 2], "age": [5, 6, 40, 70], + "months_since_last_birthday": [0.0] * 4, "is_uc_claimant": [False, False, True, True], "child_benefit_reported": [0.0, 10.0, 0.0, 0.0], "pension_credit_reported": [0.0, 0.0, 0.0, 5.0], 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 c0122c3cc..0bfc2f958 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 @@ -46,15 +46,15 @@ def test_uk_contract_loads_and_selects_build_year_rates() -> None: 0.6, 0.55, 0.5, - # The tool-version-6 refit: the DfE rows at the spring term, universal + # The tool-version-7 refit: the DfE rows at the spring term, universal # nested under working parent (at its lower bound), one usage share per - # under-2 age (age 1 at its upper bound). + # DfE age under 2 (age 1 at its upper bound). 0.9697, - 0.8361, - 0.698, + 0.8262, + 0.6962, 1.0, 0.0, - 0.6547, + 0.6551, 0.441, 0.2682, 0.97, diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_take_up_gate.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_take_up_gate.py index 1dee21ba7..13de2fb0d 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_take_up_gate.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_take_up_gate.py @@ -61,6 +61,7 @@ def _frame(*, brma_values=("LONDON_A", "LONDON_B")): "person_benunit_id": [*range(201, 201 + n), 201, 203, 202, 204], "person_household_id": [*household_ids, 1, 3, 2, 4], "age": [30, 40] * 5 + [0, 1, 0, 1], + "months_since_last_birthday": [0.0] * (n + 4), "is_uc_claimant": [True] * n + [False] * 4, } ) 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 7b53cb65b..e488f5774 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 @@ -587,7 +587,7 @@ { "assignment_unit": "person", "draw": "max_free_entitlement_hours_used", - "eligibility": "children of whole-year age 0 in copy benefit units that claim the working-parent hours, against the copy's re-drawn would_claim_extended_childcare; native persons keep their frs_take_up draws", + "eligibility": "children of DfE age 0 in copy benefit units that claim the working-parent hours, against the copy's re-drawn would_claim_extended_childcare; native persons keep their frs_take_up draws", "kind": "assign_binary_from_rate", "output": "max_free_entitlement_hours_used", "rate_derivation": "as in frs_take_up, keyed on the copy's own person_id", @@ -597,7 +597,7 @@ { "assignment_unit": "person", "draw": "max_free_entitlement_hours_used", - "eligibility": "children of whole-year age 1 in copy benefit units that claim the working-parent hours, against the copy's re-drawn would_claim_extended_childcare; native persons keep their frs_take_up draws", + "eligibility": "children of DfE age 1 in copy benefit units that claim the working-parent hours, against the copy's re-drawn would_claim_extended_childcare; native persons keep their frs_take_up draws", "kind": "assign_binary_from_rate", "output": "max_free_entitlement_hours_used", "rate_derivation": "as in frs_take_up, keyed on the copy's own person_id", @@ -2344,7 +2344,7 @@ "maximum_extended_childcare_hours_usage", "max_free_entitlement_hours_used" ], - "notes": "Identity-keyed seed 0 streams replace the incumbent sequential take-up seed 100; salts are output variable names. Reported positive receipt anchors are transient and consumed only. The Universal Credit draw's population is the benefit units with a UC claimant or partner (is_uc_claimant) aged 18 or over and under Pension Credit qualifying age (66 for everyone who can reach it in this release), the age and role conditions of policyengine-uk 2.147.2's is_uc_eligible; the engine lockstep test pins it and names the three engine cases not mirrored (16- and 17-year-old claimants under the UC Regs 2013 reg 8 exceptions, mixed-age couples on the Pension Credit route, and from 2.128.0 pension-age families moved onto Universal Credit when their legacy benefit closes, SI 2014/1230 reg 60A). So the contract rate is a share of those units, an anchor outside them stays true, and any other unit is never drawn; a unit with no claimant or partner of that age keeps its reported Housing Benefit, which a claim it cannot make no longer zeroes (#882, microcosm#867, microcosm#1095). The universal childcare flag is nested under the working-parent one. A unit that claims the extended hours claims the universal hours, and any other unit claims them at the contract's universal_childcare rate, the rate conditional on not claiming the extended hours; the extended draw is unchanged. childcare_copy_take_up later re-draws the childcare flags and hours of the support and CGT copies on their own benefit units. A child of whole-year age 0 or 1 in a unit that claims the working-parent hours uses them at its age's contract rate, extended_childcare_age_0_usage or extended_childcare_age_1_usage (DfE registers far fewer of the youngest eligible children than of those aged 2 to 4, and fewer at 9 to 11 months than at age 1); a child that does not gets max_free_entitlement_hours_used 0, so the engine funds it no hours, and every other person keeps the engine's default of 30.", + "notes": "Identity-keyed seed 0 streams replace the incumbent sequential take-up seed 100; salts are output variable names. Reported positive receipt anchors are transient and consumed only. The Universal Credit draw's population is the benefit units with a UC claimant or partner (is_uc_claimant) aged 18 or over and under Pension Credit qualifying age (66 for everyone who can reach it in this release), the age and role conditions of policyengine-uk 2.147.2's is_uc_eligible; the engine lockstep test pins it and names the three engine cases not mirrored (16- and 17-year-old claimants under the UC Regs 2013 reg 8 exceptions, mixed-age couples on the Pension Credit route, and from 2.128.0 pension-age families moved onto Universal Credit when their legacy benefit closes, SI 2014/1230 reg 60A). So the contract rate is a share of those units, an anchor outside them stays true, and any other unit is never drawn; a unit with no claimant or partner of that age keeps its reported Housing Benefit, which a claim it cannot make no longer zeroes (#882, microcosm#867, microcosm#1095). The universal childcare flag is nested under the working-parent one. A unit that claims the extended hours claims the universal hours, and any other unit claims them at the contract's universal_childcare rate, the rate conditional on not claiming the extended hours; the extended draw is unchanged. childcare_copy_take_up later re-draws the childcare flags and hours of the support and CGT copies on their own benefit units. A child of DfE age 0 or 1 (its age on 31 December of the fit's model year, the age DfE counts by) in a unit that claims the working-parent hours uses them at its age's contract rate, extended_childcare_age_0_usage or extended_childcare_age_1_usage (DfE registers far fewer of the youngest eligible children than of those aged 2 to 4, and fewer at 9 to 11 months than at age 1); a child that does not gets max_free_entitlement_hours_used 0, so the engine funds it no hours, and every other person keeps the engine's default of 30.", "operations": [ { "aggregates": { @@ -2453,20 +2453,20 @@ { "assignment_unit": "person", "draw": "max_free_entitlement_hours_used", - "eligibility": "persons of whole-year age 0 in benefit units that claim the working-parent hours (would_claim_extended_childcare)", + "eligibility": "persons of DfE age 0 in benefit units that claim the working-parent hours (would_claim_extended_childcare)", "kind": "assign_binary_from_rate", "output": "max_free_entitlement_hours_used", - "rate_derivation": "a child of whole-year age 0 in a claiming unit uses the working-parent hours where u < its age's rate and gets max_free_entitlement_hours_used 0 otherwise; every other person keeps the engine's default of 30; one draw per person serves both ages' operations", + "rate_derivation": "a child of DfE age 0 in a claiming unit uses the working-parent hours where u < its age's rate and gets max_free_entitlement_hours_used 0 otherwise; every other person keeps the engine's default of 30; one draw per person serves both ages' operations", "rate_key": "extended_childcare_age_0_usage", "seed": 0 }, { "assignment_unit": "person", "draw": "max_free_entitlement_hours_used", - "eligibility": "persons of whole-year age 1 in benefit units that claim the working-parent hours (would_claim_extended_childcare)", + "eligibility": "persons of DfE age 1 in benefit units that claim the working-parent hours (would_claim_extended_childcare)", "kind": "assign_binary_from_rate", "output": "max_free_entitlement_hours_used", - "rate_derivation": "a child of whole-year age 1 in a claiming unit uses the working-parent hours where u < its age's rate and gets max_free_entitlement_hours_used 0 otherwise; every other person keeps the engine's default of 30; one draw per person serves both ages' operations", + "rate_derivation": "a child of DfE age 1 in a claiming unit uses the working-parent hours where u < its age's rate and gets max_free_entitlement_hours_used 0 otherwise; every other person keeps the engine's default of 30; one draw per person serves both ages' operations", "rate_key": "extended_childcare_age_1_usage", "seed": 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 028a88d6b..65d18dc3e 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":"months_since_last_birthday","dtype":"float64","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_blind","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_uc_claimant","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_claimant_or_partner","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_hbai_dependent_child","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"uc_is_in_gainful_self_employment","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"rent_paid_as_boarder","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"rent_paid_as_lodger","dtype":"float64","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":"trading_loss","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"loss_relief","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ni_class_4_losses_brought_forward","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":"stands_as_sole_owner_or_partner_of_company","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_engaged_in_owned_company_trade","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"owned_company_is_main_employment","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"owned_company_carries_on_trade","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"owned_company_carries_on_property_business","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"owned_company_income_share","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"reports_rent_from_other_property","dtype":"bool","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":"statutory_paternity_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":"esa_includes_support_component","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"war_widows_pension_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":"liable_for_share_of_household_rent","dtype":"bool","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.147.2"],["policyengine-core","3.33.3"],["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":"d55388f70ca6ef871c31c5db68c274d848e6351a7c3faf8782a7df3922958c3d","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","liable_for_share_of_household_rent"],"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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_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":"months_since_last_birthday","dtype":"float64","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_blind","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":"is_claimant_or_partner","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_hbai_dependent_child","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_gainful_self_employment","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent_paid_as_boarder","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent_paid_as_lodger","dtype":"float64","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":"trading_loss","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"loss_relief","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ni_class_4_losses_brought_forward","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":"stands_as_sole_owner_or_partner_of_company","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_engaged_in_owned_company_trade","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_is_main_employment","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_carries_on_trade","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_carries_on_property_business","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_income_share","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"reports_rent_from_other_property","dtype":"bool","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":"statutory_paternity_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":"esa_includes_support_component","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"war_widows_pension_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":"liable_for_share_of_household_rent","dtype":"bool","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","liable_for_share_of_household_rent"],"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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_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.147.2"],["policyengine-core","3.33.3"],["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":"is_looked_after_by_local_authority","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_household_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_relationships","stage_contract_sha256":"85aca92dcc0590c2147cfc7e0886664f26cd8e1bc0b1de728d11fa567e9fd8b4","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.147.2"],["policyengine-core","3.33.3"],["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.147.2"],["policyengine-core","3.33.3"],["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":"f7465970190c74095a0f31fa7463bd28f5ca9b9e254b25a956246e642c8b7351","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.147.2"],["policyengine-core","3.33.3"],["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"},{"column":"reports_outstanding_student_loan","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"age_left_full_time_education","dtype":"int64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_education","stage_contract_sha256":"7ec718c35f8ab04c7dba62f5b5090161e1abace5d1c3bd313f05b0e584b7dcde","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","liable_for_share_of_household_rent"],"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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education"],"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.147.2"],["policyengine-core","3.33.3"],["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","liable_for_share_of_household_rent"],"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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","liable_for_share_of_household_rent"],"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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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.147.2"],["policyengine-core","3.33.3"],["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","is_uc_claimant","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"},{"column":"max_free_entitlement_hours_used","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["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":"716a0c7fd7452f0a7c5fdd71b6104619b145e1cd1d5045278f72645be4757f91","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"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","max_free_entitlement_hours_used"],"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.147.2"],["policyengine-core","3.33.3"],["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":"122e6055bbb039de79bea512d6e4639283d9899c571be5e9fce4956637efedcc","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.147.2"],["policyengine-core","3.33.3"],["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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_brma","stage_contract_sha256":"4285376b37299d375ed583b7f6b1747bd8b7cb1c8c0d19a36481156b5314a854","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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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.147.2"],["policyengine-core","3.33.3"],["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":"b7eb5ecf39ae82822a02d49cdc8edc00bedd77e091de1d98d38a8c180146b2c0","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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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.147.2"],["policyengine-core","3.33.3"],["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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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":"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","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.147.2"],["policyengine-core","3.33.3"],["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":"d86ab4a1f53cf097f42c9c047e7a3fbb5144dc88496b49cb846b3f8be0bbe0a1","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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","rent_paid_as_boarder","rent_paid_as_lodger","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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":"property_finance_costs","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":"war_widows_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":"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":"trading_loss","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"loss_relief","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ni_class_4_losses_brought_forward","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_income_share","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"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_gainful_self_employment","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_includes_support_component","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"reports_rent_from_other_property","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"stands_as_sole_owner_or_partner_of_company","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_engaged_in_owned_company_trade","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_is_main_employment","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_carries_on_trade","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_carries_on_property_business","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"person_is_spi_income_recipient","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["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":"e1edc3e33b4c26b2b8ad29bf28498a44217670910f59dae58bac477a9ddff3a8","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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient"],"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","person_is_spi_income_recipient","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported"],"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.147.2"],["policyengine-core","3.33.3"],["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":"524549b7dfbd0fceb505311eb0c3b923cfe3b11a8acd5ecfbfbcbb477e142eb1","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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient"],"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.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"was_wealth","stage_contract_sha256":"9941b70870b0ced1ea1f51e9c9f12768005ea6c53ffdba1db3cb4e2ee030af87","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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","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.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"was_lisa","stage_contract_sha256":"46f12fdf9228f721d860ff7858b78b25406bb8737628acf63ac17d44d549f657","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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","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"},{"column":"owned_land","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"other_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"non_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["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":"f45db95fde3f93731c0925b9bf8c12021921df2e4908770acdec1e3c97889277","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":"regional_property_uprating.boundary","citation":"","description":"Run structural UK stage high_value_home_support.","id":"high_value_home_support","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.high_value_home_support@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_high_value_support_copy","bool"],["household","high_value_support_copies","int64"],["household","high_value_support_copy_index","int64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"high_value_home_support","stage_contract_sha256":"174f4b38228d98107bee1639d1a297a2748bb618e87c7bd0a6c869c6ab06f8fa","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by high_value_home_support.","id":"high_value_home_support.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_high_value_support_copy","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"high_value_support_copies","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"high_value_support_copy_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_high_value_support_copy","household.high_value_support_copies","household.high_value_support_copy_index"]},"population":"high_value_home_support","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 regional_home_values.","id":"regional_home_values","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["high_value_support_copy_index","household_is_high_value_support_copy","household_source_id","region","tenure_type"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.regional_home_values@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"},{"column":"main_residence_value_rank_basis","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"regional_home_values","stage_contract_sha256":"48e8a622c8830a54a4c48d9d8cb4f011751aa05d7cb5f6c7f0e06e1121b720b1","time_period":"2024"},"population":"high_value_home_support","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 property_components.","id":"property_components","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["main_residence_value_rank_basis","non_residential_property_value","other_residential_property_value","region","subrent"],"entity":"household","rows":"all"},{"columns":["age","is_household_head","person_is_spi_income_recipient","person_support_channel"],"entity":"person","rows":"all"}],"kernel":"uk.stage.property_components@1","mass":"conserve","outputs":[{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_finance_costs","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_rental_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"property_components","stage_contract_sha256":"8c45b96e6c1cd6a3ec8080b674f06666b1bd1e86ecef4a654c18f9825977eb1b","time_period":"2024"},"population":"high_value_home_support","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 property_purchases.","id":"property_purchases","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["household_source_id","non_residential_property_value","other_residential_property_value","region"],"entity":"household","rows":"all"},{"columns":["age","property_rental_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.property_purchases@1","mass":"conserve","outputs":[{"column":"additional_residential_property_purchased","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"non_residential_property_purchased","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"property_purchases","stage_contract_sha256":"281fe34ea94f71ac1a0652bf3ec17922f0d46919bfb74ab7b367ba6e9d680826","time_period":"2024"},"population":"high_value_home_support","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","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income"],"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.147.2"],["policyengine-core","3.33.3"],["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":"ef04589ebb01746b996c466517b07cb718cf88febe8c2d6d69f6edf6b4b80f8b","time_period":"2024"},"population":"high_value_home_support","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","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","household_local_bus_trips"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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"},{"column":"uses_energy_prepayment_meter","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"lcfs_consumption","stage_contract_sha256":"a10aeec0491876f0906782a34e197bb52162f045678ca3c19769feabe14b09c6","time_period":"2024"},"population":"high_value_home_support","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","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"etb_vat","stage_contract_sha256":"01adfcc85d77f38fb9cc896e2e4b4c4752518d9e2aa69e6947832678c25ecf19","time_period":"2024"},"population":"high_value_home_support","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","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"etb_services","stage_contract_sha256":"85c52b57b06db2075b6422e8202b90eb70ebe60a3345e59cf48a4a0460f583e4","time_period":"2024"},"population":"high_value_home_support","sources":["frs"],"structural":"none","weights":null},{"base":"high_value_home_support","citation":"","description":"Ownership boundary before uc_reporter_redraw rewrites.","id":"uc_reporter_redraw.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.147.2"],["policyengine-core","3.33.3"],["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":"93b86a8b8bbb49caebab64381c716da2d78eb7cd43d0bf1ee9edbf3a07b64539","time_period":"2024"},"population":"uc_reporter_redraw.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_reporter_redraw.boundary","citation":"","description":"Ownership boundary before spi_benefit_coherence rewrites.","id":"spi_benefit_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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 spi_benefit_coherence.","id":"spi_benefit_coherence","inputs":[{"columns":["benunit_support_channel","frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["aa_category","age","attendance_allowance_reported","dla_m_category","dla_m_reported","dla_sc_category","dla_sc_reported","esa_contrib_reported","incapacity_benefit_reported","is_uc_claimant","person_source_id","person_support_channel","pip_dl_category","pip_dl_reported","pip_m_category","pip_m_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.spi_benefit_coherence@1","mass":"conserve","outputs":[{"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_income_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":"sda_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":"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":"war_widows_pension_reported","dtype":"float64","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":"receives_benefits_in_own_right","dtype":"bool","entity":"person","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.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_benefit_coherence","stage_contract_sha256":"c3ac21a6be06f16b6c20eb5b828e2335a7e3f63d1d5ba60505562c3e7d6a8f2d","time_period":"2024"},"population":"spi_benefit_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"spi_benefit_coherence.boundary","citation":"","description":"Ownership boundary before uc_capital_coherence rewrites.","id":"uc_capital_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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":["non_residential_property_value","other_residential_property_value","owned_land","region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","is_benunit_head","is_household_head","is_parent","other_investment_income","person_support_channel","savings_interest_income","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":"pension_credit_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.147.2"],["policyengine-core","3.33.3"],["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":"40440a087f84967c734a1204f1dedcc2432556c7ce2a41f3c38bc9055f324bfa","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_legacy_closure_take_up.","id":"uc_legacy_closure_take_up","inputs":[{"columns":["frs_benunit_capital","would_claim_uc"],"entity":"benunit","rows":"all"},{"columns":["household_source_id","region"],"entity":"household","rows":"all"},{"columns":["age","child_tax_credit_reported","esa_income_reported","housing_benefit_reported","income_support_reported","jsa_income_reported","universal_credit_reported","working_tax_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_legacy_closure_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_uc_at_legacy_closure","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_legacy_closure_take_up","stage_contract_sha256":"759eba9869bb39f43d0a881de8630c132751ecb9467d97e6558899cb390f38b2","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","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure"],"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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure"],"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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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"},{"column":"has_mixed_age_couple_pension_credit_saving","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["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":"e887dbbb186cb79f6d3fc9a629269dbac4a43381b9574df65353b816f01a3a35","time_period":"2024"},"population":"pension_credit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"pension_credit_take_up.boundary","citation":"","description":"Ownership boundary before child_benefit_take_up rewrites.","id":"child_benefit_take_up.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving"],"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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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 child_benefit_take_up.","id":"child_benefit_take_up","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving"],"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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.child_benefit_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_child_benefit","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_opts_out","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"child_benefit_take_up","stage_contract_sha256":"6f1eac2609e868894a287254aac75ec57c0199783c6ae6cf4782f3fbb99f6e92","time_period":"2024"},"population":"child_benefit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"child_benefit_take_up.boundary","citation":"","description":"Ownership boundary before carers_allowance_take_up rewrites.","id":"carers_allowance_take_up.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving"],"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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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 carers_allowance_take_up.","id":"carers_allowance_take_up","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving"],"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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.carers_allowance_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"carers_allowance_take_up","stage_contract_sha256":"823cff5fdfb6c801c3301ddaeb0f20df438c4c3658faf71af07365419dc2d0c3","time_period":"2024"},"population":"carers_allowance_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"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","would_claim_carers_allowance"],"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.147.2"],["policyengine-core","3.33.3"],["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":"carers_allowance_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"carers_allowance_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","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.147.2"],["policyengine-core","3.33.3"],["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":"f7ef8492bacde1607f24693d7362110ba55ad3d083688f3df61de40dbe65bdc0","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","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.147.2"],["policyengine-core","3.33.3"],["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","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.147.2"],["policyengine-core","3.33.3"],["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":"39011749dc0e95362e4ab606f09e95d457fdf3b40c66df9511d93dbb8208805d","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","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.147.2"],["policyengine-core","3.33.3"],["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":"cgt_incidence_anchor","citation":"","description":"Run structural UK stage cgt_residential_split.","id":"cgt_residential_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.stage.expand.cgt_residential_split@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_cgt_residential_clone","bool"],["household","cgt_residential_clone_index","int64"],["person","cgt_residential_probability","float64"],["person","capital_gains_residential_property","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_residential_split","stage_contract_sha256":"554e05ecb984ae1a3262486aefbe6183496c4c03e201fe3fafb509648bd1777f","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_residential_split.","id":"cgt_residential_split.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_cgt_residential_clone","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_residential_clone_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_residential_probability","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"capital_gains_residential_property","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_cgt_residential_clone","household.cgt_residential_clone_index","person.cgt_residential_probability","person.capital_gains_residential_property"]},"population":"cgt_residential_split","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_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","capital_gains_residential_property","dividend_income","property_income","reports_rent_from_other_property","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_badr","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["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":"2c0e2b93ebef8e4f5ef5fcae0b0bf3270147f7d327a293686f5da2038d37ce5f","time_period":"2024"},"population":"cgt_residential_split","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 salary_sacrifice.","id":"salary_sacrifice","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","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","household_is_cgt_residential_clone","cgt_residential_clone_index"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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","cgt_residential_probability","capital_gains_residential_property","capital_gains_asset_type","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"},{"column":"salary_sacrifice_pre_conversion_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"salary_sacrifice","stage_contract_sha256":"a64ac17ecb296b12171a1c5f3eb0b4dcaac9f32d08cffb95d7b87d094aeec693","time_period":"2024"},"population":"cgt_residential_split","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","age_left_full_time_education","current_education","highest_education","reports_outstanding_student_loan","salary_sacrifice_pre_conversion_pay","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.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"student_loans","stage_contract_sha256":"157d9ee607633e4246ed06eeee3aac3cdff98118e72400e18b84c11b3fd2b92b","time_period":"2024"},"population":"cgt_residential_split","sources":["frs"],"structural":"none","weights":null},{"base":"cgt_residential_split","citation":"","description":"Ownership boundary before childcare_copy_take_up rewrites.","id":"childcare_copy_take_up.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","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","household_is_cgt_residential_clone","cgt_residential_clone_index"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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","cgt_residential_probability","capital_gains_residential_property","capital_gains_asset_type","capital_gains_badr","salary_sacrifice_pre_conversion_pay","student_loan_plan"],"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 childcare_copy_take_up.","id":"childcare_copy_take_up","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_uc_childcare","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","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","household_is_cgt_residential_clone","cgt_residential_clone_index"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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","cgt_residential_probability","capital_gains_residential_property","capital_gains_asset_type","capital_gains_badr","salary_sacrifice_pre_conversion_pay","student_loan_plan"],"entity":"person","rows":"all"}],"kernel":"uk.stage.childcare_copy_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_tfc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_extended_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_universal_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_targeted_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maximum_extended_childcare_hours_usage","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"max_free_entitlement_hours_used","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"childcare_copy_take_up","stage_contract_sha256":"39d4eb3281755ae0933dff426c64fe0fa7383c48b544d96223a875b78135633f","time_period":"2024"},"population":"childcare_copy_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 private_school_attendance.","id":"private_school_attendance","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","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","household_is_cgt_residential_clone","cgt_residential_clone_index"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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","cgt_residential_probability","capital_gains_residential_property","capital_gains_asset_type","capital_gains_badr","salary_sacrifice_pre_conversion_pay","student_loan_plan"],"entity":"person","rows":"all"}],"kernel":"uk.stage.private_school_attendance@1","mass":"conserve","outputs":[{"column":"attends_private_school","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"private_school_attendance","stage_contract_sha256":"7e44379c0331fe4c9de05cd76a075c1a6aa22cf0dec6cd2f91b277e70f14a038","time_period":"2024"},"population":"childcare_copy_take_up.boundary","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":"months_since_last_birthday","dtype":"float64","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_blind","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_uc_claimant","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_claimant_or_partner","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_hbai_dependent_child","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"uc_is_in_gainful_self_employment","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"rent_paid_as_boarder","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"rent_paid_as_lodger","dtype":"float64","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":"trading_loss","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"loss_relief","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ni_class_4_losses_brought_forward","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":"stands_as_sole_owner_or_partner_of_company","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_engaged_in_owned_company_trade","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"owned_company_is_main_employment","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"owned_company_carries_on_trade","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"owned_company_carries_on_property_business","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"owned_company_income_share","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"reports_rent_from_other_property","dtype":"bool","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":"statutory_paternity_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":"esa_includes_support_component","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"war_widows_pension_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":"liable_for_share_of_household_rent","dtype":"bool","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.147.2"],["policyengine-core","3.33.3"],["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":"d55388f70ca6ef871c31c5db68c274d848e6351a7c3faf8782a7df3922958c3d","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","liable_for_share_of_household_rent"],"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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_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":"months_since_last_birthday","dtype":"float64","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_blind","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":"is_claimant_or_partner","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_hbai_dependent_child","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_gainful_self_employment","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent_paid_as_boarder","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent_paid_as_lodger","dtype":"float64","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":"trading_loss","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"loss_relief","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ni_class_4_losses_brought_forward","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":"stands_as_sole_owner_or_partner_of_company","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_engaged_in_owned_company_trade","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_is_main_employment","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_carries_on_trade","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_carries_on_property_business","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_income_share","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"reports_rent_from_other_property","dtype":"bool","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":"statutory_paternity_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":"esa_includes_support_component","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"war_widows_pension_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":"liable_for_share_of_household_rent","dtype":"bool","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","liable_for_share_of_household_rent"],"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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_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.147.2"],["policyengine-core","3.33.3"],["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":"is_looked_after_by_local_authority","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_household_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_relationships","stage_contract_sha256":"85aca92dcc0590c2147cfc7e0886664f26cd8e1bc0b1de728d11fa567e9fd8b4","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.147.2"],["policyengine-core","3.33.3"],["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.147.2"],["policyengine-core","3.33.3"],["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":"f7465970190c74095a0f31fa7463bd28f5ca9b9e254b25a956246e642c8b7351","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.147.2"],["policyengine-core","3.33.3"],["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"},{"column":"reports_outstanding_student_loan","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"age_left_full_time_education","dtype":"int64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_education","stage_contract_sha256":"7ec718c35f8ab04c7dba62f5b5090161e1abace5d1c3bd313f05b0e584b7dcde","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","liable_for_share_of_household_rent"],"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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education"],"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.147.2"],["policyengine-core","3.33.3"],["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","liable_for_share_of_household_rent"],"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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","liable_for_share_of_household_rent"],"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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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.147.2"],["policyengine-core","3.33.3"],["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","is_uc_claimant","months_since_last_birthday","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"},{"column":"max_free_entitlement_hours_used","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["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":"78aec80408c50455b37308e5a977fb70df3ecf915d6c1e8f80715ad9b58e62cf","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"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","max_free_entitlement_hours_used"],"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.147.2"],["policyengine-core","3.33.3"],["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":"4c046fafdae5b3e12d22a206c93b59ee7a74184c030a9868b368fc816b652997","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.147.2"],["policyengine-core","3.33.3"],["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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_brma","stage_contract_sha256":"4285376b37299d375ed583b7f6b1747bd8b7cb1c8c0d19a36481156b5314a854","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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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.147.2"],["policyengine-core","3.33.3"],["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":"b7eb5ecf39ae82822a02d49cdc8edc00bedd77e091de1d98d38a8c180146b2c0","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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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.147.2"],["policyengine-core","3.33.3"],["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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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":"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","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.147.2"],["policyengine-core","3.33.3"],["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":"d86ab4a1f53cf097f42c9c047e7a3fbb5144dc88496b49cb846b3f8be0bbe0a1","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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","rent_paid_as_boarder","rent_paid_as_lodger","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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":"property_finance_costs","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":"war_widows_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":"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":"trading_loss","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"loss_relief","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ni_class_4_losses_brought_forward","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_income_share","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"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_gainful_self_employment","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_includes_support_component","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"reports_rent_from_other_property","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"stands_as_sole_owner_or_partner_of_company","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_engaged_in_owned_company_trade","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_is_main_employment","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_carries_on_trade","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_company_carries_on_property_business","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"person_is_spi_income_recipient","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["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":"e1edc3e33b4c26b2b8ad29bf28498a44217670910f59dae58bac477a9ddff3a8","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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient"],"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","person_is_spi_income_recipient","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported"],"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.147.2"],["policyengine-core","3.33.3"],["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":"524549b7dfbd0fceb505311eb0c3b923cfe3b11a8acd5ecfbfbcbb477e142eb1","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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient"],"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.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"was_wealth","stage_contract_sha256":"9941b70870b0ced1ea1f51e9c9f12768005ea6c53ffdba1db3cb4e2ee030af87","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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","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.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"was_lisa","stage_contract_sha256":"46f12fdf9228f721d860ff7858b78b25406bb8737628acf63ac17d44d549f657","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","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","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"},{"column":"owned_land","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"other_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"non_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["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":"f45db95fde3f93731c0925b9bf8c12021921df2e4908770acdec1e3c97889277","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":"regional_property_uprating.boundary","citation":"","description":"Run structural UK stage high_value_home_support.","id":"high_value_home_support","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.high_value_home_support@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_high_value_support_copy","bool"],["household","high_value_support_copies","int64"],["household","high_value_support_copy_index","int64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"high_value_home_support","stage_contract_sha256":"174f4b38228d98107bee1639d1a297a2748bb618e87c7bd0a6c869c6ab06f8fa","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by high_value_home_support.","id":"high_value_home_support.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_high_value_support_copy","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"high_value_support_copies","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"high_value_support_copy_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_high_value_support_copy","household.high_value_support_copies","household.high_value_support_copy_index"]},"population":"high_value_home_support","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 regional_home_values.","id":"regional_home_values","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["high_value_support_copy_index","household_is_high_value_support_copy","household_source_id","region","tenure_type"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.regional_home_values@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"},{"column":"main_residence_value_rank_basis","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"regional_home_values","stage_contract_sha256":"48e8a622c8830a54a4c48d9d8cb4f011751aa05d7cb5f6c7f0e06e1121b720b1","time_period":"2024"},"population":"high_value_home_support","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 property_components.","id":"property_components","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["main_residence_value_rank_basis","non_residential_property_value","other_residential_property_value","region","subrent"],"entity":"household","rows":"all"},{"columns":["age","is_household_head","person_is_spi_income_recipient","person_support_channel"],"entity":"person","rows":"all"}],"kernel":"uk.stage.property_components@1","mass":"conserve","outputs":[{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_finance_costs","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_rental_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"property_components","stage_contract_sha256":"8c45b96e6c1cd6a3ec8080b674f06666b1bd1e86ecef4a654c18f9825977eb1b","time_period":"2024"},"population":"high_value_home_support","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 property_purchases.","id":"property_purchases","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["household_source_id","non_residential_property_value","other_residential_property_value","region"],"entity":"household","rows":"all"},{"columns":["age","property_rental_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.property_purchases@1","mass":"conserve","outputs":[{"column":"additional_residential_property_purchased","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"non_residential_property_purchased","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"property_purchases","stage_contract_sha256":"281fe34ea94f71ac1a0652bf3ec17922f0d46919bfb74ab7b367ba6e9d680826","time_period":"2024"},"population":"high_value_home_support","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","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income"],"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.147.2"],["policyengine-core","3.33.3"],["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":"ef04589ebb01746b996c466517b07cb718cf88febe8c2d6d69f6edf6b4b80f8b","time_period":"2024"},"population":"high_value_home_support","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","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","household_local_bus_trips"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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"},{"column":"uses_energy_prepayment_meter","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"lcfs_consumption","stage_contract_sha256":"a10aeec0491876f0906782a34e197bb52162f045678ca3c19769feabe14b09c6","time_period":"2024"},"population":"high_value_home_support","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","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"etb_vat","stage_contract_sha256":"01adfcc85d77f38fb9cc896e2e4b4c4752518d9e2aa69e6947832678c25ecf19","time_period":"2024"},"population":"high_value_home_support","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","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"etb_services","stage_contract_sha256":"85c52b57b06db2075b6422e8202b90eb70ebe60a3345e59cf48a4a0460f583e4","time_period":"2024"},"population":"high_value_home_support","sources":["frs"],"structural":"none","weights":null},{"base":"high_value_home_support","citation":"","description":"Ownership boundary before uc_reporter_redraw rewrites.","id":"uc_reporter_redraw.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.147.2"],["policyengine-core","3.33.3"],["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":"93b86a8b8bbb49caebab64381c716da2d78eb7cd43d0bf1ee9edbf3a07b64539","time_period":"2024"},"population":"uc_reporter_redraw.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_reporter_redraw.boundary","citation":"","description":"Ownership boundary before spi_benefit_coherence rewrites.","id":"spi_benefit_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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 spi_benefit_coherence.","id":"spi_benefit_coherence","inputs":[{"columns":["benunit_support_channel","frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["aa_category","age","attendance_allowance_reported","dla_m_category","dla_m_reported","dla_sc_category","dla_sc_reported","esa_contrib_reported","incapacity_benefit_reported","is_uc_claimant","person_source_id","person_support_channel","pip_dl_category","pip_dl_reported","pip_m_category","pip_m_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.spi_benefit_coherence@1","mass":"conserve","outputs":[{"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_income_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":"sda_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":"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":"war_widows_pension_reported","dtype":"float64","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":"receives_benefits_in_own_right","dtype":"bool","entity":"person","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.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_benefit_coherence","stage_contract_sha256":"c3ac21a6be06f16b6c20eb5b828e2335a7e3f63d1d5ba60505562c3e7d6a8f2d","time_period":"2024"},"population":"spi_benefit_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"spi_benefit_coherence.boundary","citation":"","description":"Ownership boundary before uc_capital_coherence rewrites.","id":"uc_capital_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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":["non_residential_property_value","other_residential_property_value","owned_land","region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","is_benunit_head","is_household_head","is_parent","other_investment_income","person_support_channel","savings_interest_income","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":"pension_credit_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.147.2"],["policyengine-core","3.33.3"],["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":"40440a087f84967c734a1204f1dedcc2432556c7ce2a41f3c38bc9055f324bfa","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_legacy_closure_take_up.","id":"uc_legacy_closure_take_up","inputs":[{"columns":["frs_benunit_capital","would_claim_uc"],"entity":"benunit","rows":"all"},{"columns":["household_source_id","region"],"entity":"household","rows":"all"},{"columns":["age","child_tax_credit_reported","esa_income_reported","housing_benefit_reported","income_support_reported","jsa_income_reported","universal_credit_reported","working_tax_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_legacy_closure_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_uc_at_legacy_closure","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_legacy_closure_take_up","stage_contract_sha256":"759eba9869bb39f43d0a881de8630c132751ecb9467d97e6558899cb390f38b2","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","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure"],"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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure"],"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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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"},{"column":"has_mixed_age_couple_pension_credit_saving","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["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":"e887dbbb186cb79f6d3fc9a629269dbac4a43381b9574df65353b816f01a3a35","time_period":"2024"},"population":"pension_credit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"pension_credit_take_up.boundary","citation":"","description":"Ownership boundary before child_benefit_take_up rewrites.","id":"child_benefit_take_up.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving"],"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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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 child_benefit_take_up.","id":"child_benefit_take_up","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving"],"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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.child_benefit_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_child_benefit","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_opts_out","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"child_benefit_take_up","stage_contract_sha256":"6f1eac2609e868894a287254aac75ec57c0199783c6ae6cf4782f3fbb99f6e92","time_period":"2024"},"population":"child_benefit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"child_benefit_take_up.boundary","citation":"","description":"Ownership boundary before carers_allowance_take_up rewrites.","id":"carers_allowance_take_up.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving"],"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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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 carers_allowance_take_up.","id":"carers_allowance_take_up","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving"],"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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.carers_allowance_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"carers_allowance_take_up","stage_contract_sha256":"823cff5fdfb6c801c3301ddaeb0f20df438c4c3658faf71af07365419dc2d0c3","time_period":"2024"},"population":"carers_allowance_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"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","would_claim_carers_allowance"],"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.147.2"],["policyengine-core","3.33.3"],["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":"carers_allowance_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"carers_allowance_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","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.147.2"],["policyengine-core","3.33.3"],["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":"f7ef8492bacde1607f24693d7362110ba55ad3d083688f3df61de40dbe65bdc0","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","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.147.2"],["policyengine-core","3.33.3"],["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","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.147.2"],["policyengine-core","3.33.3"],["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":"39011749dc0e95362e4ab606f09e95d457fdf3b40c66df9511d93dbb8208805d","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","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.147.2"],["policyengine-core","3.33.3"],["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":"cgt_incidence_anchor","citation":"","description":"Run structural UK stage cgt_residential_split.","id":"cgt_residential_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","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","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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.stage.expand.cgt_residential_split@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_cgt_residential_clone","bool"],["household","cgt_residential_clone_index","int64"],["person","cgt_residential_probability","float64"],["person","capital_gains_residential_property","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_residential_split","stage_contract_sha256":"554e05ecb984ae1a3262486aefbe6183496c4c03e201fe3fafb509648bd1777f","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_residential_split.","id":"cgt_residential_split.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_cgt_residential_clone","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_residential_clone_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_residential_probability","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"capital_gains_residential_property","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_cgt_residential_clone","household.cgt_residential_clone_index","person.cgt_residential_probability","person.capital_gains_residential_property"]},"population":"cgt_residential_split","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_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","capital_gains_residential_property","dividend_income","property_income","reports_rent_from_other_property","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_badr","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["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":"2c0e2b93ebef8e4f5ef5fcae0b0bf3270147f7d327a293686f5da2038d37ce5f","time_period":"2024"},"population":"cgt_residential_split","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 salary_sacrifice.","id":"salary_sacrifice","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","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","household_is_cgt_residential_clone","cgt_residential_clone_index"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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","cgt_residential_probability","capital_gains_residential_property","capital_gains_asset_type","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"},{"column":"salary_sacrifice_pre_conversion_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"salary_sacrifice","stage_contract_sha256":"a64ac17ecb296b12171a1c5f3eb0b4dcaac9f32d08cffb95d7b87d094aeec693","time_period":"2024"},"population":"cgt_residential_split","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","age_left_full_time_education","current_education","highest_education","reports_outstanding_student_loan","salary_sacrifice_pre_conversion_pay","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.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"student_loans","stage_contract_sha256":"157d9ee607633e4246ed06eeee3aac3cdff98118e72400e18b84c11b3fd2b92b","time_period":"2024"},"population":"cgt_residential_split","sources":["frs"],"structural":"none","weights":null},{"base":"cgt_residential_split","citation":"","description":"Ownership boundary before childcare_copy_take_up rewrites.","id":"childcare_copy_take_up.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","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","household_is_cgt_residential_clone","cgt_residential_clone_index"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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","cgt_residential_probability","capital_gains_residential_property","capital_gains_asset_type","capital_gains_badr","salary_sacrifice_pre_conversion_pay","student_loan_plan"],"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 childcare_copy_take_up.","id":"childcare_copy_take_up","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_uc_childcare","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","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","household_is_cgt_residential_clone","cgt_residential_clone_index"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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","cgt_residential_probability","capital_gains_residential_property","capital_gains_asset_type","capital_gains_badr","salary_sacrifice_pre_conversion_pay","student_loan_plan"],"entity":"person","rows":"all"}],"kernel":"uk.stage.childcare_copy_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_tfc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_extended_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_universal_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_targeted_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maximum_extended_childcare_hours_usage","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"max_free_entitlement_hours_used","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"childcare_copy_take_up","stage_contract_sha256":"cdbb7e135b16fac7ca1bcd6c54222821e2976b4da99f10a60913efd0ba03c13c","time_period":"2024"},"population":"childcare_copy_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 private_school_attendance.","id":"private_school_attendance","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","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","pension_credit_reported_capital","would_claim_uc_at_legacy_closure","has_mixed_age_couple_pension_credit_saving","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_is_high_value_support_copy","high_value_support_copies","high_value_support_copy_index","main_residence_value_rank_basis","additional_residential_property_purchased","non_residential_property_purchased","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","uses_energy_prepayment_meter","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","household_is_cgt_residential_clone","cgt_residential_clone_index"],"entity":"household","rows":"all"},{"columns":["age","gender","months_since_last_birthday","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","trading_loss","loss_relief","ni_class_4_losses_brought_forward","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","stands_as_sole_owner_or_partner_of_company","is_engaged_in_owned_company_trade","owned_company_is_main_employment","owned_company_carries_on_trade","owned_company_carries_on_property_business","owned_company_income_share","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","statutory_paternity_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","esa_includes_support_component","bsp_reported","war_widows_pension_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","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","reports_outstanding_student_loan","age_left_full_time_education","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","max_free_entitlement_hours_used","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","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","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","cgt_residential_probability","capital_gains_residential_property","capital_gains_asset_type","capital_gains_badr","salary_sacrifice_pre_conversion_pay","student_loan_plan"],"entity":"person","rows":"all"}],"kernel":"uk.stage.private_school_attendance@1","mass":"conserve","outputs":[{"column":"attends_private_school","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.147.2"],["policyengine-core","3.33.3"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"private_school_attendance","stage_contract_sha256":"7e44379c0331fe4c9de05cd76a075c1a6aa22cf0dec6cd2f91b277e70f14a038","time_period":"2024"},"population":"childcare_copy_take_up.boundary","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/uk_frs_stochastic.py b/test_support/microcosm_build/uk_frs_stochastic.py index 69e3b389a..3e5d5898c 100644 --- a/test_support/microcosm_build/uk_frs_stochastic.py +++ b/test_support/microcosm_build/uk_frs_stochastic.py @@ -118,6 +118,7 @@ def _frame() -> object: "person_benunit_id": [10, 10, 20, 30], "person_household_id": [1, 1, 1, 2], "age": [5, 6, 40, 70], + "months_since_last_birthday": [0.0] * 4, "is_uc_claimant": [False, False, True, True], "child_benefit_reported": [0, 10, 0, 0], "pension_credit_reported": [0, 0, 0, 5], diff --git a/tools/fit_uk_childcare_takeup.py b/tools/fit_uk_childcare_takeup.py index d809fdad2..b2053a77d 100644 --- a/tools/fit_uk_childcare_takeup.py +++ b/tools/fit_uk_childcare_takeup.py @@ -41,12 +41,13 @@ ) from microcosm.calibrate import TargetRegistry -TOOL_VERSION = 6 +TOOL_VERSION = 7 #: The model year the DfE rows are measured in: its spring term (January of #: the next calendar year) is the term DfE's January census counts, and from #: it working-parent hours reach children from 9 months. DEFAULT_TARGET_PERIOD = 2025 -#: The shares of children aged 0 and 1 (whole-year age) who use the hours +#: The shares of children of DfE age 0 and 1 (age on 31 December of the model +#: year, the age DfE counts by; tool version 7) who use the hours #: their family's working-parent claim gives them (DfE registers far fewer of #: the youngest eligible children than of those aged 2 to 4, and fewer at 9 to #: 11 months than at age 1). @@ -103,10 +104,11 @@ ), **{ key: ( - f"The share of children of whole-year age {age} who use the hours their " - "family's working-parent claim gives them, fitted with the other age's " - "share to DfE's working parent registrations at 9 to 11 months and at " - "age 1 at the spring term." + f"The share of children of DfE age {age} (age on 31 December of the " + "model year) who use the hours their family's working-parent claim " + "gives them, fitted with the other age's share to DfE's working " + "parent registrations at 9 to 11 months and at age 1 at the spring " + "term." ) for age, key in UNDER_TWO_KEYS.items() }, @@ -439,7 +441,7 @@ def __init__( def total(self, side: str, target: str, usage: Mapping[int, float]) -> float: """A side's sum with each age's under-2 contributions scaled by its - usage share (``usage`` maps whole-year age to share).""" + usage share (``usage`` maps DfE age to share).""" values = getattr(self, side).get(target) if values is None: @@ -624,9 +626,10 @@ def people(mask: np.ndarray) -> np.ndarray: ), } person_rows = np.asarray(sim.calculate("person_id", target_period)).shape[0] - whole_age = np.floor(np.asarray(sim.calculate("age", target_period), dtype=float)) + # The draw keys each child's usage on its DfE age (frs_take_up), so its + # contributions split by the same age. under_two_rows = { - target: {age: values * (whole_age == age) for age in UNDER_TWO_KEYS} + target: {age: values * (dfe_age == age) for age in UNDER_TWO_KEYS} for target, values in result.items() if np.asarray(values).shape[0] == person_rows and target.startswith("dfe.") } diff --git a/tools/report_uk_childcare_realised_take_up.py b/tools/report_uk_childcare_realised_take_up.py index 421bef8d3..e32f40224 100644 --- a/tools/report_uk_childcare_realised_take_up.py +++ b/tools/report_uk_childcare_realised_take_up.py @@ -15,7 +15,7 @@ self-employment income exceeds £100,000 (a pay proxy, not adjusted net income); -and each age's under-2 usage share over the children of that age in units that +and each DfE age's under-2 usage share over the children of that age in units that claim the working-parent hours. Every cell names its carriers as distinct source households and reads "<10" in place of its shares when fewer than 10 carry it (UKDS disclosure control). The receipt belongs in the run tree; it is never @@ -40,6 +40,7 @@ UK_EXTENDED_CHILDCARE_OUTPUT, UK_UNDER_TWO_USAGE_KEYS, UK_UNDER_TWO_USAGE_OUTPUT, + person_dfe_age, person_unit_flag, under_two_children, universal_childcare_marginal_rate, @@ -145,7 +146,7 @@ def realised_childcare_take_up( person, benunit, benunit[UK_EXTENDED_CHILDCARE_OUTPUT].to_numpy() ) uses = person[UK_UNDER_TWO_USAGE_OUTPUT].to_numpy(dtype=float) > 0 - whole_age = np.floor(age) + dfe_age = person_dfe_age(person) for child_age, key in UK_UNDER_TWO_USAGE_KEYS.items(): flags[f"{UK_UNDER_TWO_USAGE_OUTPUT}.age_{child_age}"] = { "contract_key": key, @@ -155,7 +156,7 @@ def realised_childcare_take_up( uses, person_weights, person_sources, - under_two_children(person) & claiming & (whole_age == child_age), + under_two_children(person) & claiming & (dfe_age == child_age), ) }, }